Skip to content
This repository was archived by the owner on Jul 22, 2024. It is now read-only.

Commit cb33623

Browse files
keianhzobluemarvin
andcommitted
Fixes #3693 Request permission to download envs in the external storage (#3694)
* Request permission to download envs in the external storage * Request Write instead of Read permission. Co-authored-by: Randall E. Barker <[email protected]>
1 parent 76f9edd commit cb33623

4 files changed

Lines changed: 90 additions & 7 deletions

File tree

app/src/common/shared/org/mozilla/vrbrowser/downloads/DownloadsManager.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,12 @@ public void startDownload(@NonNull DownloadJob job, @SettingsStore.Storage int s
131131
}
132132

133133
if (mDownloadManager != null) {
134-
mDownloadManager.enqueue(request);
134+
try {
135+
mDownloadManager.enqueue(request);
136+
} catch (SecurityException e) {
137+
notifyDownloadError("Cannot create output file", job.getFilename());
138+
return;
139+
}
135140
scheduleUpdates();
136141
}
137142
}

app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/settings/EnvironmentOptionsView.java

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import android.graphics.drawable.BitmapDrawable;
1212
import android.view.LayoutInflater;
1313

14+
import androidx.annotation.NonNull;
1415
import androidx.databinding.DataBindingUtil;
1516

1617
import org.mozilla.vrbrowser.R;
@@ -30,7 +31,7 @@
3031
import java.net.URL;
3132
import java.util.Arrays;
3233

