From 0833c5a133f44994e10f9d719c50f88602755717 Mon Sep 17 00:00:00 2001 From: Alan Stokes Date: Tue, 2 Apr 2019 15:37:54 +0100 Subject: [PATCH] Take default for background activity starts from DeviceConfig. We've modified the implementation to use the value set by DeviceConfig if the user has not touched the developer options setting (change fb227077b8652b817a094d37a5215ad7466ee603). We want the Settings screen to reflect this default until the user explicitly sets it. Additionally if the user disables developer settings we want to go back to using whatever DeviceConfig sets. Bug: 129533810 Test: croot && make RunSettingsRoboTests \ ROBOTEST_FILTER=AllowBackgroundActivityStartsPreferenceControllerTest Change-Id: I73901a22da928f9a6924b30882b26494cdcd94bc --- ...undActivityStartsPreferenceController.java | 41 +++++++--- ...ctivityStartsPreferenceControllerTest.java | 74 ++++++++++++++++--- 2 files changed, 96 insertions(+), 19 deletions(-) diff --git a/src/com/android/settings/development/AllowBackgroundActivityStartsPreferenceController.java b/src/com/android/settings/development/AllowBackgroundActivityStartsPreferenceController.java index d26517a0283..4aaa4906335 100644 --- a/src/com/android/settings/development/AllowBackgroundActivityStartsPreferenceController.java +++ b/src/com/android/settings/development/AllowBackgroundActivityStartsPreferenceController.java @@ -17,11 +17,13 @@ package com.android.settings.development; import android.content.Context; +import android.provider.DeviceConfig; import android.provider.Settings; import androidx.preference.Preference; import androidx.preference.SwitchPreference; +import com.android.internal.annotations.VisibleForTesting; import com.android.settings.core.PreferenceControllerMixin; import com.android.settingslib.development.DeveloperOptionsPreferenceController; @@ -32,6 +34,11 @@ public class AllowBackgroundActivityStartsPreferenceController private static final String BACKGROUND_ACTIVITY_STARTS_ENABLED_KEY = "allow_background_activity_starts"; + /** Key in DeviceConfig that stores the default for the preference (as a boolean). */ + @VisibleForTesting + static final String KEY_DEFAULT_BACKGROUND_ACTIVITY_STARTS_ENABLED = + "default_background_activity_starts_enabled"; + public AllowBackgroundActivityStartsPreferenceController(Context context) { super(context); } @@ -47,22 +54,38 @@ public class AllowBackgroundActivityStartsPreferenceController return true; } - private void writeSetting(boolean isEnabled) { - Settings.Global.putInt(mContext.getContentResolver(), - Settings.Global.BACKGROUND_ACTIVITY_STARTS_ENABLED, isEnabled ? 1 : 0); - } - @Override public void updateState(Preference preference) { final int mode = Settings.Global.getInt(mContext.getContentResolver(), - Settings.Global.BACKGROUND_ACTIVITY_STARTS_ENABLED, 1); - ((SwitchPreference) mPreference).setChecked(mode != 0); + Settings.Global.BACKGROUND_ACTIVITY_STARTS_ENABLED, -1); + + boolean isEnabled = mode < 0 ? isDefaultEnabled() : mode != 0; + ((SwitchPreference) mPreference).setChecked(isEnabled); } @Override protected void onDeveloperOptionsSwitchDisabled() { super.onDeveloperOptionsSwitchDisabled(); - writeSetting(true); - ((SwitchPreference) mPreference).setChecked(true); + clearSetting(); + updateState(mPreference); + } + + private void writeSetting(boolean isEnabled) { + Settings.Global.putInt(mContext.getContentResolver(), + Settings.Global.BACKGROUND_ACTIVITY_STARTS_ENABLED, isEnabled ? 1 : 0); + } + + private void clearSetting() { + Settings.Global.putInt(mContext.getContentResolver(), + Settings.Global.BACKGROUND_ACTIVITY_STARTS_ENABLED, -1); + } + + private boolean isDefaultEnabled() { + // The default in the absence of user preference is settable via DeviceConfig. + // Note that the default default is enabled. + return DeviceConfig.getBoolean( + DeviceConfig.NAMESPACE_ACTIVITY_MANAGER, + KEY_DEFAULT_BACKGROUND_ACTIVITY_STARTS_ENABLED, + /*defaultValue*/ true); } } diff --git a/tests/robotests/src/com/android/settings/development/AllowBackgroundActivityStartsPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/development/AllowBackgroundActivityStartsPreferenceControllerTest.java index 8e95aa109c6..afe08489503 100644 --- a/tests/robotests/src/com/android/settings/development/AllowBackgroundActivityStartsPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/development/AllowBackgroundActivityStartsPreferenceControllerTest.java @@ -16,17 +16,22 @@ package com.android.settings.development; +import static com.android.settings.development.AllowBackgroundActivityStartsPreferenceController.KEY_DEFAULT_BACKGROUND_ACTIVITY_STARTS_ENABLED; + import static com.google.common.truth.Truth.assertThat; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.content.Context; +import android.provider.DeviceConfig; import android.provider.Settings; import androidx.preference.PreferenceScreen; import androidx.preference.SwitchPreference; +import com.android.settings.testutils.shadow.ShadowDeviceConfig; + import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -34,8 +39,10 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; +import org.robolectric.annotation.Config; @RunWith(RobolectricTestRunner.class) +@Config(shadows = {ShadowDeviceConfig.class}) public class AllowBackgroundActivityStartsPreferenceControllerTest { @Mock @@ -60,20 +67,14 @@ public class AllowBackgroundActivityStartsPreferenceControllerTest { public void onPreferenceChange_settingEnabled_allowBackgroundActivityStartsShouldBeOn() { mController.onPreferenceChange(mPreference, true /* new value */); - final int mode = Settings.Global.getInt(mContext.getContentResolver(), - Settings.Global.BACKGROUND_ACTIVITY_STARTS_ENABLED, 1 /* default */); - - assertThat(mode).isEqualTo(1); + assertThat(getModeFroMSettings()).isEqualTo(1); } @Test public void onPreferenceChange_settingDisabled_allowBackgroundActivityStartsShouldBeOff() { mController.onPreferenceChange(mPreference, false /* new value */); - final int mode = Settings.Global.getInt(mContext.getContentResolver(), - Settings.Global.BACKGROUND_ACTIVITY_STARTS_ENABLED, 1 /* default */); - - assertThat(mode).isEqualTo(0); + assertThat(getModeFroMSettings()).isEqualTo(0); } @Test @@ -83,7 +84,7 @@ public class AllowBackgroundActivityStartsPreferenceControllerTest { mController.updateState(mPreference); verify(mPreference).setChecked(false); - } + } @Test public void updateState_settingEnabled_preferenceShouldBeChecked() { @@ -95,11 +96,64 @@ public class AllowBackgroundActivityStartsPreferenceControllerTest { } @Test - public void onDeveloperOptionsSwitchDisabled_shouldDisablePreference() { + public void updateState_settingReset_defaultDisabled_preferenceShouldNotBeChecked() { + setDefault(false); + mController.updateState(mPreference); + + verify(mPreference).setChecked(false); + } + + @Test + public void updateState_settingReset_defaultEnabled_preferenceShouldBeChecked() { + setDefault(true); + mController.updateState(mPreference); + + verify(mPreference).setChecked(true); + } + + @Test + public void onDeveloperOptionsSwitchDisabled_noDefault_shouldResetPreference() { mController.onDeveloperOptionsSwitchDisabled(); verify(mPreference).setChecked(true); verify(mPreference).setEnabled(false); + + assertThat(getModeFroMSettings()).isEqualTo(-1); + } + + @Test + public void onDeveloperOptionsSwitchDisabled_defaultDisabled_shouldResetPreference() { + setDefault(false); + mController.onDeveloperOptionsSwitchDisabled(); + + verify(mPreference).setChecked(false); + verify(mPreference).setEnabled(false); + + assertThat(getModeFroMSettings()).isEqualTo(-1); + } + + @Test + public void onDeveloperOptionsSwitchDisabled_defaultEnabled_shouldResetPreference() { + setDefault(true); + mController.onDeveloperOptionsSwitchDisabled(); + + verify(mPreference).setChecked(true); + verify(mPreference).setEnabled(false); + + assertThat(getModeFroMSettings()).isEqualTo(-1); + } + + private int getModeFroMSettings() { + return Settings.Global.getInt(mContext.getContentResolver(), + Settings.Global.BACKGROUND_ACTIVITY_STARTS_ENABLED, 999 /* default */); + } + + private void setDefault(boolean defaultEnabled) { + DeviceConfig.setProperty( + DeviceConfig.NAMESPACE_ACTIVITY_MANAGER, + KEY_DEFAULT_BACKGROUND_ACTIVITY_STARTS_ENABLED, + Boolean.toString(defaultEnabled), + false /* makeDefault */); } }