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); + } +}