OSDN Git Service

Refactor LocationSettings
authorRaff Tsai <rafftsai@google.com>
Fri, 22 Nov 2019 03:35:40 +0000 (11:35 +0800)
committerRaff Tsai <rafftsai@google.com>
Mon, 25 Nov 2019 05:11:12 +0000 (13:11 +0800)
- Extends BasePreferenceController in LocationBasePreferenceController
which binds preference key based on xml file instead of writing the key
in java code. Then the controller can be used in many xmls.
- Modify LocationServicePreferenceController to support only personal or
profile user.

Bug: 141601408
Test: manual, robolectric
Change-Id: I51ee950dfb87474df84a8dc3db55fb911edcf599

17 files changed:
res/xml/location_recent_requests_see_all.xml
res/xml/location_settings.xml
src/com/android/settings/location/AppLocationPermissionPreferenceController.java
src/com/android/settings/location/LocationBasePreferenceController.java
src/com/android/settings/location/LocationFooterPreferenceController.java
src/com/android/settings/location/LocationForWorkPreferenceController.java
src/com/android/settings/location/LocationScanningPreferenceController.java
src/com/android/settings/location/LocationServicePreferenceController.java
src/com/android/settings/location/LocationSettings.java
src/com/android/settings/location/RecentLocationRequestPreferenceController.java
src/com/android/settings/location/RecentLocationRequestSeeAllFragment.java
src/com/android/settings/location/RecentLocationRequestSeeAllPreferenceController.java
tests/robotests/src/com/android/settings/location/AppLocationPermissionPreferenceControllerTest.java
tests/robotests/src/com/android/settings/location/LocationFooterPreferenceControllerTest.java
tests/robotests/src/com/android/settings/location/LocationForWorkPreferenceControllerTest.java
tests/robotests/src/com/android/settings/location/LocationScanningPreferenceControllerTest.java
tests/robotests/src/com/android/settings/location/LocationServicePreferenceControllerTest.java

index dfb8804..492bc96 100644 (file)
      See the License for the specific language governing permissions and
      limitations under the License.
 -->
-<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
-        android:title="@string/location_category_recent_location_requests"
-        android:key="recent_location_requests_see_all">
-        <PreferenceCategory
-            android:key="all_recent_location_requests"/>
+<PreferenceScreen
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:settings="http://schemas.android.com/apk/res-auto"
+    android:title="@string/location_category_recent_location_requests"
+    android:key="recent_location_requests_see_all">
+    <PreferenceCategory
+        android:key="all_recent_location_requests"
+        settings:controller="com.android.settings.location.RecentLocationRequestSeeAllPreferenceController"/>
+
 </PreferenceScreen>
index 136e6ab..2ad1554 100644 (file)
      limitations under the License.
 -->
 
-<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
-                  xmlns:settings="http://schemas.android.com/apk/res-auto"
-        android:key="location_settings"
-        android:title="@string/location_settings_title"
-        settings:keywords="@string/keywords_location">
+<PreferenceScreen
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:settings="http://schemas.android.com/apk/res-auto"
+    android:key="location_settings"
+    android:title="@string/location_settings_title"
+    settings:keywords="@string/keywords_location">
 
-        <PreferenceCategory
-            android:key="recent_location_requests"
-            android:title="@string/location_category_recent_location_requests"/>
+    <PreferenceCategory
+        android:key="recent_location_requests"
+        android:title="@string/location_category_recent_location_requests"
+        settings:controller="com.android.settings.location.RecentLocationRequestPreferenceController"/>
 
-        <Preference
-            android:key="recent_location_requests_see_all_button"
-            android:title="@string/location_recent_location_requests_see_all"
-            android:icon="@drawable/ic_chevron_right_24dp"
-            android:fragment="com.android.settings.location.RecentLocationRequestSeeAllFragment"
-            settings:searchable="false"/>
+    <Preference
+        android:key="recent_location_requests_see_all_button"
+        android:title="@string/location_recent_location_requests_see_all"
+        android:icon="@drawable/ic_chevron_right_24dp"
+        android:fragment="com.android.settings.location.RecentLocationRequestSeeAllFragment"
+        settings:searchable="false"/>
 
-        <PreferenceCategory
-            android:key="location_advanced_settings"
-            android:layout="@layout/preference_category_no_label"
-            settings:initialExpandedChildrenCount="2">
+    <PreferenceCategory
+        android:key="location_advanced_settings"
+        android:layout="@layout/preference_category_no_label"
+        settings:initialExpandedChildrenCount="2">
 
