From 245ee27053ca244fc6aa8f627f33ec5d0bfbb6bf Mon Sep 17 00:00:00 2001 From: Helium314 Date: Mon, 11 Dec 2023 23:19:04 +0100 Subject: [PATCH] add copy key, fixes #253 --- .../inputmethod/latin/RichInputConnection.java | 18 ++++++++++++++++++ .../inputmethod/latin/common/Constants.java | 11 ++++++----- .../latin/inputlogic/InputLogic.java | 3 +++ .../latin/suggestions/SuggestionStripView.java | 8 ++++++++ .../main/res/drawable/sym_keyboard_copy.xml | 12 ++++++++++++ app/src/main/res/layout/suggestions_strip.xml | 3 +++ .../res/layout/suggestions_strip_copy_key.xml | 10 ++++++++++ app/src/main/res/values/attrs.xml | 1 + .../main/res/values/keyboard-icons-holo.xml | 1 + .../res/values/keyboard-icons-lxx-light.xml | 1 + .../main/res/values/keyboard-icons-rounded.xml | 1 + 11 files changed, 64 insertions(+), 5 deletions(-) create mode 100644 app/src/main/res/drawable/sym_keyboard_copy.xml create mode 100644 app/src/main/res/layout/suggestions_strip_copy_key.xml diff --git a/app/src/main/java/org/dslul/openboard/inputmethod/latin/RichInputConnection.java b/app/src/main/java/org/dslul/openboard/inputmethod/latin/RichInputConnection.java index 1d6c25262..e51a8d5e7 100644 --- a/app/src/main/java/org/dslul/openboard/inputmethod/latin/RichInputConnection.java +++ b/app/src/main/java/org/dslul/openboard/inputmethod/latin/RichInputConnection.java @@ -6,6 +6,9 @@ package org.dslul.openboard.inputmethod.latin; +import android.content.ClipData; +import android.content.ClipboardManager; +import android.content.Context; import android.inputmethodservice.InputMethodService; import android.os.Bundle; import android.os.SystemClock; @@ -635,6 +638,21 @@ public final class RichInputConnection implements PrivateCommandPerformer { // the rest is done via LatinIME.onUpdateSelection } + public void copyText() { + // copy selected text, and if nothing is selected copy the whole text + CharSequence text = getSelectedText(InputConnection.GET_TEXT_WITH_STYLES); + if (text == null || text.length() == 0) { + // we have no selection, get the whole text + ExtractedTextRequest etr = new ExtractedTextRequest(); + etr.flags = InputConnection.GET_TEXT_WITH_STYLES; + etr.hintMaxChars = Integer.MAX_VALUE; + text = mIC.getExtractedText(etr, 0).text; + } + if (text == null) return; + final ClipboardManager cm = (ClipboardManager) mParent.getSystemService(Context.CLIPBOARD_SERVICE); + cm.setPrimaryClip(ClipData.newPlainText("copied text", text)); + } + public void commitCorrection(final CorrectionInfo correctionInfo) { if (DEBUG_BATCH_NESTING) checkBatchEdit(); if (DEBUG_PREVIOUS_TEXT) checkConsistencyForDebug(); diff --git a/app/src/main/java/org/dslul/openboard/inputmethod/latin/common/Constants.java b/app/src/main/java/org/dslul/openboard/inputmethod/latin/common/Constants.java index 1242b7088..08a4f3f67 100644 --- a/app/src/main/java/org/dslul/openboard/inputmethod/latin/common/Constants.java +++ b/app/src/main/java/org/dslul/openboard/inputmethod/latin/common/Constants.java @@ -233,12 +233,13 @@ public final class Constants { public static final int CODE_ALPHA_FROM_NUMPAD = -21; public static final int CODE_SYMBOL_FROM_NUMPAD = -22; public static final int CODE_SELECT_ALL = -23; - public static final int CODE_LEFT = -24; - public static final int CODE_RIGHT = -25; - public static final int CODE_UP = -26; - public static final int CODE_DOWN = -27; + public static final int CODE_COPY = -24; + public static final int CODE_LEFT = -25; + public static final int CODE_RIGHT = -26; + public static final int CODE_UP = -27; + public static final int CODE_DOWN = -28; // Code value representing the code is not specified. - public static final int CODE_UNSPECIFIED = -28; + public static final int CODE_UNSPECIFIED = -29; public static boolean isLetterCode(final int code) { return code >= CODE_SPACE; diff --git a/app/src/main/java/org/dslul/openboard/inputmethod/latin/inputlogic/InputLogic.java b/app/src/main/java/org/dslul/openboard/inputmethod/latin/inputlogic/InputLogic.java index 757698404..90f63b17a 100644 --- a/app/src/main/java/org/dslul/openboard/inputmethod/latin/inputlogic/InputLogic.java +++ b/app/src/main/java/org/dslul/openboard/inputmethod/latin/inputlogic/InputLogic.java @@ -763,6 +763,9 @@ public final class InputLogic { case Constants.CODE_SELECT_ALL: mConnection.selectAll(); break; + case Constants.CODE_COPY: + mConnection.copyText(); + break; case Constants.CODE_LEFT: sendDownUpKeyEvent(KeyEvent.KEYCODE_DPAD_LEFT); break; diff --git a/app/src/main/java/org/dslul/openboard/inputmethod/latin/suggestions/SuggestionStripView.java b/app/src/main/java/org/dslul/openboard/inputmethod/latin/suggestions/SuggestionStripView.java index c66a1d8ad..1f8c16619 100644 --- a/app/src/main/java/org/dslul/openboard/inputmethod/latin/suggestions/SuggestionStripView.java +++ b/app/src/main/java/org/dslul/openboard/inputmethod/latin/suggestions/SuggestionStripView.java @@ -78,6 +78,7 @@ public final class SuggestionStripView extends RelativeLayout implements OnClick private static final String CLIPBOARD_KEY_TAG = "clipboard_key"; private static final String SETTINGS_KEY_TAG = "settings_key"; private static final String SELECT_ALL_KEY_TAG = "select_all_key"; + private static final String COPY_KEY_TAG = "copy_key"; private static final String ONE_HANDED_KEY_TAG = "one_handed_key"; private static final String LEFT_KEY_TAG = "left_key"; private static final String RIGHT_KEY_TAG = "right_key"; @@ -160,6 +161,7 @@ public final class SuggestionStripView extends RelativeLayout implements OnClick final ImageButton voiceKey = findViewById(R.id.suggestions_strip_voice_key); final ImageButton clipboardKey = findViewById(R.id.suggestions_strip_clipboard_key); final ImageButton selectAllKey = findViewById(R.id.suggestions_strip_select_all_key); + final ImageButton copyKey = findViewById(R.id.suggestions_strip_copy_key); final ImageButton settingsKey = findViewById(R.id.suggestions_strip_settings_key); final ImageButton oneHandedKey = findViewById(R.id.suggestions_strip_one_handed_key); final ImageButton arrowLeft = findViewById(R.id.suggestions_strip_left_key); @@ -201,6 +203,7 @@ public final class SuggestionStripView extends RelativeLayout implements OnClick clipboardKey.setImageDrawable(keyboardAttr.getDrawable(R.styleable.Keyboard_iconClipboardNormalKey)); settingsKey.setImageDrawable(keyboardAttr.getDrawable(R.styleable.Keyboard_iconSettingsKey)); selectAllKey.setImageDrawable(keyboardAttr.getDrawable(R.styleable.Keyboard_iconSelectAll)); + copyKey.setImageDrawable(keyboardAttr.getDrawable(R.styleable.Keyboard_iconCopyKey)); arrowLeft.setImageDrawable(keyboardAttr.getDrawable(R.styleable.Keyboard_iconArrowLeft)); arrowRight.setImageDrawable(keyboardAttr.getDrawable(R.styleable.Keyboard_iconArrowRight)); arrowUp.setImageDrawable(keyboardAttr.getDrawable(R.styleable.Keyboard_iconArrowUp)); @@ -627,6 +630,9 @@ public final class SuggestionStripView extends RelativeLayout implements OnClick case SELECT_ALL_KEY_TAG: mListener.onCodeInput(Constants.CODE_SELECT_ALL, Constants.SUGGESTION_STRIP_COORDINATE, Constants.SUGGESTION_STRIP_COORDINATE, false); return; + case COPY_KEY_TAG: + mListener.onCodeInput(Constants.CODE_COPY, Constants.SUGGESTION_STRIP_COORDINATE, Constants.SUGGESTION_STRIP_COORDINATE, false); + return; case ONE_HANDED_KEY_TAG: final boolean oneHandedEnabled = Settings.getInstance().getCurrent().mOneHandedModeEnabled; mListener.onCodeInput(oneHandedEnabled ? Constants.CODE_STOP_ONE_HANDED_MODE : Constants.CODE_START_ONE_HANDED_MODE, @@ -719,6 +725,8 @@ public final class SuggestionStripView extends RelativeLayout implements OnClick return R.layout.suggestions_strip_clipboard_key; case SELECT_ALL_KEY_TAG: return R.layout.suggestions_strip_select_all_key; + case COPY_KEY_TAG: + return R.layout.suggestions_strip_copy_key; case ONE_HANDED_KEY_TAG: return R.layout.suggestions_strip_one_handed_key; case LEFT_KEY_TAG: diff --git a/app/src/main/res/drawable/sym_keyboard_copy.xml b/app/src/main/res/drawable/sym_keyboard_copy.xml new file mode 100644 index 000000000..44a798e6e --- /dev/null +++ b/app/src/main/res/drawable/sym_keyboard_copy.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/layout/suggestions_strip.xml b/app/src/main/res/layout/suggestions_strip.xml index 6778657a5..fc48f6b10 100644 --- a/app/src/main/res/layout/suggestions_strip.xml +++ b/app/src/main/res/layout/suggestions_strip.xml @@ -46,6 +46,9 @@ + diff --git a/app/src/main/res/layout/suggestions_strip_copy_key.xml b/app/src/main/res/layout/suggestions_strip_copy_key.xml new file mode 100644 index 000000000..034cadb5d --- /dev/null +++ b/app/src/main/res/layout/suggestions_strip_copy_key.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/values/attrs.xml b/app/src/main/res/values/attrs.xml index 9ff86f31d..a79817a4e 100644 --- a/app/src/main/res/values/attrs.xml +++ b/app/src/main/res/values/attrs.xml @@ -266,6 +266,7 @@ + diff --git a/app/src/main/res/values/keyboard-icons-holo.xml b/app/src/main/res/values/keyboard-icons-holo.xml index ac8ee9120..2608ba51d 100644 --- a/app/src/main/res/values/keyboard-icons-holo.xml +++ b/app/src/main/res/values/keyboard-icons-holo.xml @@ -27,6 +27,7 @@ @drawable/sym_keyboard_smiley_holo @drawable/sym_keyboard_clipboard_holo @drawable/sym_keyboard_clipboard_holo + @drawable/sym_keyboard_copy @drawable/sym_keyboard_clear_clipboard_holo @drawable/sym_keyboard_start_onehanded_holo @drawable/sym_keyboard_stop_onehanded_holo diff --git a/app/src/main/res/values/keyboard-icons-lxx-light.xml b/app/src/main/res/values/keyboard-icons-lxx-light.xml index fafb75c25..e68fb7188 100644 --- a/app/src/main/res/values/keyboard-icons-lxx-light.xml +++ b/app/src/main/res/values/keyboard-icons-lxx-light.xml @@ -32,6 +32,7 @@ @drawable/sym_keyboard_smiley_lxx @drawable/sym_keyboard_clipboard_lxx @drawable/sym_keyboard_clipboard_lxx + @drawable/sym_keyboard_copy @drawable/sym_keyboard_clear_clipboard_lxx @drawable/sym_keyboard_start_onehanded_lxx @drawable/sym_keyboard_stop_onehanded_lxx diff --git a/app/src/main/res/values/keyboard-icons-rounded.xml b/app/src/main/res/values/keyboard-icons-rounded.xml index d41fa938c..cb2437bb4 100644 --- a/app/src/main/res/values/keyboard-icons-rounded.xml +++ b/app/src/main/res/values/keyboard-icons-rounded.xml @@ -31,6 +31,7 @@ @drawable/sym_keyboard_smiley_rounded @drawable/sym_keyboard_clipboard_rounded @drawable/sym_keyboard_clipboard_rounded + @drawable/sym_keyboard_copy @drawable/sym_keyboard_clear_clipboard_rounded @drawable/sym_keyboard_start_onehanded_rounded @drawable/sym_keyboard_stop_onehanded_rounded