diff --git a/res/values/strings.xml b/res/values/strings.xml
index 5a2a54e9b90..7ae9074242a 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -3562,6 +3562,8 @@
Location for work profile
+
+ Location for private space
App location permissions
diff --git a/res/xml/location_settings.xml b/res/xml/location_settings.xml
index fe87efd73d7..206cc46bb24 100644
--- a/res/xml/location_settings.xml
+++ b/res/xml/location_settings.xml
@@ -49,6 +49,14 @@
settings:forWork="true"
settings:useAdminDisabledSummary="true"/>
+
+
+
mLifecycle;
+ mLifecycle = new Lifecycle(mLifecycleOwner);
+ mLocationSettings = spy(new LocationSettings());
+ when(mLocationSettings.getSettingsLifecycle()).thenReturn(mLifecycle);
+ mController = new LocationForPrivateProfilePreferenceController(mContext, "key");
+ mController.init(mLocationSettings);
+ ReflectionHelpers.setField(mController, "mLocationEnabler", mEnabler);
+ when(mScreen.findPreference(any())).thenReturn(mPreference);
+ final String key = mController.getPreferenceKey();
+ when(mPreference.getKey()).thenReturn(key);
+ when(mPreference.isVisible()).thenReturn(true);
+ }
+
+ @Test
+ public void handlePreferenceTreeClick_preferenceChecked_shouldSetRestrictionAndOnSummary() {
+ mController.displayPreference(mScreen);
+ when(mPreference.isChecked()).thenReturn(true);
+
+ mController.handlePreferenceTreeClick(mPreference);
+
+ verify(mUserManager)
+ .setUserRestriction(UserManager.DISALLOW_SHARE_LOCATION, false, mUserHandle);
+ verify(mPreference).setSummary(R.string.switch_on_text);
+ }
+
+ @Test
+ public void handlePreferenceTreeClick_preferenceUnchecked_shouldSetRestritionAndOffSummary() {
+ mController.displayPreference(mScreen);
+ when(mPreference.isChecked()).thenReturn(false);
+
+ mController.handlePreferenceTreeClick(mPreference);
+
+ verify(mUserManager)
+ .setUserRestriction(UserManager.DISALLOW_SHARE_LOCATION, true, mUserHandle);
+ verify(mPreference).setSummary(R.string.switch_off_text);
+ }
+
+ @Test
+ public void onLocationModeChanged_disabledByAdmin_shouldDisablePreference() {
+ mController.displayPreference(mScreen);
+ final EnforcedAdmin admin = mock(EnforcedAdmin.class);
+ doReturn(admin).when(mEnabler).getShareLocationEnforcedAdmin(anyInt());
+ doReturn(false).when(mEnabler).hasShareLocationRestriction(anyInt());
+
+ mController.onLocationModeChanged(Settings.Secure.LOCATION_MODE_BATTERY_SAVING, false);
+
+ verify(mPreference).setDisabledByAdmin(any());
+ }
+
+ @Test
+ public void onLocationModeChanged_locationOff_shouldDisablePreference() {
+ mController.displayPreference(mScreen);
+ doReturn(null).when(mEnabler).getShareLocationEnforcedAdmin(anyInt());
+ doReturn(false).when(mEnabler).hasShareLocationRestriction(anyInt());
+
+ mController.onLocationModeChanged(Settings.Secure.LOCATION_MODE_OFF, false);
+
+ verify(mPreference).setEnabled(false);
+ verify(mPreference).setChecked(false);
+ verify(mPreference).setSummary(R.string.location_app_permission_summary_location_off);
+ }
+
+ @Test
+ public void onLocationModeChanged_locationOn_shouldEnablePreference() {
+ mController.displayPreference(mScreen);
+ doReturn(null).when(mEnabler).getShareLocationEnforcedAdmin(anyInt());
+ doReturn(false).when(mEnabler).hasShareLocationRestriction(anyInt());
+ doReturn(true).when(mEnabler).isEnabled(anyInt());
+
+ mController.onLocationModeChanged(Settings.Secure.LOCATION_MODE_BATTERY_SAVING, false);
+
+ verify(mPreference, times(2)).setEnabled(true);
+ verify(mPreference).setSummary(R.string.switch_on_text);
+ }
+
+ @Test
+ public void onLocationModeChanged_noRestriction_shouldCheckedPreference() {
+ mController.displayPreference(mScreen);
+ doReturn(null).when(mEnabler).getShareLocationEnforcedAdmin(anyInt());
+ doReturn(false).when(mEnabler).hasShareLocationRestriction(anyInt());
+ doReturn(true).when(mEnabler).isEnabled(anyInt());
+
+ mController.onLocationModeChanged(Settings.Secure.LOCATION_MODE_BATTERY_SAVING, false);
+
+ verify(mPreference).setChecked(true);
+ }
+
+ @Test
+ public void onLocationModeChanged_hasRestriction_shouldCheckedPreference() {
+ mController.displayPreference(mScreen);
+ doReturn(null).when(mEnabler).getShareLocationEnforcedAdmin(anyInt());
+ doReturn(true).when(mEnabler).hasShareLocationRestriction(anyInt());
+
+ mController.onLocationModeChanged(Settings.Secure.LOCATION_MODE_BATTERY_SAVING, false);
+
+ verify(mPreference).setChecked(false);
+ }
+
+ private void mockPrivateProfile() {
+ final List userProfiles = new ArrayList<>();
+ doReturn(9).when(mUserHandle).getIdentifier();
+ userProfiles.add(mUserHandle);
+ doReturn(userProfiles).when(mUserManager).getUserProfiles();
+ doReturn(new UserInfo(
+ 9,
+ "user 9",
+ "",
+ 0,
+ UserManager.USER_TYPE_PROFILE_PRIVATE)).when(mUserManager).getUserInfo(9);
+ }
+}