Remove location mode menu from location settings

Location modes were introduced in KitKat. It has made location settings over complicated. In P we are removing location modes to provide simple, meaningful and transparent controls for users.

Bug: 63818349
Bug: 70350519
Test: Robo
Test: Manual
Change-Id: Ic8a168b8eeb3cd2c8b1536c378c92a5f377d3bba
This commit is contained in:
Maggie
2018-01-24 12:05:45 -08:00
parent eb4dceea7f
commit 5a86cd6545
19 changed files with 9 additions and 984 deletions

View File

@@ -3391,16 +3391,6 @@
<string name="location_title">My Location</string> <string name="location_title">My Location</string>
<!-- [CHAR LIMIT=30] Title for managed profile location switch --> <!-- [CHAR LIMIT=30] Title for managed profile location switch -->
<string name="managed_profile_location_switch_title">Location for work profile</string> <string name="managed_profile_location_switch_title">Location for work profile</string>
<!-- [CHAR LIMIT=30] Location settings screen, setting preference screen box label for location mode -->
<string name="location_mode_title">Mode</string>
<!-- [CHAR LIMIT=30] Location settings screen, high accuracy location mode -->
<string name="location_mode_high_accuracy_title">High accuracy</string>
<!-- [CHAR LIMIT=30] Location settings screen, battery saving location mode -->
<string name="location_mode_battery_saving_title">Battery saving</string>
<!-- [CHAR LIMIT=30] Location settings screen, device only location mode -->
<string name="location_mode_sensors_only_title">Device only</string>
<!-- [CHAR LIMIT=30] Location settings screen, location off mode -->
<string name="location_mode_location_off_title">Location off</string>
<!-- [CHAR LIMIT=30] Location settings screen. It's a link that directs the user to a page that <!-- [CHAR LIMIT=30] Location settings screen. It's a link that directs the user to a page that
shows the location permission setting for each installed app --> shows the location permission setting for each installed app -->
<string name="location_app_level_permissions">App-level permissions</string> <string name="location_app_level_permissions">App-level permissions</string>
@@ -3414,14 +3404,6 @@
<string name="location_high_battery_use">High battery use</string> <string name="location_high_battery_use">High battery use</string>
<!-- [CHAR LIMIT=30] Location settings screen, recent location requests low battery use--> <!-- [CHAR LIMIT=30] Location settings screen, recent location requests low battery use-->
<string name="location_low_battery_use">Low battery use</string> <string name="location_low_battery_use">Low battery use</string>
<!-- [CHAR LIMIT=30] Location mode screen, screen title -->
<string name="location_mode_screen_title">Location mode</string>
<!-- [CHAR LIMIT=130] Location mode screen, description for high accuracy mode -->
<string name="location_mode_high_accuracy_description">Use GPS, Wi\u2011Fi, Bluetooth, or mobile networks to determine location </string>
<!-- [CHAR LIMIT=130] Location mode screen, description for battery saving mode -->
<string name="location_mode_battery_saving_description">Use Wi\u2011Fi, Bluetooth, or mobile networks to determine location</string>
<!-- [CHAR LIMIT=130] Location mode screen, description for sensors only mode -->
<string name="location_mode_sensors_only_description">Use GPS and device sensors to determine location</string>
<!-- [CHAR LIMIT=30] Wireless background scanning settings screen, screen title --> <!-- [CHAR LIMIT=30] Wireless background scanning settings screen, screen title -->
<string name="location_scanning_screen_title">Scanning</string> <string name="location_scanning_screen_title">Scanning</string>
<!-- [CHAR LIMIT=130] Preference title for Wi-Fi always scanning --> <!-- [CHAR LIMIT=130] Preference title for Wi-Fi always scanning -->
@@ -6709,7 +6691,6 @@
<string name="keywords_sounds_and_notifications_interruptions">dont don\u2019t disturb, interrupt, interruption, break</string> <string name="keywords_sounds_and_notifications_interruptions">dont don\u2019t disturb, interrupt, interruption, break</string>
<string name="keywords_app">RAM</string> <string name="keywords_app">RAM</string>
<string name="keywords_location">nearby, location, history, reporting</string> <string name="keywords_location">nearby, location, history, reporting</string>
<string name="keywords_location_mode">accuracy</string>
<string name="keywords_accounts">account</string> <string name="keywords_accounts">account</string>
<string name="keywords_users">restriction, restrict, restricted</string> <string name="keywords_users">restriction, restrict, restricted</string>
<string name="keywords_keyboard_and_ime">text correction, correct, sound, vibrate, auto, language, gesture, suggest, suggestion, theme, offensive, word, type, emoji, international</string> <string name="keywords_keyboard_and_ime">text correction, correct, sound, vibrate, auto, language, gesture, suggest, suggestion, theme, offensive, word, type, emoji, international</string>
@@ -8346,8 +8327,8 @@
<!-- Summary of payment screen [CHAR LIMIT=NONE] --> <!-- Summary of payment screen [CHAR LIMIT=NONE] -->
<string name="payment_summary"><xliff:g id="app_name" example="Payment App">%1$s</xliff:g> is default</string> <string name="payment_summary"><xliff:g id="app_name" example="Payment App">%1$s</xliff:g> is default</string>
<!-- Summary of location screen [CHAR LIMIT=NONE] --> <!-- Summary of location on screen [CHAR LIMIT=NONE] -->
<string name="location_on_summary">ON / <xliff:g id="location_mode" example="High accuracy">%1$s</xliff:g></string> <string name="location_on_summary">ON</string>
<!-- Location off [CHAR LIMIT=NONE] --> <!-- Location off [CHAR LIMIT=NONE] -->
<string name="location_off_summary">OFF</string> <string name="location_off_summary">OFF</string>

