diff --git a/app/src/common/shared/org/mozilla/vrbrowser/VRBrowserActivity.java b/app/src/common/shared/org/mozilla/vrbrowser/VRBrowserActivity.java index af5c49e83..0427c1ac3 100644 --- a/app/src/common/shared/org/mozilla/vrbrowser/VRBrowserActivity.java +++ b/app/src/common/shared/org/mozilla/vrbrowser/VRBrowserActivity.java @@ -1475,6 +1475,11 @@ public TrayWidget getTray() { return mTray; } + @Override + public void saveState() { + mWindows.saveState(); + } + private native void addWidgetNative(int aHandle, WidgetPlacement aPlacement); private native void updateWidgetNative(int aHandle, WidgetPlacement aPlacement); private native void updateVisibleWidgetsNative(); diff --git a/app/src/common/shared/org/mozilla/vrbrowser/browser/SettingsStore.java b/app/src/common/shared/org/mozilla/vrbrowser/browser/SettingsStore.java index 75eefa533..eef142797 100644 --- a/app/src/common/shared/org/mozilla/vrbrowser/browser/SettingsStore.java +++ b/app/src/common/shared/org/mozilla/vrbrowser/browser/SettingsStore.java @@ -7,6 +7,8 @@ import android.preference.PreferenceManager; import android.util.Log; +import androidx.annotation.NonNull; + import org.json.JSONArray; import org.json.JSONObject; import org.mozilla.geckoview.GeckoSessionSettings; @@ -14,16 +16,12 @@ import org.mozilla.vrbrowser.R; import org.mozilla.vrbrowser.telemetry.GleanMetricsService; import org.mozilla.vrbrowser.telemetry.TelemetryWrapper; -import org.mozilla.vrbrowser.ui.widgets.UISurfaceTextureRenderer; import org.mozilla.vrbrowser.utils.DeviceType; import org.mozilla.vrbrowser.utils.LocaleUtils; import org.mozilla.vrbrowser.utils.StringUtils; import org.mozilla.vrbrowser.utils.SystemUtils; -import androidx.annotation.NonNull; - import java.util.ArrayList; -import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Locale; @@ -86,6 +84,7 @@ SettingsStore getInstance(final @NonNull Context aContext) { public final static boolean HISTORY_SYNC_DEFAULT = true; public final static boolean WHATS_NEW_DISPLAYED = false; public final static long FXA_LAST_SYNC_NEVER = 0; + public final static boolean RESTORE_TABS_ENABLED = true; // Enable telemetry by default (opt-out). public final static boolean CRASH_REPORTING_DEFAULT = false; @@ -690,8 +689,16 @@ public long getFxALastSync(@NonNull String email) { } catch (Exception e) { return FXA_LAST_SYNC_NEVER; } + } + public void setRestoreTabsEnabled(boolean isEnabled) { + SharedPreferences.Editor editor = mPrefs.edit(); + editor.putBoolean(mContext.getString(R.string.settings_key_restore_tabs), isEnabled); + editor.commit(); + } + public boolean isRestoreTabsEnabled() { + return mPrefs.getBoolean(mContext.getString(R.string.settings_key_restore_tabs), RESTORE_TABS_ENABLED); } } diff --git a/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/WidgetManagerDelegate.java b/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/WidgetManagerDelegate.java index 88ab047dd..7b9437386 100644 --- a/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/WidgetManagerDelegate.java +++ b/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/WidgetManagerDelegate.java @@ -6,7 +6,6 @@ import androidx.annotation.NonNull; import org.mozilla.geckoview.GeckoSession; -import org.mozilla.vrbrowser.VRBrowserActivity; import org.mozilla.vrbrowser.ui.widgets.menus.VideoProjectionMenuWidget; import org.mozilla.vrbrowser.utils.ConnectivityReceiver; @@ -88,4 +87,5 @@ interface WorldClickListener { TrayWidget getTray(); void addConnectivityListener(ConnectivityReceiver.Delegate aListener); void removeConnectivityListener(ConnectivityReceiver.Delegate aListener); + void saveState(); } diff --git a/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/Windows.java b/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/Windows.java index 6adb69811..8767e5da4 100644 --- a/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/Windows.java +++ b/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/Windows.java @@ -146,7 +146,7 @@ public Windows(Context aContext) { restoreWindows(); } - private void saveState() { + public void saveState() { File file = new File(mContext.getFilesDir(), WINDOWS_SAVE_FILENAME); try (Writer writer = new FileWriter(file)) { WindowsState state = new WindowsState(); @@ -602,8 +602,9 @@ private WindowWidget getRightWindow() { } private void restoreWindows() { + boolean restoreEnabled = SettingsStore.getInstance(mContext).isRestoreTabsEnabled(); WindowsState windowsState = restoreState(); - if (windowsState != null) { + if (restoreEnabled && windowsState != null) { ArrayList restoredSessions = new ArrayList<>(); if (windowsState.tabs != null) { windowsState.tabs.forEach(state -> { diff --git a/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/dialogs/RestartDialogWidget.java b/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/dialogs/RestartDialogWidget.java index 66c7e0ea0..b2eb3a0f5 100644 --- a/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/dialogs/RestartDialogWidget.java +++ b/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/dialogs/RestartDialogWidget.java @@ -30,6 +30,7 @@ protected void initialize(Context aContext) { onDismiss(); } else if (index == PromptDialogWidget.POSITIVE) { + mWidgetManager.saveState(); postDelayed(() -> SystemUtils.scheduleRestart(getContext(), 100), 500); } }); diff --git a/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/settings/PrivacyOptionsView.java b/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/settings/PrivacyOptionsView.java index da1c6e271..8bfca8f07 100644 --- a/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/settings/PrivacyOptionsView.java +++ b/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/settings/PrivacyOptionsView.java @@ -122,6 +122,9 @@ private void initialize(Context aContext) { setPopUpsBlocking(SettingsStore.getInstance(getContext()).isPopUpsBlockingEnabled(), false); mBinding.popUpsBlockingExceptionsButton.setOnClickListener(v -> mDelegate.showView(mPopUpsBlockingExceptions)); + + mBinding.restoreTabsSwitch.setOnCheckedChangeListener(mRestoreTabsListener); + setRestoreTabs(SettingsStore.getInstance(getContext()).isRestoreTabsEnabled(), false); } private void togglePermission(SwitchSetting aButton, String aPermission) { @@ -171,6 +174,10 @@ public void reject() { setPopUpsBlocking(value, doApply); }; + private SwitchSetting.OnCheckedChangeListener mRestoreTabsListener = (compoundButton, value, doApply) -> { + setRestoreTabs(value, doApply); + }; + private void resetOptions() { if (mBinding.drmContentPlaybackSwitch.isChecked() != SettingsStore.DRM_PLAYBACK_DEFAULT) { setDrmContent(SettingsStore.DRM_PLAYBACK_DEFAULT, true); @@ -199,6 +206,10 @@ private void resetOptions() { if (mBinding.popUpsBlockingSwitch.isChecked() != SettingsStore.POP_UPS_BLOCKING_DEFAULT) { setPopUpsBlocking(SettingsStore.POP_UPS_BLOCKING_DEFAULT, true); } + + if (mBinding.restoreTabsSwitch.isChecked() != SettingsStore.RESTORE_TABS_ENABLED) { + setRestoreTabs(SettingsStore.RESTORE_TABS_ENABLED, true); + } } private void setDrmContent(boolean value, boolean doApply) { @@ -273,6 +284,16 @@ private void setPopUpsBlocking(boolean value, boolean doApply) { } } + private void setRestoreTabs(boolean value, boolean doApply) { + mBinding.restoreTabsSwitch.setOnCheckedChangeListener(null); + mBinding.restoreTabsSwitch.setValue(value, false); + mBinding.restoreTabsSwitch.setOnCheckedChangeListener(mRestoreTabsListener); + + if (doApply) { + SettingsStore.getInstance(getContext()).setRestoreTabsEnabled(value); + } + } + @Override public Point getDimensions() { return new Point( WidgetPlacement.dpDimension(getContext(), R.dimen.privacy_options_width), diff --git a/app/src/main/res/layout/options_privacy.xml b/app/src/main/res/layout/options_privacy.xml index ea7bb85e4..39b8da946 100644 --- a/app/src/main/res/layout/options_privacy.xml +++ b/app/src/main/res/layout/options_privacy.xml @@ -45,6 +45,12 @@ app:buttonText="@string/developer_options_show" app:description="@string/settings_privacy_policy" /> + + settings_key_whats_new_displayed settings_key_ui_hardware_acceleration settings_key_fxa_last_sync + settings_key_restore_tabs https://github.com/MozillaReality/FirefoxReality/wiki/Environments https://www.mozilla.org/privacy/firefox/ https://mixedreality.mozilla.org/fxr/report?src=browser-fxr&label=browser-firefox-reality&url=%1$s diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 49b3e88de..69e172647 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -554,6 +554,10 @@ and is used to enable or disable playback of DRM controlled content. --> Play DRM-Controlled Content (<a href="http://somesite.com/">Learn More</a>) + + Restore tabs and windows after restart + Tracking Protection