From a2a593dd3b1928442244262acaef1cb3a41bc8d6 Mon Sep 17 00:00:00 2001 From: yuemingw Date: Fri, 1 Jun 2018 17:11:31 +0100 Subject: [PATCH] Check EnforcedAdmin to see if location is locked down by device policy. Bug: 78563793 Test: m -j RunSettingsRoboTests and manually via TestDPC Change-Id: Iad2f11bde51bf6c321beb3c4709d53971a8e40c7 --- .../LocationServicePreferenceController.java | 6 +- ...cationServicePreferenceControllerTest.java | 65 ++++++++++++++++--- .../testutils/shadow/ShadowUserManager.java | 17 ++++- 3 files changed, 78 insertions(+), 10 deletions(-) diff --git a/src/com/android/settings/location/LocationServicePreferenceController.java b/src/com/android/settings/location/LocationServicePreferenceController.java index f865b449041..9860abd85d2 100644 --- a/src/com/android/settings/location/LocationServicePreferenceController.java +++ b/src/com/android/settings/location/LocationServicePreferenceController.java @@ -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; @@ -130,8 +131,11 @@ public class LocationServicePreferenceController extends LocationBasePreferenceC private List 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); } } diff --git a/tests/robotests/src/com/android/settings/location/LocationServicePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/location/LocationServicePreferenceControllerTest.java index f3958f41d59..a6059a9e8c2 100644 --- a/tests/robotests/src/com/android/settings/location/LocationServicePreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/location/LocationServicePreferenceControllerTest.java @@ -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; @@ -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; @@ -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 = { @@ -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); @@ -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 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 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); @@ -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 enforcingUsers = new ArrayList<>(); enforcingUsers.add(new UserManager.EnforcingUser(userId, UserManager.RESTRICTION_SOURCE_DEVICE_OWNER)); diff --git a/tests/robotests/src/com/android/settings/testutils/shadow/ShadowUserManager.java b/tests/robotests/src/com/android/settings/testutils/shadow/ShadowUserManager.java index d83c8148fff..df87536d33b 100644 --- a/tests/robotests/src/com/android/settings/testutils/shadow/ShadowUserManager.java +++ b/tests/robotests/src/com/android/settings/testutils/shadow/ShadowUserManager.java @@ -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; @@ -45,6 +46,7 @@ public class ShadowUserManager extends org.robolectric.shadows.ShadowUserManager private final List mUserProfileInfos = new ArrayList<>(); private final Set mManagedProfiles = new HashSet<>(); private boolean mIsQuietModeEnabled = false; + private int[] profileIdsForUser; @Resetter public void reset() { @@ -96,7 +98,11 @@ public class ShadowUserManager extends org.robolectric.shadows.ShadowUserManager @Implementation public List 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 enforcingUsers = + mRestrictionSources.get(restrictionKey + userHandle.getIdentifier()); + return enforcingUsers == null ? Collections.emptyList() : enforcingUsers; } public void setUserRestrictionSources( @@ -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; + } }