Dbrant has uploaded a new change for review.
https://gerrit.wikimedia.org/r/181261
Change subject: Get selected text from the WebView.
......................................................................
Get selected text from the WebView.
Sort-of hacky method that works by programmatically copying the selected
text to the clipboard, then peeking at the clipboard contents. (The actual
WebView provides no way of getting selected text)
Change-Id: I6c29eff4d9930bd218a9f686493cbcbc67d78691
---
M wikipedia/src/main/java/org/wikipedia/page/PageActivity.java
1 file changed, 71 insertions(+), 4 deletions(-)
git pull ssh://gerrit.wikimedia.org:29418/apps/android/wikipedia
refs/changes/61/181261/1
diff --git a/wikipedia/src/main/java/org/wikipedia/page/PageActivity.java
b/wikipedia/src/main/java/org/wikipedia/page/PageActivity.java
index f3d824f..071feaf 100644
--- a/wikipedia/src/main/java/org/wikipedia/page/PageActivity.java
+++ b/wikipedia/src/main/java/org/wikipedia/page/PageActivity.java
@@ -27,8 +27,11 @@
import com.squareup.otto.Subscribe;
import de.keyboardsurfer.android.widget.crouton.Crouton;
import de.keyboardsurfer.android.widget.crouton.Style;
+import android.annotation.TargetApi;
import android.app.AlertDialog;
import android.app.SearchManager;
+import android.content.ClipboardManager;
+import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
@@ -77,7 +80,10 @@
private NavDrawerFragment fragmentNavdrawer;
private SearchArticlesFragment searchFragment;
private TextView searchHintText;
+
private ActionMode webViewActionMode;
+ private ClipboardManager.OnPrimaryClipChangedListener clipListener;
+ private MenuItem copyMenuItem;
public static final int PROGRESS_BAR_MAX_VALUE = 10000;
private ProgressBar progressBar;
@@ -607,7 +613,8 @@
}
pausedStateOfZero = latestWikipediaZeroDisposition;
pausedMessageOfZero = latestCarrierMessage;
- searchHintText.setText(getString(latestWikipediaZeroDisposition ?
R.string.zero_search_hint : R.string.search_hint));
+ searchHintText.setText(getString(
+ latestWikipediaZeroDisposition ? R.string.zero_search_hint :
R.string.search_hint));
}
private void makeWikipediaZeroCrouton(int bgcolor, int fgcolor, String
verbiage) {
@@ -734,22 +741,82 @@
Log.d("Wikipedia", "Deregistering bus");
}
+ /**
+ * ActionMode that is invoked when the user long-presses inside the
WebView.
+ * Since API <11 doesn't provide a long-press context for the WebView
anyway, and we're
+ * using clipboard features that are only supported in API 11+, we'll mark
this whole
+ * method as TargetApi(11), so that the IDE doesn't get upset.
+ * @param mode ActionMode under which this context is starting.
+ */
+ @TargetApi(11)
@Override
public void onSupportActionModeStarted(ActionMode mode) {
if (webViewActionMode == null) {
webViewActionMode = mode;
Menu menu = mode.getMenu();
+
+ // Find the context menu item for copying text to the clipboard...
+ // The most practical way to do this seems to be to get the
resource name of the
+ // menu item, and see if it resembles "action_menu_copy", which
appears to remain
+ // consistent throughout the various APIs.
+ for (int i = 0; i < menu.size(); i++) {
+ String resourceName =
getResources().getResourceName(menu.getItem(i).getItemId());
+ if (resourceName.contains("action_menu_copy")) {
+ copyMenuItem = menu.getItem(i);
+ break;
+ }
+ }
+
+ // add our clipboard listener, so that we'll get an event when the
text
+ // is copied onto it...
+ ClipboardManager clipboard = (ClipboardManager) getSystemService(
+ Context.CLIPBOARD_SERVICE);
+ if (clipListener == null) {
+ clipListener = new
ClipboardManager.OnPrimaryClipChangedListener() {
+ @Override
+ public void onPrimaryClipChanged() {
+ // get the text from the clipboard!
+ ClipboardManager clipboard = (ClipboardManager)
getSystemService(
+ Context.CLIPBOARD_SERVICE);
+ if (clipboard.hasPrimaryClip()
+ && clipboard.getPrimaryClip().getItemCount() > 0) {
+
+
+ // TODO: Pass the clipboard text to the Share
handler!
+
+
+ Log.d("Share", ">>> Clipboard text: " +
clipboard.getPrimaryClip()
+
.getItemAt(0).coerceToText(PageActivity.this));
+
+ }
+
clipboard.removePrimaryClipChangedListener(clipListener);
+ }
+ };
+ }
+ // remove it first, just in case it was added from the last
context, and
+ // ended up not being used.
+ clipboard.removePrimaryClipChangedListener(clipListener);
+ // and add it again.
+ clipboard.addPrimaryClipChangedListener(clipListener);
+
+ // inject our Share item into the menu...
MenuItem shareItem = menu.add(R.string.share_via);
shareItem.setIcon(app.getCurrentTheme() == WikipediaApp.THEME_DARK
? R.drawable.ic_share_dark
: R.drawable.ic_share);
MenuItemCompat.setShowAsAction(shareItem,
MenuItemCompat.SHOW_AS_ACTION_ALWAYS);
+
shareItem.setOnMenuItemClickListener(new
MenuItem.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
-
- // TODO: implement sharing of image with quote!
-
+ if (copyMenuItem != null) {
+ // programmatically invoke the copy-to-clipboard
action...
+ webViewActionMode.getMenu()
+
.performIdentifierAction(copyMenuItem.getItemId(), 0);
+ // this will trigger a state-change event in the
Clipboard, which we'll
+ // catch with our listener above.
+ }
+ // leave context mode...
if (webViewActionMode != null) {
webViewActionMode.finish();
}
--
To view, visit https://gerrit.wikimedia.org/r/181261
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I6c29eff4d9930bd218a9f686493cbcbc67d78691
Gerrit-PatchSet: 1
Gerrit-Project: apps/android/wikipedia
Gerrit-Branch: master
Gerrit-Owner: Dbrant <[email protected]>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits