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 */); } }