Bug 1409296 - Support minimal context menu functionality in GeckoView-based PWA. r=maliu
authorNevin Chen <cnevinchen@gmail.com>
Tue, 17 Oct 2017 16:43:49 +0800
changeset 386804 07d16d2791dad02eb1f2a50b8556b69101cf4f7b
parent 386803 02dcc553e8207e5443ac69fe3454e5ef539d4ec9
child 386805 da7ac021e1209f76295cd19594280002d5e6ef38
push id96311
push userarchaeopteryx@coole-files.de
push dateWed, 18 Oct 2017 09:52:02 +0000
treeherdermozilla-inbound@a8a1e8cc1980 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersmaliu
bugs1409296
milestone58.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Bug 1409296 - Support minimal context menu functionality in GeckoView-based PWA. r=maliu MozReview-Commit-ID: 1QxyMs4OhxG
mobile/android/base/java/org/mozilla/gecko/customtabs/CustomTabsActivity.java
mobile/android/base/java/org/mozilla/gecko/webapps/WebAppActivity.java
mobile/android/base/java/org/mozilla/gecko/webapps/WebApps.java
--- a/mobile/android/base/java/org/mozilla/gecko/customtabs/CustomTabsActivity.java
+++ b/mobile/android/base/java/org/mozilla/gecko/customtabs/CustomTabsActivity.java
@@ -56,16 +56,17 @@ import org.mozilla.gecko.prompts.PromptS
 import org.mozilla.gecko.text.TextSelection;
 import org.mozilla.gecko.util.ActivityUtils;
 import org.mozilla.gecko.util.Clipboard;
 import org.mozilla.gecko.util.ColorUtil;
 import org.mozilla.gecko.util.GeckoBundle;
 import org.mozilla.gecko.util.IntentUtils;
 import org.mozilla.gecko.util.PackageUtil;
 import org.mozilla.gecko.util.ThreadUtils;
+import org.mozilla.gecko.webapps.WebApps;
 import org.mozilla.gecko.widget.ActionModePresenter;
 import org.mozilla.gecko.widget.GeckoPopupMenu;
 
 import java.util.List;
 
 public class CustomTabsActivity extends AppCompatActivity
                                 implements ActionModePresenter,
                                            GeckoMenu.Callback,
@@ -648,72 +649,29 @@ public class CustomTabsActivity extends 
         }
     }
 
     @Override
     public void onContextMenu(GeckoView view, int screenX, int screenY,
                               final String uri, final String elementSrc) {
 
         final String content = uri != null ? uri : elementSrc != null ? elementSrc : "";
-        final Uri validUri = getValidURL(content);
+        final Uri validUri = WebApps.getValidURL(content);
         if (validUri == null) {
             return;
         }
 
         runOnUiThread(new Runnable() {
             @Override
             public void run() {
-                openInFennec(validUri, CustomTabsActivity.this);
+                WebApps.openInFennec(validUri, CustomTabsActivity.this);
             }
         });
     }
 
-    void openInFennec(final Uri uri, final Context context) {
-        ThreadUtils.assertOnUiThread();
-
-        final Prompt prompt = new Prompt(context, new Prompt.PromptCallback() {
-            @Override
-            public void onPromptFinished(final GeckoBundle result) {
-
-                final int itemId = result.getInt("button", -1);
-
-                if (itemId == -1) {
-                    // this is the error case, we shouldn't have this situation.
-                    return;
-                }
-                Intent intent = new Intent(context, BrowserApp.class);
-                // BrowserApp's onNewIntent will check action so below is required
-                intent.setAction(Intent.ACTION_VIEW);
-                intent.setData(uri);
-                intent.setPackage(context.getPackageName());
-                context.startActivity(intent);
-
-            }
-        });
-
-        final PromptListItem[] items = new PromptListItem[1];
-        items[0] = new PromptListItem(context.getResources().getString(R.string.overlay_share_open_browser_btn_label));
-        prompt.show("", "", items, ListView.CHOICE_MODE_NONE);
-
-    }
-
-    @Nullable
-    Uri getValidURL(@NonNull String urlString) {
-        final Uri uri = Uri.parse(urlString);
-        if (uri == null) {
-            return null;
-        }
-        final String scheme = uri.getScheme();
-        // currently we only support http and https to open in Firefox
-        if (scheme.equals("http") || scheme.equals("https")) {
-            return uri;
-        } else {
-            return null;
-        }
-    }
 
     @Override // ActionModePresenter
     public void startActionMode(final ActionMode.Callback callback) {
         endActionMode();
         mActionMode = startSupportActionMode(callback);
     }
 
     @Override // ActionModePresenter
