package org.wikipedia; import android.net.Uri; import android.support.annotation.NonNull; import android.view.ContextMenu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.webkit.WebView; import android.widget.AdapterView; import android.widget.ListView; import org.wikipedia.dataclient.WikiSite; import org.wikipedia.history.HistoryEntry; import org.wikipedia.page.PageTitle; import org.wikipedia.readinglist.AddToReadingListDialog; import static org.wikipedia.util.DeviceUtil.hideSoftKeyboard; import static org.wikipedia.util.UriUtil.isValidPageLink; public class LongPressHandler implements View.OnCreateContextMenuListener, MenuItem.OnMenuItemClickListener { private final ContextMenuListener contextMenuListener; private final int historySource; private PageTitle title; private HistoryEntry entry; public LongPressHandler(@NonNull View view, int historySource, @NonNull ContextMenuListener listener) { this.historySource = historySource; this.contextMenuListener = listener; view.setOnCreateContextMenuListener(this); } @Override public void onCreateContextMenu(ContextMenu menu, View view, ContextMenu.ContextMenuInfo menuInfo) { title = null; if (view instanceof WebView) { WebView.HitTestResult result = ((WebView) view).getHitTestResult(); if (result.getType() == WebView.HitTestResult.SRC_ANCHOR_TYPE) { Uri uri = Uri.parse(result.getExtra()); if (isValidPageLink(uri)) { title = ((WebViewContextMenuListener) contextMenuListener).getWikiSite() .titleForInternalLink(uri.getPath()); } } } else if (view instanceof ListView) { AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) menuInfo; title = ((ListViewContextMenuListener) contextMenuListener) .getTitleForListPosition(info.position); } if (title != null && !title.isSpecial()) { hideSoftKeyboard(view); entry = new HistoryEntry(title, historySource); new MenuInflater(view.getContext()).inflate(R.menu.menu_page_long_press, menu); menu.setHeaderTitle(title.getDisplayText()); for (int i = 0; i < menu.size(); i++) { menu.getItem(i).setOnMenuItemClickListener(this); } } } @Override public boolean onMenuItemClick(MenuItem item) { switch (item.getItemId()) { case R.id.menu_long_press_open_page: contextMenuListener.onOpenLink(title, entry); return true; case R.id.menu_long_press_open_in_new_tab: contextMenuListener.onOpenInNewTab(title, entry); return true; case R.id.menu_long_press_copy_page: contextMenuListener.onCopyLink(title); return true; case R.id.menu_long_press_share_page: contextMenuListener.onShareLink(title); return true; case R.id.menu_long_press_add_to_list: contextMenuListener.onAddToList(title, AddToReadingListDialog.InvokeSource.CONTEXT_MENU); return true; default: return false; } } public interface ContextMenuListener { void onOpenLink(PageTitle title, HistoryEntry entry); void onOpenInNewTab(PageTitle title, HistoryEntry entry); void onCopyLink(PageTitle title); void onShareLink(PageTitle title); void onAddToList(PageTitle title, AddToReadingListDialog.InvokeSource source); } public interface ListViewContextMenuListener extends ContextMenuListener { PageTitle getTitleForListPosition(int position); } public interface WebViewContextMenuListener extends ContextMenuListener { WikiSite getWikiSite(); } }