Update show system experiment behavior.
When the experiment flag is flipped to on, toggle the "show system accesses" setting to on one time and then do not modify the value again unless the experiment is turned off and then on again. Bug: 191503437 Test: atest LocationControllerImplTest Change-Id: I25e647bc3ccfb911719b2047a5096f9a9e62a3ad
This commit is contained in:
@@ -7229,6 +7229,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
|
||||
|
||||
@@ -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,
|
||||
@@ -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) {
|
||||
@@ -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();
|
||||
});
|
||||
|
||||
@@ -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.
|
||||
*/
|
||||
@@ -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;
|
||||
@@ -267,7 +304,7 @@ public class LocationControllerImpl extends BroadcastReceiver implements Locatio
|
||||
nonSystemAppOp = true;
|
||||
}
|
||||
|
||||
shouldDisplay = showSystem || shouldDisplay || !isSystemApp;
|
||||
shouldDisplay = mShowSystemAccessesSetting || shouldDisplay || !isSystemApp;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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() {
|
||||
@@ -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,
|
||||
@@ -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(
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user