-            <!-- This preference category gets removed if new_recent_location_ui is disabled -->
-            <Preference
-                android:key="app_level_permissions"
-                android:title="@string/location_app_level_permissions">
-                <intent android:action="android.intent.action.MANAGE_PERMISSION_APPS">
-                    <extra android:name="android.intent.extra.PERMISSION_NAME"
-                           android:value="android.permission-group.LOCATION" />
-                </intent>
-            </Preference>
+        <!-- This preference category gets removed if new_recent_location_ui is disabled -->
+        <Preference
+            android:key="app_level_permissions"
+            android:title="@string/location_app_level_permissions"
+            settings:controller="com.android.settings.location.AppLocationPermissionPreferenceController">
+            <intent android:action="android.intent.action.MANAGE_PERMISSION_APPS">
+                <extra android:name="android.intent.extra.PERMISSION_NAME"
+                       android:value="android.permission-group.LOCATION"/>
+            </intent>
+        </Preference>
 
-            <Preference
-                android:key="location_scanning"
-                android:title="@string/location_scanning_screen_title"
-                android:fragment="com.android.settings.location.ScanningSettings"/>
+        <Preference
+            android:fragment="com.android.settings.location.ScanningSettings"
+            android:key="location_scanning"
+            android:title="@string/location_scanning_screen_title"
+            settings:controller="com.android.settings.location.LocationScanningPreferenceController"/>
 
-            <!-- This preference gets removed if there is no managed profile -->
-            <com.android.settingslib.RestrictedSwitchPreference
-                android:key="managed_profile_location_switch"
-                android:title="@string/managed_profile_location_switch_title"
-                settings:useAdminDisabledSummary="true"
-                android:enabled="false"
-                android:selectable="true" />
+        <!-- This preference gets removed if there is no managed profile -->
+        <com.android.settingslib.RestrictedSwitchPreference
+            android:enabled="false"
+            android:key="managed_profile_location_switch"
+            android:selectable="true"
+            android:title="@string/managed_profile_location_switch_title"
+            settings:controller="com.android.settings.location.LocationForWorkPreferenceController"
+            settings:useAdminDisabledSummary="true"/>
 
-            <PreferenceCategory
-                android:key="location_services"
-                android:layout="@layout/preference_category_no_label"/>
+        <PreferenceCategory
+            android:key="location_services"
+            android:layout="@layout/preference_category_no_label"
+            settings:controller="com.android.settings.location.LocationServicePreferenceController"/>
 
-            <!-- This preference gets removed if there is no managed profile -->
-            <PreferenceCategory
-                android:title="@string/managed_profile_location_services"
-                android:key="location_services_managed_profile" />
+        <!-- This preference gets removed if there is no managed profile -->
+        <PreferenceCategory
+            android:key="location_services_managed_profile"
+            android:title="@string/managed_profile_location_services"/>
 
-        </PreferenceCategory>
+    </PreferenceCategory>
 
-        <PreferenceCategory
-            android:key="location_footer"
-            android:layout="@layout/preference_category_no_label"
-            settings:allowDividerAbove="false"/>
+    <PreferenceCategory
+        android:key="location_footer"
+        android:layout="@layout/preference_category_no_label"
+        settings:allowDividerAbove="false"
+        settings:controller="com.android.settings.location.LocationFooterPreferenceController"/>
 </PreferenceScreen>
index 65abe99..90b3797 100644 (file)
@@ -16,7 +16,6 @@ import androidx.preference.Preference;
 import com.android.settings.R;
 import com.android.settings.Utils;
 import com.android.settings.core.PreferenceControllerMixin;
-import com.android.settingslib.core.lifecycle.Lifecycle;
 
 import java.util.Arrays;
 import java.util.List;