View File

@@ -1,35 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2011 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:key="location_mode_settings"
android:title="@string/location_mode_screen_title">
<com.android.settings.widget.RadioButtonPreference
android:key="high_accuracy"
android:title="@string/location_mode_high_accuracy_title"
android:summary="@string/location_mode_high_accuracy_description" />
<com.android.settings.widget.RadioButtonPreference
android:key="battery_saving"
android:title="@string/location_mode_battery_saving_title"
android:summary="@string/location_mode_battery_saving_description" />
<com.android.settings.widget.RadioButtonPreference
android:key="sensors_only"
android:title="@string/location_mode_sensors_only_title"
android:summary="@string/location_mode_sensors_only_description" />
</PreferenceScreen>

View File

@@ -50,10 +50,4 @@
<PreferenceCategory <PreferenceCategory
android:key="location_services" android:key="location_services"
android:title="@string/location_category_location_services" /> android:title="@string/location_category_location_services" />
<Preference
android:key="location_mode"
android:title="@string/location_mode_title"
settings:keywords="@string/keywords_location_mode"
android:summary="@string/summary_placeholder" />
</PreferenceScreen> </PreferenceScreen>

View File

@@ -1,108 +0,0 @@
/*
* Copyright (C) 2013 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;
/**
* A page with 3 radio buttons to choose the location mode.
*
* There are 3 location modes when location access is enabled:
*
* High accuracy: use both GPS and network location.
*
* Battery saving: use network location only to reduce the power consumption.
*
* Sensors only: use GPS location only.
*/
public class LocationMode extends DashboardFragment {
private static final String TAG = "LocationMode";
@Override
public int getMetricsCategory() {
return MetricsEvent.LOCATION_MODE;
}
@Override
protected int getPreferenceScreenResId() {
return R.xml.location_mode;
}
@Override
protected String getLogTag() {
return TAG;
}
@Override
protected List<AbstractPreferenceController> getPreferenceControllers(Context context) {
return buildPreferenceControllers(context, getLifecycle());
}
@Override
public int getHelpResource() {
return R.string.help_url_location_access;
}
private static List<AbstractPreferenceController> buildPreferenceControllers(
Context context, Lifecycle lifecycle) {
final List<AbstractPreferenceController> controllers = new ArrayList<>();
controllers.add(new LocationModeHighAccuracyPreferenceController(context, lifecycle));
controllers.add(
new LocationModeBatterySavingPreferenceController(context, lifecycle));
controllers.add(new LocationModeSensorsOnlyPreferenceController(context, lifecycle));
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_mode;
return Arrays.asList(sir);
}
@Override
protected boolean isPageSearchEnabled(Context context) {
return context.getResources().getBoolean(R.bool.config_location_mode_available);
}
@Override
public List<AbstractPreferenceController> getPreferenceControllers(Context
context) {
return buildPreferenceControllers(context, null /* lifecycle */);
}
};
}

