Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 82af1830 authored by Jonathan Koo's avatar Jonathan Koo Committed by Android (Google) Code Review
Browse files

Merge "Address UI change request for injected services" into qt-dev

parents cd576f15 e531bd01
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -3863,6 +3863,8 @@
    <string name="location_scanning_bluetooth_always_scanning_title">Bluetooth scanning</string>
    <!-- Description text for Bluetooth always scanning -->
    <string name="location_scanning_bluetooth_always_scanning_description">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.</string>
    <!-- [CHAR LIMIT=50] Location settings screen, sub category for location services for managed profile -->
    <string name="managed_profile_location_services">Location services for work</string>
    <!-- [CHAR LIMIT=30] Security & location settings screen, setting check box label for Google location service (cell ID, wifi, etc.) -->
    <string name="location_network_based">Wi\u2011Fi &amp; mobile network location</string>
+6 −0
Original line number Diff line number Diff line
@@ -55,6 +55,12 @@

            <PreferenceCategory
                android:key="location_services" />

            <!-- This preference gets removed if there is no managed profile -->
            <PreferenceCategory
                android:title="@string/managed_profile_location_services"
                android:key="location_services_managed_profile" />

        </PreferenceCategory>

        <PreferenceCategory
+26 −15
Original line number Diff line number Diff line
@@ -34,6 +34,7 @@ import com.android.settingslib.core.lifecycle.events.OnPause;
import com.android.settingslib.core.lifecycle.events.OnResume;

import java.util.List;
import java.util.Map;

public class LocationServicePreferenceController extends LocationBasePreferenceController
        implements LifecycleObserver, OnResume, OnPause {
@@ -41,11 +42,14 @@ public class LocationServicePreferenceController extends LocationBasePreferenceC
    private static final String TAG = "LocationServicePrefCtrl";
    /** Key for preference category "Location services" */
    private static final String KEY_LOCATION_SERVICES = "location_services";
    /** Key for preference category "Location services for work" */
    private static final String KEY_LOCATION_SERVICES_MANAGED = "location_services_managed_profile";
    @VisibleForTesting
    static final IntentFilter INTENT_FILTER_INJECTED_SETTING_CHANGED =
            new IntentFilter(SettingInjectorService.ACTION_INJECTED_SETTING_CHANGED);

    private PreferenceCategory mCategoryLocationServices;
    private PreferenceCategory mCategoryLocationServicesManaged;
    private final LocationSettings mFragment;
    private final AppSettingsInjector mInjector;
    /** Receives UPDATE_INTENT */
@@ -73,30 +77,37 @@ public class LocationServicePreferenceController extends LocationBasePreferenceC
        return KEY_LOCATION_SERVICES;
    }

    @Override
    public boolean isAvailable() {
        // If managed profile has lock-down on location access then its injected location services
        // must not be shown.
        return mInjector.hasInjectedSettings(mLocationEnabler.isManagedProfileRestrictedByBase()
                ? UserHandle.myUserId() : UserHandle.USER_CURRENT);
    }

    @Override
    public void displayPreference(PreferenceScreen screen) {
        super.displayPreference(screen);
        mCategoryLocationServices = screen.findPreference(KEY_LOCATION_SERVICES);
        mCategoryLocationServicesManaged = screen.findPreference(KEY_LOCATION_SERVICES_MANAGED);
    }

    @Override
    public void updateState(Preference preference) {
        mCategoryLocationServices.removeAll();
        final List<Preference> prefs = getLocationServices();
        for (Preference pref : prefs) {
        mCategoryLocationServicesManaged.removeAll();
        final Map<Integer, List<Preference>> prefs = getLocationServices();
        boolean showPrimary = false;
        boolean showManaged = false;
        for (Map.Entry<Integer, List<Preference>> entry : prefs.entrySet()) {
            for (Preference pref : entry.getValue()) {
                if (pref instanceof RestrictedAppPreference) {
                    ((RestrictedAppPreference) pref).checkRestrictionAndSetDisabled();
                }
            }
        LocationSettings.addPreferencesSorted(prefs, mCategoryLocationServices);
            if (entry.getKey() == UserHandle.myUserId()) {
                LocationSettings.addPreferencesSorted(entry.getValue(), mCategoryLocationServices);
                showPrimary = true;
            } else {
                LocationSettings.addPreferencesSorted(entry.getValue(),
                        mCategoryLocationServicesManaged);
                showManaged = true;
            }
        }
        mCategoryLocationServices.setVisible(showPrimary);
        mCategoryLocationServicesManaged.setVisible(showManaged);
    }

    @Override
@@ -128,7 +139,7 @@ public class LocationServicePreferenceController extends LocationBasePreferenceC
        mContext.unregisterReceiver(mInjectedSettingsReceiver);
    }

    private List<Preference> getLocationServices() {
    private Map<Integer, 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());
+26 −27
Original line number Diff line number Diff line
@@ -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<Preference> preferences = new ArrayList<>();
        final Map<Integer, List<Preference>> 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)
        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<Integer, List<Preference>> 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();