diff options
author | Alex Stetson <alexstetson@google.com> | 2021-05-05 08:49:15 -0700 |
---|---|---|
committer | Alex Stetson <alexstetson@google.com> | 2021-05-06 08:28:19 -0700 |
commit | aff80d1e141bd939d4eed1f17c11e18ecc7d8cd1 (patch) | |
tree | 576f30c262547ded2e1e83ffaa9d3da7b5d23aca | |
parent | f9ebf6600fe6737134999c065765c2345ffc26a4 (diff) | |
download | packages_apps_Settings-aff80d1e141bd939d4eed1f17c11e18ecc7d8cd1.tar.gz packages_apps_Settings-aff80d1e141bd939d4eed1f17c11e18ecc7d8cd1.tar.bz2 packages_apps_Settings-aff80d1e141bd939d4eed1f17c11e18ecc7d8cd1.zip |
Use shared model for non-system overlay toggle
Allows settings applications on other platforms to re-use values by
migrating to Settings.secure and moving HideNonSystemOverlayMixin to
SettingsLib.
Bug: 184967544
Test: atest SettingsUnitTests
Change-Id: If9aaeca29ebb8b481d75622934503e368d7435d3
12 files changed, 24 insertions, 202 deletions
diff --git a/src/com/android/settings/core/HideNonSystemOverlayMixin.java b/src/com/android/settings/core/HideNonSystemOverlayMixin.java deleted file mode 100644 index eff1792c62..0000000000 --- a/src/com/android/settings/core/HideNonSystemOverlayMixin.java +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Copyright (C) 2019 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.settings.core; - -import static android.view.WindowManager.LayoutParams.SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS; - -import static androidx.lifecycle.Lifecycle.Event.ON_START; -import static androidx.lifecycle.Lifecycle.Event.ON_STOP; - -import android.app.Activity; -import android.view.Window; -import android.view.WindowManager; - -import androidx.annotation.VisibleForTesting; -import androidx.lifecycle.LifecycleObserver; -import androidx.lifecycle.OnLifecycleEvent; - -import com.android.settings.development.OverlaySettingsPreferenceController; - - -/** - * A mixin that adds window flag to prevent non-system overlays showing on top of Settings - * activities. - */ -public class HideNonSystemOverlayMixin implements LifecycleObserver { - - private final Activity mActivity; - - public HideNonSystemOverlayMixin(Activity activity) { - mActivity = activity; - } - - @VisibleForTesting - boolean isEnabled() { - return !OverlaySettingsPreferenceController.isOverlaySettingsEnabled(mActivity); - } - - @OnLifecycleEvent(ON_START) - public void onStart() { - if (mActivity == null || !isEnabled()) { - return; - } - mActivity.getWindow().addSystemFlags(SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS); - android.util.EventLog.writeEvent(0x534e4554, "120484087", -1, ""); - } - - - @OnLifecycleEvent(ON_STOP) - public void onStop() { - if (mActivity == null || !isEnabled()) { - return; - } - final Window window = mActivity.getWindow(); - final WindowManager.LayoutParams attrs = window.getAttributes(); - attrs.privateFlags &= ~SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS; - window.setAttributes(attrs); - } -} diff --git a/src/com/android/settings/core/SettingsBaseActivity.java b/src/com/android/settings/core/SettingsBaseActivity.java index 903805e6dd..2e2eeff1c8 100644 --- a/src/com/android/settings/core/SettingsBaseActivity.java +++ b/src/com/android/settings/core/SettingsBaseActivity.java @@ -47,6 +47,7 @@ import com.android.settings.R; import com.android.settings.SubSettings; import com.android.settings.Utils; import com.android.settings.dashboard.CategoryManager; +import com.android.settingslib.core.lifecycle.HideNonSystemOverlayMixin; import com.android.settingslib.drawer.Tile; import com.android.settingslib.transition.SettingsTransitionHelper; diff --git a/src/com/android/settings/development/OverlaySettingsPreferenceController.java b/src/com/android/settings/development/OverlaySettingsPreferenceController.java index 50f9867297..cd08793a9e 100644 --- a/src/com/android/settings/development/OverlaySettingsPreferenceController.java +++ b/src/com/android/settings/development/OverlaySettingsPreferenceController.java @@ -16,8 +16,10 @@ package com.android.settings.development; +import static com.android.settingslib.core.lifecycle.HideNonSystemOverlayMixin.SECURE_OVERLAY_SETTINGS; + import android.content.Context; -import android.content.SharedPreferences; +import android.provider.Settings; import androidx.annotation.VisibleForTesting; import androidx.preference.Preference; @@ -33,7 +35,6 @@ import com.android.settingslib.development.DeveloperOptionsPreferenceController; public class OverlaySettingsPreferenceController extends DeveloperOptionsPreferenceController implements Preference.OnPreferenceChangeListener, PreferenceControllerMixin { - public static final String SHARE_PERFS = "overlay_settings"; private static final String KEY_OVERLAY_SETTINGS = "overlay_settings"; public OverlaySettingsPreferenceController(Context context) { @@ -64,10 +65,10 @@ public class OverlaySettingsPreferenceController extends DeveloperOptionsPrefere /** * Check if this setting is enabled or not. */ - public static boolean isOverlaySettingsEnabled(Context context) { - final SharedPreferences editor = context.getSharedPreferences(SHARE_PERFS, - Context.MODE_PRIVATE); - return editor.getBoolean(SHARE_PERFS, false /* defValue */); + @VisibleForTesting + static boolean isOverlaySettingsEnabled(Context context) { + return Settings.Secure.getInt(context.getContentResolver(), + SECURE_OVERLAY_SETTINGS, 0 /* defValue */) != 0; } /** @@ -75,9 +76,8 @@ public class OverlaySettingsPreferenceController extends DeveloperOptionsPrefere */ @VisibleForTesting static void setOverlaySettingsEnabled(Context context, boolean enabled) { - final SharedPreferences editor = context.getSharedPreferences(SHARE_PERFS, - Context.MODE_PRIVATE); - editor.edit().putBoolean(SHARE_PERFS, enabled).apply(); + Settings.Secure.putInt(context.getContentResolver(), + SECURE_OVERLAY_SETTINGS, enabled ? 1 : 0); } @Override diff --git a/src/com/android/settings/homepage/SettingsHomepageActivity.java b/src/com/android/settings/homepage/SettingsHomepageActivity.java index cd980f32a6..c59b805c43 100644 --- a/src/com/android/settings/homepage/SettingsHomepageActivity.java +++ b/src/com/android/settings/homepage/SettingsHomepageActivity.java @@ -39,9 +39,9 @@ import com.android.settings.R; import com.android.settings.Utils; import com.android.settings.accounts.AvatarViewMixin; import com.android.settings.core.FeatureFlags; -import com.android.settings.core.HideNonSystemOverlayMixin; import com.android.settings.homepage.contextualcards.ContextualCardsFragment; import com.android.settings.overlay.FeatureFactory; +import com.android.settingslib.core.lifecycle.HideNonSystemOverlayMixin; import com.android.settingslib.transition.SettingsTransitionHelper; public class SettingsHomepageActivity extends FragmentActivity { diff --git a/src/com/android/settings/notification/app/ChannelPanelActivity.java b/src/com/android/settings/notification/app/ChannelPanelActivity.java index 3ba118ee4d..9889183d4d 100644 --- a/src/com/android/settings/notification/app/ChannelPanelActivity.java +++ b/src/com/android/settings/notification/app/ChannelPanelActivity.java @@ -31,10 +31,9 @@ import androidx.annotation.Nullable; import androidx.fragment.app.FragmentActivity; import androidx.fragment.app.FragmentManager; -import com.android.internal.annotations.VisibleForTesting; import com.android.settings.R; -import com.android.settings.core.HideNonSystemOverlayMixin; import com.android.settings.core.SubSettingLauncher; +import com.android.settingslib.core.lifecycle.HideNonSystemOverlayMixin; /** * Dialog Activity to host channel settings diff --git a/src/com/android/settings/panel/SettingsPanelActivity.java b/src/com/android/settings/panel/SettingsPanelActivity.java index 856dc35c6e..77949eb298 100644 --- a/src/com/android/settings/panel/SettingsPanelActivity.java +++ b/src/com/android/settings/panel/SettingsPanelActivity.java @@ -35,7 +35,7 @@ import androidx.fragment.app.FragmentManager; import com.android.internal.annotations.VisibleForTesting; import com.android.settings.R; -import com.android.settings.core.HideNonSystemOverlayMixin; +import com.android.settingslib.core.lifecycle.HideNonSystemOverlayMixin; /** * Dialog Activity to host Settings Slices. diff --git a/src/com/android/settings/security/CredentialStorage.java b/src/com/android/settings/security/CredentialStorage.java index be42850372..090fdf6bb0 100644 --- a/src/com/android/settings/security/CredentialStorage.java +++ b/src/com/android/settings/security/CredentialStorage.java @@ -44,9 +44,9 @@ import androidx.fragment.app.FragmentActivity; import com.android.internal.widget.LockPatternUtils; import com.android.settings.R; -import com.android.settings.core.HideNonSystemOverlayMixin; import com.android.settings.password.ChooseLockSettingsHelper; import com.android.settings.vpn2.VpnUtils; +import com.android.settingslib.core.lifecycle.HideNonSystemOverlayMixin; /** * CredentialStorage handles resetting and installing keys into KeyStore. diff --git a/src/com/android/settings/wifi/addappnetworks/AddAppNetworksActivity.java b/src/com/android/settings/wifi/addappnetworks/AddAppNetworksActivity.java index f276603d7d..7b5eaa9ecb 100644 --- a/src/com/android/settings/wifi/addappnetworks/AddAppNetworksActivity.java +++ b/src/com/android/settings/wifi/addappnetworks/AddAppNetworksActivity.java @@ -30,7 +30,7 @@ import androidx.fragment.app.FragmentManager; import com.android.internal.annotations.VisibleForTesting; import com.android.settings.R; -import com.android.settings.core.HideNonSystemOverlayMixin; +import com.android.settingslib.core.lifecycle.HideNonSystemOverlayMixin; /** * When apps send a new intent with a WifiConfiguration list extra to Settings APP. Settings APP diff --git a/tests/robotests/src/com/android/settings/core/HideNonSystemOverlayMixinTest.java b/tests/robotests/src/com/android/settings/core/HideNonSystemOverlayMixinTest.java deleted file mode 100644 index cf0f1380cf..0000000000 --- a/tests/robotests/src/com/android/settings/core/HideNonSystemOverlayMixinTest.java +++ /dev/null @@ -1,104 +0,0 @@ -/* - * Copyright (C) 2019 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.settings.core; - -import static android.view.WindowManager.LayoutParams.SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS; - -import static com.google.common.truth.Truth.assertThat; - -import android.content.Context; -import android.content.SharedPreferences; -import android.os.Bundle; -import android.view.WindowManager; - -import androidx.annotation.Nullable; -import androidx.appcompat.app.AppCompatActivity; - -import com.android.settings.R; -import com.android.settings.development.OverlaySettingsPreferenceController; - -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.robolectric.Robolectric; -import org.robolectric.RobolectricTestRunner; -import org.robolectric.android.controller.ActivityController; - -@RunWith(RobolectricTestRunner.class) -public class HideNonSystemOverlayMixinTest { - - private ActivityController<TestActivity> mActivityController; - - @Before - public void setUp() { - mActivityController = Robolectric.buildActivity(TestActivity.class); - } - - @Test - public void startActivity_shouldHideNonSystemOverlay() { - mActivityController.setup(); - TestActivity activity = mActivityController.get(); - - // Activity start: HIDE_NON_SYSTEM_OVERLAY should be set. - final WindowManager.LayoutParams attrs = activity.getWindow().getAttributes(); - assertThat(attrs.privateFlags & SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS) - .isNotEqualTo(0); - } - - @Test - public void stopActivity_shouldUnhideNonSystemOverlay() { - mActivityController.setup().stop(); - TestActivity activity = mActivityController.get(); - - final WindowManager.LayoutParams attrs = activity.getWindow().getAttributes(); - assertThat(attrs.privateFlags & SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS) - .isEqualTo(0); - } - - @Test - public void isEnabled_isAllowedOverlaySettings_returnFalse() { - mActivityController.setup(); - final TestActivity activity = mActivityController.get(); - final SharedPreferences editor = activity.getSharedPreferences( - OverlaySettingsPreferenceController.SHARE_PERFS, - Context.MODE_PRIVATE); - editor.edit().putBoolean(OverlaySettingsPreferenceController.SHARE_PERFS, true).apply(); - - assertThat(new HideNonSystemOverlayMixin(activity).isEnabled()).isFalse(); - } - - @Test - public void isEnabled_isNotAllowedOverlaySettings_returnTrue() { - mActivityController.setup(); - TestActivity activity = mActivityController.get(); - final SharedPreferences editor = activity.getSharedPreferences( - OverlaySettingsPreferenceController.SHARE_PERFS, - Context.MODE_PRIVATE); - editor.edit().putBoolean(OverlaySettingsPreferenceController.SHARE_PERFS, false).apply(); - - assertThat(new HideNonSystemOverlayMixin(activity).isEnabled()).isTrue(); - } - - public static class TestActivity extends AppCompatActivity { - @Override - protected void onCreate(@Nullable Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setTheme(R.style.Theme_AppCompat); - getLifecycle().addObserver(new HideNonSystemOverlayMixin(this)); - } - } -} diff --git a/tests/robotests/src/com/android/settings/homepage/SettingsHomepageActivityTest.java b/tests/robotests/src/com/android/settings/homepage/SettingsHomepageActivityTest.java index 620f6d74b1..9a4ad3c29f 100644 --- a/tests/robotests/src/com/android/settings/homepage/SettingsHomepageActivityTest.java +++ b/tests/robotests/src/com/android/settings/homepage/SettingsHomepageActivityTest.java @@ -35,11 +35,11 @@ import android.widget.FrameLayout; import androidx.fragment.app.Fragment; import com.android.settings.R; -import com.android.settings.core.HideNonSystemOverlayMixin; import com.android.settings.dashboard.suggestions.SuggestionFeatureProviderImpl; import com.android.settings.homepage.contextualcards.slices.BatteryFixSliceTest; import com.android.settings.testutils.shadow.ShadowUserManager; import com.android.settings.testutils.shadow.ShadowUtils; +import com.android.settingslib.core.lifecycle.HideNonSystemOverlayMixin; import org.junit.Before; import org.junit.Test; diff --git a/tests/robotests/src/com/android/settings/panel/SettingsPanelActivityTest.java b/tests/robotests/src/com/android/settings/panel/SettingsPanelActivityTest.java index 25e17865e2..5cdc12a26d 100644 --- a/tests/robotests/src/com/android/settings/panel/SettingsPanelActivityTest.java +++ b/tests/robotests/src/com/android/settings/panel/SettingsPanelActivityTest.java @@ -36,8 +36,8 @@ import android.view.WindowManager; import androidx.fragment.app.FragmentManager; import com.android.settings.R; -import com.android.settings.core.HideNonSystemOverlayMixin; import com.android.settings.testutils.FakeFeatureFactory; +import com.android.settingslib.core.lifecycle.HideNonSystemOverlayMixin; import org.junit.Before; import org.junit.Test; diff --git a/tests/unit/src/com/android/settings/development/OverlaySettingsPreferenceControllerTest.java b/tests/unit/src/com/android/settings/development/OverlaySettingsPreferenceControllerTest.java index 827f5a199a..66fc24c92d 100644 --- a/tests/unit/src/com/android/settings/development/OverlaySettingsPreferenceControllerTest.java +++ b/tests/unit/src/com/android/settings/development/OverlaySettingsPreferenceControllerTest.java @@ -16,10 +16,12 @@ package com.android.settings.development; +import static com.android.settingslib.core.lifecycle.HideNonSystemOverlayMixin.SECURE_OVERLAY_SETTINGS; + import static com.google.common.truth.Truth.assertThat; import android.content.Context; -import android.content.SharedPreferences; +import android.provider.Settings; import androidx.preference.SwitchPreference; import androidx.test.core.app.ApplicationProvider; @@ -83,20 +85,16 @@ public class OverlaySettingsPreferenceControllerTest { @Test public void isOverlaySettingsEnabled_sharePreferenceSetTrue_shouldReturnTrue() { - final SharedPreferences editor = mContext.getSharedPreferences( - OverlaySettingsPreferenceController.SHARE_PERFS, - Context.MODE_PRIVATE); - editor.edit().putBoolean(OverlaySettingsPreferenceController.SHARE_PERFS, true).apply(); + Settings.Secure.putInt(mContext.getContentResolver(), + SECURE_OVERLAY_SETTINGS, 1); assertThat(OverlaySettingsPreferenceController.isOverlaySettingsEnabled(mContext)).isTrue(); } @Test public void isOverlaySettingsEnabled_sharePreferenceSetFalse_shouldReturnFalse() { - final SharedPreferences editor = mContext.getSharedPreferences( - OverlaySettingsPreferenceController.SHARE_PERFS, - Context.MODE_PRIVATE); - editor.edit().putBoolean(OverlaySettingsPreferenceController.SHARE_PERFS, false).apply(); + Settings.Secure.putInt(mContext.getContentResolver(), + SECURE_OVERLAY_SETTINGS, 0); assertThat( OverlaySettingsPreferenceController.isOverlaySettingsEnabled(mContext)).isFalse(); |