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