BearND has uploaded a new change for review.

  https://gerrit.wikimedia.org/r/180372

Change subject: WIP: Long click action on link: save page
......................................................................

WIP: Long click action on link: save page

TODO:
[] handle more link types (like external links)
[] thumbnail of newly saved page is not showing up

Change-Id: I68d2616e4ed104a43636b053d3f2cafb14c2ef4b
---
M wikipedia/res/values-qq/strings.xml
R wikipedia/src/main/java/org/wikipedia/savedpages/SaveOtherPageTask.java
R wikipedia/src/main/java/org/wikipedia/savedpages/SaveOtherPagesHandler.java
M wikipedia/src/main/java/org/wikipedia/savedpages/SavedPagesFragment.java
M wikipedia/src/main/java/org/wikipedia/views/ObservableWebView.java
5 files changed, 131 insertions(+), 36 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/apps/android/wikipedia 
refs/changes/72/180372/1

diff --git a/wikipedia/res/values-qq/strings.xml 
b/wikipedia/res/values-qq/strings.xml
index 66fb2fe..048fd90 100644
--- a/wikipedia/res/values-qq/strings.xml
+++ b/wikipedia/res/values-qq/strings.xml
@@ -39,7 +39,7 @@
 {{Identical|Update saved page}}</string>
   <string name="dialog_prompt_refresh_all_saved_pages">Prompt before updating 
all saved pages</string>
   <string name="toast_saved_page_refreshed">Small toast (popup) message saying 
that all saved pages were updated</string>
-  <string name="menu_save_page">Menu item text for saving the currently active 
page.
+  <string name="menu_save_page">Menu item text for saving the currently active 
or a linked page.
 {{Identical|Save page}}</string>
   <string name="menu_share_page">Menu item text for sharing the currently 
active page. Uses the build-in Android sharing functionality, so translate it 
the same way as the operating system does.
 {{Identical|Share}}</string>
diff --git 
a/wikipedia/src/main/java/org/wikipedia/savedpages/RefreshSavedPageTask.java 
b/wikipedia/src/main/java/org/wikipedia/savedpages/SaveOtherPageTask.java
similarity index 75%
rename from 
wikipedia/src/main/java/org/wikipedia/savedpages/RefreshSavedPageTask.java
rename to 
wikipedia/src/main/java/org/wikipedia/savedpages/SaveOtherPageTask.java
index bfd0e56..9177f93 100644
--- a/wikipedia/src/main/java/org/wikipedia/savedpages/RefreshSavedPageTask.java
+++ b/wikipedia/src/main/java/org/wikipedia/savedpages/SaveOtherPageTask.java
@@ -7,6 +7,7 @@
 import org.mediawiki.api.json.Api;
 import org.mediawiki.api.json.ApiResult;
 import org.mediawiki.api.json.RequestBuilder;
+import org.wikipedia.PageTitle;
 import org.wikipedia.WikipediaApp;
 import org.wikipedia.page.Page;
 import org.wikipedia.page.PageProperties;
@@ -17,18 +18,19 @@
 import java.util.List;
 import java.util.concurrent.CountDownLatch;
 
