11a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira/* 21a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira * Copyright (C) 2011 Google Inc. 31a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira * Licensed to The Android Open Source Project. 41a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira * 51a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira * Licensed under the Apache License, Version 2.0 (the "License"); 61a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira * you may not use this file except in compliance with the License. 71a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira * You may obtain a copy of the License at 81a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira * 91a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira * http://www.apache.org/licenses/LICENSE-2.0 101a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira * 111a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira * Unless required by applicable law or agreed to in writing, software 121a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira * distributed under the License is distributed on an "AS IS" BASIS, 131a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 141a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira * See the License for the specific language governing permissions and 151a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira * limitations under the License. 161a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira */ 171a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira 1830e2c24b056542f3b1b438aeb798305d1226d0c8Andy Huangpackage com.android.mail.browse; 191a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira 201a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereiraimport android.app.Activity; 211a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereiraimport android.content.ClipData; 221a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereiraimport android.content.ClipboardManager; 231a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereiraimport android.content.Context; 241a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereiraimport android.content.Intent; 251a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereiraimport android.content.pm.PackageManager; 261a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereiraimport android.content.pm.ResolveInfo; 271a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereiraimport android.net.Uri; 281a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereiraimport android.provider.ContactsContract; 291a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereiraimport android.view.ContextMenu; 301a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereiraimport android.view.ContextMenu.ContextMenuInfo; 311a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereiraimport android.view.MenuInflater; 321a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereiraimport android.view.MenuItem; 331a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereiraimport android.view.View; 341a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereiraimport android.view.View.OnCreateContextMenuListener; 351a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereiraimport android.webkit.WebView; 361a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira 370b7ed6fae6e36f2abc4ca916764177d1879731b4Andy Huangimport com.android.mail.R; 385b18d791a38885faf3315707221804e9187e027cAndrew Sappersteinimport com.android.mail.analytics.Analytics; 393c6fd44f9ae0cf60248dc64ee74d46afed633c45Andy Huangimport com.android.mail.providers.Message; 400b7ed6fae6e36f2abc4ca916764177d1879731b4Andy Huang 411a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereiraimport java.io.UnsupportedEncodingException; 421a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereiraimport java.net.URLDecoder; 431a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereiraimport java.net.URLEncoder; 441a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereiraimport java.nio.charset.Charset; 451a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira 461a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira/** 471a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira * <p>Handles display and behavior of the context menu for known actionable content in WebViews. 481a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira * Requires an Activity to bind to for Context resolution and to start other activites.</p> 491a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira * <br> 501a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira * Dependencies: 511a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira * <ul> 521a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira * <li>res/menu/webview_context_menu.xml</li> 531a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira * </ul> 541a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira */ 550b7ed6fae6e36f2abc4ca916764177d1879731b4Andy Huangpublic class WebViewContextMenu implements OnCreateContextMenuListener, 561a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira MenuItem.OnMenuItemClickListener { 571a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira 588ec43e877a9c1925514f066655984e21fbd255e8Andrew Sapperstein private final Activity mActivity; 598ec43e877a9c1925514f066655984e21fbd255e8Andrew Sapperstein private final InlineAttachmentViewIntentBuilder mIntentBuilder; 608ec43e877a9c1925514f066655984e21fbd255e8Andrew Sapperstein 610c7f1c183c90c14a9920372b71434b9b29bd5b4dAndrew Sapperstein private final boolean mSupportsDial; 620c7f1c183c90c14a9920372b71434b9b29bd5b4dAndrew Sapperstein private final boolean mSupportsSms; 630c7f1c183c90c14a9920372b71434b9b29bd5b4dAndrew Sapperstein 643c6fd44f9ae0cf60248dc64ee74d46afed633c45Andy Huang private Callbacks mCallbacks; 653c6fd44f9ae0cf60248dc64ee74d46afed633c45Andy Huang 665b18d791a38885faf3315707221804e9187e027cAndrew Sapperstein // Strings used for analytics. 675b18d791a38885faf3315707221804e9187e027cAndrew Sapperstein private static final String CATEGORY_WEB_CONTEXT_MENU = "web_context_menu"; 685b18d791a38885faf3315707221804e9187e027cAndrew Sapperstein private static final String ACTION_LONG_PRESS = "long_press"; 695b18d791a38885faf3315707221804e9187e027cAndrew Sapperstein private static final String ACTION_CLICK = "menu_clicked"; 705b18d791a38885faf3315707221804e9187e027cAndrew Sapperstein 711a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira protected static enum MenuType { 721a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira OPEN_MENU, 731a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira COPY_LINK_MENU, 741a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira SHARE_LINK_MENU, 751a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira DIAL_MENU, 761a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira SMS_MENU, 771a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira ADD_CONTACT_MENU, 781a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira COPY_PHONE_MENU, 791a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira EMAIL_CONTACT_MENU, 801a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira COPY_MAIL_MENU, 811a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira MAP_MENU, 821a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira COPY_GEO_MENU, 831a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira } 841a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira 853c6fd44f9ae0cf60248dc64ee74d46afed633c45Andy Huang public interface Callbacks { 863c6fd44f9ae0cf60248dc64ee74d46afed633c45Andy Huang /** 873c6fd44f9ae0cf60248dc64ee74d46afed633c45Andy Huang * Given a URL the user clicks/long-presses on, get the {@link Message} whose body contains 883c6fd44f9ae0cf60248dc64ee74d46afed633c45Andy Huang * that URL. 893c6fd44f9ae0cf60248dc64ee74d46afed633c45Andy Huang * 903c6fd44f9ae0cf60248dc64ee74d46afed633c45Andy Huang * @param url URL of a selected link 913c6fd44f9ae0cf60248dc64ee74d46afed633c45Andy Huang * @return Message containing that URL 923c6fd44f9ae0cf60248dc64ee74d46afed633c45Andy Huang */ 93833123d9c31b0b2dd23f7f74738c5bccf8a546d3Andrew Sapperstein ConversationMessage getMessageForClickedUrl(String url); 943c6fd44f9ae0cf60248dc64ee74d46afed633c45Andy Huang } 953c6fd44f9ae0cf60248dc64ee74d46afed633c45Andy Huang 968ec43e877a9c1925514f066655984e21fbd255e8Andrew Sapperstein public WebViewContextMenu(Activity host, InlineAttachmentViewIntentBuilder builder) { 970b7ed6fae6e36f2abc4ca916764177d1879731b4Andy Huang mActivity = host; 988ec43e877a9c1925514f066655984e21fbd255e8Andrew Sapperstein mIntentBuilder = builder; 990c7f1c183c90c14a9920372b71434b9b29bd5b4dAndrew Sapperstein 1000c7f1c183c90c14a9920372b71434b9b29bd5b4dAndrew Sapperstein // Query the package manager to see if the device 1010c7f1c183c90c14a9920372b71434b9b29bd5b4dAndrew Sapperstein // has an app that supports ACTION_DIAL or ACTION_SENDTO 1020c7f1c183c90c14a9920372b71434b9b29bd5b4dAndrew Sapperstein // with the appropriate uri schemes. 1030c7f1c183c90c14a9920372b71434b9b29bd5b4dAndrew Sapperstein final PackageManager pm = mActivity.getPackageManager(); 1040c7f1c183c90c14a9920372b71434b9b29bd5b4dAndrew Sapperstein mSupportsDial = !pm.queryIntentActivities( 1050c7f1c183c90c14a9920372b71434b9b29bd5b4dAndrew Sapperstein new Intent(Intent.ACTION_DIAL, Uri.parse(WebView.SCHEME_TEL)), 1060c7f1c183c90c14a9920372b71434b9b29bd5b4dAndrew Sapperstein PackageManager.MATCH_DEFAULT_ONLY).isEmpty(); 1070c7f1c183c90c14a9920372b71434b9b29bd5b4dAndrew Sapperstein mSupportsSms = !pm.queryIntentActivities( 1080c7f1c183c90c14a9920372b71434b9b29bd5b4dAndrew Sapperstein new Intent(Intent.ACTION_SENDTO, Uri.parse("smsto:")), 1090c7f1c183c90c14a9920372b71434b9b29bd5b4dAndrew Sapperstein PackageManager.MATCH_DEFAULT_ONLY).isEmpty(); 1101a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira } 1111a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira 1123c6fd44f9ae0cf60248dc64ee74d46afed633c45Andy Huang public void setCallbacks(Callbacks cb) { 1133c6fd44f9ae0cf60248dc64ee74d46afed633c45Andy Huang mCallbacks = cb; 1143c6fd44f9ae0cf60248dc64ee74d46afed633c45Andy Huang } 1153c6fd44f9ae0cf60248dc64ee74d46afed633c45Andy Huang 1165b18d791a38885faf3315707221804e9187e027cAndrew Sapperstein /** 1175b18d791a38885faf3315707221804e9187e027cAndrew Sapperstein * Abstract base class that automates sending an analytics event 1185b18d791a38885faf3315707221804e9187e027cAndrew Sapperstein * when the menu item is clicked. 1195b18d791a38885faf3315707221804e9187e027cAndrew Sapperstein */ 1205b18d791a38885faf3315707221804e9187e027cAndrew Sapperstein private abstract class AnalyticsClick implements MenuItem.OnMenuItemClickListener { 1215b18d791a38885faf3315707221804e9187e027cAndrew Sapperstein private final String mAnalyticsLabel; 1225b18d791a38885faf3315707221804e9187e027cAndrew Sapperstein 1235b18d791a38885faf3315707221804e9187e027cAndrew Sapperstein public AnalyticsClick(String analyticsLabel) { 1245b18d791a38885faf3315707221804e9187e027cAndrew Sapperstein mAnalyticsLabel = analyticsLabel; 1255b18d791a38885faf3315707221804e9187e027cAndrew Sapperstein } 1265b18d791a38885faf3315707221804e9187e027cAndrew Sapperstein 1275b18d791a38885faf3315707221804e9187e027cAndrew Sapperstein @Override 1285b18d791a38885faf3315707221804e9187e027cAndrew Sapperstein public final boolean onMenuItemClick(MenuItem item) { 1295b18d791a38885faf3315707221804e9187e027cAndrew Sapperstein Analytics.getInstance().sendEvent( 1305b18d791a38885faf3315707221804e9187e027cAndrew Sapperstein CATEGORY_WEB_CONTEXT_MENU, ACTION_CLICK, mAnalyticsLabel, 0); 1315b18d791a38885faf3315707221804e9187e027cAndrew Sapperstein return onClick(); 1325b18d791a38885faf3315707221804e9187e027cAndrew Sapperstein } 1335b18d791a38885faf3315707221804e9187e027cAndrew Sapperstein 1345b18d791a38885faf3315707221804e9187e027cAndrew Sapperstein public abstract boolean onClick(); 1355b18d791a38885faf3315707221804e9187e027cAndrew Sapperstein } 1365b18d791a38885faf3315707221804e9187e027cAndrew Sapperstein 1371a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira // For our copy menu items. 1385b18d791a38885faf3315707221804e9187e027cAndrew Sapperstein private class Copy extends AnalyticsClick { 1391a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira private final CharSequence mText; 1401a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira 1415b18d791a38885faf3315707221804e9187e027cAndrew Sapperstein public Copy(CharSequence text, String analyticsLabel) { 1425b18d791a38885faf3315707221804e9187e027cAndrew Sapperstein super(analyticsLabel); 1431a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira mText = text; 1441a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira } 1451a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira 1461a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira @Override 1475b18d791a38885faf3315707221804e9187e027cAndrew Sapperstein public boolean onClick() { 1485b18d791a38885faf3315707221804e9187e027cAndrew Sapperstein ClipboardManager clipboard = 1495b18d791a38885faf3315707221804e9187e027cAndrew Sapperstein (ClipboardManager) mActivity.getSystemService(Context.CLIPBOARD_SERVICE); 1505b18d791a38885faf3315707221804e9187e027cAndrew Sapperstein clipboard.setPrimaryClip(ClipData.newPlainText(null, mText)); 1511a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira return true; 1521a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira } 1531a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira } 1541a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira 1555b18d791a38885faf3315707221804e9187e027cAndrew Sapperstein /** 1565b18d791a38885faf3315707221804e9187e027cAndrew Sapperstein * Sends an intent and reports the analytics event. 1575b18d791a38885faf3315707221804e9187e027cAndrew Sapperstein */ 1585b18d791a38885faf3315707221804e9187e027cAndrew Sapperstein private class SendIntent extends AnalyticsClick { 1595b18d791a38885faf3315707221804e9187e027cAndrew Sapperstein private Intent mIntent; 1601a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira 1615b18d791a38885faf3315707221804e9187e027cAndrew Sapperstein public SendIntent(String analyticsLabel) { 1625b18d791a38885faf3315707221804e9187e027cAndrew Sapperstein super(analyticsLabel); 1635b18d791a38885faf3315707221804e9187e027cAndrew Sapperstein } 1645b18d791a38885faf3315707221804e9187e027cAndrew Sapperstein 1655b18d791a38885faf3315707221804e9187e027cAndrew Sapperstein public SendIntent(Intent intent, String analyticsLabel) { 1665b18d791a38885faf3315707221804e9187e027cAndrew Sapperstein super(analyticsLabel); 1675b18d791a38885faf3315707221804e9187e027cAndrew Sapperstein setIntent(intent); 1685b18d791a38885faf3315707221804e9187e027cAndrew Sapperstein } 1695b18d791a38885faf3315707221804e9187e027cAndrew Sapperstein 1705b18d791a38885faf3315707221804e9187e027cAndrew Sapperstein void setIntent(Intent intent) { 1715b18d791a38885faf3315707221804e9187e027cAndrew Sapperstein mIntent = intent; 1721a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira } 1731a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira 1741a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira @Override 1755b18d791a38885faf3315707221804e9187e027cAndrew Sapperstein public final boolean onClick() { 1765b18d791a38885faf3315707221804e9187e027cAndrew Sapperstein try { 1775b18d791a38885faf3315707221804e9187e027cAndrew Sapperstein mActivity.startActivity(mIntent); 1785b18d791a38885faf3315707221804e9187e027cAndrew Sapperstein } catch(android.content.ActivityNotFoundException ex) { 1795b18d791a38885faf3315707221804e9187e027cAndrew Sapperstein // if no app handles it, do nothing 1805b18d791a38885faf3315707221804e9187e027cAndrew Sapperstein } 1811a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira return true; 1821a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira } 1831a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira } 1841a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira 1855b18d791a38885faf3315707221804e9187e027cAndrew Sapperstein // For our share menu items. 1865b18d791a38885faf3315707221804e9187e027cAndrew Sapperstein private class Share extends SendIntent { 1875b18d791a38885faf3315707221804e9187e027cAndrew Sapperstein public Share(String url, String analyticsLabel) { 1885b18d791a38885faf3315707221804e9187e027cAndrew Sapperstein super(analyticsLabel); 1895b18d791a38885faf3315707221804e9187e027cAndrew Sapperstein final Intent send = new Intent(Intent.ACTION_SEND); 1905b18d791a38885faf3315707221804e9187e027cAndrew Sapperstein send.setType("text/plain"); 1915b18d791a38885faf3315707221804e9187e027cAndrew Sapperstein send.putExtra(Intent.EXTRA_TEXT, url); 1925b18d791a38885faf3315707221804e9187e027cAndrew Sapperstein setIntent(Intent.createChooser(send, mActivity.getText( 1935b18d791a38885faf3315707221804e9187e027cAndrew Sapperstein getChooserTitleStringResIdForMenuType(MenuType.SHARE_LINK_MENU)))); 1945b18d791a38885faf3315707221804e9187e027cAndrew Sapperstein } 1955b18d791a38885faf3315707221804e9187e027cAndrew Sapperstein } 1965b18d791a38885faf3315707221804e9187e027cAndrew Sapperstein 1971a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira private boolean showShareLinkMenuItem() { 1981a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira PackageManager pm = mActivity.getPackageManager(); 1991a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira Intent send = new Intent(Intent.ACTION_SEND); 2001a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira send.setType("text/plain"); 2011a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira ResolveInfo ri = pm.resolveActivity(send, PackageManager.MATCH_DEFAULT_ONLY); 2021a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira return ri != null; 2031a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira } 2041a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira 2050b7ed6fae6e36f2abc4ca916764177d1879731b4Andy Huang @Override 2060b7ed6fae6e36f2abc4ca916764177d1879731b4Andy Huang public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo info) { 2071a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira // FIXME: This is copied over almost directly from BrowserActivity. 2081a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira // Would like to find a way to combine the two (Bug 1251210). 2091a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira 2101a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira WebView webview = (WebView) v; 2111a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira WebView.HitTestResult result = webview.getHitTestResult(); 2121a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira if (result == null) { 2131a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira return; 2141a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira } 2151a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira 2161a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira int type = result.getType(); 2171a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira switch (type) { 2181a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira case WebView.HitTestResult.UNKNOWN_TYPE: 2195b18d791a38885faf3315707221804e9187e027cAndrew Sapperstein Analytics.getInstance().sendEvent( 2205b18d791a38885faf3315707221804e9187e027cAndrew Sapperstein CATEGORY_WEB_CONTEXT_MENU, ACTION_LONG_PRESS, "unknown", 0); 2215b18d791a38885faf3315707221804e9187e027cAndrew Sapperstein return; 2221a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira case WebView.HitTestResult.EDIT_TEXT_TYPE: 2235b18d791a38885faf3315707221804e9187e027cAndrew Sapperstein Analytics.getInstance().sendEvent( 2245b18d791a38885faf3315707221804e9187e027cAndrew Sapperstein CATEGORY_WEB_CONTEXT_MENU, ACTION_LONG_PRESS, "edit_text", 0); 2251a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira return; 2261a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira default: 2271a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira break; 2281a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira } 2291a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira 2301a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira // Note, http://b/issue?id=1106666 is requesting that 2311a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira // an inflated menu can be used again. This is not available 2321a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira // yet, so inflate each time (yuk!) 2331a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira MenuInflater inflater = mActivity.getMenuInflater(); 2341a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira // Also, we are copying the menu file from browser until 2351a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira // 1251210 is fixed. 2361a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira inflater.inflate(getMenuResourceId(), menu); 2371a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira 2381a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira // Initially make set the menu item handler this WebViewContextMenu, which will default to 2391a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira // calling the non-abstract subclass's implementation. 2401a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira for (int i = 0; i < menu.size(); i++) { 2411a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira final MenuItem menuItem = menu.getItem(i); 2421a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira menuItem.setOnMenuItemClickListener(this); 2431a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira } 2441a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira 2451a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira 2461a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira // Show the correct menu group 2471a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira String extra = result.getExtra(); 248e307785b44deec1eb2aad5ecf83ea4b581779baaAndrew Sapperstein menu.setGroupVisible(R.id.PHONE_MENU, type == WebView.HitTestResult.PHONE_TYPE); 249e307785b44deec1eb2aad5ecf83ea4b581779baaAndrew Sapperstein menu.setGroupVisible(R.id.EMAIL_MENU, type == WebView.HitTestResult.EMAIL_TYPE); 250e307785b44deec1eb2aad5ecf83ea4b581779baaAndrew Sapperstein menu.setGroupVisible(R.id.GEO_MENU, type == WebView.HitTestResult.GEO_TYPE); 251e307785b44deec1eb2aad5ecf83ea4b581779baaAndrew Sapperstein menu.setGroupVisible(R.id.ANCHOR_MENU, type == WebView.HitTestResult.SRC_ANCHOR_TYPE 252e307785b44deec1eb2aad5ecf83ea4b581779baaAndrew Sapperstein || type == WebView.HitTestResult.SRC_IMAGE_ANCHOR_TYPE); 25377f4af1767a61b50558200b94597d3682e4bc1e9Andrew Sapperstein menu.setGroupVisible(R.id.IMAGE_MENU, type == WebView.HitTestResult.IMAGE_TYPE 25477f4af1767a61b50558200b94597d3682e4bc1e9Andrew Sapperstein || type == WebView.HitTestResult.SRC_IMAGE_ANCHOR_TYPE); 2551a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira 2561a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira // Setup custom handling depending on the type 2571a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira switch (type) { 2581a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira case WebView.HitTestResult.PHONE_TYPE: 2595b18d791a38885faf3315707221804e9187e027cAndrew Sapperstein Analytics.getInstance().sendEvent( 2605b18d791a38885faf3315707221804e9187e027cAndrew Sapperstein CATEGORY_WEB_CONTEXT_MENU, ACTION_LONG_PRESS, "phone", 0); 2611a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira String decodedPhoneExtra; 2621a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira try { 2631a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira decodedPhoneExtra = URLDecoder.decode(extra, Charset.defaultCharset().name()); 264c1cc0c44c3471be83321d61a81533ee0b0d23060Jin Cao 265c1cc0c44c3471be83321d61a81533ee0b0d23060Jin Cao // International numbers start with '+' followed by the country code, etc. 266c1cc0c44c3471be83321d61a81533ee0b0d23060Jin Cao // However, during decode, the initial '+' is changed into ' '. 267c1cc0c44c3471be83321d61a81533ee0b0d23060Jin Cao // Let's special case that here to avoid losing that information. If the decoded 268c1cc0c44c3471be83321d61a81533ee0b0d23060Jin Cao // string starts with one space, let's replace that space with + since it's 269c1cc0c44c3471be83321d61a81533ee0b0d23060Jin Cao // impossible for the normal number string to start with a space. 270c1cc0c44c3471be83321d61a81533ee0b0d23060Jin Cao // b/10640197 271c1cc0c44c3471be83321d61a81533ee0b0d23060Jin Cao if (decodedPhoneExtra.startsWith(" ") && !decodedPhoneExtra.startsWith(" ")) { 272c1cc0c44c3471be83321d61a81533ee0b0d23060Jin Cao decodedPhoneExtra = decodedPhoneExtra.replaceFirst(" ", "+"); 273c1cc0c44c3471be83321d61a81533ee0b0d23060Jin Cao } 2745b18d791a38885faf3315707221804e9187e027cAndrew Sapperstein } catch (UnsupportedEncodingException ignore) { 2751a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira // Should never happen; default charset is UTF-8 2761a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira decodedPhoneExtra = extra; 2771a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira } 2781a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira 2791a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira menu.setHeaderTitle(decodedPhoneExtra); 2801a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira // Dial 2811a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira final MenuItem dialMenuItem = 2821a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira menu.findItem(getMenuResIdForMenuType(MenuType.DIAL_MENU)); 2830c7f1c183c90c14a9920372b71434b9b29bd5b4dAndrew Sapperstein 2840c7f1c183c90c14a9920372b71434b9b29bd5b4dAndrew Sapperstein if (mSupportsDial) { 2855b18d791a38885faf3315707221804e9187e027cAndrew Sapperstein final Intent intent = new Intent(Intent.ACTION_DIAL, 2865b18d791a38885faf3315707221804e9187e027cAndrew Sapperstein Uri.parse(WebView.SCHEME_TEL + extra)); 2875b18d791a38885faf3315707221804e9187e027cAndrew Sapperstein dialMenuItem.setOnMenuItemClickListener(new SendIntent(intent, "dial")); 2880c7f1c183c90c14a9920372b71434b9b29bd5b4dAndrew Sapperstein } else { 2890c7f1c183c90c14a9920372b71434b9b29bd5b4dAndrew Sapperstein dialMenuItem.setVisible(false); 2900c7f1c183c90c14a9920372b71434b9b29bd5b4dAndrew Sapperstein } 2911a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira 2921a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira // Send SMS 2931a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira final MenuItem sendSmsMenuItem = 2941a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira menu.findItem(getMenuResIdForMenuType(MenuType.SMS_MENU)); 2950c7f1c183c90c14a9920372b71434b9b29bd5b4dAndrew Sapperstein if (mSupportsSms) { 2965b18d791a38885faf3315707221804e9187e027cAndrew Sapperstein final Intent intent = 2975b18d791a38885faf3315707221804e9187e027cAndrew Sapperstein new Intent(Intent.ACTION_SENDTO, Uri.parse("smsto:" + extra)); 2985b18d791a38885faf3315707221804e9187e027cAndrew Sapperstein sendSmsMenuItem.setOnMenuItemClickListener(new SendIntent(intent, "sms")); 2990c7f1c183c90c14a9920372b71434b9b29bd5b4dAndrew Sapperstein } else { 3000c7f1c183c90c14a9920372b71434b9b29bd5b4dAndrew Sapperstein sendSmsMenuItem.setVisible(false); 3010c7f1c183c90c14a9920372b71434b9b29bd5b4dAndrew Sapperstein } 3021a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira 3031a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira // Add to contacts 3041a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira final Intent addIntent = new Intent(Intent.ACTION_INSERT_OR_EDIT); 3051a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira addIntent.setType(ContactsContract.Contacts.CONTENT_ITEM_TYPE); 3061a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira 3071a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira addIntent.putExtra(ContactsContract.Intents.Insert.PHONE, decodedPhoneExtra); 3081a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira final MenuItem addToContactsMenuItem = 3091a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira menu.findItem(getMenuResIdForMenuType(MenuType.ADD_CONTACT_MENU)); 3105b18d791a38885faf3315707221804e9187e027cAndrew Sapperstein addToContactsMenuItem.setOnMenuItemClickListener( 3115b18d791a38885faf3315707221804e9187e027cAndrew Sapperstein new SendIntent(addIntent, "add_contact")); 3121a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira 3131a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira // Copy 3141a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira menu.findItem(getMenuResIdForMenuType(MenuType.COPY_PHONE_MENU)). 3155b18d791a38885faf3315707221804e9187e027cAndrew Sapperstein setOnMenuItemClickListener(new Copy(extra, "copy_phone")); 3161a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira break; 3171a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira case WebView.HitTestResult.EMAIL_TYPE: 3185b18d791a38885faf3315707221804e9187e027cAndrew Sapperstein Analytics.getInstance().sendEvent( 3195b18d791a38885faf3315707221804e9187e027cAndrew Sapperstein CATEGORY_WEB_CONTEXT_MENU, ACTION_LONG_PRESS, "email", 0); 3201a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira menu.setHeaderTitle(extra); 3215b18d791a38885faf3315707221804e9187e027cAndrew Sapperstein final Intent mailtoIntent = 3225b18d791a38885faf3315707221804e9187e027cAndrew Sapperstein new Intent(Intent.ACTION_VIEW, Uri.parse(WebView.SCHEME_MAILTO + extra)); 3235b18d791a38885faf3315707221804e9187e027cAndrew Sapperstein menu.findItem(getMenuResIdForMenuType(MenuType.EMAIL_CONTACT_MENU)) 3245b18d791a38885faf3315707221804e9187e027cAndrew Sapperstein .setOnMenuItemClickListener(new SendIntent(mailtoIntent, "send_email")); 3251a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira menu.findItem(getMenuResIdForMenuType(MenuType.COPY_MAIL_MENU)). 3265b18d791a38885faf3315707221804e9187e027cAndrew Sapperstein setOnMenuItemClickListener(new Copy(extra, "copy_email")); 3271a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira break; 3281a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira case WebView.HitTestResult.GEO_TYPE: 3295b18d791a38885faf3315707221804e9187e027cAndrew Sapperstein Analytics.getInstance().sendEvent( 3305b18d791a38885faf3315707221804e9187e027cAndrew Sapperstein CATEGORY_WEB_CONTEXT_MENU, ACTION_LONG_PRESS, "geo", 0); 3311a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira menu.setHeaderTitle(extra); 3321a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira String geoExtra = ""; 3331a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira try { 3341a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira geoExtra = URLEncoder.encode(extra, Charset.defaultCharset().name()); 3355b18d791a38885faf3315707221804e9187e027cAndrew Sapperstein } catch (UnsupportedEncodingException ignore) { 3361a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira // Should never happen; default charset is UTF-8 3371a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira } 3381a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira final MenuItem viewMapMenuItem = 3391a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira menu.findItem(getMenuResIdForMenuType(MenuType.MAP_MENU)); 3405b18d791a38885faf3315707221804e9187e027cAndrew Sapperstein 3415b18d791a38885faf3315707221804e9187e027cAndrew Sapperstein final Intent viewMap = 3425b18d791a38885faf3315707221804e9187e027cAndrew Sapperstein new Intent(Intent.ACTION_VIEW, Uri.parse(WebView.SCHEME_GEO + geoExtra)); 3435b18d791a38885faf3315707221804e9187e027cAndrew Sapperstein viewMapMenuItem.setOnMenuItemClickListener(new SendIntent(viewMap, "view_map")); 3441a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira menu.findItem(getMenuResIdForMenuType(MenuType.COPY_GEO_MENU)). 3455b18d791a38885faf3315707221804e9187e027cAndrew Sapperstein setOnMenuItemClickListener(new Copy(extra, "copy_geo")); 3461a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira break; 3471a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira case WebView.HitTestResult.SRC_ANCHOR_TYPE: 3485b18d791a38885faf3315707221804e9187e027cAndrew Sapperstein Analytics.getInstance().sendEvent( 3495b18d791a38885faf3315707221804e9187e027cAndrew Sapperstein CATEGORY_WEB_CONTEXT_MENU, ACTION_LONG_PRESS, "src_anchor", 0); 3508ec43e877a9c1925514f066655984e21fbd255e8Andrew Sapperstein setupAnchorMenu(extra, menu); 3518ec43e877a9c1925514f066655984e21fbd255e8Andrew Sapperstein break; 3521a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira case WebView.HitTestResult.SRC_IMAGE_ANCHOR_TYPE: 3535b18d791a38885faf3315707221804e9187e027cAndrew Sapperstein Analytics.getInstance().sendEvent( 3545b18d791a38885faf3315707221804e9187e027cAndrew Sapperstein CATEGORY_WEB_CONTEXT_MENU, ACTION_LONG_PRESS, "src_image_anchor", 0); 3558ec43e877a9c1925514f066655984e21fbd255e8Andrew Sapperstein setupAnchorMenu(extra, menu); 3565b18d791a38885faf3315707221804e9187e027cAndrew Sapperstein setupImageMenu(extra, menu); 3575b18d791a38885faf3315707221804e9187e027cAndrew Sapperstein break; 3588ec43e877a9c1925514f066655984e21fbd255e8Andrew Sapperstein case WebView.HitTestResult.IMAGE_TYPE: 3595b18d791a38885faf3315707221804e9187e027cAndrew Sapperstein Analytics.getInstance().sendEvent( 3605b18d791a38885faf3315707221804e9187e027cAndrew Sapperstein CATEGORY_WEB_CONTEXT_MENU, ACTION_LONG_PRESS, "image", 0); 3615b18d791a38885faf3315707221804e9187e027cAndrew Sapperstein setupImageMenu(extra, menu); 3628ec43e877a9c1925514f066655984e21fbd255e8Andrew Sapperstein break; 3638ec43e877a9c1925514f066655984e21fbd255e8Andrew Sapperstein default: 3648ec43e877a9c1925514f066655984e21fbd255e8Andrew Sapperstein break; 3658ec43e877a9c1925514f066655984e21fbd255e8Andrew Sapperstein } 3668ec43e877a9c1925514f066655984e21fbd255e8Andrew Sapperstein } 3671a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira 3688ec43e877a9c1925514f066655984e21fbd255e8Andrew Sapperstein private void setupAnchorMenu(String extra, ContextMenu menu) { 3698ec43e877a9c1925514f066655984e21fbd255e8Andrew Sapperstein menu.findItem(getMenuResIdForMenuType(MenuType.SHARE_LINK_MENU)).setVisible( 3708ec43e877a9c1925514f066655984e21fbd255e8Andrew Sapperstein showShareLinkMenuItem()); 3711a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira 3728ec43e877a9c1925514f066655984e21fbd255e8Andrew Sapperstein // The documentation for WebView indicates that if the HitTestResult is 3738ec43e877a9c1925514f066655984e21fbd255e8Andrew Sapperstein // SRC_ANCHOR_TYPE or the url would be specified in the extra. We don't need to 3748ec43e877a9c1925514f066655984e21fbd255e8Andrew Sapperstein // call requestFocusNodeHref(). If we wanted to handle UNKNOWN HitTestResults, we 3758ec43e877a9c1925514f066655984e21fbd255e8Andrew Sapperstein // would. With this knowledge, we can just set the title 3768ec43e877a9c1925514f066655984e21fbd255e8Andrew Sapperstein menu.setHeaderTitle(extra); 3771a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira 3788ec43e877a9c1925514f066655984e21fbd255e8Andrew Sapperstein menu.findItem(getMenuResIdForMenuType(MenuType.COPY_LINK_MENU)). 3795b18d791a38885faf3315707221804e9187e027cAndrew Sapperstein setOnMenuItemClickListener(new Copy(extra, "copy_link")); 3801a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira 3818ec43e877a9c1925514f066655984e21fbd255e8Andrew Sapperstein final MenuItem openLinkMenuItem = 3828ec43e877a9c1925514f066655984e21fbd255e8Andrew Sapperstein menu.findItem(getMenuResIdForMenuType(MenuType.OPEN_MENU)); 3835b18d791a38885faf3315707221804e9187e027cAndrew Sapperstein openLinkMenuItem.setOnMenuItemClickListener( 3845b18d791a38885faf3315707221804e9187e027cAndrew Sapperstein new SendIntent(new Intent(Intent.ACTION_VIEW, Uri.parse(extra)), "open_link")); 3858ec43e877a9c1925514f066655984e21fbd255e8Andrew Sapperstein 3868ec43e877a9c1925514f066655984e21fbd255e8Andrew Sapperstein menu.findItem(getMenuResIdForMenuType(MenuType.SHARE_LINK_MENU)). 3875b18d791a38885faf3315707221804e9187e027cAndrew Sapperstein setOnMenuItemClickListener(new Share(extra, "share_link")); 3888ec43e877a9c1925514f066655984e21fbd255e8Andrew Sapperstein } 3898ec43e877a9c1925514f066655984e21fbd255e8Andrew Sapperstein 3908ec43e877a9c1925514f066655984e21fbd255e8Andrew Sapperstein /** 3918ec43e877a9c1925514f066655984e21fbd255e8Andrew Sapperstein * Used to setup the image menu group if the {@link android.webkit.WebView.HitTestResult} 3928ec43e877a9c1925514f066655984e21fbd255e8Andrew Sapperstein * is of type {@link android.webkit.WebView.HitTestResult#IMAGE_TYPE} or 3938ec43e877a9c1925514f066655984e21fbd255e8Andrew Sapperstein * {@link android.webkit.WebView.HitTestResult#SRC_IMAGE_ANCHOR_TYPE}. 3948ec43e877a9c1925514f066655984e21fbd255e8Andrew Sapperstein * @param url Url that was long pressed. 3958ec43e877a9c1925514f066655984e21fbd255e8Andrew Sapperstein * @param menu The {@link android.view.ContextMenu} that is about to be shown. 3968ec43e877a9c1925514f066655984e21fbd255e8Andrew Sapperstein */ 3975b18d791a38885faf3315707221804e9187e027cAndrew Sapperstein private void setupImageMenu(String url, ContextMenu menu) { 398833123d9c31b0b2dd23f7f74738c5bccf8a546d3Andrew Sapperstein final ConversationMessage msg = 399833123d9c31b0b2dd23f7f74738c5bccf8a546d3Andrew Sapperstein (mCallbacks != null) ? mCallbacks.getMessageForClickedUrl(url) : null; 4008f1abcbb70fa4eea77eae9bbe51b238870472a47Jin Cao if (msg == null) { 4015b18d791a38885faf3315707221804e9187e027cAndrew Sapperstein menu.setGroupVisible(R.id.IMAGE_MENU, false); 4025b18d791a38885faf3315707221804e9187e027cAndrew Sapperstein return; 4038f1abcbb70fa4eea77eae9bbe51b238870472a47Jin Cao } 4045b18d791a38885faf3315707221804e9187e027cAndrew Sapperstein 4053c6fd44f9ae0cf60248dc64ee74d46afed633c45Andy Huang final Intent intent = mIntentBuilder.createInlineAttachmentViewIntent(mActivity, url, msg); 4068ec43e877a9c1925514f066655984e21fbd255e8Andrew Sapperstein if (intent == null) { 4075b18d791a38885faf3315707221804e9187e027cAndrew Sapperstein menu.setGroupVisible(R.id.IMAGE_MENU, false); 4085b18d791a38885faf3315707221804e9187e027cAndrew Sapperstein return; 4091a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira } 4108ec43e877a9c1925514f066655984e21fbd255e8Andrew Sapperstein 4118ec43e877a9c1925514f066655984e21fbd255e8Andrew Sapperstein final MenuItem menuItem = menu.findItem(R.id.view_image_context_menu_id); 4125b18d791a38885faf3315707221804e9187e027cAndrew Sapperstein menuItem.setOnMenuItemClickListener(new SendIntent(intent, "view_image")); 4138ec43e877a9c1925514f066655984e21fbd255e8Andrew Sapperstein 4145b18d791a38885faf3315707221804e9187e027cAndrew Sapperstein menu.setGroupVisible(R.id.IMAGE_MENU, true); 4151a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira } 4161a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira 4171a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira @Override 4181a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira public boolean onMenuItemClick(MenuItem item) { 4191a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira return onMenuItemSelected(item); 4201a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira } 4211a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira 4221a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira /** 4231a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira * Returns the menu resource id for the specified menu type 4241a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira * @param menuType type of the specified menu 4251a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira * @return menu resource id 4261a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira */ 4270b7ed6fae6e36f2abc4ca916764177d1879731b4Andy Huang protected int getMenuResIdForMenuType(MenuType menuType) { 4280b7ed6fae6e36f2abc4ca916764177d1879731b4Andy Huang switch(menuType) { 4290b7ed6fae6e36f2abc4ca916764177d1879731b4Andy Huang case OPEN_MENU: 4300b7ed6fae6e36f2abc4ca916764177d1879731b4Andy Huang return R.id.open_context_menu_id; 4310b7ed6fae6e36f2abc4ca916764177d1879731b4Andy Huang case COPY_LINK_MENU: 4320b7ed6fae6e36f2abc4ca916764177d1879731b4Andy Huang return R.id.copy_link_context_menu_id; 4330b7ed6fae6e36f2abc4ca916764177d1879731b4Andy Huang case SHARE_LINK_MENU: 4340b7ed6fae6e36f2abc4ca916764177d1879731b4Andy Huang return R.id.share_link_context_menu_id; 4350b7ed6fae6e36f2abc4ca916764177d1879731b4Andy Huang case DIAL_MENU: 4360b7ed6fae6e36f2abc4ca916764177d1879731b4Andy Huang return R.id.dial_context_menu_id; 4370b7ed6fae6e36f2abc4ca916764177d1879731b4Andy Huang case SMS_MENU: 4380b7ed6fae6e36f2abc4ca916764177d1879731b4Andy Huang return R.id.sms_context_menu_id; 4390b7ed6fae6e36f2abc4ca916764177d1879731b4Andy Huang case ADD_CONTACT_MENU: 4400b7ed6fae6e36f2abc4ca916764177d1879731b4Andy Huang return R.id.add_contact_context_menu_id; 4410b7ed6fae6e36f2abc4ca916764177d1879731b4Andy Huang case COPY_PHONE_MENU: 4420b7ed6fae6e36f2abc4ca916764177d1879731b4Andy Huang return R.id.copy_phone_context_menu_id; 4430b7ed6fae6e36f2abc4ca916764177d1879731b4Andy Huang case EMAIL_CONTACT_MENU: 4440b7ed6fae6e36f2abc4ca916764177d1879731b4Andy Huang return R.id.email_context_menu_id; 4450b7ed6fae6e36f2abc4ca916764177d1879731b4Andy Huang case COPY_MAIL_MENU: 4460b7ed6fae6e36f2abc4ca916764177d1879731b4Andy Huang return R.id.copy_mail_context_menu_id; 4470b7ed6fae6e36f2abc4ca916764177d1879731b4Andy Huang case MAP_MENU: 4480b7ed6fae6e36f2abc4ca916764177d1879731b4Andy Huang return R.id.map_context_menu_id; 4490b7ed6fae6e36f2abc4ca916764177d1879731b4Andy Huang case COPY_GEO_MENU: 4500b7ed6fae6e36f2abc4ca916764177d1879731b4Andy Huang return R.id.copy_geo_context_menu_id; 4510b7ed6fae6e36f2abc4ca916764177d1879731b4Andy Huang default: 4520b7ed6fae6e36f2abc4ca916764177d1879731b4Andy Huang throw new IllegalStateException("Unexpected MenuType"); 4530b7ed6fae6e36f2abc4ca916764177d1879731b4Andy Huang } 4540b7ed6fae6e36f2abc4ca916764177d1879731b4Andy Huang } 4551a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira 4561a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira /** 4571a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira * Returns the resource id of the string to be used when showing a chooser for a menu 4581a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira * @param menuType type of the specified menu 4591a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira * @return string resource id 4601a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira */ 4610b7ed6fae6e36f2abc4ca916764177d1879731b4Andy Huang protected int getChooserTitleStringResIdForMenuType(MenuType menuType) { 4620b7ed6fae6e36f2abc4ca916764177d1879731b4Andy Huang switch(menuType) { 4630b7ed6fae6e36f2abc4ca916764177d1879731b4Andy Huang case SHARE_LINK_MENU: 4640b7ed6fae6e36f2abc4ca916764177d1879731b4Andy Huang return R.string.choosertitle_sharevia; 4650b7ed6fae6e36f2abc4ca916764177d1879731b4Andy Huang default: 4660b7ed6fae6e36f2abc4ca916764177d1879731b4Andy Huang throw new IllegalStateException("Unexpected MenuType"); 4670b7ed6fae6e36f2abc4ca916764177d1879731b4Andy Huang } 4680b7ed6fae6e36f2abc4ca916764177d1879731b4Andy Huang } 4691a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira 4701a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira /** 4711a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira * Returns the resource id for the web view context menu 4721a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira */ 4730b7ed6fae6e36f2abc4ca916764177d1879731b4Andy Huang protected int getMenuResourceId() { 4740b7ed6fae6e36f2abc4ca916764177d1879731b4Andy Huang return R.menu.webview_context_menu; 4750b7ed6fae6e36f2abc4ca916764177d1879731b4Andy Huang } 4761a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira 4771a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira 4781a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira /** 4791a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira * Called when a menu item is not handled by the context menu. 4801a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira */ 4810b7ed6fae6e36f2abc4ca916764177d1879731b4Andy Huang protected boolean onMenuItemSelected(MenuItem menuItem) { 4820b7ed6fae6e36f2abc4ca916764177d1879731b4Andy Huang return mActivity.onOptionsItemSelected(menuItem); 4830b7ed6fae6e36f2abc4ca916764177d1879731b4Andy Huang } 4841a73ea8bc1b08ff4e7baac515ed54a15de13ffe2Mindy Pereira} 485