View File

@@ -1,40 +0,0 @@
/*
* Copyright (C) 2017 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.Settings;
import com.android.settingslib.core.lifecycle.Lifecycle;
public class LocationModeBatterySavingPreferenceController
extends LocationModeRadioButtonPreferenceController {
private static final String KEY_BATTERY_SAVING = "battery_saving";
public LocationModeBatterySavingPreferenceController(Context context,
Lifecycle lifecycle) {
super(context, lifecycle);
}
@Override
public String getPreferenceKey() {
return KEY_BATTERY_SAVING;
}
@Override
protected int getLocationMode() {
return Settings.Secure.LOCATION_MODE_BATTERY_SAVING;
}
}

View File

@@ -1,40 +0,0 @@
/*
* Copyright (C) 2017 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.Settings;
import com.android.settingslib.core.lifecycle.Lifecycle;
public class LocationModeHighAccuracyPreferenceController
extends LocationModeRadioButtonPreferenceController {
private static final String KEY_HIGH_ACCURACY = "high_accuracy";
public LocationModeHighAccuracyPreferenceController(Context context,
Lifecycle lifecycle) {
super(context, lifecycle);
}
@Override
public String getPreferenceKey() {
return KEY_HIGH_ACCURACY;
}
@Override
protected int getLocationMode() {
return Settings.Secure.LOCATION_MODE_HIGH_ACCURACY;
}
}

View File

@@ -1,76 +0,0 @@
/*
* Copyright (C) 2017 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.v7.preference.Preference;
import android.support.v7.preference.PreferenceScreen;
import com.android.settings.R;
import com.android.settings.SettingsActivity;
import com.android.settingslib.core.lifecycle.Lifecycle;
public class LocationModePreferenceController extends LocationBasePreferenceController {
/** Key for preference screen "Mode" */
private static final String KEY_LOCATION_MODE = "location_mode";
private final LocationSettings mParentFragment;
private Preference mPreference;
public LocationModePreferenceController(Context context, LocationSettings parent,
Lifecycle lifecycle) {
super(context, lifecycle);
mParentFragment = parent;
}
@Override
public String getPreferenceKey() {
return KEY_LOCATION_MODE;
}
@Override
public boolean isAvailable() {
return mContext.getResources().getBoolean(R.bool.config_location_mode_available);
}
@Override
public void displayPreference(PreferenceScreen screen) {
super.displayPreference(screen);
mPreference = screen.findPreference(KEY_LOCATION_MODE);
}
@Override
public boolean handlePreferenceTreeClick(Preference preference) {
if (KEY_LOCATION_MODE.equals(preference.getKey())) {
final SettingsActivity activity = (SettingsActivity) mParentFragment.getActivity();
activity.startPreferencePanel(mParentFragment, LocationMode.class.getName(), null,
R.string.location_mode_screen_title, null, mParentFragment, 0);
return true;
}
return false;
}
@Override
public void onLocationModeChanged(int mode, boolean restricted) {
final int modeDescription = LocationPreferenceController.getLocationString(mode);
if (modeDescription != 0) {
mPreference.setSummary(modeDescription);
}
// Restricted user can't change the location mode, so disable the master switch. But in some
// corner cases, the location might still be enabled. In such case the master switch should
// be disabled but checked.
mPreference.setEnabled(mLocationEnabler.isEnabled(mode));
}
}

View File

