Bug 1241999 - Show snackbar to ask for Storage permission if updater is enabled. r=nalexander
--- a/mobile/android/base/java/org/mozilla/gecko/BrowserApp.java
+++ b/mobile/android/base/java/org/mozilla/gecko/BrowserApp.java
@@ -1,15 +1,16 @@
/* -*- 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;
+import android.Manifest;
import android.os.AsyncTask;
import org.mozilla.gecko.adjust.AdjustHelperInterface;
import org.mozilla.gecko.annotation.RobocopTarget;
import org.mozilla.gecko.AppConstants.Versions;
import org.mozilla.gecko.DynamicToolbar.PinReason;
import org.mozilla.gecko.DynamicToolbar.VisibilityTransition;
import org.mozilla.gecko.GeckoProfileDirectories.NoMozillaDirectoryException;
import org.mozilla.gecko.Tabs.TabEvents;
@@ -41,16 +42,17 @@ import org.mozilla.gecko.home.HomePager.
import org.mozilla.gecko.home.HomePanelsManager;
import org.mozilla.gecko.home.SearchEngine;
import org.mozilla.gecko.javaaddons.JavaAddonManager;
import org.mozilla.gecko.menu.GeckoMenu;
import org.mozilla.gecko.menu.GeckoMenuItem;
import org.mozilla.gecko.mozglue.ContextUtils;
import org.mozilla.gecko.mozglue.ContextUtils.SafeIntent;
import org.mozilla.gecko.overlays.ui.ShareDialog;
+import org.mozilla.gecko.permissions.Permissions;
import org.mozilla.gecko.preferences.ClearOnShutdownPref;
import org.mozilla.gecko.preferences.GeckoPreferences;
import org.mozilla.gecko.prompts.Prompt;
import org.mozilla.gecko.prompts.PromptListItem;
import org.mozilla.gecko.restrictions.Restrictable;
import org.mozilla.gecko.restrictions.RestrictedProfileConfiguration;
import org.mozilla.gecko.sync.repositories.android.FennecTabsRepository;
import org.mozilla.gecko.tabqueue.TabQueueHelper;
@@ -60,16 +62,17 @@ import org.mozilla.gecko.tabs.TabHistory
import org.mozilla.gecko.tabs.TabHistoryFragment;
import org.mozilla.gecko.tabs.TabHistoryPage;
import org.mozilla.gecko.tabs.TabsPanel;
import org.mozilla.gecko.toolbar.AutocompleteHandler;
import org.mozilla.gecko.toolbar.BrowserToolbar;
import org.mozilla.gecko.toolbar.BrowserToolbar.TabEditingState;
import org.mozilla.gecko.toolbar.ToolbarProgressView;
import org.mozilla.gecko.trackingprotection.TrackingProtectionPrompt;
+import org.mozilla.gecko.updater.UpdateServiceHelper;
import org.mozilla.gecko.util.ActivityUtils;
import org.mozilla.gecko.util.Clipboard;
import org.mozilla.gecko.util.EventCallback;
import org.mozilla.gecko.util.FloatUtils;
import org.mozilla.gecko.util.GamepadUtils;
import org.mozilla.gecko.util.GeckoEventListener;
import org.mozilla.gecko.util.HardwareUtils;
import org.mozilla.gecko.util.MenuUtils;
@@ -749,16 +752,49 @@ public class BrowserApp extends GeckoApp
public void onScreenshotTaken(String data, String title) {
// Treat screenshots as a sharing method.
Telemetry.sendUIEvent(TelemetryContract.Event.SHARE, TelemetryContract.Method.BUTTON, "screenshot");
}
});
// Set the maximum bits-per-pixel the favicon system cares about.
IconDirectoryEntry.setMaxBPP(GeckoAppShell.getScreenDepth());
+
+ // The update service is enabled for RELEASE_BUILD, which includes the release and beta channels.
+ // However, no updates are served. Therefore, we don't trust the update service directly, and
+ // try to avoid prompting unnecessarily. See Bug 1232798.
+ if (!AppConstants.RELEASE_BUILD && UpdateServiceHelper.isUpdaterEnabled()) {
+ Permissions.from(this)
+ .withPermissions(Manifest.permission.WRITE_EXTERNAL_STORAGE)
+ .doNotPrompt()
+ .andFallback(new Runnable() {
+ @Override
+ public void run() {
+ showUpdaterPermissionSnackbar();
+ }
+ })
+ .run();
+ }
+ }
+
+ private void showUpdaterPermissionSnackbar() {
+ SnackbarHelper.SnackbarCallback allowCallback = new SnackbarHelper.SnackbarCallback() {
+ @Override
+ public void onClick(View v) {
+ Permissions.from(BrowserApp.this)
+ .withPermissions(Manifest.permission.WRITE_EXTERNAL_STORAGE)
+ .run();
+ }
+ };
+
+ SnackbarHelper.showSnackbarWithAction(this,
+ getString(R.string.updater_permission_text),
+ Snackbar.LENGTH_INDEFINITE,
+ getString(R.string.updater_permission_allow),
+ allowCallback);
}
private void conditionallyNotifyHCEOL() {
final StrictMode.ThreadPolicy savedPolicy = StrictMode.allowThreadDiskReads();
try {
final SharedPreferences prefs = GeckoSharedPrefs.forProfile(this);
if (!prefs.getBoolean(HONEYCOMB_EOL_NOTIFIED, false)) {
--- a/mobile/android/base/java/org/mozilla/gecko/permissions/PermissionBlock.java
+++ b/mobile/android/base/java/org/mozilla/gecko/permissions/PermissionBlock.java
@@ -61,20 +61,27 @@ public class PermissionBlock {
if (condition) {
doNotPrompt();
}
return this;
}
/**
+ * Execute this permission block. Calling this method will prompt the user if needed.
+ */
+ public void run() {
+ run(null);
+ }
+
+ /**
* Execute the specified runnable if the app has been granted all permissions. Calling this method will prompt the
* user if needed.
*/
- public void run(@NonNull Runnable onPermissionsGranted) {
+ public void run(Runnable onPermissionsGranted) {
if (!doNotPrompt && !(context instanceof Activity)) {
throw new IllegalStateException("You need to either specify doNotPrompt() or pass in an Activity context");
}
this.onPermissionsGranted = onPermissionsGranted;
if (hasPermissions(context)) {
onPermissionsGranted();
--- a/mobile/android/base/strings.xml.in
+++ b/mobile/android/base/strings.xml.in
@@ -536,16 +536,17 @@
<string name="updater_downloading_select">&updater_downloading_select2;</string>
<string name="updater_downloading_retry">&updater_downloading_retry2;</string>
<string name="updater_apply_title">&updater_apply_title2;</string>
<string name="updater_apply_select">&updater_apply_select2;</string>
<string name="updater_permission_title">&brandShortName;</string>
<string name="updater_permission_text">&updater_permission_text;</string>
+ <string name="updater_permission_allow">&updater_permission_allow;</string>
<!-- Awesomescreen screen -->
<string name="suggestions_prompt">&suggestions_prompt3;</string>
<string name="search_bar_item_desc">&search_bar_item_desc;</string>
<string name="suggestion_for_engine">&suggestion_for_engine;</string>
<!-- Set Image Notifications -->