commit 6dc05e67cdbbb0a74f2c24387a3ea7443e08b57c Author: Matthew Finkel Matthew.Finkel@gmail.com Date: Sat Oct 12 00:45:36 2019 +0000
Bug 26529 - Prompt before opening external app --- .../base/java/org/mozilla/gecko/BrowserApp.java | 7 +++++-- .../android/base/java/org/mozilla/gecko/GeckoApp.java | 7 +++++-- .../base/java/org/mozilla/gecko/GeckoApplication.java | 7 +++++-- .../base/java/org/mozilla/gecko/IntentHelper.java | 15 +++++++++++---- .../java/org/mozilla/gecko/toolbar/BrowserToolbar.java | 1 + .../org/mozilla/gecko/toolbar/ToolbarEditLayout.java | 18 ++++++++++++++---- 6 files changed, 41 insertions(+), 14 deletions(-)
diff --git a/mobile/android/base/java/org/mozilla/gecko/BrowserApp.java b/mobile/android/base/java/org/mozilla/gecko/BrowserApp.java index 5d6f725dc1c5..ab19b78d54e7 100644 --- a/mobile/android/base/java/org/mozilla/gecko/BrowserApp.java +++ b/mobile/android/base/java/org/mozilla/gecko/BrowserApp.java @@ -175,6 +175,7 @@ import org.mozilla.gecko.util.WindowUtil; import org.mozilla.gecko.widget.ActionModePresenter; import org.mozilla.gecko.widget.AnchoredPopup; import org.mozilla.gecko.widget.AnimatedProgressBar; +import org.mozilla.gecko.widget.ExternalIntentDuringPrivateBrowsingPromptFragment; import org.mozilla.gecko.widget.GeckoActionProvider; import org.mozilla.gecko.widget.SplashScreen; import org.mozilla.geckoview.DynamicToolbarAnimator; @@ -2237,7 +2238,8 @@ public class BrowserApp extends GeckoApp if (AppConstants.RELEASE_OR_BETA) { Intent intent = new Intent(Intent.ACTION_VIEW); intent.setData(Uri.parse("market://details?id=" + getPackageName())); - startActivity(intent); + ExternalIntentDuringPrivateBrowsingPromptFragment.showDialogOrAndroidChooser( + this, getSupportFragmentManager(), intent); break; }
@@ -4195,7 +4197,8 @@ public class BrowserApp extends GeckoApp if (flags.contains(OnUrlOpenListener.Flags.OPEN_WITH_INTENT)) { Intent intent = new Intent(Intent.ACTION_VIEW); intent.setData(Uri.parse(url)); - startActivity(intent); + ExternalIntentDuringPrivateBrowsingPromptFragment.showDialogOrAndroidChooser( + this, getSupportFragmentManager(), intent); } else { // By default this listener is used for lists where the offline reader-view icon // is shown - hence we need to redirect to the reader-view page by default. diff --git a/mobile/android/base/java/org/mozilla/gecko/GeckoApp.java b/mobile/android/base/java/org/mozilla/gecko/GeckoApp.java index 1504470b697e..42edb2bfc99b 100644 --- a/mobile/android/base/java/org/mozilla/gecko/GeckoApp.java +++ b/mobile/android/base/java/org/mozilla/gecko/GeckoApp.java @@ -43,6 +43,7 @@ import org.mozilla.gecko.util.ThreadUtils; import org.mozilla.gecko.util.ViewUtil; import org.mozilla.gecko.widget.ActionModePresenter; import org.mozilla.gecko.widget.AnchoredPopup; +import org.mozilla.gecko.widget.ExternalIntentDuringPrivateBrowsingPromptFragment; import org.mozilla.geckoview.GeckoSession; import org.mozilla.geckoview.GeckoSessionSettings; import org.mozilla.geckoview.GeckoView; @@ -766,11 +767,13 @@ public abstract class GeckoApp extends GeckoActivity if (email != null) { Uri contactUri = Uri.parse(email); Intent i = new Intent(ContactsContract.Intents.SHOW_OR_CREATE_CONTACT, contactUri); - startActivity(i); + ExternalIntentDuringPrivateBrowsingPromptFragment.showDialogOrAndroidChooser( + this, getSupportFragmentManager(), i); } else if (phone != null) { Uri contactUri = Uri.parse(phone); Intent i = new Intent(ContactsContract.Intents.SHOW_OR_CREATE_CONTACT, contactUri); - startActivity(i); + ExternalIntentDuringPrivateBrowsingPromptFragment.showDialogOrAndroidChooser( + this, getSupportFragmentManager(), i); } else { // something went wrong. Log.e(LOGTAG, "Received Contact:Add message with no email nor phone number"); diff --git a/mobile/android/base/java/org/mozilla/gecko/GeckoApplication.java b/mobile/android/base/java/org/mozilla/gecko/GeckoApplication.java index bb3cdec7c0fe..3801bb4d0b64 100644 --- a/mobile/android/base/java/org/mozilla/gecko/GeckoApplication.java +++ b/mobile/android/base/java/org/mozilla/gecko/GeckoApplication.java @@ -25,6 +25,7 @@ import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.design.widget.Snackbar; import android.support.multidex.MultiDex; +import android.support.v7.app.AppCompatActivity; import android.text.TextUtils; import android.util.Base64; import android.util.Log; @@ -64,6 +65,7 @@ import org.mozilla.gecko.util.PRNGFixes; import org.mozilla.gecko.util.ProxySelector; import org.mozilla.gecko.util.ShortcutUtils; import org.mozilla.gecko.util.ThreadUtils; +import org.mozilla.gecko.widget.ExternalIntentDuringPrivateBrowsingPromptFragment; import org.mozilla.geckoview.GeckoRuntime; import org.mozilla.geckoview.GeckoRuntimeSettings;
@@ -813,8 +815,9 @@ public class GeckoApplication extends Application context.getContentResolver().delete(intent.getData(), null, null); } }; - ActivityHandlerHelper.startIntentForActivity(currentActivity, chooser, - handler); + ActivityHandlerHelper.registerActivityHandler(handler); + ExternalIntentDuringPrivateBrowsingPromptFragment.showDialogOrAndroidChooser( + currentActivity, ((AppCompatActivity)currentActivity).getSupportFragmentManager(), intent); } }); } diff --git a/mobile/android/base/java/org/mozilla/gecko/IntentHelper.java b/mobile/android/base/java/org/mozilla/gecko/IntentHelper.java index c5b1666a31da..b5853a35ae20 100644 --- a/mobile/android/base/java/org/mozilla/gecko/IntentHelper.java +++ b/mobile/android/base/java/org/mozilla/gecko/IntentHelper.java @@ -123,7 +123,7 @@ public final class IntentHelper implements BundleEventListener { String className, String action, String title, - final boolean showPromptInPrivateBrowsing) { + boolean showPromptInPrivateBrowsing) { final Context context = getContext(); final Intent intent = getOpenURIIntent(context, targetURI, mimeType, action, title); @@ -141,10 +141,15 @@ public final class IntentHelper implements BundleEventListener { } }
+ // Always prompt for Intents + showPromptInPrivateBrowsing = true; + final FragmentActivity activity = getActivity(); if (!showPromptInPrivateBrowsing || activity == null) { if (activity == null) { - intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + //intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + // We'll find out what this breaks. + return false; } return ActivityHandlerHelper.startIntentAndCatch(LOGTAG, context, intent); } else { @@ -152,7 +157,7 @@ public final class IntentHelper implements BundleEventListener { // statically, but since this method is called from Gecko and I'm // unfamiliar with that code, this is a simpler solution. return ExternalIntentDuringPrivateBrowsingPromptFragment.showDialogOrAndroidChooser( - context, activity.getSupportFragmentManager(), intent); + activity, activity.getSupportFragmentManager(), intent); } }
@@ -472,7 +477,9 @@ public final class IntentHelper implements BundleEventListener { // isn't owned exclusively by Firefox, so there's no real benefit to using content:// URIs // here. try (StrictModeContext unused = StrictModeContext.allowAllVmPolicies()) { - ActivityHandlerHelper.startIntentForActivity(activity, intent, handler); + // Always prompt. + ExternalIntentDuringPrivateBrowsingPromptFragment.showDialogOrAndroidChooser( + activity, activity.getSupportFragmentManager(), intent); } catch (SecurityException e) { Log.w(LOGTAG, "Forbidden to launch activity.", e); } diff --git a/mobile/android/base/java/org/mozilla/gecko/toolbar/BrowserToolbar.java b/mobile/android/base/java/org/mozilla/gecko/toolbar/BrowserToolbar.java index 2bc379cecb8b..3ba208ea0fcc 100644 --- a/mobile/android/base/java/org/mozilla/gecko/toolbar/BrowserToolbar.java +++ b/mobile/android/base/java/org/mozilla/gecko/toolbar/BrowserToolbar.java @@ -222,6 +222,7 @@ public abstract class BrowserToolbar extends ThemedRelativeLayout prefs = new ToolbarPrefs(); urlDisplayLayout.setToolbarPrefs(prefs); urlEditLayout.setToolbarPrefs(prefs); + urlEditLayout.setActivity(activity);
// ScrollViews are allowed to have only one child. final View scrollChild = urlDisplayScroll.getChildAt(0); diff --git a/mobile/android/base/java/org/mozilla/gecko/toolbar/ToolbarEditLayout.java b/mobile/android/base/java/org/mozilla/gecko/toolbar/ToolbarEditLayout.java index a28847285350..ecd8d49f5a41 100644 --- a/mobile/android/base/java/org/mozilla/gecko/toolbar/ToolbarEditLayout.java +++ b/mobile/android/base/java/org/mozilla/gecko/toolbar/ToolbarEditLayout.java @@ -9,6 +9,7 @@ import android.app.Activity; import android.content.Intent; import android.graphics.drawable.Drawable; import android.speech.RecognizerIntent; +import android.support.v7.app.AppCompatActivity; import android.widget.Button; import org.mozilla.gecko.ActivityHandlerHelper; import org.mozilla.gecko.GeckoAppShell; @@ -30,6 +31,7 @@ import org.mozilla.gecko.util.HardwareUtils; import org.mozilla.gecko.util.InputOptionsUtils; import org.mozilla.gecko.util.StringUtils; import org.mozilla.gecko.util.ThreadUtils; +import org.mozilla.gecko.widget.ExternalIntentDuringPrivateBrowsingPromptFragment; import org.mozilla.gecko.widget.themed.ThemedImageButton; import org.mozilla.gecko.widget.themed.ThemedLinearLayout;
@@ -60,6 +62,8 @@ public class ToolbarEditLayout extends ThemedLinearLayout { private final ThemedImageButton mVoiceInput; private final ThemedImageButton mQrCode;
+ private Activity mActivity; + private OnFocusChangeListener mFocusChangeListener;
private boolean showKeyboardOnFocus = false; // Indicates if we need to show the keyboard after the app resumes @@ -185,6 +189,10 @@ public class ToolbarEditLayout extends ThemedLinearLayout { mQrCode.setPrivateMode(isPrivate); }
+ public void setActivity(Activity activity) { + mActivity = activity; + } + /** * Called when the parent gains focus (on app launch and resume) */ @@ -294,8 +302,7 @@ public class ToolbarEditLayout extends ThemedLinearLayout { Telemetry.sendUIEvent(TelemetryContract.Event.ACTION, TelemetryContract.Method.ACTIONBAR, "voice_input_launch"); final Intent intent = InputOptionsUtils.createVoiceRecognizerIntent(getResources().getString(R.string.voicesearch_prompt));
- final Activity activity = ActivityUtils.getActivityFromContext(getContext()); - ActivityHandlerHelper.startIntentForActivity(activity, intent, new ActivityResultHandler() { + ActivityHandlerHelper.registerActivityHandler(new ActivityResultHandler() { @Override public void onActivityResult(int resultCode, Intent data) { if (resultCode != Activity.RESULT_OK) { @@ -316,6 +323,8 @@ public class ToolbarEditLayout extends ThemedLinearLayout { imm.showSoftInput(mEditText, InputMethodManager.SHOW_IMPLICIT); } }); + ExternalIntentDuringPrivateBrowsingPromptFragment.showDialogOrAndroidChooser( + mActivity, ((AppCompatActivity)mActivity).getSupportFragmentManager(), intent); }
private boolean qrCodeIsEnabled(Context context) { @@ -331,8 +340,7 @@ public class ToolbarEditLayout extends ThemedLinearLayout { Telemetry.sendUIEvent(TelemetryContract.Event.ACTION, TelemetryContract.Method.ACTIONBAR, "qrcode_input_launch"); final Intent intent = InputOptionsUtils.createQRCodeReaderIntent();
- final Activity activity = ActivityUtils.getActivityFromContext(getContext()); - ActivityHandlerHelper.startIntentForActivity(activity, intent, new ActivityResultHandler() { + ActivityHandlerHelper.registerActivityHandler(new ActivityResultHandler() { @Override public void onActivityResult(int resultCode, Intent intent) { if (resultCode == Activity.RESULT_OK) { @@ -353,5 +361,7 @@ public class ToolbarEditLayout extends ThemedLinearLayout { // as well as the actual result, which may hold a URL. } }); + ExternalIntentDuringPrivateBrowsingPromptFragment.showDialogOrAndroidChooser( + mActivity, ((AppCompatActivity)mActivity).getSupportFragmentManager(), intent); } }