--- a/mobile/android/base/java/org/mozilla/gecko/webapps/WebAppActivity.java
+++ b/mobile/android/base/java/org/mozilla/gecko/webapps/WebAppActivity.java
@@ -88,17 +88,30 @@ public class WebAppActivity extends AppC
 
         super.onCreate(savedInstanceState);
 
         mGeckoView = new GeckoView(this);
         mGeckoView.setNavigationListener(this);
         mGeckoView.setContentListener(new GeckoView.ContentListener() {
             public void onTitleChange(GeckoView view, String title) {}
             public void onContextMenu(GeckoView view, int screenX, int screenY,
-                               String uri, String elementSrc) {}
+                               String uri, String elementSrc) {
+                final String content = uri != null ? uri : elementSrc != null ? elementSrc : "";
+                final Uri validUri = WebApps.getValidURL(content);
+                if (validUri == null) {
+                    return;
+                }
+
+                runOnUiThread(new Runnable() {
+                    @Override
+                    public void run() {
+                        WebApps.openInFennec(validUri, WebAppActivity.this);
+                    }
+                });
+            }
             public void onFullScreen(GeckoView view, boolean fullScreen) {
                 updateFullScreenContent(fullScreen);
             }
         });
 
         mPromptService = new PromptService(this, mGeckoView.getEventDispatcher());
         mDoorHangerPopup = new DoorHangerPopup(this, mGeckoView.getEventDispatcher());
 
--- a/mobile/android/base/java/org/mozilla/gecko/webapps/WebApps.java
+++ b/mobile/android/base/java/org/mozilla/gecko/webapps/WebApps.java
@@ -1,15 +1,29 @@
 /* -*- Mode: Java; c-basic-offset: 4; tab-width: 4; indent-tabs-mode: nil; -*-
  * This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 package org.mozilla.gecko.webapps;
 
+import android.content.Context;
+import android.content.Intent;
+import android.net.Uri;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.widget.ListView;
+
+import org.mozilla.gecko.BrowserApp;
+import org.mozilla.gecko.R;
+import org.mozilla.gecko.prompts.Prompt;
+import org.mozilla.gecko.prompts.PromptListItem;
+import org.mozilla.gecko.util.GeckoBundle;
+import org.mozilla.gecko.util.ThreadUtils;
+
 /**
  * 10 predefined slots for homescreen webapps, in LauncherActivity
  * launched webapps will be given an index (via WebAppIndexer) that
  * points to one of these class names
  **/
 
 public final class WebApps {
     public static class WebApp0 extends WebAppActivity { }
@@ -17,9 +31,53 @@ public final class WebApps {
     public static class WebApp2 extends WebAppActivity { }
     public static class WebApp3 extends WebAppActivity { }
     public static class WebApp4 extends WebAppActivity { }
     public static class WebApp5 extends WebAppActivity { }
     public static class WebApp6 extends WebAppActivity { }
     public static class WebApp7 extends WebAppActivity { }
     public static class WebApp8 extends WebAppActivity { }
     public static class WebApp9 extends WebAppActivity { }
+
+    public static void openInFennec(final Uri uri, final Context context) {
+        ThreadUtils.assertOnUiThread();
+
+        final Prompt prompt = new Prompt(context, new Prompt.PromptCallback() {
+            @Override
+            public void onPromptFinished(final GeckoBundle result) {
+
+                final int itemId = result.getInt("button", -1);
+
+                if (itemId == -1) {
+                    // this is the error case, we shouldn't have this situation.
+                    return;
+                }
+                Intent intent = new Intent(context, BrowserApp.class);
+                // BrowserApp's onNewIntent will check action so below is required
+                intent.setAction(Intent.ACTION_VIEW);
+                intent.setData(uri);
+                intent.setPackage(context.getPackageName());
+                context.startActivity(intent);
+
+            }
+        });
+
+        final PromptListItem[] items = new PromptListItem[1];
+        items[0] = new PromptListItem(context.getResources().getString(R.string.overlay_share_open_browser_btn_label));
+        prompt.show("", "", items, ListView.CHOICE_MODE_NONE);
+
+    }
+
+    @Nullable
+    public static Uri getValidURL(@NonNull String urlString) {
+        final Uri uri = Uri.parse(urlString);
+        if (uri == null) {
+            return null;
+        }
+        final String scheme = uri.getScheme();
+        // currently we only support http and https to open in Firefox
+        if (scheme.equals("http") || scheme.equals("https")) {
+            return uri;
+        } else {
+            return null;
+        }
+    }
 }