-public class RefreshSavedPageTask extends SectionsFetchTask {
-    private final SavedPage savedPage;
+/**
+ * A task to save a page we're not currently on.
+ * It gets the page content of the other page and then uses {@link 
SavePageTask} to save it.
+ */
+public class SaveOtherPageTask extends SectionsFetchTask {
+    private final PageTitle pageTitle;
     private final WikipediaApp app;
 
-    private PageProperties pageProperties;
-
-    public RefreshSavedPageTask(Context context, SavedPage savedPage) {
-        super(context, savedPage.getTitle(), "all");
-        this.savedPage = savedPage;
+    public SaveOtherPageTask(Context context, PageTitle pageTitle) {
+        super(context, pageTitle, "all");
+        this.pageTitle = pageTitle;
         this.app = WikipediaApp.getInstance();
     }
-
 
     @Override
     public RequestBuilder buildRequest(Api api) {
@@ -42,9 +44,9 @@
     public List<Section> processResult(ApiResult result) throws Throwable {
         JSONObject mobileView = result.asObject().optJSONObject("mobileview");
         if (mobileView != null) {
-            pageProperties = PageProperties.parseJSON(mobileView);
+            PageProperties pageProperties = 
PageProperties.parseJSON(mobileView);
             List<Section> sections = super.processResult(result);
-            final Page page = new Page(savedPage.getTitle(), 
(ArrayList<Section>) sections, pageProperties);
+            final Page page = new Page(pageTitle, (ArrayList<Section>) 
sections, pageProperties);
             final CountDownLatch savePagesLatch = new CountDownLatch(1);
             new Handler(Looper.getMainLooper()).post(new Runnable() {
                 @Override
diff --git 
a/wikipedia/src/main/java/org/wikipedia/savedpages/RefreshPagesHandler.java 
b/wikipedia/src/main/java/org/wikipedia/savedpages/SaveOtherPagesHandler.java
similarity index 71%
rename from 
wikipedia/src/main/java/org/wikipedia/savedpages/RefreshPagesHandler.java
rename to 
wikipedia/src/main/java/org/wikipedia/savedpages/SaveOtherPagesHandler.java
index 8b97814..dfcb04a 100644
--- a/wikipedia/src/main/java/org/wikipedia/savedpages/RefreshPagesHandler.java
+++ 
b/wikipedia/src/main/java/org/wikipedia/savedpages/SaveOtherPagesHandler.java
@@ -6,15 +6,17 @@
 import android.content.DialogInterface;
 import android.util.Log;
 import android.widget.Toast;
+
+import org.wikipedia.PageTitle;
 import org.wikipedia.R;
 import org.wikipedia.page.Section;
 
 import java.util.List;
 
 /**
- * Handler for refreshing a list of Saved Pages
+ * Handler for refreshing a list of Saved Pages or saving new Saved Pages.
  */
-public class RefreshPagesHandler {
+public class SaveOtherPagesHandler {
     /**
      * Variable set to true if the refresh in progress has been cancelled
      */
@@ -23,19 +25,39 @@
      * Variable used to track number of  saved pages that have been completed 
so far
      */
     private int savedPagesCompleted = 0;
-    private final List<SavedPage> savedPages;
+    private final int completeMessage;
+    private final int errorMessage;
+
+    private final List<PageTitle> pageTitles;
     private final Context context;
     private ProgressDialog progressDialog;
 
-    public RefreshPagesHandler(Context context, List<SavedPage> savedPages) {
-        this.savedPages = savedPages;
+    /**
+     * Use this constructor for refreshing saved pages.
+     */
+    public SaveOtherPagesHandler(Context context, List<PageTitle> pageTitles) {
+        this(context,
+                pageTitles,
+                R.string.saved_pages_progress_title,
+                R.string.saved_pages_refresh_pages_complete,
+                R.string.saved_pages_update_all_error_message);
+    }
+
+    /**
+     * Use this constructor for other situations, providing custom messages.
+     */
+    public SaveOtherPagesHandler(Context context, List<PageTitle> pageTitles, 
int progressTitle,
+                                 int completeMessage, int errorMessage) {
+        this.pageTitles = pageTitles;
         this.context = context;
+        this.completeMessage = completeMessage;
+        this.errorMessage = errorMessage;
 
         progressDialog = new ProgressDialog(context);
         progressDialog.setIndeterminate(false);
-        progressDialog.setMax(savedPages.size());
+        progressDialog.setMax(pageTitles.size());
         progressDialog.setProgress(0);
-        
progressDialog.setMessage(context.getResources().getString(R.string.saved_pages_progress_title));
+        
progressDialog.setMessage(context.getResources().getString(progressTitle));
         progressDialog.setCanceledOnTouchOutside(false);
         progressDialog.setOnCancelListener(new 
DialogInterface.OnCancelListener() {
             @Override
@@ -62,16 +84,16 @@
         isRefreshCancelled = false;
         savedPagesCompleted = 0;
         progressDialog.show();
-        for (int i = 0; i < savedPages.size(); i++) {
-            final SavedPage savedPage = savedPages.get(i);
-                new RefreshSavedPageTask(context, savedPage) {
+        for (int i = 0; i < pageTitles.size(); i++) {
+            final PageTitle pageTitle = pageTitles.get(i);
+                new SaveOtherPageTask(context, pageTitle) {
                     @Override
                     public void onBeforeExecute() {
                         if (isRefreshCancelled) {
                             cancel();
                             return;
                         }
-                        Log.d("Wikipedia", "refreshing start: " + 
savedPage.getTitle().getDisplayText());
+                        Log.d("Wikipedia", "refreshing start: " + 
pageTitle.getDisplayText());
                     }
 
                     @Override
@@ -83,12 +105,12 @@
                         }
                         savedPagesCompleted++;
                         progressDialog.setProgress(savedPagesCompleted);
-                        Log.d("Wikipedia", "Count is " + savedPagesCompleted + 
" of " + savedPages.size());
-                        if (savedPagesCompleted == savedPages.size()) {
+                        Log.d("Wikipedia", "Count is " + savedPagesCompleted + 
" of " + pageTitles.size());
+                        if (savedPagesCompleted == pageTitles.size()) {
                             progressDialog.dismiss();
-                            Toast.makeText(context, 
R.string.saved_pages_refresh_pages_complete, Toast.LENGTH_LONG).show();
+                            Toast.makeText(context, completeMessage, 
Toast.LENGTH_LONG).show();
                         }
-                        Log.d("Wikipedia", "refreshing end: " + 
savedPage.getTitle().getDisplayText());
+                        Log.d("Wikipedia", "refreshing end: " + 
pageTitle.getDisplayText());
                     }
 
                     @Override
@@ -108,7 +130,7 @@
     private AlertDialog errorDialog;
 
     /**
-     * Returns a persistant dialog we can use to show errors.
+     * Returns a persistent dialog we can use to show errors.
      * @return A properly setup AlertDialog with handlers for retry and cancel.
      */
     private AlertDialog getErrorDialog() {
@@ -127,7 +149,7 @@
                             dialogInterface.dismiss();
                         }
                     })
-                    .setMessage(R.string.saved_pages_update_all_error_message)
+                    .setMessage(errorMessage)
                     .show();
         }
         return errorDialog;
diff --git 
a/wikipedia/src/main/java/org/wikipedia/savedpages/SavedPagesFragment.java 
b/wikipedia/src/main/java/org/wikipedia/savedpages/SavedPagesFragment.java
index e99a72a..08e88cb 100644
--- a/wikipedia/src/main/java/org/wikipedia/savedpages/SavedPagesFragment.java
+++ b/wikipedia/src/main/java/org/wikipedia/savedpages/SavedPagesFragment.java
@@ -19,6 +19,8 @@
 import android.view.*;
 import android.widget.*;
 import com.squareup.picasso.Picasso;
+
+import org.wikipedia.PageTitle;
 import org.wikipedia.R;
 import org.wikipedia.WikipediaApp;
 import org.wikipedia.history.HistoryEntry;
@@ -36,7 +38,7 @@
     private TextView savedPagesEmptyTitle;
     private TextView savedPagesEmptyMessage;
     private SavedPagesAdapter adapter;
-    private RefreshPagesHandler refreshHandler;
+    private SaveOtherPagesHandler refreshHandler;
     private EditText entryFilter;
     private ImageView savedPagesEmptyImage;
 
@@ -345,24 +347,24 @@
 
     private void refreshSelected() {
         SparseBooleanArray checkedItems = 
savedPagesList.getCheckedItemPositions();
-        ArrayList<SavedPage> savedPages = new ArrayList<SavedPage>();
+        ArrayList<PageTitle> pageTitles = new ArrayList<PageTitle>();
         for (int i = 0; i < checkedItems.size(); i++) {
             if (checkedItems.valueAt(i)) {
                 SavedPage page = 
SavedPage.PERSISTANCE_HELPER.fromCursor((Cursor) 
adapter.getItem(checkedItems.keyAt(i)));
-                savedPages.add(page);
+                pageTitles.add(page.getTitle());
             }
         }
-        refreshHandler = new RefreshPagesHandler(getActivity(), savedPages);
+        refreshHandler = new SaveOtherPagesHandler(getActivity(), pageTitles);
         refreshHandler.refresh();
     }
 
     private void refreshAll() {
-        ArrayList<SavedPage> savedPages = new ArrayList<SavedPage>();
+        ArrayList<PageTitle> pageTitles = new ArrayList<PageTitle>();
         for (int i = 0; i < adapter.getCount(); i++) {
             SavedPage page = SavedPage.PERSISTANCE_HELPER.fromCursor((Cursor) 
adapter.getItem(i));
-            savedPages.add(page);
+            pageTitles.add(page.getTitle());
         }
-        refreshHandler = new RefreshPagesHandler(getActivity(), savedPages);
+        refreshHandler = new SaveOtherPagesHandler(getActivity(), pageTitles);
         refreshHandler.refresh();
     }
 
diff --git a/wikipedia/src/main/java/org/wikipedia/views/ObservableWebView.java 
b/wikipedia/src/main/java/org/wikipedia/views/ObservableWebView.java
index 325ef33..79546f8 100644
--- a/wikipedia/src/main/java/org/wikipedia/views/ObservableWebView.java
+++ b/wikipedia/src/main/java/org/wikipedia/views/ObservableWebView.java
@@ -1,18 +1,28 @@
 package org.wikipedia.views;
 
 import android.content.Context;
+import android.graphics.Canvas;
+import android.net.Uri;
 import android.util.AttributeSet;
+import android.view.ContextMenu;
+import android.view.MenuItem;
 import android.view.MotionEvent;
 import android.webkit.WebView;
+
+import org.wikipedia.PageTitle;
+import org.wikipedia.R;
 import org.wikipedia.WikipediaApp;
 import org.wikipedia.events.WebViewInvalidateEvent;
-import android.graphics.Canvas;
+import org.wikipedia.savedpages.SaveOtherPagesHandler;
+
 import java.util.ArrayList;
 import java.util.List;
 
 public class ObservableWebView extends WebView {
+    private static final int ID_SAVE_PAGE = 102;
     private static final WebViewInvalidateEvent INVALIDATE_EVENT = new 
WebViewInvalidateEvent();
 
+    private final LongPressActions longPressActions = new LongPressActions();
     private List<OnScrollChangeListener> onScrollChangeListeners;
     private List<OnDownMotionEventListener> onDownMotionEventListeners;
     private List<OnUpOrCancelMotionEventListener> 
onUpOrCancelMotionEventListeners;
@@ -124,4 +134,63 @@
         }
         WikipediaApp.getInstance().getBus().post(INVALIDATE_EVENT);
     }
+
+    @Override
+    protected void onCreateContextMenu(ContextMenu menu) {
+        super.onCreateContextMenu(menu);
+        longPressActions.setupLinkContextMenu(getContext(), menu, 
getHitTestResult());
+    }
+
+    /**
+     * Handle all long press actions on this webView
+     */
+    private static class LongPressActions {
+        private Context context;
+        private PageTitle title;
+
+        private void setupLinkContextMenu(Context context, ContextMenu menu, 
HitTestResult result) {
+            this.context = context;
+            WikipediaApp app = (WikipediaApp) context.getApplicationContext();
+            if (result.getType() == HitTestResult.SRC_ANCHOR_TYPE
+                    || result.getType() == HitTestResult.ANCHOR_TYPE) {
+                // Menu options for a hyperlink.
+                // set the header title to the page name
+                String url = result.getExtra();
+                Uri uri = Uri.parse(url);
+                final String authority = uri.getAuthority();
+                if ("wikipedia.org".equals(authority)) {
+                    // it's really a "/wiki/" link
+                    title = 
app.getPrimarySite().titleForInternalLink(uri.getPath());
+                    menu.setHeaderTitle(title.getDisplayText());
+                    menu.add(0, ID_SAVE_PAGE, 0, 
context.getString(R.string.menu_save_page))
+                            .setOnMenuItemClickListener(handler);
+                } else {
+                    // TODO
+                    title = null;
+                }
+            }
+        }
+
+        MenuItem.OnMenuItemClickListener handler = new 
MenuItem.OnMenuItemClickListener() {
+            public boolean onMenuItemClick(MenuItem item) {
+                switch (item.getItemId()) {
+                    case ID_SAVE_PAGE:
+                        saveOtherPage();
+                        break;
+                }
+                return true;
+            }
+        };
+
+        private void saveOtherPage() {
+            ArrayList<PageTitle> titles = new ArrayList<PageTitle>();
+            titles.add(title);
+            SaveOtherPagesHandler refreshHandler = new 
SaveOtherPagesHandler(context,
+                    titles,
+                    R.string.toast_saving_page,
+                    R.string.toast_saved_page,
+                    R.string.toast_save_page_failed);
+            refreshHandler.refresh();
+        }
+    }
 }

-- 
To view, visit https://gerrit.wikimedia.org/r/180372
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I68d2616e4ed104a43636b053d3f2cafb14c2ef4b
Gerrit-PatchSet: 1
Gerrit-Project: apps/android/wikipedia
Gerrit-Branch: master
Gerrit-Owner: BearND <bsitzm...@wikimedia.org>

_______________________________________________
MediaWiki-commits mailing list
MediaWiki-commits@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to