33-
class EnvironmentOptionsView extends SettingsView {
34+
class EnvironmentOptionsView extends SettingsView implements EnvironmentsManager.EnvironmentListener {
3435

3536
private OptionsEnvironmentBinding mBinding;
3637
private ImageRadioGroupSetting mEnvironmentsRadio;
@@ -80,13 +81,14 @@ protected void updateUI() {
8081
public void onShown() {
8182
super.onShown();
8283

84+
mEnvironmentsManager.addListener(this);
8385
mWidgetManager.pushWorldBrightness(this, WidgetManagerDelegate.DEFAULT_NO_DIM_BRIGHTNESS);
8486
}
8587

86-
8788
@Override
8889
public void onHidden() {
8990
mWidgetManager.popWorldBrightness(this);
91+
mEnvironmentsManager.removeListener(this);
9092
}
9193

9294
private void setEnvOverride(boolean value) {
@@ -127,7 +129,6 @@ private void setEnv(int checkedId, boolean doApply) {
127129
mEnvironmentsRadio.setOnCheckedChangeListener(mEnvsListener);
128130

129131
String value = (String) mEnvironmentsRadio.getValueForId(checkedId);
130-
SettingsStore.getInstance(getContext()).setEnvironment(value);
131132

132133
mEnvironmentsManager.setOrDownloadEnvironment(value);
133134
}
@@ -189,4 +190,18 @@ private void updateEnvironments() {
189190
setEnv(mEnvironmentsRadio.getIdForValue(env), false);
190191
}
191192

193+
@Override
194+
public void onEnvironmentSetSuccess(@NonNull String envId) {
195+
196+
}
197+
198+
@Override
199+
public void onEnvironmentSetError(@NonNull String error) {
200+
setEnv(mEnvironmentsRadio.getIdForValue(SettingsStore.getInstance(getContext()).getEnvironment()), false);
201+
mWidgetManager.getFocusedWindow().showAlert(
202+
getContext().getString(R.string.environment__error_title),
203+
error,
204+
null
205+
);
206+
}
192207
}

app/src/common/shared/org/mozilla/vrbrowser/utils/EnvironmentsManager.java

Lines changed: 56 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import com.mozilla.speechlibrary.utils.zip.UnzipCallback;
1212
import com.mozilla.speechlibrary.utils.zip.UnzipTask;
1313

14+
import org.mozilla.geckoview.GeckoSession;
1415
import org.mozilla.vrbrowser.R;
1516
import org.mozilla.vrbrowser.browser.SettingsStore;
1617
import org.mozilla.vrbrowser.downloads.Download;
@@ -19,19 +20,39 @@
1920
import org.mozilla.vrbrowser.ui.widgets.WidgetManagerDelegate;
2021

2122
import java.io.File;
23+
import java.util.ArrayList;
2224

2325
public class EnvironmentsManager implements DownloadsManager.DownloadsListener, SharedPreferences.OnSharedPreferenceChangeListener {
2426

27+
public interface EnvironmentListener {
28+
default void onEnvironmentSetSuccess(@NonNull String envId) {}
29+
default void onEnvironmentSetError(@NonNull String error) {}
30+
}
31+
2532
private WidgetManagerDelegate mApplicationDelegate;
2633
private Context mContext;
2734
private DownloadsManager mDownloadManager;
2835
private SharedPreferences mPrefs;
36+
private ArrayList<EnvironmentListener> mListeners;
2937

3038
public EnvironmentsManager(@NonNull Context context) {
3139
mContext = context;
3240
mApplicationDelegate = ((WidgetManagerDelegate)context);
3341
mDownloadManager = mApplicationDelegate.getServicesProvider().getDownloadsManager();
3442
mPrefs = PreferenceManager.getDefaultSharedPreferences(mContext);
43+
mListeners = new ArrayList<>();
44+
}
45+
46+
public void addListener(@NonNull EnvironmentListener listener) {
47+
if (!mListeners.contains(listener)) {
48+
mListeners.add(listener);
49+
}
50+
}
51+
52+
public void removeListener(@NonNull EnvironmentListener listener) {
53+
if (mListeners.contains(listener)) {
54+
mListeners.remove(listener);
55+
}
3556
}
3657

3758
public void start() {
@@ -46,11 +67,15 @@ public void stop() {
4667

4768
public void setOrDownloadEnvironment(@NonNull String envId) {
4869
if (EnvironmentUtils.isBuiltinEnvironment(mContext, envId)) {
70+
SettingsStore.getInstance(mContext).setEnvironment(envId);
71+
mListeners.forEach(environmentListener -> environmentListener.onEnvironmentSetSuccess(envId));
4972
mApplicationDelegate.updateEnvironment();
5073

5174
} else {
5275
if (EnvironmentUtils.isExternalEnvReady(mContext, envId)) {
5376
// If the environment is ready, call native to update
77+
SettingsStore.getInstance(mContext).setEnvironment(envId);
78+
mListeners.forEach(environmentListener -> environmentListener.onEnvironmentSetSuccess(envId));
5479
mApplicationDelegate.updateEnvironment();
5580

5681
} else {
@@ -98,7 +123,29 @@ private void downloadEnvironment(@NonNull String envId) {
98123
if (!isDownloading) {
99124
// If the env is not being downloaded, start downloading it
100125
DownloadJob job = DownloadJob.create(environment.getPayload());
101-
mDownloadManager.startDownload(job);
126+
@SettingsStore.Storage int storage = SettingsStore.getInstance(mContext).getDownloadsStorage();
127+
if (storage == SettingsStore.EXTERNAL &&
128+
!mApplicationDelegate.isPermissionGranted(android.Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
129+
mApplicationDelegate.requestPermission(
130+
job.getUri(),
131+
android.Manifest.permission.WRITE_EXTERNAL_STORAGE,
132+
new GeckoSession.PermissionDelegate.Callback() {
133+
@Override
134+
public void grant() {
135+
mDownloadManager.startDownload(job);
136+
}
137+
138+
@Override
139+
public void reject() {
140+
mListeners.forEach(listener -> listener.onEnvironmentSetError(
141+
mContext.getString(R.string.environment_download_permission_error_body)
142+
));
143+
}
144+
});
145+
146+
} else {
147+
mDownloadManager.startDownload(job);
148+
}
102149
}
103150
}
104151
}
@@ -130,17 +177,23 @@ public void onUnzipFinish(@NonNull String zipFile, @NonNull String outputPath) {
130177
file.delete();
131178

132179
// the environment is ready, call native to update the current env.
180+
SettingsStore.getInstance(mContext).setEnvironment(env.getValue());
181+
mListeners.forEach(environmentListener -> environmentListener.onEnvironmentSetSuccess(env.getValue()));
133182
mApplicationDelegate.updateEnvironment();
134183
}
135184

136185
@Override
137186
public void onUnzipCancelled(@NonNull String zipFile) {
138-
187+
mListeners.forEach(listener -> listener.onEnvironmentSetError(
188+
mContext.getString(R.string.environment_download_unzip_error_body)
189+
));
139190
}
140191

141192
@Override
142193
public void onUnzipError(@NonNull String zipFile, @Nullable String error) {
143-
194+
mListeners.forEach(listener -> listener.onEnvironmentSetError(
195+
mContext.getString(R.string.environment_download_unzip_error_body)
196+
));
144197
}
145198
});
146199
String zipOutputPath = EnvironmentUtils.getEnvPath(mContext, env.getValue());

app/src/main/res/values/strings.xml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1794,4 +1794,14 @@ the Select` button. When clicked it closes all the previously selected tabs -->
17941794
<!-- This string is displayed in the downloads panel, in the download status when an unknown error happened. -->
17951795
<string name="download_status_unknown_error">Unknown error</string>
17961796

1797+
<!-- This string is shown in the body of the error dialog displayed when the user is trying to download an environment in the external storage
1798+
but hasn't granted the permission. -->
1799+
<string name="environment_download_permission_error_body">Permission to write the external storage is required to download the environment.</string>
1800+
1801+
<!-- This string is shown in the body of the error dialog displayed when the environment unzipping fails. -->
1802+
<string name="environment_download_unzip_error_body">An error occurred while unzipping the environment.</string>
1803+
1804+
<!-- This string is shown in the title of the error dialog displayed if there is any error during an environment setup. -->
1805+
<string name="environment__error_title">Environment error</string>
1806+
17971807
</resources>

0 commit comments

Comments
 (0)