Skip to content

Commit

Permalink
Request permission to download envs in the external storage
Browse files Browse the repository at this point in the history
  • Loading branch information
keianhzo committed Jul 17, 2020
1 parent 632d248 commit b45414e
Show file tree
Hide file tree
Showing 3 changed files with 84 additions and 6 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
import android.graphics.drawable.BitmapDrawable;
import android.view.LayoutInflater;

import androidx.annotation.NonNull;
import androidx.databinding.DataBindingUtil;

import org.mozilla.vrbrowser.R;
Expand All @@ -30,7 +31,7 @@
import java.net.URL;
import java.util.Arrays;

class EnvironmentOptionsView extends SettingsView {
class EnvironmentOptionsView extends SettingsView implements EnvironmentsManager.EnvironmentListener {

private OptionsEnvironmentBinding mBinding;
private ImageRadioGroupSetting mEnvironmentsRadio;
Expand Down Expand Up @@ -80,13 +81,14 @@ protected void updateUI() {
public void onShown() {
super.onShown();

mEnvironmentsManager.addListener(this);
mWidgetManager.pushWorldBrightness(this, WidgetManagerDelegate.DEFAULT_NO_DIM_BRIGHTNESS);
}


@Override
public void onHidden() {
mWidgetManager.popWorldBrightness(this);
mEnvironmentsManager.removeListener(this);
}

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

String value = (String) mEnvironmentsRadio.getValueForId(checkedId);
SettingsStore.getInstance(getContext()).setEnvironment(value);

mEnvironmentsManager.setOrDownloadEnvironment(value);
}
Expand Down Expand Up @@ -189,4 +190,18 @@ private void updateEnvironments() {
setEnv(mEnvironmentsRadio.getIdForValue(env), false);
}

@Override
public void onEnvironmentSetSuccess(@NonNull String envId) {

}

@Override
public void onEnvironmentSetError(@NonNull String error) {
setEnv(mEnvironmentsRadio.getIdForValue(SettingsStore.getInstance(getContext()).getEnvironment()), false);
mWidgetManager.getFocusedWindow().showAlert(
getContext().getString(R.string.environment__error_title),
error,
null
);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
import com.mozilla.speechlibrary.utils.zip.UnzipCallback;
import com.mozilla.speechlibrary.utils.zip.UnzipTask;

import org.mozilla.geckoview.GeckoSession;
import org.mozilla.vrbrowser.R;
import org.mozilla.vrbrowser.browser.SettingsStore;
import org.mozilla.vrbrowser.downloads.Download;
Expand All @@ -19,19 +20,39 @@
import org.mozilla.vrbrowser.ui.widgets.WidgetManagerDelegate;

import java.io.File;
import java.util.ArrayList;

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

public interface EnvironmentListener {
default void onEnvironmentSetSuccess(@NonNull String envId) {}
default void onEnvironmentSetError(@NonNull String error) {}
}

private WidgetManagerDelegate mApplicationDelegate;
private Context mContext;
private DownloadsManager mDownloadManager;
private SharedPreferences mPrefs;
private ArrayList<EnvironmentListener> mListeners;

public EnvironmentsManager(@NonNull Context context) {
mContext = context;
mApplicationDelegate = ((WidgetManagerDelegate)context);
mDownloadManager = mApplicationDelegate.getServicesProvider().getDownloadsManager();
mPrefs = PreferenceManager.getDefaultSharedPreferences(mContext);
mListeners = new ArrayList<>();
}

public void addListener(@NonNull EnvironmentListener listener) {
if (!mListeners.contains(listener)) {
mListeners.add(listener);
}
}

public void removeListener(@NonNull EnvironmentListener listener) {
if (mListeners.contains(listener)) {
mListeners.remove(listener);
}
}

public void start() {
Expand All @@ -46,11 +67,15 @@ public void stop() {

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

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

} else {
Expand Down Expand Up @@ -98,7 +123,29 @@ private void downloadEnvironment(@NonNull String envId) {
if (!isDownloading) {
// If the env is not being downloaded, start downloading it
DownloadJob job = DownloadJob.create(environment.getPayload());
mDownloadManager.startDownload(job);
@SettingsStore.Storage int storage = SettingsStore.getInstance(mContext).getDownloadsStorage();
if (storage == SettingsStore.EXTERNAL &&
!mApplicationDelegate.isPermissionGranted(android.Manifest.permission.READ_EXTERNAL_STORAGE)) {
mApplicationDelegate.requestPermission(
job.getUri(),
android.Manifest.permission.READ_EXTERNAL_STORAGE,
new GeckoSession.PermissionDelegate.Callback() {
@Override
public void grant() {
mDownloadManager.startDownload(job);
}

@Override
public void reject() {
mListeners.forEach(listener -> listener.onEnvironmentSetError(
mContext.getString(R.string.environment_download_permission_error_body)
));
}
});

} else {
mDownloadManager.startDownload(job);
}
}
}
}
Expand Down Expand Up @@ -130,17 +177,23 @@ public void onUnzipFinish(@NonNull String zipFile, @NonNull String outputPath) {
file.delete();

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

@Override
public void onUnzipCancelled(@NonNull String zipFile) {

mListeners.forEach(listener -> listener.onEnvironmentSetError(
mContext.getString(R.string.environment_download_unzip_error_body)
));
}

@Override
public void onUnzipError(@NonNull String zipFile, @Nullable String error) {

mListeners.forEach(listener -> listener.onEnvironmentSetError(
mContext.getString(R.string.environment_download_unzip_error_body)
));
}
});
String zipOutputPath = EnvironmentUtils.getEnvPath(mContext, env.getValue());
Expand Down
10 changes: 10 additions & 0 deletions app/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -1832,4 +1832,14 @@ the Select` button. When clicked it closes all the previously selected tabs -->
<!-- This string is displayed in the downloads panel, in the download status when an unknown error happened. -->
<string name="download_status_unknown_error">Unknown error</string>

<!-- 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
but hasn't granted the permission. -->
<string name="environment_download_permission_error_body">Permission to write the external storage is required to download the environment.</string>

<!-- This string is shown in the body of the error dialog displayed when the environment unzipping fails. -->
<string name="environment_download_unzip_error_body">An error occurred while unzipping the environment.</string>

<!-- This string is shown in the title of the error dialog displayed if there is any error during an environment setup. -->
<string name="environment__error_title">Environment error</string>

</resources>

0 comments on commit b45414e

Please sign in to comment.