@@ -1,53 +0,0 @@
/*
* Copyright (C) 2017 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.v7.preference.PreferenceScreen;
import com.android.settings.widget.RadioButtonPreference;
import com.android.settingslib.core.lifecycle.Lifecycle;
public abstract class LocationModeRadioButtonPreferenceController
extends LocationBasePreferenceController
implements RadioButtonPreference.OnClickListener {
protected RadioButtonPreference mPreference;
public LocationModeRadioButtonPreferenceController(Context context, Lifecycle lifecycle) {
super(context, lifecycle);
}
@Override
public void displayPreference(PreferenceScreen screen) {
super.displayPreference(screen);
mPreference = (RadioButtonPreference) screen.findPreference(getPreferenceKey());
mPreference.setOnClickListener(this);
}
@Override
public void onRadioButtonClicked(RadioButtonPreference emiter) {
mLocationEnabler.setLocationMode(getLocationMode());
}
@Override
public void onLocationModeChanged(int mode, boolean restricted) {
mPreference.setChecked(mode == getLocationMode());
mPreference.setEnabled(mLocationEnabler.isEnabled(mode));
}
/** Gets the location mode that this controller monitors. */
protected abstract int getLocationMode();
}

View File

@@ -1,40 +0,0 @@
/*
* Copyright (C) 2017 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.Settings;
import com.android.settingslib.core.lifecycle.Lifecycle;
public class LocationModeSensorsOnlyPreferenceController
extends LocationModeRadioButtonPreferenceController {
private static final String KEY_SENSORS_ONLY = "sensors_only";
public LocationModeSensorsOnlyPreferenceController(Context context,
Lifecycle lifecycle) {
super(context, lifecycle);
}
@Override
public String getPreferenceKey() {
return KEY_SENSORS_ONLY;
}
@Override
protected int getLocationMode() {
return Settings.Secure.LOCATION_MODE_SENSORS_ONLY;
}
}

View File

@@ -105,26 +105,11 @@ public class LocationPreferenceController extends AbstractPreferenceController
int mode = Secure.getInt(context.getContentResolver(), int mode = Secure.getInt(context.getContentResolver(),
Secure.LOCATION_MODE, Secure.LOCATION_MODE_OFF); Secure.LOCATION_MODE, Secure.LOCATION_MODE_OFF);
if (mode != Secure.LOCATION_MODE_OFF) { if (mode != Secure.LOCATION_MODE_OFF) {
return context.getString(R.string.location_on_summary, return context.getString(R.string.location_on_summary);
context.getString(getLocationString(mode)));
} }
return context.getString(R.string.location_off_summary); return context.getString(R.string.location_off_summary);
} }
public static int getLocationString(int mode) {
switch (mode) {
case Secure.LOCATION_MODE_OFF:
return R.string.location_mode_location_off_title;
case Secure.LOCATION_MODE_SENSORS_ONLY:
return R.string.location_mode_sensors_only_title;
case Secure.LOCATION_MODE_BATTERY_SAVING:
return R.string.location_mode_battery_saving_title;
case Secure.LOCATION_MODE_HIGH_ACCURACY:
return R.string.location_mode_high_accuracy_title;
}
return 0;
}
@Override @Override
public ResultPayload getResultPayload() { public ResultPayload getResultPayload() {
final Intent intent = DatabaseIndexingUtils.buildSearchResultPageIntent(mContext, final Intent intent = DatabaseIndexingUtils.buildSearchResultPageIntent(mContext,

View File

@@ -127,7 +127,6 @@ public class LocationSettings extends DashboardFragment {
private static List<AbstractPreferenceController> buildPreferenceControllers( private static List<AbstractPreferenceController> buildPreferenceControllers(
Context context, LocationSettings fragment, Lifecycle lifecycle) { Context context, LocationSettings fragment, Lifecycle lifecycle) {
final List<AbstractPreferenceController> controllers = new ArrayList<>(); final List<AbstractPreferenceController> controllers = new ArrayList<>();
controllers.add(new LocationModePreferenceController(context, fragment, lifecycle));
controllers.add(new AppLocationPermissionPreferenceController(context)); controllers.add(new AppLocationPermissionPreferenceController(context));
controllers.add(new LocationForWorkPreferenceController(context, lifecycle)); controllers.add(new LocationForWorkPreferenceController(context, lifecycle));
controllers.add( controllers.add(

View File

@@ -62,7 +62,6 @@ import com.android.settings.inputmethod.AvailableVirtualKeyboardFragment;
import com.android.settings.inputmethod.PhysicalKeyboardFragment; import com.android.settings.inputmethod.PhysicalKeyboardFragment;
import com.android.settings.inputmethod.VirtualKeyboardFragment; import com.android.settings.inputmethod.VirtualKeyboardFragment;
import com.android.settings.language.LanguageAndInputSettings; import com.android.settings.language.LanguageAndInputSettings;
import com.android.settings.location.LocationMode;
import com.android.settings.location.LocationSettings; import com.android.settings.location.LocationSettings;
import com.android.settings.location.ScanningSettings; import com.android.settings.location.ScanningSettings;
import com.android.settings.network.NetworkDashboardFragment; import com.android.settings.network.NetworkDashboardFragment;
@@ -132,7 +131,6 @@ public class SearchIndexableResourcesImpl implements SearchIndexableResources {
addIndex(GestureSettings.class); addIndex(GestureSettings.class);
addIndex(LanguageAndInputSettings.class); addIndex(LanguageAndInputSettings.class);
addIndex(LocationSettings.class); addIndex(LocationSettings.class);
addIndex(LocationMode.class);
addIndex(ScanningSettings.class); addIndex(ScanningSettings.class);
addIndex(SecuritySettingsV2.class); addIndex(SecuritySettingsV2.class);
addIndex(ScreenLockSettings.class); addIndex(ScreenLockSettings.class);

View File

@@ -1,57 +0,0 @@
/*
* Copyright (C) 2017 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 com.google.common.truth.Truth.assertThat;
import static org.mockito.Mockito.mock;
import android.arch.lifecycle.LifecycleOwner;
import android.content.Context;
import android.provider.Settings;
import com.android.settings.TestConfig;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settingslib.core.lifecycle.Lifecycle;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.annotation.Config;
@RunWith(SettingsRobolectricTestRunner.class)
@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
public class LocationModeBatterySavingPreferenceControllerTest {
private LifecycleOwner mLifecycleOwner;
private Lifecycle mLifecycle;
@Before
public void setUp() {
mLifecycleOwner = () -> mLifecycle;
mLifecycle = new Lifecycle(mLifecycleOwner);
}
@Test
public void getLocationMode_shouldReturnModeBatterySaving() {
final LocationModeBatterySavingPreferenceController controller =
new LocationModeBatterySavingPreferenceController(mock(Context.class), mLifecycle);
assertThat(controller.getLocationMode())
.isEqualTo(Settings.Secure.LOCATION_MODE_BATTERY_SAVING);
}
}

View File

@@ -1,57 +0,0 @@
/*
* Copyright (C) 2017 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 com.google.common.truth.Truth.assertThat;
import static org.mockito.Mockito.mock;
import android.arch.lifecycle.LifecycleOwner;
import android.content.Context;
import android.provider.Settings;
import com.android.settings.TestConfig;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settingslib.core.lifecycle.Lifecycle;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.annotation.Config;
@RunWith(SettingsRobolectricTestRunner.class)
@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
public class LocationModeHighAccuracyPreferenceControllerTest {
private LifecycleOwner mLifecycleOwner;
private Lifecycle mLifecycle;
@Before
public void setUp() {
mLifecycleOwner = () -> mLifecycle;
mLifecycle = new Lifecycle(mLifecycleOwner);
}
@Test
public void getLocationMode_shouldReturnModeHighAccuracy() {
final LocationModeHighAccuracyPreferenceController controller =
new LocationModeHighAccuracyPreferenceController(mock(Context.class), mLifecycle);
assertThat(controller.getLocationMode())
.isEqualTo(Settings.Secure.LOCATION_MODE_HIGH_ACCURACY);
}
}

View File

@@ -1,141 +0,0 @@
/*
* Copyright (C) 2017 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 junit.framework.Assert.assertFalse;
import static junit.framework.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.eq;
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.os.UserManager;
import android.provider.Settings;
import android.support.v7.preference.Preference;
import android.support.v7.preference.PreferenceScreen;
import com.android.settings.R;
import com.android.settings.SettingsActivity;
import com.android.settings.TestConfig;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settingslib.core.lifecycle.Lifecycle;
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;
@RunWith(SettingsRobolectricTestRunner.class)
@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
public class LocationModePreferenceControllerTest {
@Mock
private LocationSettings mFragment;
@Mock
private SettingsActivity mActivity;
@Mock
private Preference mPreference;
@Mock
private PreferenceScreen mScreen;
@Mock
private UserManager mUserManager;
private Context mContext;
private LocationModePreferenceController mController;
private LifecycleOwner mLifecycleOwner;
private Lifecycle mLifecycle;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
mContext = spy(RuntimeEnvironment.application);
when(mContext.getSystemService(Context.USER_SERVICE)).thenReturn(mUserManager);
mLifecycleOwner = () -> mLifecycle;
mLifecycle = new Lifecycle(mLifecycleOwner);
mController = new LocationModePreferenceController(mContext, mFragment, mLifecycle);
when(mFragment.getActivity()).thenReturn(mActivity);
when(mScreen.findPreference(mController.getPreferenceKey())).thenReturn(mPreference);
}
@Test
@Config(qualifiers = "mcc999")
public void locationModePreference_ifXmlSetToFalse_shouldNotBeAvailable() {
assertFalse(mController.isAvailable());
}
@Test
public void locationModePreference_ifXmlSetToTrue_shouldBeAvailable() {
assertTrue(mController.isAvailable());
}
@Test
public void onLocationModeChanged_locationOff_shouldDisablePreference() {
when(mUserManager.hasUserRestriction(any())).thenReturn(false);
mController.displayPreference(mScreen);
mController.onLocationModeChanged(Settings.Secure.LOCATION_MODE_OFF, false);
verify(mPreference).setEnabled(false);
}
@Test
public void onLocationModeChanged_restricted_shouldDisablePreference() {
when(mUserManager.hasUserRestriction(any())).thenReturn(true);
mController.displayPreference(mScreen);
mController.onLocationModeChanged(Settings.Secure.LOCATION_MODE_BATTERY_SAVING, false);
verify(mPreference).setEnabled(false);
}
@Test
public void onLocationModeChanged_locationOnNotRestricted_shouldEnablePreference() {
when(mUserManager.hasUserRestriction(any())).thenReturn(false);
mController.displayPreference(mScreen);
mController.onLocationModeChanged(Settings.Secure.LOCATION_MODE_BATTERY_SAVING, false);
verify(mPreference).setEnabled(true);
}
@Test
public void onLocationModeChanged_shouldUpdateSummary() {
mController.displayPreference(mScreen);
mController.onLocationModeChanged(Settings.Secure.LOCATION_MODE_BATTERY_SAVING, false);
verify(mPreference).setSummary(anyInt());
}
@Test
public void handlePreferenceTreeClick_shouldStartLocationModeFragment() {
final Preference preference = new Preference(mContext);
preference.setKey(mController.getPreferenceKey());
mController.handlePreferenceTreeClick(preference);
verify(mActivity).startPreferencePanel(any(), eq(LocationMode.class.getName()), any(),
eq(R.string.location_mode_screen_title), any(), any(), anyInt());
}
}

View File

@@ -1,140 +0,0 @@
/*
* Copyright (C) 2017 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 com.google.common.truth.Truth.assertThat;
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;
import android.support.v7.preference.PreferenceScreen;
import com.android.settings.TestConfig;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settings.testutils.shadow.ShadowSecureSettings;
import com.android.settings.widget.RadioButtonPreference;
import com.android.settingslib.core.lifecycle.Lifecycle;
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;
@RunWith(SettingsRobolectricTestRunner.class)
@Config(
manifest = TestConfig.MANIFEST_PATH,
sdk = TestConfig.SDK_VERSION,
shadows = {ShadowSecureSettings.class})
public class LocationModeRadioButtonPreferenceControllerTest {
@Mock
private RadioButtonPreference mPreference;
@Mock
private PreferenceScreen mScreen;
private Context mContext;
private LocationModeRadioButtonPreferenceController mController;
private LifecycleOwner mLifecycleOwner;
private Lifecycle mLifecycle;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
mContext = RuntimeEnvironment.application;
mLifecycleOwner = () -> mLifecycle;
mLifecycle = new Lifecycle(mLifecycleOwner);
mController = new LocationModeRadioButtonPreferenceControllerTestable(mContext, mLifecycle);
when(mScreen.findPreference(mController.getPreferenceKey())).thenReturn(mPreference);
}
@Test
public void displayPreference_shouldAddClickListener() {
mController.displayPreference(mScreen);
verify(mPreference).setOnClickListener(mController);
}
@Test
public void onRadioButtonClicked_shouldSetLocationModeToOwnMode() {
mController.displayPreference(mScreen);
Settings.Secure.putInt(mContext.getContentResolver(),
Settings.Secure.LOCATION_MODE, Settings.Secure.LOCATION_MODE_OFF);
mController.onRadioButtonClicked(mPreference);
assertThat(Settings.Secure.getInt(mContext.getContentResolver(),
Settings.Secure.LOCATION_MODE, Settings.Secure.LOCATION_MODE_OFF))
.isEqualTo(mController.getLocationMode());
}
@Test
public void onLocationModeChanged_otherModeSelected_shouldUncheckPreference() {
mController.displayPreference(mScreen);
mController.onLocationModeChanged(Settings.Secure.LOCATION_MODE_BATTERY_SAVING, false);
verify(mPreference).setChecked(false);
}
@Test
public void onLocationModeChanged_ownModeSelected_shouldCheckPreference() {
mController.displayPreference(mScreen);
mController.onLocationModeChanged(mController.getLocationMode(), false);
verify(mPreference).setChecked(true);
}
@Test
public void onLocationModeChanged_locationOff_shouldDisablePreference() {
mController.displayPreference(mScreen);
mController.onLocationModeChanged(Settings.Secure.LOCATION_MODE_OFF, false);
verify(mPreference).setEnabled(false);
}
@Test
public void onLocationModeChanged_locationOn_shouldDisablePreference() {
mController.displayPreference(mScreen);
mController.onLocationModeChanged(Settings.Secure.LOCATION_MODE_BATTERY_SAVING, false);
verify(mPreference).setEnabled(true);
}
private class LocationModeRadioButtonPreferenceControllerTestable
extends LocationModeRadioButtonPreferenceController {
public LocationModeRadioButtonPreferenceControllerTestable(Context context,
Lifecycle lifecycle) {
super(context, lifecycle);
}
@Override
public String getPreferenceKey() {
return "test";
}
@Override
protected int getLocationMode() {
return Settings.Secure.LOCATION_MODE_HIGH_ACCURACY;
}
}
}

View File

@@ -1,57 +0,0 @@
/*
* Copyright (C) 2017 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 com.google.common.truth.Truth.assertThat;
import static org.mockito.Mockito.mock;
import android.arch.lifecycle.LifecycleOwner;
import android.content.Context;
import android.provider.Settings;
import com.android.settings.TestConfig;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settingslib.core.lifecycle.Lifecycle;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.annotation.Config;
@RunWith(SettingsRobolectricTestRunner.class)
@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
public class LocationModeSensorsOnlyPreferenceControllerTest {
private LifecycleOwner mLifecycleOwner;
private Lifecycle mLifecycle;
@Before
public void setUp() {
mLifecycleOwner = () -> mLifecycle;
mLifecycle = new Lifecycle(mLifecycleOwner);
}
@Test
public void getLocationMode_shouldReturnModeSensorsOnly() {
final LocationModeSensorsOnlyPreferenceController controller =
new LocationModeSensorsOnlyPreferenceController(mock(Context.class), mLifecycle);
assertThat(controller.getLocationMode())
.isEqualTo(Settings.Secure.LOCATION_MODE_SENSORS_ONLY);
}
}

View File

@@ -1,73 +0,0 @@
/*
* Copyright (C) 2017 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 com.google.common.truth.Truth.assertThat;
import static org.mockito.Mockito.spy;
import android.content.Context;
import android.provider.SearchIndexableResource;
import com.android.settings.TestConfig;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settings.testutils.XmlTestUtils;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.MockitoAnnotations;
import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
@RunWith(SettingsRobolectricTestRunner.class)
@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
public class LocationModeTest {
private Context mContext;
private LocationMode mFragment;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
mContext = spy(RuntimeEnvironment.application);
mFragment = new LocationMode();
}
@Test
public void testSearchIndexProvider_shouldIndexResource() {
final List<SearchIndexableResource> indexRes =
mFragment.SEARCH_INDEX_DATA_PROVIDER.getXmlResourcesToIndex(mContext,
true /* enabled */);
assertThat(indexRes).isNotNull();
assertThat(indexRes.get(0).xmlResId).isEqualTo(mFragment.getPreferenceScreenResId());
}
@Test
@Config(qualifiers = "mcc999")
public void testSearchIndexProvider_ifPageDisabled_shouldNotIndexResource() {
final List<String> niks = LocationMode.SEARCH_INDEX_DATA_PROVIDER
.getNonIndexableKeys(mContext);
final int xmlId = mFragment.getPreferenceScreenResId();
final List<String> keys = XmlTestUtils.getKeysFromPreferenceXml(mContext, xmlId);
assertThat(niks).containsAllIn(keys);
}
}

