From 2229585e889bd90d23576bf357786d538ec9f209 Mon Sep 17 00:00:00 2001 From: Raff Tsai Date: Fri, 22 Nov 2019 11:35:40 +0800 Subject: [PATCH] Refactor LocationSettings - 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 --- res/xml/location_recent_requests_see_all.xml | 14 ++- res/xml/location_settings.xml | 111 ++++++++++-------- ...ocationPermissionPreferenceController.java | 16 +-- .../LocationBasePreferenceController.java | 41 +++++-- .../LocationFooterPreferenceController.java | 17 +-- .../LocationForWorkPreferenceController.java | 25 ++-- .../LocationScanningPreferenceController.java | 9 +- .../LocationServicePreferenceController.java | 60 +++++----- .../settings/location/LocationSettings.java | 41 ++----- ...ntLocationRequestPreferenceController.java | 29 +---- .../RecentLocationRequestSeeAllFragment.java | 50 +++----- ...tionRequestSeeAllPreferenceController.java | 33 +----- ...ionPermissionPreferenceControllerTest.java | 9 +- ...ocationFooterPreferenceControllerTest.java | 2 +- ...cationForWorkPreferenceControllerTest.java | 8 +- ...ationScanningPreferenceControllerTest.java | 2 +- ...cationServicePreferenceControllerTest.java | 15 ++- 17 files changed, 209 insertions(+), 273 deletions(-) diff --git a/res/xml/location_recent_requests_see_all.xml b/res/xml/location_recent_requests_see_all.xml index dfb8804b085..492bc968c59 100644 --- a/res/xml/location_recent_requests_see_all.xml +++ b/res/xml/location_recent_requests_see_all.xml @@ -10,9 +10,13 @@ See the License for the specific language governing permissions and limitations under the License. --> - - + + + diff --git a/res/xml/location_settings.xml b/res/xml/location_settings.xml index 136e6ab6195..2ad155448f2 100644 --- a/res/xml/location_settings.xml +++ b/res/xml/location_settings.xml @@ -14,64 +14,71 @@ limitations under the License. --> - + - + + + + + + + + + + + + + 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"/> + + + - - - - - - - - - - - - - - - - - - - + settings:controller="com.android.settings.location.LocationServicePreferenceController"/> + + android:key="location_services_managed_profile" + android:title="@string/managed_profile_location_services"/> + + + + diff --git a/src/com/android/settings/location/AppLocationPermissionPreferenceController.java b/src/com/android/settings/location/AppLocationPermissionPreferenceController.java index 65abe997a99..90b37978fdd 100644 --- a/src/com/android/settings/location/AppLocationPermissionPreferenceController.java +++ b/src/com/android/settings/location/AppLocationPermissionPreferenceController.java @@ -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 diff --git a/src/com/android/settings/location/LocationBasePreferenceController.java b/src/com/android/settings/location/LocationBasePreferenceController.java index 6cf8626ebcd..69ef1adf6e6 100644 --- a/src/com/android/settings/location/LocationBasePreferenceController.java +++ b/src/com/android/settings/location/LocationBasePreferenceController.java @@ -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; } } diff --git a/src/com/android/settings/location/LocationFooterPreferenceController.java b/src/com/android/settings/location/LocationFooterPreferenceController.java index 7c39fea47f6..3b9324df31c 100644 --- a/src/com/android/settings/location/LocationFooterPreferenceController.java +++ b/src/com/android/settings/location/LocationFooterPreferenceController.java @@ -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; } /** diff --git a/src/com/android/settings/location/LocationForWorkPreferenceController.java b/src/com/android/settings/location/LocationForWorkPreferenceController.java index 1208ea2ee0a..342efff84f8 100644 --- a/src/com/android/settings/location/LocationForWorkPreferenceController.java +++ b/src/com/android/settings/location/LocationForWorkPreferenceController.java @@ -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 diff --git a/src/com/android/settings/location/LocationScanningPreferenceController.java b/src/com/android/settings/location/LocationScanningPreferenceController.java index 2c05a39e540..436676df558 100644 --- a/src/com/android/settings/location/LocationScanningPreferenceController.java +++ b/src/com/android/settings/location/LocationScanningPreferenceController.java @@ -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 diff --git a/src/com/android/settings/location/LocationServicePreferenceController.java b/src/com/android/settings/location/LocationServicePreferenceController.java index 70246cbe3ae..0902573de09 100644 --- a/src/com/android/settings/location/LocationServicePreferenceController.java +++ b/src/com/android/settings/location/LocationServicePreferenceController.java @@ -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> 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 diff --git a/src/com/android/settings/location/LocationSettings.java b/src/com/android/settings/location/LocationSettings.java index 4afb5049295..3b4c4aa2287 100644 --- a/src/com/android/settings/location/LocationSettings.java +++ b/src/com/android/settings/location/LocationSettings.java @@ -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; @@ -81,6 +78,17 @@ public class LocationSettings extends DashboardFragment { switchBar.show(); } + @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 createPreferenceControllers(Context context) { - return buildPreferenceControllers(context, this, getSettingsLifecycle()); - } - static void addPreferencesSorted(List 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 buildPreferenceControllers( - Context context, LocationSettings fragment, Lifecycle lifecycle) { - final List 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 createPreferenceControllers(Context - context) { - return buildPreferenceControllers(context, null /* fragment */, - null /* lifecycle */); - } - }; + new BaseSearchIndexProvider(R.xml.location_settings); } diff --git a/src/com/android/settings/location/RecentLocationRequestPreferenceController.java b/src/com/android/settings/location/RecentLocationRequestPreferenceController.java index fb8c62c6573..0af084c0fc8 100644 --- a/src/com/android/settings/location/RecentLocationRequestPreferenceController.java +++ b/src/com/android/settings/location/RecentLocationRequestPreferenceController.java @@ -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 diff --git a/src/com/android/settings/location/RecentLocationRequestSeeAllFragment.java b/src/com/android/settings/location/RecentLocationRequestSeeAllFragment.java index 32c9d0d6aff..fc2a5fed00b 100644 --- a/src/com/android/settings/location/RecentLocationRequestSeeAllFragment.java +++ b/src/com/android/settings/location/RecentLocationRequestSeeAllFragment.java @@ -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 { @@ -51,6 +46,14 @@ public class RecentLocationRequestSeeAllFragment extends DashboardFragment { return MetricsEvent.RECENT_LOCATION_REQUESTS_ALL; } + @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; @@ -61,11 +64,6 @@ public class RecentLocationRequestSeeAllFragment extends DashboardFragment { return TAG; } - @Override - protected List createPreferenceControllers(Context context) { - return buildPreferenceControllers(context, getSettingsLifecycle(), this); - } - @Override public boolean onOptionsItemSelected(MenuItem menuItem) { switch (menuItem.getItemId()) { @@ -87,32 +85,6 @@ public class RecentLocationRequestSeeAllFragment extends DashboardFragment { mHideSystemMenu.setVisible(mShowSystem); } - private static List buildPreferenceControllers( - Context context, Lifecycle lifecycle, RecentLocationRequestSeeAllFragment fragment) { - final List 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 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); } diff --git a/src/com/android/settings/location/RecentLocationRequestSeeAllPreferenceController.java b/src/com/android/settings/location/RecentLocationRequestSeeAllPreferenceController.java index 3abccf7d231..012cb8bbe79 100644 --- a/src/com/android/settings/location/RecentLocationRequestSeeAllPreferenceController.java +++ b/src/com/android/settings/location/RecentLocationRequestSeeAllPreferenceController.java @@ -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 diff --git a/tests/robotests/src/com/android/settings/location/AppLocationPermissionPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/location/AppLocationPermissionPreferenceControllerTest.java index 7392ec78b9c..4303489682b 100644 --- a/tests/robotests/src/com/android/settings/location/AppLocationPermissionPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/location/AppLocationPermissionPreferenceControllerTest.java @@ -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); } diff --git a/tests/robotests/src/com/android/settings/location/LocationFooterPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/location/LocationFooterPreferenceControllerTest.java index dc3d40a7400..180f3e2494b 100644 --- a/tests/robotests/src/com/android/settings/location/LocationFooterPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/location/LocationFooterPreferenceControllerTest.java @@ -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); diff --git a/tests/robotests/src/com/android/settings/location/LocationForWorkPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/location/LocationForWorkPreferenceControllerTest.java index 9034688f899..5db5ed521ab 100644 --- a/tests/robotests/src/com/android/settings/location/LocationForWorkPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/location/LocationForWorkPreferenceControllerTest.java @@ -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); diff --git a/tests/robotests/src/com/android/settings/location/LocationScanningPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/location/LocationScanningPreferenceControllerTest.java index b85377c5356..28403b1fb11 100644 --- a/tests/robotests/src/com/android/settings/location/LocationScanningPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/location/LocationScanningPreferenceControllerTest.java @@ -38,7 +38,7 @@ public class LocationScanningPreferenceControllerTest { @Before public void setUp() { mContext = RuntimeEnvironment.application; - mController = new LocationScanningPreferenceController(mContext); + mController = new LocationScanningPreferenceController(mContext, "key"); } @Test diff --git a/tests/robotests/src/com/android/settings/location/LocationServicePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/location/LocationServicePreferenceControllerTest.java index c6709edfc4e..29048ed55ea 100644 --- a/tests/robotests/src/com/android/settings/location/LocationServicePreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/location/LocationServicePreferenceControllerTest.java @@ -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); }