Loading core/java/android/provider/Settings.java +7 −0 Original line number Diff line number Diff line Loading @@ -7230,6 +7230,13 @@ public final class Settings { */ public static final String LOCATION_SHOW_SYSTEM_OPS = "locationShowSystemOps"; /** * Whether or not an indicator experiment has started. * @hide */ public static final String LOCATION_INDICATOR_EXPERIMENT_STARTED = "locationIndicatorExperimentStarted"; /** * A flag containing settings used for biometric weak * @hide Loading packages/SystemUI/src/com/android/systemui/statusbar/policy/LocationControllerImpl.java +40 −3 Original line number Diff line number Diff line Loading @@ -86,6 +86,7 @@ public class LocationControllerImpl extends BroadcastReceiver implements Locatio private boolean mShouldDisplayAllAccesses; private boolean mShowSystemAccessesFlag; private boolean mShowSystemAccessesSetting; private boolean mExperimentStarted; @Inject public LocationControllerImpl(Context context, AppOpsController appOpsController, Loading @@ -107,6 +108,9 @@ public class LocationControllerImpl extends BroadcastReceiver implements Locatio mShouldDisplayAllAccesses = getAllAccessesSetting(); mShowSystemAccessesFlag = getShowSystemFlag(); mShowSystemAccessesSetting = getShowSystemSetting(); mExperimentStarted = getExperimentStarted(); toggleSystemSettingIfExperimentJustStarted(); mContentObserver = new ContentObserver(mBackgroundHandler) { @Override public void onChange(boolean selfChange) { Loading @@ -123,8 +127,15 @@ public class LocationControllerImpl extends BroadcastReceiver implements Locatio DeviceConfig.NAMESPACE_PRIVACY, backgroundHandler::post, properties -> { // Update the Device Config flag which controls the experiment to display // location accesses. mShouldDisplayAllAccesses = getAllAccessesSetting(); mShowSystemAccessesFlag = getShowSystemSetting(); // Update the Device Config flag which controls the experiment to display // system location accesses. mShowSystemAccessesFlag = getShowSystemFlag(); // Update the local flag for the system accesses experiment and potentially // update the behavior based on the flag value. toggleSystemSettingIfExperimentJustStarted(); updateActiveLocationRequests(); }); Loading Loading @@ -222,6 +233,33 @@ public class LocationControllerImpl extends BroadcastReceiver implements Locatio return mSecureSettings.getInt(Settings.Secure.LOCATION_SHOW_SYSTEM_OPS, 0) == 1; } private boolean getExperimentStarted() { return mSecureSettings .getInt(Settings.Secure.LOCATION_INDICATOR_EXPERIMENT_STARTED, 0) == 1; } private void toggleSystemSettingIfExperimentJustStarted() { // mShowSystemAccessesFlag indicates whether the Device Config flag is flipped // by an experiment. mExperimentStarted is the local device value which indicates the last // value the device has seen for the Device Config flag. // The local device value is needed to determine that the Device Config flag was just // flipped, as the experiment behavior should only happen once after the experiment is // enabled. if (mShowSystemAccessesFlag && !mExperimentStarted) { // If the Device Config flag is enabled, but the local device setting is not then the // experiment just started. Update the local flag to match and enable the experiment // behavior by flipping the show system setting value. mSecureSettings.putInt(Settings.Secure.LOCATION_INDICATOR_EXPERIMENT_STARTED, 1); mSecureSettings.putInt(Settings.Secure.LOCATION_SHOW_SYSTEM_OPS, 1); mExperimentStarted = true; } else if (!mShowSystemAccessesFlag && mExperimentStarted) { // If the Device Config flag is disabled, but the local device flag is enabled then // update the local device flag to match. mSecureSettings.putInt(Settings.Secure.LOCATION_INDICATOR_EXPERIMENT_STARTED, 0); mExperimentStarted = false; } } /** * Returns true if there currently exist active high power location requests. */ Loading Loading @@ -249,7 +287,6 @@ public class LocationControllerImpl extends BroadcastReceiver implements Locatio } boolean hadActiveLocationRequests = mAreActiveLocationRequests; boolean shouldDisplay = false; boolean showSystem = mShowSystemAccessesFlag || mShowSystemAccessesSetting; boolean systemAppOp = false; boolean nonSystemAppOp = false; boolean isSystemApp; Loading @@ -267,7 +304,7 @@ public class LocationControllerImpl extends BroadcastReceiver implements Locatio nonSystemAppOp = true; } shouldDisplay = showSystem || shouldDisplay || !isSystemApp; shouldDisplay = mShowSystemAccessesSetting || shouldDisplay || !isSystemApp; } } Loading packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/LocationControllerImplTest.java +47 −7 Original line number Diff line number Diff line Loading @@ -51,7 +51,7 @@ import com.android.systemui.settings.UserTracker; import com.android.systemui.statusbar.policy.LocationController.LocationChangeCallback; import com.android.systemui.util.DeviceConfigProxy; import com.android.systemui.util.DeviceConfigProxyFake; import com.android.systemui.util.settings.SecureSettings; import com.android.systemui.util.settings.FakeSettings; import com.google.common.collect.ImmutableList; Loading @@ -70,11 +70,11 @@ public class LocationControllerImplTest extends SysuiTestCase { private TestableLooper mTestableLooper; private DeviceConfigProxy mDeviceConfigProxy; private UiEventLoggerFake mUiEventLogger; private FakeSettings mSecureSettings; @Mock private PackageManager mPackageManager; @Mock private AppOpsController mAppOpsController; @Mock private UserTracker mUserTracker; @Mock private SecureSettings mSecureSettings; @Before public void setup() { Loading @@ -85,7 +85,7 @@ public class LocationControllerImplTest extends SysuiTestCase { .thenReturn(ImmutableList.of(new UserInfo(0, "name", 0))); mDeviceConfigProxy = new DeviceConfigProxyFake(); mUiEventLogger = new UiEventLoggerFake(); mSecureSettings = new FakeSettings(); mTestableLooper = TestableLooper.get(this); mLocationController = new LocationControllerImpl(mContext, Loading Loading @@ -248,8 +248,7 @@ public class LocationControllerImplTest extends SysuiTestCase { @Test public void testCallbackNotified_additionalOps_shouldShowSystem() { when(mSecureSettings.getInt(Settings.Secure.LOCATION_SHOW_SYSTEM_OPS, 0)) .thenReturn(1); mSecureSettings.putInt(Settings.Secure.LOCATION_SHOW_SYSTEM_OPS, 1); LocationChangeCallback callback = mock(LocationChangeCallback.class); mLocationController.addCallback(callback); mDeviceConfigProxy.setProperty( Loading Loading @@ -282,8 +281,7 @@ public class LocationControllerImplTest extends SysuiTestCase { verify(callback, times(1)).onLocationActiveChanged(false); when(mSecureSettings.getInt(Settings.Secure.LOCATION_SHOW_SYSTEM_OPS, 0)) .thenReturn(0); mSecureSettings.putInt(Settings.Secure.LOCATION_SHOW_SYSTEM_OPS, 0); mLocationController.onActiveStateChanged(AppOpsManager.OP_FINE_LOCATION, 0, "com.system.app", true); Loading Loading @@ -367,4 +365,46 @@ public class LocationControllerImplTest extends SysuiTestCase { // No new callbacks verify(callback).onLocationSettingsChanged(anyBoolean()); } @Test public void testExperimentFlipsSystemFlag() throws Exception { mSecureSettings.putInt(Settings.Secure.LOCATION_SHOW_SYSTEM_OPS, 0); mDeviceConfigProxy.setProperty( DeviceConfig.NAMESPACE_PRIVACY, SystemUiDeviceConfigFlags.PROPERTY_LOCATION_INDICATORS_SMALL_ENABLED, "true", true); // Show system experiment not running mDeviceConfigProxy.setProperty( DeviceConfig.NAMESPACE_PRIVACY, SystemUiDeviceConfigFlags.PROPERTY_LOCATION_INDICATORS_SHOW_SYSTEM, "false", false); mTestableLooper.processAllMessages(); // Flip experiment on mDeviceConfigProxy.setProperty( DeviceConfig.NAMESPACE_PRIVACY, SystemUiDeviceConfigFlags.PROPERTY_LOCATION_INDICATORS_SHOW_SYSTEM, "true", true); mTestableLooper.processAllMessages(); // Verify settings were flipped assertThat(mSecureSettings.getInt(Settings.Secure.LOCATION_SHOW_SYSTEM_OPS)) .isEqualTo(1); assertThat(mSecureSettings.getInt(Settings.Secure.LOCATION_INDICATOR_EXPERIMENT_STARTED)) .isEqualTo(1); // Flip experiment off mDeviceConfigProxy.setProperty( DeviceConfig.NAMESPACE_PRIVACY, SystemUiDeviceConfigFlags.PROPERTY_LOCATION_INDICATORS_SHOW_SYSTEM, "false", false); mTestableLooper.processAllMessages(); assertThat(mSecureSettings.getInt(Settings.Secure.LOCATION_INDICATOR_EXPERIMENT_STARTED)) .isEqualTo(0); } } No newline at end of file Loading
core/java/android/provider/Settings.java +7 −0 Original line number Diff line number Diff line Loading @@ -7230,6 +7230,13 @@ public final class Settings { */ public static final String LOCATION_SHOW_SYSTEM_OPS = "locationShowSystemOps"; /** * Whether or not an indicator experiment has started. * @hide */ public static final String LOCATION_INDICATOR_EXPERIMENT_STARTED = "locationIndicatorExperimentStarted"; /** * A flag containing settings used for biometric weak * @hide Loading
packages/SystemUI/src/com/android/systemui/statusbar/policy/LocationControllerImpl.java +40 −3 Original line number Diff line number Diff line Loading @@ -86,6 +86,7 @@ public class LocationControllerImpl extends BroadcastReceiver implements Locatio private boolean mShouldDisplayAllAccesses; private boolean mShowSystemAccessesFlag; private boolean mShowSystemAccessesSetting; private boolean mExperimentStarted; @Inject public LocationControllerImpl(Context context, AppOpsController appOpsController, Loading @@ -107,6 +108,9 @@ public class LocationControllerImpl extends BroadcastReceiver implements Locatio mShouldDisplayAllAccesses = getAllAccessesSetting(); mShowSystemAccessesFlag = getShowSystemFlag(); mShowSystemAccessesSetting = getShowSystemSetting(); mExperimentStarted = getExperimentStarted(); toggleSystemSettingIfExperimentJustStarted(); mContentObserver = new ContentObserver(mBackgroundHandler) { @Override public void onChange(boolean selfChange) { Loading @@ -123,8 +127,15 @@ public class LocationControllerImpl extends BroadcastReceiver implements Locatio DeviceConfig.NAMESPACE_PRIVACY, backgroundHandler::post, properties -> { // Update the Device Config flag which controls the experiment to display // location accesses. mShouldDisplayAllAccesses = getAllAccessesSetting(); mShowSystemAccessesFlag = getShowSystemSetting(); // Update the Device Config flag which controls the experiment to display // system location accesses. mShowSystemAccessesFlag = getShowSystemFlag(); // Update the local flag for the system accesses experiment and potentially // update the behavior based on the flag value. toggleSystemSettingIfExperimentJustStarted(); updateActiveLocationRequests(); }); Loading Loading @@ -222,6 +233,33 @@ public class LocationControllerImpl extends BroadcastReceiver implements Locatio return mSecureSettings.getInt(Settings.Secure.LOCATION_SHOW_SYSTEM_OPS, 0) == 1; } private boolean getExperimentStarted() { return mSecureSettings .getInt(Settings.Secure.LOCATION_INDICATOR_EXPERIMENT_STARTED, 0) == 1; } private void toggleSystemSettingIfExperimentJustStarted() { // mShowSystemAccessesFlag indicates whether the Device Config flag is flipped // by an experiment. mExperimentStarted is the local device value which indicates the last // value the device has seen for the Device Config flag. // The local device value is needed to determine that the Device Config flag was just // flipped, as the experiment behavior should only happen once after the experiment is // enabled. if (mShowSystemAccessesFlag && !mExperimentStarted) { // If the Device Config flag is enabled, but the local device setting is not then the // experiment just started. Update the local flag to match and enable the experiment // behavior by flipping the show system setting value. mSecureSettings.putInt(Settings.Secure.LOCATION_INDICATOR_EXPERIMENT_STARTED, 1); mSecureSettings.putInt(Settings.Secure.LOCATION_SHOW_SYSTEM_OPS, 1); mExperimentStarted = true; } else if (!mShowSystemAccessesFlag && mExperimentStarted) { // If the Device Config flag is disabled, but the local device flag is enabled then // update the local device flag to match. mSecureSettings.putInt(Settings.Secure.LOCATION_INDICATOR_EXPERIMENT_STARTED, 0); mExperimentStarted = false; } } /** * Returns true if there currently exist active high power location requests. */ Loading Loading @@ -249,7 +287,6 @@ public class LocationControllerImpl extends BroadcastReceiver implements Locatio } boolean hadActiveLocationRequests = mAreActiveLocationRequests; boolean shouldDisplay = false; boolean showSystem = mShowSystemAccessesFlag || mShowSystemAccessesSetting; boolean systemAppOp = false; boolean nonSystemAppOp = false; boolean isSystemApp; Loading @@ -267,7 +304,7 @@ public class LocationControllerImpl extends BroadcastReceiver implements Locatio nonSystemAppOp = true; } shouldDisplay = showSystem || shouldDisplay || !isSystemApp; shouldDisplay = mShowSystemAccessesSetting || shouldDisplay || !isSystemApp; } } Loading
packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/LocationControllerImplTest.java +47 −7 Original line number Diff line number Diff line Loading @@ -51,7 +51,7 @@ import com.android.systemui.settings.UserTracker; import com.android.systemui.statusbar.policy.LocationController.LocationChangeCallback; import com.android.systemui.util.DeviceConfigProxy; import com.android.systemui.util.DeviceConfigProxyFake; import com.android.systemui.util.settings.SecureSettings; import com.android.systemui.util.settings.FakeSettings; import com.google.common.collect.ImmutableList; Loading @@ -70,11 +70,11 @@ public class LocationControllerImplTest extends SysuiTestCase { private TestableLooper mTestableLooper; private DeviceConfigProxy mDeviceConfigProxy; private UiEventLoggerFake mUiEventLogger; private FakeSettings mSecureSettings; @Mock private PackageManager mPackageManager; @Mock private AppOpsController mAppOpsController; @Mock private UserTracker mUserTracker; @Mock private SecureSettings mSecureSettings; @Before public void setup() { Loading @@ -85,7 +85,7 @@ public class LocationControllerImplTest extends SysuiTestCase { .thenReturn(ImmutableList.of(new UserInfo(0, "name", 0))); mDeviceConfigProxy = new DeviceConfigProxyFake(); mUiEventLogger = new UiEventLoggerFake(); mSecureSettings = new FakeSettings(); mTestableLooper = TestableLooper.get(this); mLocationController = new LocationControllerImpl(mContext, Loading Loading @@ -248,8 +248,7 @@ public class LocationControllerImplTest extends SysuiTestCase { @Test public void testCallbackNotified_additionalOps_shouldShowSystem() { when(mSecureSettings.getInt(Settings.Secure.LOCATION_SHOW_SYSTEM_OPS, 0)) .thenReturn(1); mSecureSettings.putInt(Settings.Secure.LOCATION_SHOW_SYSTEM_OPS, 1); LocationChangeCallback callback = mock(LocationChangeCallback.class); mLocationController.addCallback(callback); mDeviceConfigProxy.setProperty( Loading Loading @@ -282,8 +281,7 @@ public class LocationControllerImplTest extends SysuiTestCase { verify(callback, times(1)).onLocationActiveChanged(false); when(mSecureSettings.getInt(Settings.Secure.LOCATION_SHOW_SYSTEM_OPS, 0)) .thenReturn(0); mSecureSettings.putInt(Settings.Secure.LOCATION_SHOW_SYSTEM_OPS, 0); mLocationController.onActiveStateChanged(AppOpsManager.OP_FINE_LOCATION, 0, "com.system.app", true); Loading Loading @@ -367,4 +365,46 @@ public class LocationControllerImplTest extends SysuiTestCase { // No new callbacks verify(callback).onLocationSettingsChanged(anyBoolean()); } @Test public void testExperimentFlipsSystemFlag() throws Exception { mSecureSettings.putInt(Settings.Secure.LOCATION_SHOW_SYSTEM_OPS, 0); mDeviceConfigProxy.setProperty( DeviceConfig.NAMESPACE_PRIVACY, SystemUiDeviceConfigFlags.PROPERTY_LOCATION_INDICATORS_SMALL_ENABLED, "true", true); // Show system experiment not running mDeviceConfigProxy.setProperty( DeviceConfig.NAMESPACE_PRIVACY, SystemUiDeviceConfigFlags.PROPERTY_LOCATION_INDICATORS_SHOW_SYSTEM, "false", false); mTestableLooper.processAllMessages(); // Flip experiment on mDeviceConfigProxy.setProperty( DeviceConfig.NAMESPACE_PRIVACY, SystemUiDeviceConfigFlags.PROPERTY_LOCATION_INDICATORS_SHOW_SYSTEM, "true", true); mTestableLooper.processAllMessages(); // Verify settings were flipped assertThat(mSecureSettings.getInt(Settings.Secure.LOCATION_SHOW_SYSTEM_OPS)) .isEqualTo(1); assertThat(mSecureSettings.getInt(Settings.Secure.LOCATION_INDICATOR_EXPERIMENT_STARTED)) .isEqualTo(1); // Flip experiment off mDeviceConfigProxy.setProperty( DeviceConfig.NAMESPACE_PRIVACY, SystemUiDeviceConfigFlags.PROPERTY_LOCATION_INDICATORS_SHOW_SYSTEM, "false", false); mTestableLooper.processAllMessages(); assertThat(mSecureSettings.getInt(Settings.Secure.LOCATION_INDICATOR_EXPERIMENT_STARTED)) .isEqualTo(0); } } No newline at end of file