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