@@ -25,7 +24,6 @@ import java.util.concurrent.atomic.AtomicInteger;
 public class AppLocationPermissionPreferenceController extends
         LocationBasePreferenceController implements PreferenceControllerMixin {
 
-    private static final String KEY_APP_LEVEL_PERMISSIONS = "app_level_permissions";
     /** Total number of apps that has location permission. */
     @VisibleForTesting
     int mNumTotal = -1;
@@ -40,20 +38,16 @@ public class AppLocationPermissionPreferenceController extends
     private final LocationManager mLocationManager;
     private Preference mPreference;
 
-    public AppLocationPermissionPreferenceController(Context context, Lifecycle lifecycle) {
-        super(context, lifecycle);
+    public AppLocationPermissionPreferenceController(Context context, String key) {
+        super(context, key);
         mLocationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
     }
 
     @Override
-    public String getPreferenceKey() {
-        return KEY_APP_LEVEL_PERMISSIONS;
-    }
-
-    @Override
-    public boolean isAvailable() {
+    public int getAvailabilityStatus() {
         return Settings.Global.getInt(mContext.getContentResolver(),
-                Settings.Global.LOCATION_SETTINGS_LINK_TO_PERMISSIONS_ENABLED, 1) == 1;
+                Settings.Global.LOCATION_SETTINGS_LINK_TO_PERMISSIONS_ENABLED, 1) == 1 ? AVAILABLE
+                : UNSUPPORTED_ON_DEVICE;
     }
 
     @Override
index 6cf8626..69ef1ad 100644 (file)
@@ -16,29 +16,46 @@ package com.android.settings.location;
 import android.content.Context;
 import android.os.UserManager;
 
-import com.android.settings.core.PreferenceControllerMixin;
-import com.android.settingslib.core.AbstractPreferenceController;
+import com.android.settings.core.BasePreferenceController;
+import com.android.settings.dashboard.DashboardFragment;
 import com.android.settingslib.core.lifecycle.Lifecycle;
 
 /**
  * A base controller for preferences that listens to location settings change and modifies location
  * settings.
  */
-public abstract class LocationBasePreferenceController extends AbstractPreferenceController
-        implements PreferenceControllerMixin, LocationEnabler.LocationModeChangeListener {
+public abstract class LocationBasePreferenceController extends BasePreferenceController
+        implements LocationEnabler.LocationModeChangeListener {
 
-    protected final UserManager mUserManager;
-    protected final LocationEnabler mLocationEnabler;
+    protected UserManager mUserManager;
+    protected LocationEnabler mLocationEnabler;
+    protected DashboardFragment mFragment;
+    protected Lifecycle mLifecycle;
 
-    public LocationBasePreferenceController(Context context, Lifecycle lifecycle) {
-        super(context);
-        mUserManager = (UserManager) context.getSystemService(Context.USER_SERVICE);
-        mLocationEnabler = new LocationEnabler(context, this /* listener */, lifecycle);
+    /**
+     * Constructor of LocationBasePreferenceController. {@link BasePreferenceController} uses
+     * reflection to create controller, all controllers extends {@link BasePreferenceController}
+     * should have this function.
+     */
+    public LocationBasePreferenceController(Context context, String key) {
+        super(context, key);
+    }
+
+    /**
+     * Initialize {@link LocationEnabler} in this controller
+     *
+     * @param fragment The {@link DashboardFragment} uses the controller.
+     */
+    public void init(DashboardFragment fragment) {
+        mFragment = fragment;
+        mUserManager = (UserManager) mContext.getSystemService(Context.USER_SERVICE);
+        mLifecycle = mFragment.getSettingsLifecycle();
+        mLocationEnabler = new LocationEnabler(mContext, this /* listener */, mLifecycle);
     }
 
     @Override
-    public boolean isAvailable() {
-        return true;
+    public int getAvailabilityStatus() {
+        return AVAILABLE;
     }
 
 }
index 7c39fea..3b9324d 100644 (file)
@@ -13,7 +13,6 @@
  */
 package com.android.settings.location;
 
-import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
 import android.content.pm.ActivityInfo;
@@ -24,7 +23,6 @@ import android.content.pm.ResolveInfo;
 import android.location.LocationManager;
 import android.util.Log;
 
-import androidx.annotation.VisibleForTesting;
 import androidx.preference.Preference;
 import androidx.preference.PreferenceCategory;
 
@@ -41,23 +39,16 @@ import java.util.List;
 public class LocationFooterPreferenceController extends LocationBasePreferenceController {
 
     private static final String TAG = "LocationFooter";
-    private static final String KEY_LOCATION_FOOTER = "location_footer";
     private static final Intent INJECT_INTENT =
             new Intent(LocationManager.SETTINGS_FOOTER_DISPLAYED_ACTION);
 
     private final PackageManager mPackageManager;
 
-    public LocationFooterPreferenceController(Context context) {
-        // we don't care location mode changes, so pass in a null lifecycle to disable listening
-        super(context, null);
+    public LocationFooterPreferenceController(Context context, String key) {
+        super(context, key);
         mPackageManager = context.getPackageManager();
     }
 
-    @Override
-    public String getPreferenceKey() {
-        return KEY_LOCATION_FOOTER;
-    }
-
     /**
      * Insert footer preferences.
      */
@@ -97,8 +88,8 @@ public class LocationFooterPreferenceController extends LocationBasePreferenceCo
      * inject.
      */
     @Override
-    public boolean isAvailable() {
-        return !getFooterData().isEmpty();
+    public int getAvailabilityStatus() {
+        return !getFooterData().isEmpty() ? AVAILABLE : UNSUPPORTED_ON_DEVICE;
     }
 
     /**
index 1208ea2..342efff 100644 (file)
@@ -17,6 +17,7 @@ package com.android.settings.location;
 
 import android.content.Context;
 import android.os.UserManager;
+import android.text.TextUtils;
 
 import androidx.preference.Preference;
 import androidx.preference.PreferenceScreen;
@@ -25,25 +26,18 @@ import com.android.settings.R;
 import com.android.settings.Utils;
 import com.android.settingslib.RestrictedLockUtils;
 import com.android.settingslib.RestrictedSwitchPreference;
-import com.android.settingslib.core.lifecycle.Lifecycle;
 
 public class LocationForWorkPreferenceController extends LocationBasePreferenceController {
 
-    /**
-     * Key for managed profile location switch preference. Shown only
-     * if there is a managed profile.
-     */
-    private static final String KEY_MANAGED_PROFILE_SWITCH = "managed_profile_location_switch";
-
     private RestrictedSwitchPreference mPreference;
 
-    public LocationForWorkPreferenceController(Context context, Lifecycle lifecycle) {
-        super(context, lifecycle);
+    public LocationForWorkPreferenceController(Context context, String key) {
+        super(context, key);
     }
 
     @Override
     public boolean handlePreferenceTreeClick(Preference preference) {
-        if (KEY_MANAGED_PROFILE_SWITCH.equals(preference.getKey())) {
+        if (TextUtils.equals(preference.getKey(), getPreferenceKey())) {
             final boolean switchState = mPreference.isChecked();
             mUserManager.setUserRestriction(UserManager.DISALLOW_SHARE_LOCATION, !switchState,
                     Utils.getManagedProfile(mUserManager));
@@ -57,19 +51,14 @@ public class LocationForWorkPreferenceController extends LocationBasePreferenceC
     @Override
     public void displayPreference(PreferenceScreen screen) {
         super.displayPreference(screen);
-        mPreference = screen.findPreference(KEY_MANAGED_PROFILE_SWITCH);
+        mPreference = screen.findPreference(getPreferenceKey());
     }
 
     @Override
-    public boolean isAvailable() {
+    public int getAvailabilityStatus() {
         // Looking for a managed profile. If there are no managed profiles then we are removing the
         // managed profile category.
-        return Utils.getManagedProfile(mUserManager) != null;
-    }
-
-    @Override
-    public String getPreferenceKey() {
-        return KEY_MANAGED_PROFILE_SWITCH;
+        return Utils.getManagedProfile(mUserManager) != null ? AVAILABLE : UNSUPPORTED_ON_DEVICE;
     }
 
     @Override
index 2c05a39..436676d 100644 (file)
@@ -19,19 +19,14 @@ package com.android.settings.location;
 import android.content.Context;
 import android.provider.Settings;
 
-import androidx.annotation.VisibleForTesting;
-
 import com.android.settings.R;
 import com.android.settings.core.BasePreferenceController;
 
 
 public class LocationScanningPreferenceController extends BasePreferenceController {
-    @VisibleForTesting static final String KEY_LOCATION_SCANNING = "location_scanning";
-    private final Context mContext;
 
-    public LocationScanningPreferenceController(Context context) {
-        super(context, KEY_LOCATION_SCANNING);
-        mContext = context;
+    public LocationScanningPreferenceController(Context context, String key) {
+        super(context, key);
     }
 
     @Override
index 70246cb..0902573 100644 (file)
@@ -27,8 +27,8 @@ import androidx.preference.PreferenceCategory;
 import androidx.preference.PreferenceScreen;
 
 import com.android.settings.Utils;
+import com.android.settings.dashboard.DashboardFragment;
 import com.android.settings.widget.RestrictedAppPreference;
-import com.android.settingslib.core.lifecycle.Lifecycle;
 import com.android.settingslib.core.lifecycle.LifecycleObserver;
 import com.android.settingslib.core.lifecycle.events.OnPause;
 import com.android.settingslib.core.lifecycle.events.OnResume;
@@ -41,40 +41,31 @@ 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";
+    @VisibleForTesting
+    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 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;
+    @VisibleForTesting
+    AppSettingsInjector mInjector;
     /** Receives UPDATE_INTENT */
     @VisibleForTesting
     BroadcastReceiver mInjectedSettingsReceiver;
 
-    public LocationServicePreferenceController(Context context, LocationSettings fragment,
-            Lifecycle lifecycle) {
-        this(context, fragment, lifecycle, new AppSettingsInjector(context));
-    }
-
-    @VisibleForTesting
-    LocationServicePreferenceController(Context context, LocationSettings fragment,
-            Lifecycle lifecycle, AppSettingsInjector injector) {
-        super(context, lifecycle);
-        mFragment = fragment;
-        mInjector = injector;
-        if (lifecycle != null) {
-            lifecycle.addObserver(this);
-        }
+    public LocationServicePreferenceController(Context context, String key) {
+        super(context, key);
     }
 
     @Override
-    public String getPreferenceKey() {
-        return KEY_LOCATION_SERVICES;
+    public void init(DashboardFragment fragment) {
+        super.init(fragment);
+        mInjector = new AppSettingsInjector(mContext);
     }
 
     @Override
@@ -86,8 +77,12 @@ public class LocationServicePreferenceController extends LocationBasePreferenceC
 
     @Override
     public void updateState(Preference preference) {
-        mCategoryLocationServices.removeAll();
-        mCategoryLocationServicesManaged.removeAll();
+        if (mCategoryLocationServices != null) {
+            mCategoryLocationServices.removeAll();
+        }
+        if (mCategoryLocationServicesManaged != null) {
+            mCategoryLocationServicesManaged.removeAll();
+        }
         final Map<Integer, List<Preference>> prefs = getLocationServices();
         boolean showPrimary = false;
         boolean showManaged = false;
@@ -98,16 +93,25 @@ public class LocationServicePreferenceController extends LocationBasePreferenceC
                 }
             }
             if (entry.getKey() == UserHandle.myUserId()) {
-                LocationSettings.addPreferencesSorted(entry.getValue(), mCategoryLocationServices);
+                if (mCategoryLocationServices != null) {
+                    LocationSettings.addPreferencesSorted(entry.getValue(),
+                            mCategoryLocationServices);
+                }
                 showPrimary = true;
             } else {
-                LocationSettings.addPreferencesSorted(entry.getValue(),
-                        mCategoryLocationServicesManaged);
+                if (mCategoryLocationServicesManaged != null) {
+                    LocationSettings.addPreferencesSorted(entry.getValue(),
+                            mCategoryLocationServicesManaged);
+                }
                 showManaged = true;
             }
         }
-        mCategoryLocationServices.setVisible(showPrimary);
-        mCategoryLocationServicesManaged.setVisible(showManaged);
+        if (mCategoryLocationServices != null) {
+            mCategoryLocationServices.setVisible(showPrimary);
+        }
+        if (mCategoryLocationServicesManaged != null) {
+            mCategoryLocationServicesManaged.setVisible(showManaged);
+        }
     }
 
     @Override
index 4afb504..3b4c4aa 100644 (file)
@@ -29,12 +29,9 @@ import com.android.settings.SettingsActivity;
 import com.android.settings.dashboard.DashboardFragment;
 import com.android.settings.search.BaseSearchIndexProvider;
 import com.android.settings.widget.SwitchBar;
-import com.android.settingslib.core.AbstractPreferenceController;
-import com.android.settingslib.core.lifecycle.Lifecycle;
 import com.android.settingslib.location.RecentLocationApps;
 import com.android.settingslib.search.SearchIndexable;
 
-import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Comparator;
 import java.util.List;
@@ -82,6 +79,17 @@ public class LocationSettings extends DashboardFragment {
     }
 
     @Override
+    public void onAttach(Context context) {
+        super.onAttach(context);
+
+        use(AppLocationPermissionPreferenceController.class).init(this);
+        use(RecentLocationRequestPreferenceController.class).init(this);
+        use(LocationServicePreferenceController.class).init(this);
+        use(LocationFooterPreferenceController.class).init(this);
+        use(LocationForWorkPreferenceController.class).init(this);
+    }
+
+    @Override
     protected int getPreferenceScreenResId() {
         return R.xml.location_settings;
     }
@@ -91,11 +99,6 @@ public class LocationSettings extends DashboardFragment {
         return TAG;
     }
 
-    @Override
-    protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
-        return buildPreferenceControllers(context, this, getSettingsLifecycle());
-    }
-
     static void addPreferencesSorted(List<Preference> prefs, PreferenceGroup container) {
         // If there's some items to display, sort the items and add them to the container.
         Collections.sort(prefs,
@@ -110,29 +113,9 @@ public class LocationSettings extends DashboardFragment {
         return R.string.help_url_location_access;
     }
 
-    private static List<AbstractPreferenceController> buildPreferenceControllers(
-            Context context, LocationSettings fragment, Lifecycle lifecycle) {
-        final List<AbstractPreferenceController> controllers = new ArrayList<>();
-        controllers.add(new AppLocationPermissionPreferenceController(context, lifecycle));
-        controllers.add(new LocationForWorkPreferenceController(context, lifecycle));
-        controllers.add(new RecentLocationRequestPreferenceController(context, fragment, lifecycle));
-        controllers.add(new LocationScanningPreferenceController(context));
-        controllers.add(new LocationServicePreferenceController(context, fragment, lifecycle));
-        controllers.add(new LocationFooterPreferenceController(context));
-        return controllers;
-    }
-
     /**
      * For Search.
      */
     public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
-            new BaseSearchIndexProvider(R.xml.location_settings) {
-
-                @Override
-                public List<AbstractPreferenceController> createPreferenceControllers(Context
-                        context) {
-                    return buildPreferenceControllers(context, null /* fragment */,
-                            null /* lifecycle */);
-                }
-            };
+            new BaseSearchIndexProvider(R.xml.location_settings);
 }
index fb8c62c..0af084c 100644 (file)
@@ -26,18 +26,13 @@ import com.android.settings.R;
 import com.android.settings.applications.appinfo.AppInfoDashboardFragment;
 import com.android.settings.core.SubSettingLauncher;
 import com.android.settings.dashboard.DashboardFragment;
-import com.android.settingslib.core.lifecycle.Lifecycle;
 import com.android.settingslib.location.RecentLocationApps;
 import com.android.settingslib.widget.apppreference.AppPreference;
 
 import java.util.List;
 
 public class RecentLocationRequestPreferenceController extends LocationBasePreferenceController {
-    /** Key for preference category "Recent location requests" */
-    private static final String KEY_RECENT_LOCATION_REQUESTS = "recent_location_requests";
-    @VisibleForTesting
-    static final String KEY_SEE_ALL_BUTTON = "recent_location_requests_see_all_button";
-    private final LocationSettings mFragment;
+
     private final RecentLocationApps mRecentLocationApps;
     private PreferenceCategory mCategoryRecentLocationRequests;
 
@@ -70,29 +65,15 @@ public class RecentLocationRequestPreferenceController extends LocationBasePrefe
         }
     }
 
-    public RecentLocationRequestPreferenceController(Context context, LocationSettings fragment,
-            Lifecycle lifecycle) {
-        this(context, fragment, lifecycle, new RecentLocationApps(context));
-    }
-
-    @VisibleForTesting
-    RecentLocationRequestPreferenceController(Context context, LocationSettings fragment,
-            Lifecycle lifecycle, RecentLocationApps recentApps) {
-        super(context, lifecycle);
-        mFragment = fragment;
-        mRecentLocationApps = recentApps;
-    }
-
-    @Override
-    public String getPreferenceKey() {
-        return KEY_RECENT_LOCATION_REQUESTS;
+    public RecentLocationRequestPreferenceController(Context context, String key) {
+        super(context, key);
+        mRecentLocationApps = new RecentLocationApps(context);
     }
 
     @Override
     public void displayPreference(PreferenceScreen screen) {
         super.displayPreference(screen);
-        mCategoryRecentLocationRequests =
-                (PreferenceCategory) screen.findPreference(KEY_RECENT_LOCATION_REQUESTS);
+        mCategoryRecentLocationRequests = screen.findPreference(getPreferenceKey());
     }
 
     @Override
index 32c9d0d..fc2a5fe 100644 (file)
@@ -24,13 +24,8 @@ import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
 import com.android.settings.R;
 import com.android.settings.dashboard.DashboardFragment;
 import com.android.settings.search.BaseSearchIndexProvider;
-import com.android.settingslib.core.AbstractPreferenceController;
-import com.android.settingslib.core.lifecycle.Lifecycle;
 import com.android.settingslib.search.SearchIndexable;
 
-import java.util.ArrayList;
-import java.util.List;
-
 /** Dashboard Fragment to display all recent location requests, sorted by recency. */
 @SearchIndexable
 public class RecentLocationRequestSeeAllFragment extends DashboardFragment {
@@ -52,6 +47,14 @@ public class RecentLocationRequestSeeAllFragment extends DashboardFragment {
     }
 
     @Override
+    public void onAttach(Context context) {
+        super.onAttach(context);
+
+        mController = use(RecentLocationRequestSeeAllPreferenceController.class);
+        mController.init(this);
+    }
+
+    @Override
     protected int getPreferenceScreenResId() {
         return R.xml.location_recent_requests_see_all;
     }
@@ -62,11 +65,6 @@ public class RecentLocationRequestSeeAllFragment extends DashboardFragment {
     }
 
     @Override
-    protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
-        return buildPreferenceControllers(context, getSettingsLifecycle(), this);
-    }
-
-    @Override
     public boolean onOptionsItemSelected(MenuItem menuItem) {
         switch (menuItem.getItemId()) {
             case MENU_SHOW_SYSTEM:
@@ -87,32 +85,6 @@ public class RecentLocationRequestSeeAllFragment extends DashboardFragment {
         mHideSystemMenu.setVisible(mShowSystem);
     }
 
-    private static List<AbstractPreferenceController> buildPreferenceControllers(
-            Context context, Lifecycle lifecycle, RecentLocationRequestSeeAllFragment fragment) {
-        final List<AbstractPreferenceController> controllers = new ArrayList<>();
-        final RecentLocationRequestSeeAllPreferenceController controller =
-                new RecentLocationRequestSeeAllPreferenceController(context, lifecycle, fragment);
-        controllers.add(controller);
-        if (fragment != null) {
-            fragment.mController = controller;
-        }
-        return controllers;
-    }
-
-    /**
-     * For Search.
-     */
-    public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
-            new BaseSearchIndexProvider(R.xml.location_recent_requests_see_all) {
-
-                @Override
-                public List<AbstractPreferenceController> getPreferenceControllers(Context
-                        context) {
-                    return buildPreferenceControllers(
-                            context, /* lifecycle = */ null, /* fragment = */ null);
-                }
-            };
-
     @Override
     public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
         super.onCreateOptionsMenu(menu, inflater);
@@ -122,4 +94,10 @@ public class RecentLocationRequestSeeAllFragment extends DashboardFragment {
                 R.string.menu_hide_system);
         updateMenu();
     }
+
+    /**
+     * For Search.
+     */
+    public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
+            new BaseSearchIndexProvider(R.xml.location_recent_requests_see_all);
 }
index 3abccf7..012cb8b 100644 (file)
@@ -22,44 +22,24 @@ import androidx.preference.Preference;
 import androidx.preference.PreferenceCategory;
 import androidx.preference.PreferenceScreen;
 
-import com.android.settingslib.core.lifecycle.Lifecycle;
+import com.android.settings.R;
 import com.android.settingslib.location.RecentLocationApps;
 import com.android.settingslib.widget.apppreference.AppPreference;
 
 import java.util.List;
 
-import com.android.settings.R;
-
 /** Preference controller for preference category displaying all recent location requests. */
 public class RecentLocationRequestSeeAllPreferenceController
         extends LocationBasePreferenceController {
-    /** Key for preference category "All recent location requests" */
-    private static final String KEY_ALL_RECENT_LOCATION_REQUESTS = "all_recent_location_requests";
-    private final RecentLocationRequestSeeAllFragment mFragment;
+
     private PreferenceCategory mCategoryAllRecentLocationRequests;
     private RecentLocationApps mRecentLocationApps;
     private boolean mShowSystem = false;
     private Preference mPreference;
 
-    public RecentLocationRequestSeeAllPreferenceController(
-            Context context, Lifecycle lifecycle, RecentLocationRequestSeeAllFragment fragment) {
-        this(context, lifecycle, fragment, new RecentLocationApps(context));
-    }
-
-    @VisibleForTesting
-    RecentLocationRequestSeeAllPreferenceController(
-            Context context,
-            Lifecycle lifecycle,
-            RecentLocationRequestSeeAllFragment fragment,
-            RecentLocationApps recentLocationApps) {
-        super(context, lifecycle);
-        mFragment = fragment;
-        mRecentLocationApps = recentLocationApps;
-    }
-
-    @Override
-    public String getPreferenceKey() {
-        return KEY_ALL_RECENT_LOCATION_REQUESTS;
+    public RecentLocationRequestSeeAllPreferenceController(Context context, String key) {
+        super(context, key);
+        mRecentLocationApps = new RecentLocationApps(context);
     }
 
     @Override
@@ -70,8 +50,7 @@ public class RecentLocationRequestSeeAllPreferenceController
     @Override
     public void displayPreference(PreferenceScreen screen) {
         super.displayPreference(screen);
-        mCategoryAllRecentLocationRequests =
-                (PreferenceCategory) screen.findPreference(KEY_ALL_RECENT_LOCATION_REQUESTS);
+        mCategoryAllRecentLocationRequests = screen.findPreference(getPreferenceKey());
     }
 
     @Override
index 7392ec7..4303489 100644 (file)
@@ -2,6 +2,9 @@ package com.android.settings.location;
 
 import static com.google.common.truth.Truth.assertThat;
 
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.when;
+
 import android.content.Context;
 import android.location.LocationManager;
 import android.provider.Settings;
@@ -30,6 +33,7 @@ public class AppLocationPermissionPreferenceControllerTest {
     private LifecycleOwner mLifecycleOwner;
     private Lifecycle mLifecycle;
     private LocationManager mLocationManager;
+    private LocationSettings mLocationSettings;
 
     @Before
     public void setUp() {
@@ -37,7 +41,10 @@ public class AppLocationPermissionPreferenceControllerTest {
         mContext = RuntimeEnvironment.application;
         mLifecycleOwner = () -> mLifecycle;
         mLifecycle = new Lifecycle(mLifecycleOwner);
-        mController = new AppLocationPermissionPreferenceController(mContext, mLifecycle);
+        mLocationSettings = spy(new LocationSettings());
+        when(mLocationSettings.getSettingsLifecycle()).thenReturn(mLifecycle);
+        mController = new AppLocationPermissionPreferenceController(mContext, "key");
+        mController.init(mLocationSettings);
         mLocationManager = (LocationManager) mContext.getSystemService(Context.LOCATION_SERVICE);
     }
 
index dc3d40a..180f3e2 100644 (file)
@@ -70,7 +70,7 @@ public class LocationFooterPreferenceControllerTest {
         Context context = spy(RuntimeEnvironment.application);
         when(context.getPackageManager()).thenReturn(mPackageManager);
         when(mPreferenceCategory.getContext()).thenReturn(context);
-        mController = spy(new LocationFooterPreferenceController(context));
+        mController = spy(new LocationFooterPreferenceController(context, "key"));
         when(mPackageManager.getResourcesForApplication(any(ApplicationInfo.class)))
                 .thenReturn(mResources);
         when(mResources.getString(TEST_RES_ID)).thenReturn(TEST_TEXT);
index 9034688..5db5ed5 100644 (file)
@@ -69,6 +69,7 @@ public class LocationForWorkPreferenceControllerTest {
     private LocationForWorkPreferenceController mController;
     private LifecycleOwner mLifecycleOwner;
     private Lifecycle mLifecycle;
+    private LocationSettings mLocationSettings;
 
     @Before
     public void setUp() {
@@ -77,10 +78,13 @@ public class LocationForWorkPreferenceControllerTest {
         when(mContext.getSystemService(Context.USER_SERVICE)).thenReturn(mUserManager);
         mLifecycleOwner = () -> mLifecycle;
         mLifecycle = new Lifecycle(mLifecycleOwner);
-        mController = spy(new LocationForWorkPreferenceController(mContext, mLifecycle));
+        mLocationSettings = spy(new LocationSettings());
+        when(mLocationSettings.getSettingsLifecycle()).thenReturn(mLifecycle);
+        mController = spy(new LocationForWorkPreferenceController(mContext, "key"));
+        mController.init(mLocationSettings);
         mockManagedProfile();
         ReflectionHelpers.setField(mController, "mLocationEnabler", mEnabler);
-        when(mScreen.findPreference(mController.getPreferenceKey())).thenReturn(mPreference);
+        when(mScreen.findPreference(any())).thenReturn(mPreference);
         final String key = mController.getPreferenceKey();
         when(mPreference.getKey()).thenReturn(key);
         when(mPreference.isVisible()).thenReturn(true);
index b85377c..28403b1 100644 (file)
@@ -38,7 +38,7 @@ public class LocationScanningPreferenceControllerTest {
     @Before
     public void setUp() {
         mContext = RuntimeEnvironment.application;
-        mController = new LocationScanningPreferenceController(mContext);
+        mController = new LocationScanningPreferenceController(mContext, "key");
     }
 
     @Test
index c6709ed..29048ed 100644 (file)
@@ -15,6 +15,9 @@
  */
 package com.android.settings.location;
 
+import static com.android.settings.location.LocationServicePreferenceController.KEY_LOCATION_SERVICES;
+import static com.android.settings.location.LocationServicePreferenceController.KEY_LOCATION_SERVICES_MANAGED;
+
 import static com.google.common.truth.Truth.assertThat;
 
 import static org.mockito.ArgumentMatchers.any;
@@ -59,8 +62,6 @@ 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;
@@ -86,14 +87,16 @@ public class LocationServicePreferenceControllerTest {
         mContext = spy(RuntimeEnvironment.application);
         mLifecycleOwner = () -> mLifecycle;
         mLifecycle = new Lifecycle(mLifecycleOwner);
-        mController = spy(new LocationServicePreferenceController(
-                mContext, mFragment, mLifecycle, mSettingsInjector));
+        mController = spy(new LocationServicePreferenceController(mContext, KEY_LOCATION_SERVICES));
+        when(mFragment.getSettingsLifecycle()).thenReturn(mLifecycle);
+        mController.init(mFragment);
+        mController.mInjector = mSettingsInjector;
         final String key = mController.getPreferenceKey();
         when(mScreen.findPreference(key)).thenReturn(mCategoryPrimary);
-        when(mScreen.findPreference(LOCATION_SERVICES_MANAGED_PROFILE_KEY)).thenReturn(
+        when(mScreen.findPreference(KEY_LOCATION_SERVICES_MANAGED)).thenReturn(
                 mCategoryManaged);
         when(mCategoryPrimary.getKey()).thenReturn(key);
-        when(mCategoryManaged.getKey()).thenReturn(LOCATION_SERVICES_MANAGED_PROFILE_KEY);
+        when(mCategoryManaged.getKey()).thenReturn(KEY_LOCATION_SERVICES_MANAGED);
         when(mContext.getSystemService(Context.DEVICE_POLICY_SERVICE))
                 .thenReturn(mDevicePolicyManager);
     }