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

Commit 42c1dc6d authored by Jonathan Koo's avatar Jonathan Koo Committed by android-build-merger
Browse files

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

am: 82af1830

Change-Id: Iaec7f7ee83f4bc764940b22343b2c7556cb2b8a6
parents a7579584 82af1830
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -3869,6 +3869,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();