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

Reply via email to