diff --git a/res/values/strings.xml b/res/values/strings.xml index 7180a0f56eb..d9d95b93f56 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -3863,6 +3863,8 @@ Bluetooth scanning Allow apps and services to scan for nearby devices at any time, even when Bluetooth is off. This can be used, for example, to improve location-based features and services. + + Location services for work Wi\u2011Fi & mobile network location diff --git a/res/xml/location_settings.xml b/res/xml/location_settings.xml index 29d4048c22f..2f43ce8cd88 100644 --- a/res/xml/location_settings.xml +++ b/res/xml/location_settings.xml @@ -55,6 +55,12 @@ + + + + prefs = getLocationServices(); - for (Preference pref : prefs) { - if (pref instanceof RestrictedAppPreference) { - ((RestrictedAppPreference) pref).checkRestrictionAndSetDisabled(); + mCategoryLocationServicesManaged.removeAll(); + final Map> prefs = getLocationServices(); + boolean showPrimary = false; + boolean showManaged = false; + for (Map.Entry> entry : prefs.entrySet()) { + for (Preference pref : entry.getValue()) { + if (pref instanceof RestrictedAppPreference) { + ((RestrictedAppPreference) pref).checkRestrictionAndSetDisabled(); + } + } + if (entry.getKey() == UserHandle.myUserId()) { + LocationSettings.addPreferencesSorted(entry.getValue(), mCategoryLocationServices); + showPrimary = true; + } else { + LocationSettings.addPreferencesSorted(entry.getValue(), + mCategoryLocationServicesManaged); + showManaged = true; } } - LocationSettings.addPreferencesSorted(prefs, mCategoryLocationServices); + mCategoryLocationServices.setVisible(showPrimary); + mCategoryLocationServicesManaged.setVisible(showManaged); } @Override @@ -128,7 +139,7 @@ public class LocationServicePreferenceController extends LocationBasePreferenceC mContext.unregisterReceiver(mInjectedSettingsReceiver); } - private List getLocationServices() { + private Map> 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()); diff --git a/tests/robotests/src/com/android/settings/location/LocationServicePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/location/LocationServicePreferenceControllerTest.java index 75d6f8214ea..c6709edfc4e 100644 --- a/tests/robotests/src/com/android/settings/location/LocationServicePreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/location/LocationServicePreferenceControllerTest.java @@ -31,6 +31,7 @@ import android.content.Context; import android.os.UserHandle; import android.os.UserManager; import android.provider.Settings; +import android.util.ArrayMap; import androidx.lifecycle.LifecycleOwner; import androidx.preference.Preference; @@ -53,15 +54,20 @@ import org.robolectric.annotation.Config; import java.util.ArrayList; import java.util.List; +import java.util.Map; @RunWith(RobolectricTestRunner.class) @Config(shadows = ShadowUserManager.class) public class LocationServicePreferenceControllerTest { + private static final String LOCATION_SERVICES_MANAGED_PROFILE_KEY = + "location_services_managed_profile"; @Mock(answer = Answers.RETURNS_DEEP_STUBS) private LocationSettings mFragment; @Mock - private PreferenceCategory mCategory; + private PreferenceCategory mCategoryPrimary; + @Mock + private PreferenceCategory mCategoryManaged; @Mock private PreferenceScreen mScreen; @Mock @@ -83,26 +89,15 @@ public class LocationServicePreferenceControllerTest { mController = spy(new LocationServicePreferenceController( mContext, mFragment, mLifecycle, mSettingsInjector)); final String key = mController.getPreferenceKey(); - when(mScreen.findPreference(key)).thenReturn(mCategory); - when(mCategory.getKey()).thenReturn(key); + when(mScreen.findPreference(key)).thenReturn(mCategoryPrimary); + when(mScreen.findPreference(LOCATION_SERVICES_MANAGED_PROFILE_KEY)).thenReturn( + mCategoryManaged); + when(mCategoryPrimary.getKey()).thenReturn(key); + when(mCategoryManaged.getKey()).thenReturn(LOCATION_SERVICES_MANAGED_PROFILE_KEY); when(mContext.getSystemService(Context.DEVICE_POLICY_SERVICE)) .thenReturn(mDevicePolicyManager); } - @Test - public void isAvailable_noInjectedSettings_shouldReturnFalse() { - doReturn(false).when(mSettingsInjector).hasInjectedSettings(anyInt()); - - assertThat(mController.isAvailable()).isFalse(); - } - - @Test - public void isAvailable_hasInjectedSettings_shouldReturnFalse() { - doReturn(true).when(mSettingsInjector).hasInjectedSettings(anyInt()); - - assertThat(mController.isAvailable()).isTrue(); - } - @Test public void onResume_shouldRegisterListener() { mController.onResume(); @@ -122,24 +117,26 @@ public class LocationServicePreferenceControllerTest { @Test public void updateState_shouldRemoveAllAndAddInjectedSettings() { final List preferences = new ArrayList<>(); + final Map> map = new ArrayMap<>(); final Preference pref1 = new Preference(mContext); pref1.setTitle("Title1"); final Preference pref2 = new Preference(mContext); pref2.setTitle("Title2"); preferences.add(pref1); preferences.add(pref2); - doReturn(preferences) - .when(mSettingsInjector).getInjectedSettings(any(Context.class), anyInt()); + map.put(UserHandle.myUserId(), preferences); + doReturn(map) + .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); + mController.updateState(mCategoryPrimary); - verify(mCategory).removeAll(); - verify(mCategory).addPreference(pref1); - verify(mCategory).addPreference(pref2); + verify(mCategoryPrimary).removeAll(); + verify(mCategoryPrimary).addPreference(pref1); + verify(mCategoryPrimary).addPreference(pref2); } @Test @@ -161,7 +158,7 @@ public class LocationServicePreferenceControllerTest { when(mDevicePolicyManager.getDeviceOwnerComponentOnAnyUser()).thenReturn(componentName); mController.displayPreference(mScreen); - mController.updateState(mCategory); + mController.updateState(mCategoryPrimary); verify(mSettingsInjector).getInjectedSettings( any(Context.class), eq(UserHandle.myUserId())); } @@ -181,7 +178,7 @@ public class LocationServicePreferenceControllerTest { enforcingUsers); mController.displayPreference(mScreen); - mController.updateState(mCategory); + mController.updateState(mCategoryPrimary); verify(mSettingsInjector).getInjectedSettings( any(Context.class), eq(UserHandle.USER_CURRENT)); } @@ -200,7 +197,9 @@ public class LocationServicePreferenceControllerTest { UserManager.DISALLOW_CONFIG_LOCATION); pref.setTitle("Location Accuracy"); preferences.add(pref); - doReturn(preferences).when(mSettingsInjector) + final Map> map = new ArrayMap<>(); + map.put(UserHandle.myUserId(), preferences); + doReturn(map).when(mSettingsInjector) .getInjectedSettings(any(Context.class), anyInt()); ShadowUserManager.getShadow().setProfileIdsWithDisabled(new int[]{UserHandle.myUserId()}); @@ -217,7 +216,7 @@ public class LocationServicePreferenceControllerTest { when(mDevicePolicyManager.getDeviceOwnerComponentOnAnyUser()).thenReturn(componentName); mController.displayPreference(mScreen); - mController.updateState(mCategory); + mController.updateState(mCategoryPrimary); assertThat(pref.isEnabled()).isFalse(); assertThat(pref.isDisabledByAdmin()).isTrue();