Under "recent location requests", add "See all"
Under Settings -> Security & Location -> Location, add "See all" button under recent location requests On location settings page, display at most 3 recent location requests. If there are more than 3, show a "see all" button. When user clicks "See all", take them to a new fragment with all recent location requests. Test: Robo Test: Manual Bug: 70350519 Change-Id: Id1f9a8da1593814a8f30f8e6ec8ac75fb10f6672
This commit is contained in:
@@ -3371,6 +3371,8 @@
|
||||
<string name="location_app_level_permissions">App-level permissions</string>
|
||||
<!-- [CHAR LIMIT=42] Location settings screen, sub category for recent location requests -->
|
||||
<string name="location_category_recent_location_requests">Recent location requests</string>
|
||||
<!-- Location settings screen, displayed when there're more than three recent location requests -->
|
||||
<string name="location_recent_location_requests_see_all">See all</string>
|
||||
<!-- Location settings screen, displayed when there's no recent app accessing location -->
|
||||
<string name="location_no_recent_apps">No apps have requested location recently</string>
|
||||
<!-- [CHAR LIMIT=30] Location settings screen, sub category for location services -->
|
||||
|
24
res/xml/location_recent_requests_see_all.xml
Normal file
24
res/xml/location_recent_requests_see_all.xml
Normal file
@@ -0,0 +1,24 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Copyright (C) 2018 The Android Open Source Project
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
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>
|
@@ -24,6 +24,13 @@
|
||||
android:key="recent_location_requests"
|
||||
android:title="@string/location_category_recent_location_requests"/>
|
||||
|
||||
<Preference
|
||||
android:key="recent_location_requests_see_all"
|
||||
android:title="@string/location_recent_location_requests_see_all"
|
||||
android:icon="@drawable/ic_chevron_right_24dp"
|
||||
android:selectable="true"
|
||||
android:fragment="com.android.settings.location.RecentLocationRequestSeeAllFragment"/>
|
||||
|
||||
<!-- This preference category gets removed if new_recent_location_ui is disabled -->
|
||||
<Preference
|
||||
android:key="app_level_permissions"
|
||||
|
@@ -70,8 +70,10 @@ public class LocationSettings extends DashboardFragment {
|
||||
public int getInitialExpandedChildCount() {
|
||||
final RecentLocationApps recentLocationApps = new RecentLocationApps(getActivity());
|
||||
final int locationRequestsApps = recentLocationApps.getAppList().size();
|
||||
final int locationRequestsPrefs = locationRequestsApps == 0 ? 1 : locationRequestsApps;
|
||||
return locationRequestsPrefs + 2;
|
||||
final int locationRequestsPrefs =
|
||||
locationRequestsApps == 0
|
||||
? 1 : (locationRequestsApps > 3 ? 4 : locationRequestsApps);
|
||||
return locationRequestsPrefs + 1;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@@ -20,32 +20,33 @@ import android.support.annotation.VisibleForTesting;
|
||||
import android.support.v7.preference.Preference;
|
||||
import android.support.v7.preference.PreferenceCategory;
|
||||
import android.support.v7.preference.PreferenceScreen;
|
||||
|
||||
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.settings.widget.AppPreference;
|
||||
import com.android.settingslib.core.lifecycle.Lifecycle;
|
||||
import com.android.settingslib.location.RecentLocationApps;
|
||||
|
||||
import java.util.ArrayList;
|
||||
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 = "recent_location_requests_see_all";
|
||||
private final LocationSettings mFragment;
|
||||
private final RecentLocationApps mRecentLocationApps;
|
||||
private PreferenceCategory mCategoryRecentLocationRequests;
|
||||
private Preference mSeeAllButton;
|
||||
|
||||
@VisibleForTesting
|
||||
/** Used in this class and {@link RecentLocationRequestSeeAllPreferenceController}*/
|
||||
static class PackageEntryClickedListener implements Preference.OnPreferenceClickListener {
|
||||
private final LocationSettings mFragment;
|
||||
private final DashboardFragment mFragment;
|
||||
private final String mPackage;
|
||||
private final UserHandle mUserHandle;
|
||||
|
||||
public PackageEntryClickedListener(LocationSettings fragment, String packageName,
|
||||
public PackageEntryClickedListener(DashboardFragment fragment, String packageName,
|
||||
UserHandle userHandle) {
|
||||
mFragment = fragment;
|
||||
mPackage = packageName;
|
||||
@@ -92,24 +93,32 @@ public class RecentLocationRequestPreferenceController extends LocationBasePrefe
|
||||
super.displayPreference(screen);
|
||||
mCategoryRecentLocationRequests =
|
||||
(PreferenceCategory) screen.findPreference(KEY_RECENT_LOCATION_REQUESTS);
|
||||
mSeeAllButton = screen.findPreference(KEY_SEE_ALL);
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateState(Preference preference) {
|
||||
mCategoryRecentLocationRequests.removeAll();
|
||||
mSeeAllButton.setVisible(false);
|
||||
|
||||
final Context prefContext = preference.getContext();
|
||||
final List<RecentLocationApps.Request> recentLocationRequests =
|
||||
mRecentLocationApps.getAppListSorted();
|
||||
|
||||
final List<Preference> recentLocationPrefs = new ArrayList<>(recentLocationRequests.size());
|
||||
for (final RecentLocationApps.Request request : recentLocationRequests) {
|
||||
recentLocationPrefs.add(createAppPreference(prefContext, request));
|
||||
}
|
||||
if (recentLocationRequests.size() > 0) {
|
||||
if (recentLocationRequests.size() > 3) {
|
||||
// Display the top 3 preferences to container in original order.
|
||||
for (int i = 0; i < 3; i ++) {
|
||||
mCategoryRecentLocationRequests.addPreference(
|
||||
createAppPreference(prefContext, recentLocationRequests.get(i)));
|
||||
}
|
||||
// Display a button to list all requests
|
||||
mSeeAllButton.setVisible(true);
|
||||
} else if (recentLocationRequests.size() > 0) {
|
||||
// Add preferences to container in original order (already sorted by recency).
|
||||
for (Preference entry : recentLocationPrefs) {
|
||||
mCategoryRecentLocationRequests.addPreference(entry);
|
||||
for (RecentLocationApps.Request request : recentLocationRequests) {
|
||||
mCategoryRecentLocationRequests.addPreference(
|
||||
createAppPreference(prefContext, request));
|
||||
}
|
||||
} else {
|
||||
// If there's no item to display, add a "No recent apps" item.
|
||||
@@ -132,7 +141,7 @@ public class RecentLocationRequestPreferenceController extends LocationBasePrefe
|
||||
|
||||
@VisibleForTesting
|
||||
AppPreference createAppPreference(Context prefContext, RecentLocationApps.Request request) {
|
||||
final AppPreference pref = createAppPreference(prefContext);
|
||||
final AppPreference pref = createAppPreference(prefContext);
|
||||
pref.setSummary(request.contentDescription);
|
||||
pref.setIcon(request.icon);
|
||||
pref.setTitle(request.label);
|
||||
|
@@ -0,0 +1,89 @@
|
||||
/*
|
||||
* Copyright 2018 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.android.settings.location;
|
||||
|
||||
|
||||
import android.content.Context;
|
||||
import android.provider.SearchIndexableResource;
|
||||
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.settings.search.Indexable;
|
||||
import com.android.settingslib.core.AbstractPreferenceController;
|
||||
import com.android.settingslib.core.lifecycle.Lifecycle;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
/** Dashboard Fragment to display all recent location requests, sorted by recency. */
|
||||
public class RecentLocationRequestSeeAllFragment extends DashboardFragment {
|
||||
|
||||
private static final String TAG = "RecentLocationReqAll";
|
||||
|
||||
public static final String PATH =
|
||||
"com.android.settings.location.RecentLocationRequestSeeAllFragment";
|
||||
|
||||
@Override
|
||||
public int getMetricsCategory() {
|
||||
return MetricsEvent.RECENT_LOCATION_REQUESTS_ALL;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected int getPreferenceScreenResId() {
|
||||
return R.xml.location_recent_requests_see_all;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String getLogTag() {
|
||||
return TAG;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
|
||||
return buildPreferenceControllers(context, getLifecycle(), this);
|
||||
}
|
||||
|
||||
private static List<AbstractPreferenceController> buildPreferenceControllers(
|
||||
Context context, Lifecycle lifecycle, RecentLocationRequestSeeAllFragment fragment) {
|
||||
final List<AbstractPreferenceController> controllers = new ArrayList<>();
|
||||
controllers.add(
|
||||
new RecentLocationRequestSeeAllPreferenceController(context, lifecycle, fragment));
|
||||
return controllers;
|
||||
}
|
||||
|
||||
/**
|
||||
* For Search.
|
||||
*/
|
||||
public static final Indexable.SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
|
||||
new BaseSearchIndexProvider() {
|
||||
@Override
|
||||
public List<SearchIndexableResource> getXmlResourcesToIndex(
|
||||
Context context, boolean enabled) {
|
||||
final SearchIndexableResource sir = new SearchIndexableResource(context);
|
||||
sir.xmlResId = R.xml.location_recent_requests_see_all;
|
||||
return Arrays.asList(sir);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<AbstractPreferenceController> getPreferenceControllers(Context
|
||||
context) {
|
||||
return buildPreferenceControllers(
|
||||
context, /* lifecycle = */ null, /* fragment = */ null);
|
||||
}
|
||||
};
|
||||
}
|
@@ -0,0 +1,95 @@
|
||||
/*
|
||||
* Copyright 2018 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.android.settings.location;
|
||||
|
||||
import android.content.Context;
|
||||
import android.support.annotation.VisibleForTesting;
|
||||
import android.support.v7.preference.Preference;
|
||||
import android.support.v7.preference.PreferenceCategory;
|
||||
import android.support.v7.preference.PreferenceScreen;
|
||||
import com.android.settings.widget.AppPreference;
|
||||
import com.android.settingslib.core.lifecycle.Lifecycle;
|
||||
import com.android.settingslib.location.RecentLocationApps;
|
||||
import java.util.List;
|
||||
|
||||
/** 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;
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onLocationModeChanged(int mode, boolean restricted) {
|
||||
mCategoryAllRecentLocationRequests.setEnabled(mLocationEnabler.isEnabled(mode));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void displayPreference(PreferenceScreen screen) {
|
||||
super.displayPreference(screen);
|
||||
mCategoryAllRecentLocationRequests =
|
||||
(PreferenceCategory) screen.findPreference(KEY_ALL_RECENT_LOCATION_REQUESTS);
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateState(Preference preference) {
|
||||
mCategoryAllRecentLocationRequests.removeAll();
|
||||
List<RecentLocationApps.Request> requests = mRecentLocationApps.getAppListSorted();
|
||||
for (RecentLocationApps.Request request : requests) {
|
||||
Preference appPreference = createAppPreference(preference.getContext(), request);
|
||||
mCategoryAllRecentLocationRequests.addPreference(appPreference);
|
||||
}
|
||||
}
|
||||
|
||||
@VisibleForTesting
|
||||
AppPreference createAppPreference(
|
||||
Context prefContext, RecentLocationApps.Request request) {
|
||||
final AppPreference pref = new AppPreference(prefContext);
|
||||
pref.setSummary(request.contentDescription);
|
||||
pref.setIcon(request.icon);
|
||||
pref.setTitle(request.label);
|
||||
pref.setOnPreferenceClickListener(
|
||||
new RecentLocationRequestPreferenceController.PackageEntryClickedListener(
|
||||
mFragment, request.packageName, request.userHandle));
|
||||
return pref;
|
||||
}
|
||||
}
|
@@ -65,6 +65,7 @@ import com.android.settings.inputmethod.PhysicalKeyboardFragment;
|
||||
import com.android.settings.inputmethod.VirtualKeyboardFragment;
|
||||
import com.android.settings.language.LanguageAndInputSettings;
|
||||
import com.android.settings.location.LocationSettings;
|
||||
import com.android.settings.location.RecentLocationRequestSeeAllFragment;
|
||||
import com.android.settings.location.ScanningSettings;
|
||||
import com.android.settings.network.NetworkDashboardFragment;
|
||||
import com.android.settings.nfc.PaymentSettings;
|
||||
@@ -177,6 +178,7 @@ public class SearchIndexableResourcesImpl implements SearchIndexableResources {
|
||||
addIndex(SmartBatterySettings.class);
|
||||
addIndex(MyDeviceInfoFragment.class);
|
||||
addIndex(VibrationSettings.class);
|
||||
addIndex(RecentLocationRequestSeeAllFragment.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@@ -22,6 +22,7 @@ import static org.mockito.ArgumentMatchers.argThat;
|
||||
import static org.mockito.ArgumentMatchers.eq;
|
||||
import static org.mockito.Mockito.doReturn;
|
||||
import static org.mockito.Mockito.mock;
|
||||
import static org.mockito.Mockito.never;
|
||||
import static org.mockito.Mockito.spy;
|
||||
import static org.mockito.Mockito.verify;
|
||||
import static org.mockito.Mockito.when;
|
||||
@@ -34,7 +35,6 @@ import android.support.v7.preference.Preference;
|
||||
import android.support.v7.preference.PreferenceCategory;
|
||||
import android.support.v7.preference.PreferenceScreen;
|
||||
import android.text.TextUtils;
|
||||
|
||||
import com.android.settings.R;
|
||||
import com.android.settings.TestConfig;
|
||||
import com.android.settings.applications.appinfo.AppInfoDashboardFragment;
|
||||
@@ -43,7 +43,8 @@ import com.android.settings.widget.AppPreference;
|
||||
import com.android.settingslib.core.lifecycle.Lifecycle;
|
||||
import com.android.settingslib.location.RecentLocationApps;
|
||||
import com.android.settingslib.location.RecentLocationApps.Request;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
@@ -56,9 +57,6 @@ import org.mockito.MockitoAnnotations;
|
||||
import org.robolectric.RuntimeEnvironment;
|
||||
import org.robolectric.annotation.Config;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
@RunWith(SettingsRobolectricTestRunner.class)
|
||||
@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
|
||||
public class RecentLocationRequestPreferenceControllerTest {
|
||||
@@ -71,6 +69,8 @@ public class RecentLocationRequestPreferenceControllerTest {
|
||||
private PreferenceScreen mScreen;
|
||||
@Mock
|
||||
private RecentLocationApps mRecentLocationApps;
|
||||
@Mock
|
||||
private Preference mSeeAllButton;
|
||||
|
||||
private Context mContext;
|
||||
private RecentLocationRequestPreferenceController mController;
|
||||
@@ -86,6 +86,7 @@ public class RecentLocationRequestPreferenceControllerTest {
|
||||
mController = spy(new RecentLocationRequestPreferenceController(
|
||||
mContext, mFragment, mLifecycle, mRecentLocationApps));
|
||||
when(mScreen.findPreference(mController.getPreferenceKey())).thenReturn(mCategory);
|
||||
when(mScreen.findPreference(mController.KEY_SEE_ALL)).thenReturn(mSeeAllButton);
|
||||
final String key = mController.getPreferenceKey();
|
||||
when(mCategory.getKey()).thenReturn(key);
|
||||
when(mCategory.getContext()).thenReturn(mContext);
|
||||
@@ -123,38 +124,43 @@ public class RecentLocationRequestPreferenceControllerTest {
|
||||
|
||||
@Test
|
||||
public void updateState_hasRecentRequest_shouldRemoveAllAndAddInjectedSettings() {
|
||||
final List<RecentLocationApps.Request> requests = new ArrayList<>();
|
||||
final Request req1 = mock(Request.class);
|
||||
final Request req2 = mock(Request.class);
|
||||
requests.add(req1);
|
||||
requests.add(req2);
|
||||
List<Request> requests = createMockRequests(2);
|
||||
doReturn(requests).when(mRecentLocationApps).getAppListSorted();
|
||||
final String title1 = "testTitle1";
|
||||
final String title2 = "testTitle2";
|
||||
final AppPreference preference1 = mock(AppPreference.class);
|
||||
final AppPreference preference2 = mock(AppPreference.class);
|
||||
when(preference1.getTitle()).thenReturn(title1);
|
||||
when(preference2.getTitle()).thenReturn(title2);
|
||||
doReturn(preference1).when(mController)
|
||||
.createAppPreference(any(Context.class), eq(req1));
|
||||
doReturn(preference2).when(mController)
|
||||
.createAppPreference(any(Context.class), eq(req2));
|
||||
|
||||
mController.displayPreference(mScreen);
|
||||
mController.updateState(mCategory);
|
||||
|
||||
verify(mCategory).removeAll();
|
||||
// Verifies two preferences are added in original order
|
||||
InOrder inOrder = Mockito.inOrder(mCategory);
|
||||
inOrder.verify(mCategory).addPreference(argThat(titleMatches(title1)));
|
||||
inOrder.verify(mCategory).addPreference(argThat(titleMatches(title2)));
|
||||
inOrder.verify(mCategory).addPreference(argThat(titleMatches("appTitle0")));
|
||||
inOrder.verify(mCategory).addPreference(argThat(titleMatches("appTitle1")));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void updateState_hasOverThreeRequests_shouldDisplaySeeAllButton() {
|
||||
List<Request> requests = createMockRequests(6);
|
||||
when(mRecentLocationApps.getAppListSorted()).thenReturn(requests);
|
||||
|
||||
mController.displayPreference(mScreen);
|
||||
mController.updateState(mCategory);
|
||||
|
||||
verify(mCategory).removeAll();
|
||||
// Verifies the first three preferences are added
|
||||
InOrder inOrder = Mockito.inOrder(mCategory);
|
||||
inOrder.verify(mCategory).addPreference(argThat(titleMatches("appTitle0")));
|
||||
inOrder.verify(mCategory).addPreference(argThat(titleMatches("appTitle1")));
|
||||
inOrder.verify(mCategory).addPreference(argThat(titleMatches("appTitle2")));
|
||||
verify(mCategory, never()).addPreference(argThat(titleMatches("appTitle3")));
|
||||
// Verifies the "See all" preference is visible
|
||||
verify(mSeeAllButton).setVisible(true);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void createAppPreference_shouldAddClickListener() {
|
||||
final Request request = mock(Request.class);
|
||||
final AppPreference preference = mock(AppPreference.class);
|
||||
doReturn(preference).when(mController)
|
||||
.createAppPreference(any(Context.class));
|
||||
doReturn(preference).when(mController).createAppPreference(any(Context.class));
|
||||
|
||||
mController.createAppPreference(mContext, request);
|
||||
|
||||
@@ -190,4 +196,19 @@ public class RecentLocationRequestPreferenceControllerTest {
|
||||
return preference -> TextUtils.equals(expected, preference.getTitle());
|
||||
}
|
||||
|
||||
private List<RecentLocationApps.Request> createMockRequests(int count) {
|
||||
List<RecentLocationApps.Request> requests = new ArrayList<>();
|
||||
for (int i = 0; i < count; i++) {
|
||||
// Add mock requests
|
||||
Request req = mock(Request.class, "request" + i);
|
||||
requests.add(req);
|
||||
// Map mock AppPreferences with mock requests
|
||||
String title = "appTitle" + i;
|
||||
AppPreference appPreference = mock(AppPreference.class, "AppPreference" + i);
|
||||
doReturn(title).when(appPreference).getTitle();
|
||||
doReturn(appPreference)
|
||||
.when(mController).createAppPreference(any(Context.class), eq(req));
|
||||
}
|
||||
return requests;
|
||||
}
|
||||
}
|
@@ -0,0 +1,126 @@
|
||||
/*
|
||||
* Copyright 2018 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.android.settings.location;
|
||||
|
||||
import static org.mockito.ArgumentMatchers.any;
|
||||
import static org.mockito.ArgumentMatchers.eq;
|
||||
import static org.mockito.Mockito.doReturn;
|
||||
import static org.mockito.Mockito.mock;
|
||||
import static org.mockito.Mockito.spy;
|
||||
import static org.mockito.Mockito.verify;
|
||||
import static org.mockito.Mockito.when;
|
||||
|
||||
import android.arch.lifecycle.LifecycleOwner;
|
||||
import android.content.Context;
|
||||
import android.provider.Settings.Secure;
|
||||
import android.support.v7.preference.PreferenceCategory;
|
||||
import android.support.v7.preference.PreferenceScreen;
|
||||
import com.android.settings.TestConfig;
|
||||
import com.android.settings.testutils.SettingsRobolectricTestRunner;
|
||||
import com.android.settings.widget.AppPreference;
|
||||
import com.android.settingslib.core.lifecycle.Lifecycle;
|
||||
import com.android.settingslib.location.RecentLocationApps;
|
||||
import com.android.settingslib.location.RecentLocationApps.Request;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.mockito.Mock;
|
||||
import org.mockito.MockitoAnnotations;
|
||||
import org.robolectric.RuntimeEnvironment;
|
||||
import org.robolectric.annotation.Config;
|
||||
|
||||
/** Unit tests for {@link RecentLocationRequestSeeAllPreferenceController} */
|
||||
@RunWith(SettingsRobolectricTestRunner.class)
|
||||
@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
|
||||
public class RecentLocationRequestSeeAllPreferenceControllerTest {
|
||||
|
||||
@Mock
|
||||
RecentLocationRequestSeeAllFragment mFragment;
|
||||
@Mock
|
||||
private PreferenceScreen mScreen;
|
||||
@Mock
|
||||
private PreferenceCategory mCategory;
|
||||
@Mock
|
||||
private RecentLocationApps mRecentLocationApps;
|
||||
|
||||
private Context mContext;
|
||||
private LifecycleOwner mLifecycleOwner;
|
||||
private Lifecycle mLifecycle;
|
||||
private RecentLocationRequestSeeAllPreferenceController mController;
|
||||
|
||||
@Before
|
||||
public void setUp() {
|
||||
MockitoAnnotations.initMocks(this);
|
||||
mContext = spy(RuntimeEnvironment.application);
|
||||
mLifecycleOwner = () -> mLifecycle;
|
||||
mLifecycle = new Lifecycle(mLifecycleOwner);
|
||||
mController = spy(
|
||||
new RecentLocationRequestSeeAllPreferenceController(
|
||||
mContext, mLifecycle, mFragment, mRecentLocationApps));
|
||||
when(mScreen.findPreference(mController.getPreferenceKey())).thenReturn(mCategory);
|
||||
final String key = mController.getPreferenceKey();
|
||||
when(mCategory.getKey()).thenReturn(key);
|
||||
when(mCategory.getContext()).thenReturn(mContext);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void onLocationModeChanged_locationOn_shouldEnablePreference() {
|
||||
mController.displayPreference(mScreen);
|
||||
|
||||
mController.onLocationModeChanged(Secure.LOCATION_MODE_HIGH_ACCURACY, false);
|
||||
|
||||
verify(mCategory).setEnabled(true);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void onLocationModeChanged_locationOff_shouldDisablePreference() {
|
||||
mController.displayPreference(mScreen);
|
||||
|
||||
mController.onLocationModeChanged(Secure.LOCATION_MODE_OFF, false);
|
||||
|
||||
verify(mCategory).setEnabled(false);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void updateState_shouldRemoveAll() {
|
||||
doReturn(Collections.EMPTY_LIST).when(mRecentLocationApps).getAppListSorted();
|
||||
|
||||
mController.displayPreference(mScreen);
|
||||
mController.updateState(mCategory);
|
||||
|
||||
verify(mCategory).removeAll();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void updateState_hasRecentLocationRequest_shouldAddPreference() {
|
||||
Request request = mock(Request.class);
|
||||
AppPreference appPreference = mock(AppPreference.class);
|
||||
doReturn(appPreference)
|
||||
.when(mController).createAppPreference(any(Context.class), eq(request));
|
||||
when(mRecentLocationApps.getAppListSorted())
|
||||
.thenReturn(new ArrayList<>(Arrays.asList(request)));
|
||||
|
||||
mController.displayPreference(mScreen);
|
||||
mController.updateState(mCategory);
|
||||
|
||||
verify(mCategory).removeAll();
|
||||
verify(mCategory).addPreference(appPreference);
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user