View File

@@ -109,45 +109,30 @@ public class LocationPreferenceControllerTest {
} }
@Test @Test
public void getLocationSummary_sensorsOnly_shouldSetSummarySensorsOnly() { public void getLocationSummary_sensorsOnly_shouldSetSummaryOn() {
Secure.putInt(mContext.getContentResolver(), Secure.putInt(mContext.getContentResolver(),
Secure.LOCATION_MODE, Secure.LOCATION_MODE_SENSORS_ONLY); Secure.LOCATION_MODE, Secure.LOCATION_MODE_SENSORS_ONLY);
assertThat(mController.getLocationSummary(mContext)).isEqualTo( assertThat(mController.getLocationSummary(mContext)).isEqualTo(
mContext.getString(R.string.location_on_summary, mContext.getString(R.string.location_on_summary));
mContext.getString(R.string.location_mode_sensors_only_title)));
} }
@Test @Test
public void getLocationSummary_highAccuracy_shouldSetSummarHighAccuracy() { public void getLocationSummary_highAccuracy_shouldSetSummaryOn() {
Secure.putInt(mContext.getContentResolver(), Secure.putInt(mContext.getContentResolver(),
Secure.LOCATION_MODE, Secure.LOCATION_MODE_HIGH_ACCURACY); Secure.LOCATION_MODE, Secure.LOCATION_MODE_HIGH_ACCURACY);
assertThat(mController.getLocationSummary(mContext)).isEqualTo( assertThat(mController.getLocationSummary(mContext)).isEqualTo(
mContext.getString(R.string.location_on_summary, mContext.getString(R.string.location_on_summary));
mContext.getString(R.string.location_mode_high_accuracy_title)));
} }
@Test @Test
public void getLocationSummary_batterySaving_shouldSetSummaryBatterySaving() { public void getLocationSummary_batterySaving_shouldSetSummaryOn() {
Secure.putInt(mContext.getContentResolver(), Secure.putInt(mContext.getContentResolver(),
Secure.LOCATION_MODE, Secure.LOCATION_MODE_BATTERY_SAVING); Secure.LOCATION_MODE, Secure.LOCATION_MODE_BATTERY_SAVING);
assertThat(mController.getLocationSummary(mContext)).isEqualTo( assertThat(mController.getLocationSummary(mContext)).isEqualTo(
mContext.getString(R.string.location_on_summary, mContext.getString(R.string.location_on_summary));
mContext.getString(R.string.location_mode_battery_saving_title)));
}
@Test
public void getLocationString_shouldCorrectString() {
assertThat(mController.getLocationString(Secure.LOCATION_MODE_OFF)).isEqualTo(
R.string.location_mode_location_off_title);
assertThat(mController.getLocationString(Secure.LOCATION_MODE_SENSORS_ONLY)).isEqualTo(
R.string.location_mode_sensors_only_title);
assertThat(mController.getLocationString(Secure.LOCATION_MODE_BATTERY_SAVING)).isEqualTo(
R.string.location_mode_battery_saving_title);
assertThat(mController.getLocationString(Secure.LOCATION_MODE_HIGH_ACCURACY)).isEqualTo(
R.string.location_mode_high_accuracy_title);
} }
@Test @Test