Loading src/com/android/settings/location/LocationServicePreferenceController.java +5 −1 Original line number Diff line number Diff line Loading @@ -25,6 +25,7 @@ import androidx.preference.PreferenceCategory; import androidx.preference.PreferenceScreen; import android.util.Log; import com.android.settings.Utils; import com.android.settings.widget.RestrictedAppPreference; import com.android.settingslib.core.lifecycle.Lifecycle; import com.android.settingslib.core.lifecycle.LifecycleObserver; Loading Loading @@ -130,8 +131,11 @@ public class LocationServicePreferenceController extends LocationBasePreferenceC private List<Preference> getLocationServices() { // If location access is locked down by device policy then we only show injected settings // for the primary profile. final int profileUserId = Utils.getManagedProfileId(mUserManager, UserHandle.myUserId()); return mInjector.getInjectedSettings(mFragment.getPreferenceManager().getContext(), mLocationEnabler.isManagedProfileRestrictedByBase() (profileUserId != UserHandle.USER_NULL && mLocationEnabler.getShareLocationEnforcedAdmin(profileUserId) != null) ? UserHandle.myUserId() : UserHandle.USER_CURRENT); } } tests/robotests/src/com/android/settings/location/LocationServicePreferenceControllerTest.java +57 −8 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package com.android.settings.location; import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.eq; Loading @@ -25,24 +26,17 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.app.admin.DevicePolicyManager; import androidx.lifecycle.LifecycleOwner; import android.content.ComponentName; import android.content.Context; import android.os.UserHandle; import android.os.UserManager; import android.provider.Settings; import androidx.preference.Preference; import androidx.preference.PreferenceCategory; import androidx.preference.PreferenceScreen; import com.android.settings.testutils.SettingsRobolectricTestRunner; import com.android.settings.testutils.shadow.ShadowUserManager; import com.android.settings.widget.RestrictedAppPreference; import com.android.settingslib.core.lifecycle.Lifecycle; import java.util.ArrayList; import java.util.List; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; Loading @@ -52,6 +46,14 @@ import org.mockito.MockitoAnnotations; import org.robolectric.RuntimeEnvironment; import org.robolectric.annotation.Config; import java.util.ArrayList; import java.util.List; import androidx.lifecycle.LifecycleOwner; import androidx.preference.Preference; import androidx.preference.PreferenceCategory; import androidx.preference.PreferenceScreen; @RunWith(SettingsRobolectricTestRunner.class) @Config( shadows = { Loading Loading @@ -133,6 +135,8 @@ public class LocationServicePreferenceControllerTest { doReturn(preferences) .when(mSettingsInjector).getInjectedSettings(any(Context.class), anyInt()); when(mFragment.getPreferenceManager().getContext()).thenReturn(mContext); ShadowUserManager.getShadow().setProfileIdsWithDisabled(new int[]{UserHandle.myUserId()}); mController.displayPreference(mScreen); mController.updateState(mCategory); Loading @@ -142,6 +146,50 @@ public class LocationServicePreferenceControllerTest { verify(mCategory).addPreference(pref2); } @Test public void workProfileDisallowShareLocationOn_getParentUserLocationServicesOnly() { final int fakeWorkProfileId = 123; ShadowUserManager.getShadow().setProfileIdsWithDisabled( new int[]{UserHandle.myUserId(), fakeWorkProfileId}); // Mock RestrictedLockUtils.checkIfRestrictionEnforced and let it return non-null. final List<UserManager.EnforcingUser> enforcingUsers = new ArrayList<>(); enforcingUsers.add(new UserManager.EnforcingUser(fakeWorkProfileId, UserManager.RESTRICTION_SOURCE_DEVICE_OWNER)); final ComponentName componentName = new ComponentName("test", "test"); // Ensure that RestrictedLockUtils.checkIfRestrictionEnforced doesn't return null. ShadowUserManager.getShadow().setUserRestrictionSources( UserManager.DISALLOW_SHARE_LOCATION, UserHandle.of(fakeWorkProfileId), enforcingUsers); when(mDevicePolicyManager.getDeviceOwnerComponentOnAnyUser()).thenReturn(componentName); mController.displayPreference(mScreen); mController.updateState(mCategory); verify(mSettingsInjector).getInjectedSettings( any(Context.class), eq(UserHandle.myUserId())); } @Test public void workProfileDisallowShareLocationOff_getAllUserLocationServices() { final int fakeWorkProfileId = 123; ShadowUserManager.getShadow().setProfileIdsWithDisabled( new int[]{UserHandle.myUserId(), fakeWorkProfileId}); // Mock RestrictedLockUtils.checkIfRestrictionEnforced and let it return null. // Empty enforcing users. final List<UserManager.EnforcingUser> enforcingUsers = new ArrayList<>(); ShadowUserManager.getShadow().setUserRestrictionSources( UserManager.DISALLOW_SHARE_LOCATION, UserHandle.of(fakeWorkProfileId), enforcingUsers); mController.displayPreference(mScreen); mController.updateState(mCategory); verify(mSettingsInjector).getInjectedSettings( any(Context.class), eq(UserHandle.USER_CURRENT)); } @Test public void onLocationModeChanged_shouldRequestReloadInjectedSettigns() { mController.onLocationModeChanged(Settings.Secure.LOCATION_MODE_BATTERY_SAVING, false); Loading @@ -158,8 +206,9 @@ public class LocationServicePreferenceControllerTest { preferences.add(pref); doReturn(preferences).when(mSettingsInjector) .getInjectedSettings(any(Context.class), anyInt()); ShadowUserManager.getShadow().setProfileIdsWithDisabled(new int[]{UserHandle.myUserId()}); int userId = UserHandle.myUserId(); final int userId = UserHandle.myUserId(); List<UserManager.EnforcingUser> enforcingUsers = new ArrayList<>(); enforcingUsers.add(new UserManager.EnforcingUser(userId, UserManager.RESTRICTION_SOURCE_DEVICE_OWNER)); Loading tests/robotests/src/com/android/settings/testutils/shadow/ShadowUserManager.java +16 −1 Original line number Diff line number Diff line Loading @@ -30,6 +30,7 @@ import org.robolectric.annotation.Resetter; import org.robolectric.shadow.api.Shadow; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.List; Loading @@ -45,6 +46,7 @@ public class ShadowUserManager extends org.robolectric.shadows.ShadowUserManager private final List<UserInfo> mUserProfileInfos = new ArrayList<>(); private final Set<Integer> mManagedProfiles = new HashSet<>(); private boolean mIsQuietModeEnabled = false; private int[] profileIdsForUser; @Resetter public void reset() { Loading Loading @@ -96,7 +98,11 @@ public class ShadowUserManager extends org.robolectric.shadows.ShadowUserManager @Implementation public List<EnforcingUser> getUserRestrictionSources( String restrictionKey, UserHandle userHandle) { return mRestrictionSources.get(restrictionKey + userHandle.getIdentifier()); // Return empty list when there is no enforcing user, otherwise might trigger // NullPointer Exception in RestrictedLockUtils.checkIfRestrictionEnforced. List<EnforcingUser> enforcingUsers = mRestrictionSources.get(restrictionKey + userHandle.getIdentifier()); return enforcingUsers == null ? Collections.emptyList() : enforcingUsers; } public void setUserRestrictionSources( Loading @@ -121,4 +127,13 @@ public class ShadowUserManager extends org.robolectric.shadows.ShadowUserManager public void setQuietModeEnabled(boolean enabled) { mIsQuietModeEnabled = enabled; } @Implementation public int[] getProfileIdsWithDisabled(@UserIdInt int userId) { return profileIdsForUser; } public void setProfileIdsWithDisabled(int[] profileIds) { profileIdsForUser = profileIds; } } Loading
src/com/android/settings/location/LocationServicePreferenceController.java +5 −1 Original line number Diff line number Diff line Loading @@ -25,6 +25,7 @@ import androidx.preference.PreferenceCategory; import androidx.preference.PreferenceScreen; import android.util.Log; import com.android.settings.Utils; import com.android.settings.widget.RestrictedAppPreference; import com.android.settingslib.core.lifecycle.Lifecycle; import com.android.settingslib.core.lifecycle.LifecycleObserver; Loading Loading @@ -130,8 +131,11 @@ public class LocationServicePreferenceController extends LocationBasePreferenceC private List<Preference> getLocationServices() { // If location access is locked down by device policy then we only show injected settings // for the primary profile. final int profileUserId = Utils.getManagedProfileId(mUserManager, UserHandle.myUserId()); return mInjector.getInjectedSettings(mFragment.getPreferenceManager().getContext(), mLocationEnabler.isManagedProfileRestrictedByBase() (profileUserId != UserHandle.USER_NULL && mLocationEnabler.getShareLocationEnforcedAdmin(profileUserId) != null) ? UserHandle.myUserId() : UserHandle.USER_CURRENT); } }
tests/robotests/src/com/android/settings/location/LocationServicePreferenceControllerTest.java +57 −8 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package com.android.settings.location; import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.eq; Loading @@ -25,24 +26,17 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.app.admin.DevicePolicyManager; import androidx.lifecycle.LifecycleOwner; import android.content.ComponentName; import android.content.Context; import android.os.UserHandle; import android.os.UserManager; import android.provider.Settings; import androidx.preference.Preference; import androidx.preference.PreferenceCategory; import androidx.preference.PreferenceScreen; import com.android.settings.testutils.SettingsRobolectricTestRunner; import com.android.settings.testutils.shadow.ShadowUserManager; import com.android.settings.widget.RestrictedAppPreference; import com.android.settingslib.core.lifecycle.Lifecycle; import java.util.ArrayList; import java.util.List; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; Loading @@ -52,6 +46,14 @@ import org.mockito.MockitoAnnotations; import org.robolectric.RuntimeEnvironment; import org.robolectric.annotation.Config; import java.util.ArrayList; import java.util.List; import androidx.lifecycle.LifecycleOwner; import androidx.preference.Preference; import androidx.preference.PreferenceCategory; import androidx.preference.PreferenceScreen; @RunWith(SettingsRobolectricTestRunner.class) @Config( shadows = { Loading Loading @@ -133,6 +135,8 @@ public class LocationServicePreferenceControllerTest { doReturn(preferences) .when(mSettingsInjector).getInjectedSettings(any(Context.class), anyInt()); when(mFragment.getPreferenceManager().getContext()).thenReturn(mContext); ShadowUserManager.getShadow().setProfileIdsWithDisabled(new int[]{UserHandle.myUserId()}); mController.displayPreference(mScreen); mController.updateState(mCategory); Loading @@ -142,6 +146,50 @@ public class LocationServicePreferenceControllerTest { verify(mCategory).addPreference(pref2); } @Test public void workProfileDisallowShareLocationOn_getParentUserLocationServicesOnly() { final int fakeWorkProfileId = 123; ShadowUserManager.getShadow().setProfileIdsWithDisabled( new int[]{UserHandle.myUserId(), fakeWorkProfileId}); // Mock RestrictedLockUtils.checkIfRestrictionEnforced and let it return non-null. final List<UserManager.EnforcingUser> enforcingUsers = new ArrayList<>(); enforcingUsers.add(new UserManager.EnforcingUser(fakeWorkProfileId, UserManager.RESTRICTION_SOURCE_DEVICE_OWNER)); final ComponentName componentName = new ComponentName("test", "test"); // Ensure that RestrictedLockUtils.checkIfRestrictionEnforced doesn't return null. ShadowUserManager.getShadow().setUserRestrictionSources( UserManager.DISALLOW_SHARE_LOCATION, UserHandle.of(fakeWorkProfileId), enforcingUsers); when(mDevicePolicyManager.getDeviceOwnerComponentOnAnyUser()).thenReturn(componentName); mController.displayPreference(mScreen); mController.updateState(mCategory); verify(mSettingsInjector).getInjectedSettings( any(Context.class), eq(UserHandle.myUserId())); } @Test public void workProfileDisallowShareLocationOff_getAllUserLocationServices() { final int fakeWorkProfileId = 123; ShadowUserManager.getShadow().setProfileIdsWithDisabled( new int[]{UserHandle.myUserId(), fakeWorkProfileId}); // Mock RestrictedLockUtils.checkIfRestrictionEnforced and let it return null. // Empty enforcing users. final List<UserManager.EnforcingUser> enforcingUsers = new ArrayList<>(); ShadowUserManager.getShadow().setUserRestrictionSources( UserManager.DISALLOW_SHARE_LOCATION, UserHandle.of(fakeWorkProfileId), enforcingUsers); mController.displayPreference(mScreen); mController.updateState(mCategory); verify(mSettingsInjector).getInjectedSettings( any(Context.class), eq(UserHandle.USER_CURRENT)); } @Test public void onLocationModeChanged_shouldRequestReloadInjectedSettigns() { mController.onLocationModeChanged(Settings.Secure.LOCATION_MODE_BATTERY_SAVING, false); Loading @@ -158,8 +206,9 @@ public class LocationServicePreferenceControllerTest { preferences.add(pref); doReturn(preferences).when(mSettingsInjector) .getInjectedSettings(any(Context.class), anyInt()); ShadowUserManager.getShadow().setProfileIdsWithDisabled(new int[]{UserHandle.myUserId()}); int userId = UserHandle.myUserId(); final int userId = UserHandle.myUserId(); List<UserManager.EnforcingUser> enforcingUsers = new ArrayList<>(); enforcingUsers.add(new UserManager.EnforcingUser(userId, UserManager.RESTRICTION_SOURCE_DEVICE_OWNER)); Loading
tests/robotests/src/com/android/settings/testutils/shadow/ShadowUserManager.java +16 −1 Original line number Diff line number Diff line Loading @@ -30,6 +30,7 @@ import org.robolectric.annotation.Resetter; import org.robolectric.shadow.api.Shadow; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.List; Loading @@ -45,6 +46,7 @@ public class ShadowUserManager extends org.robolectric.shadows.ShadowUserManager private final List<UserInfo> mUserProfileInfos = new ArrayList<>(); private final Set<Integer> mManagedProfiles = new HashSet<>(); private boolean mIsQuietModeEnabled = false; private int[] profileIdsForUser; @Resetter public void reset() { Loading Loading @@ -96,7 +98,11 @@ public class ShadowUserManager extends org.robolectric.shadows.ShadowUserManager @Implementation public List<EnforcingUser> getUserRestrictionSources( String restrictionKey, UserHandle userHandle) { return mRestrictionSources.get(restrictionKey + userHandle.getIdentifier()); // Return empty list when there is no enforcing user, otherwise might trigger // NullPointer Exception in RestrictedLockUtils.checkIfRestrictionEnforced. List<EnforcingUser> enforcingUsers = mRestrictionSources.get(restrictionKey + userHandle.getIdentifier()); return enforcingUsers == null ? Collections.emptyList() : enforcingUsers; } public void setUserRestrictionSources( Loading @@ -121,4 +127,13 @@ public class ShadowUserManager extends org.robolectric.shadows.ShadowUserManager public void setQuietModeEnabled(boolean enabled) { mIsQuietModeEnabled = enabled; } @Implementation public int[] getProfileIdsWithDisabled(@UserIdInt int userId) { return profileIdsForUser; } public void setProfileIdsWithDisabled(int[] profileIds) { profileIdsForUser = profileIds; } }