From 31b4a284713881a30d1ae0f08490efd671497b75 Mon Sep 17 00:00:00 2001 From: Trevor Terris Date: Sun, 21 Nov 2021 22:04:09 -0500 Subject: [PATCH] Add copy functionality Current functionality is short-press to copy, long-press to paste. --- .../openboard/inputmethod/latin/LatinIME.java | 4 +++ .../suggestions/SuggestionStripView.java | 34 +++++++++++++------ app/src/main/res/layout/suggestions_strip.xml | 3 +- app/src/main/res/values/strings.xml | 1 + .../main/res/xml/prefs_screen_preferences.xml | 1 + 5 files changed, 31 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/org/dslul/openboard/inputmethod/latin/LatinIME.java b/app/src/main/java/org/dslul/openboard/inputmethod/latin/LatinIME.java index 4e2f52edf..c478573ed 100644 --- a/app/src/main/java/org/dslul/openboard/inputmethod/latin/LatinIME.java +++ b/app/src/main/java/org/dslul/openboard/inputmethod/latin/LatinIME.java @@ -1117,6 +1117,10 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen } } + public CharSequence getSelection() { + return mInputLogic.mConnection.getSelectedText(0); + } + /** * This is called when the user has clicked on the extracted text view, * when running in fullscreen mode. The default implementation hides 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 6e35ed482..58d21bf1e 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 @@ -62,6 +62,7 @@ public final class SuggestionStripView extends RelativeLayout implements OnClick void pickSuggestionManually(SuggestedWordInfo word); void onCodeInput(int primaryCode, int x, int y, boolean isKeyRepeat); void onTextInput(final String rawText); + CharSequence getSelection(); } static final boolean DBG = DebugFlags.DEBUG_ENABLED; @@ -172,6 +173,7 @@ public final class SuggestionStripView extends RelativeLayout implements OnClick mVoiceKey.setOnClickListener(this); mPasteKey.setImageDrawable(iconPaste); mPasteKey.setOnClickListener(this); + mPasteKey.setOnLongClickListener(this); mOtherKey.setImageDrawable(iconIncognito); } @@ -265,6 +267,23 @@ public final class SuggestionStripView extends RelativeLayout implements OnClick @Override public boolean onLongClick(final View view) { + if (view == mPasteKey) { + ClipboardManager clipboardManager = (ClipboardManager) getContext().getSystemService(Context.CLIPBOARD_SERVICE); + ClipData clipData = clipboardManager.getPrimaryClip(); + if (clipData != null && clipData.getItemCount() > 0 && clipData.getItemAt(0) != null) { + String clipString = clipData.getItemAt(0).coerceToText(getContext()).toString(); + if (clipString.length() == 1) { + mListener.onTextInput(clipString); + } else if (clipString.length() > 1) { + //awkward workaround + mListener.onTextInput(clipString.substring(0, clipString.length() - 1)); + mListener.onTextInput(clipString.substring(clipString.length() - 1)); + } + } + AudioAndHapticFeedbackManager.getInstance().performHapticAndAudioFeedback( + Constants.NOT_A_CODE, this); + return true; + } AudioAndHapticFeedbackManager.getInstance().performHapticAndAudioFeedback( Constants.NOT_A_CODE, this); return showMoreSuggestions(); @@ -423,17 +442,10 @@ public final class SuggestionStripView extends RelativeLayout implements OnClick return; } if (view == mPasteKey) { - ClipboardManager clipboardManager = (ClipboardManager) getContext().getSystemService(Context.CLIPBOARD_SERVICE); - ClipData clipData = clipboardManager.getPrimaryClip(); - if (clipData != null && clipData.getItemCount() > 0 && clipData.getItemAt(0) != null) { - String clipString = clipData.getItemAt(0).coerceToText(getContext()).toString(); - if (clipString.length() == 1) { - mListener.onTextInput(clipString); - } else if (clipString.length() > 1) { - //awkward workaround - mListener.onTextInput(clipString.substring(0, clipString.length() - 1)); - mListener.onTextInput(clipString.substring(clipString.length() - 1)); - } + CharSequence selectionSequence = mListener.getSelection(); + if (selectionSequence != null && selectionSequence.length() > 0) { + ClipboardManager clipboardManager = (ClipboardManager) getContext().getSystemService(Context.CLIPBOARD_SERVICE); + clipboardManager.setPrimaryClip(ClipData.newPlainText(selectionSequence, selectionSequence)); } return; } diff --git a/app/src/main/res/layout/suggestions_strip.xml b/app/src/main/res/layout/suggestions_strip.xml index e33367331..7fcc1e314 100644 --- a/app/src/main/res/layout/suggestions_strip.xml +++ b/app/src/main/res/layout/suggestions_strip.xml @@ -41,7 +41,8 @@ Clipboard paste key + Press to copy, long-press to paste. Configure input methods diff --git a/app/src/main/res/xml/prefs_screen_preferences.xml b/app/src/main/res/xml/prefs_screen_preferences.xml index a3c964f55..7015894db 100644 --- a/app/src/main/res/xml/prefs_screen_preferences.xml +++ b/app/src/main/res/xml/prefs_screen_preferences.xml @@ -74,6 +74,7 @@