<!-- Text shown for title of profile info setting [CHAR LIMIT=20]-->
<string name="profile_info_settings_title">Profile info</string>
<!-- Main Settings screen setting option title for the item to take you to the location screen -->
- <string name="location_settings_title">Location access</string>
+ <string name="location_settings_title">Location</string>
<!-- Main Settings screen setting option title for the item to take you to the security screen -->
<string name="security_settings_title">Security</string>
<!-- Main Settings screen setting option summary text for the item tot ake you to the security and location screen -->
<!-- Security & location settings screen, section header for settings relating to location -->
<string name="location_title">My Location</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 sensors only location mode -->
+ <string name="location_mode_sensors_only_title">Device sensors only</string>
+ <!-- [CHAR LIMIT=30] Location settings screen, sub category for recent location requests -->
+ <string name="location_category_recent_location_requests">Recent location requests</string>
+ <!-- [CHAR LIMIT=30] Location settings screen, sub category for location services -->
+ <string name="location_category_location_services">Location services</string>
+ <!-- [CHAR LIMIT=30] Location mode screen, screen title -->
+ <string name="location_mode_screen_title">Location mode</string>
+ <!-- [CHAR LIMIT=30] Location mode screen, description for high accuracy mode -->
+ <string name="location_mode_high_accuracy_description">Use GPS, Wi\u2011Fi and mobile networks to estimate location </string>
+ <!-- [CHAR LIMIT=30] Location mode screen, description for battery saving mode -->
+ <string name="location_mode_battery_saving_description">Use Wi\u2011Fi and mobile networks to estimate location</string>
+ <!-- [CHAR LIMIT=30] Location mode screen, description for sensors only mode -->
+ <string name="location_mode_sensors_only_description">Use GPS to pinpoint your location</string>
+
<!-- [CHAR LIMIT=30] Security & location settings screen, setting check box label for Google location service (cell ID, wifi, etc.) -->
<string name="location_network_based">Wi\u2011Fi & mobile network location</string>
<!-- [CHAR LIMIT=130] Security & location settings screen, setting summary for Google location service check box-->
<!-- Restrictions summary for allowing NFC transfers (phone) [CHAR LIMIT=100] -->
<string name="restriction_nfc_enable_summary" product="default">Allow data exchange when the phone touches another device</string>
<!-- Restrictions title for allowing location sharing [CHAR LIMIT=35] -->
- <string name="restriction_location_enable_title">Location access</string>
+ <string name="restriction_location_enable_title">Location</string>
<!-- Restrictions summary for allowing location sharing [CHAR LIMIT=100] -->
<string name="restriction_location_enable_summary" >Let apps use your location information</string>
--- /dev/null
+<?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:title="@string/location_mode_screen_title">
+
+ <com.android.settings.location.RadioButtonPreference
+ android:key="high_accuracy"
+ android:title="@string/location_mode_high_accuracy_title"
+ android:summary="@string/location_mode_high_accuracy_description"
+ android:persistent="false" />
+ <com.android.settings.location.RadioButtonPreference
+ android:key="battery_saving"
+ android:title="@string/location_mode_battery_saving_title"
+ android:summary="@string/location_mode_battery_saving_description"
+ android:persistent="false" />
+ <com.android.settings.location.RadioButtonPreference
+ android:key="sensors_only"
+ android:title="@string/location_mode_sensors_only_title"
+ android:summary="@string/location_mode_sensors_only_description"
+ android:persistent="false" />
+
+</PreferenceScreen>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
android:title="@string/location_settings_title">
-
- <com.android.settings.location.WrappingSwitchPreference
- android:key="location_toggle"
- android:title="@string/location_access_title"
- android:summary="@string/location_access_summary"
- android:persistent="true"/>
+ <PreferenceScreen
+ android:title="Under Construction"
+ android:summary="This page is under construction and everything here is expected to be broken for a while. Keep calm and carry on!" />
+ <PreferenceScreen
+ android:key="location_mode"
+ android:title="@string/location_mode_title"
+ android:summary="@string/location_mode_high_accuracy_title" />
<PreferenceCategory
- android:key="location_sources"
- android:title="@string/location_sources_heading" />
-
- <com.android.settings.location.RadioButtonPreference
- android:key="location_gps"
- android:title="@string/location_gps"
- android:summary="@string/location_street_level"
- android:dependency="location_toggle"
- android:persistent="false" />
-
- <com.android.settings.location.RadioButtonPreference
- android:key="location_network"
- android:title="@string/location_network_based"
- android:summary="@string/location_neighborhood_level"
- android:dependency="location_toggle"
- android:persistent="false" />
+ android:key="recent_location_requests"
+ android:title="@string/location_category_recent_location_requests" />
-<!-- Disabled to avoid confusion on devices with no AGPS
- For Google experience devices we want AGPS on by default (if supported) so we don't really need this.
- <CheckBoxPreference
- android:key="assisted_gps"
- android:title="@string/assisted_gps"
- android:summaryOn="@string/assisted_gps_enabled"
- android:summaryOff="@string/assisted_gps_disabled"/>
--->
+ <PreferenceCategory
+ android:key="location_services"
+ android:title="@string/location_category_location_services" />
</PreferenceScreen>
WifiDisplaySettings.class.getName().equals(fragmentName) ||
BluetoothSettings.class.getName().equals(fragmentName) ||
DreamSettings.class.getName().equals(fragmentName) ||
+ LocationSettings.class.getName().equals(fragmentName) ||
ToggleAccessibilityServicePreferenceFragment.class.getName().equals(fragmentName)) {
intent.putExtra(EXTRA_UI_OPTIONS, ActivityInfo.UIOPTION_SPLIT_ACTION_BAR_WHEN_NARROW);
}
--- /dev/null
+/*
+ * 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.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.widget.CompoundButton;
+import android.widget.Switch;
+
+/**
+ * LocationEnabler is a helper to manage the Location on/off master switch
+ * preference. It turns on/off Location master switch and ensures the summary
+ * of the preference reflects the current state.
+ */
+public final class LocationEnabler implements CompoundButton.OnCheckedChangeListener {
+ private final Context mContext;
+ private Switch mSwitch;
+ private boolean mValidListener;
+
+ // TODO(lifu): listens to the system configuration change, and modify the switch state whenever
+ // necessary.
+ private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ }
+ };
+
+ public LocationEnabler(Context context, Switch switch_) {
+ mContext = context;
+ mSwitch = switch_;
+ mValidListener = false;
+ }
+
+ public void resume() {
+ mSwitch.setOnCheckedChangeListener(this);
+ mValidListener = true;
+ }
+
+ public void pause() {
+ mSwitch.setOnCheckedChangeListener(null);
+ mValidListener = false;
+ }
+
+ @Override
+ public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
+ // TODO(lifu): modify the actual location settings when the user flip the master switch.
+ }
+
+ private void setChecked(boolean isChecked) {
+ if (isChecked != mSwitch.isChecked()) {
+ // set listener to null so that that code below doesn't trigger onCheckedChanged()
+ if (mValidListener) {
+ mSwitch.setOnCheckedChangeListener(null);
+ }
+ mSwitch.setChecked(isChecked);
+ if (mValidListener) {
+ mSwitch.setOnCheckedChangeListener(this);
+ }
+ }
+ }
+}
--- /dev/null
+/*
+ * 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.Intent;
+import android.preference.Preference;
+import android.preference.PreferenceScreen;
+
+import com.android.settings.R;
+import com.android.settings.SettingsPreferenceFragment;
+
+/**
+ * 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 SettingsPreferenceFragment
+ implements Preference.OnPreferenceChangeListener {
+ @Override
+ public void onActivityResult(int requestCode, int resultCode, Intent data) {
+ super.onActivityResult(requestCode, resultCode, data);
+ createPreferenceHierarchy();
+ }
+
+ @Override
+ public void onResume() {
+ super.onResume();
+
+ // Make sure we reload the preference hierarchy since some of these settings
+ // depend on others...
+ createPreferenceHierarchy();
+ }
+
+ private PreferenceScreen createPreferenceHierarchy() {
+ PreferenceScreen root = getPreferenceScreen();
+ if (root != null) {
+ root.removeAll();
+ }
+ addPreferencesFromResource(R.xml.location_mode);
+ root = getPreferenceScreen();
+
+ return root;
+ }
+
+ @Override
+ public int getHelpResource() {
+ return R.string.help_url_location_access;
+ }
+
+ @Override
+ public boolean onPreferenceChange(Preference preference, Object newValue) {
+ return true;
+ }
+}
package com.android.settings.location;
-
-import android.content.ContentQueryMap;
-import android.content.ContentResolver;
-import android.content.Context;
+import android.app.ActionBar;
+import android.app.Activity;
import android.content.Intent;
-import android.database.Cursor;
-import android.location.LocationManager;
-import android.os.UserManager;
-import android.preference.CheckBoxPreference;
import android.preference.Preference;
+import android.preference.PreferenceActivity;
import android.preference.PreferenceScreen;
-import android.preference.SwitchPreference;
-import android.provider.Settings;
-import android.util.AttributeSet;
-import android.view.View;
-import android.widget.TextView;
+import android.util.Log;
+import android.view.Gravity;
+import android.widget.Switch;
import com.android.settings.R;
import com.android.settings.SettingsPreferenceFragment;
-import java.util.Observable;
-import java.util.Observer;
-
/**
* Location access settings.
*/
public class LocationSettings extends SettingsPreferenceFragment
implements Preference.OnPreferenceChangeListener {
+ private static final String TAG = LocationSettings.class.getSimpleName();
+ private static final String KEY_LOCATION_MODE = "location_mode";
- // Location Settings
- private static final String KEY_LOCATION_TOGGLE = "location_toggle";
- private static final String KEY_LOCATION_NETWORK = "location_network";
- private static final String KEY_LOCATION_GPS = "location_gps";
- private static final String KEY_ASSISTED_GPS = "assisted_gps";
-
- private CheckBoxPreference mNetwork;
- private CheckBoxPreference mGps;
- private CheckBoxPreference mAssistedGps;
- private SwitchPreference mLocationAccess;
-
- // These provide support for receiving notification when Location Manager settings change.
- // This is necessary because the Network Location Provider can change settings
- // if the user does not confirm enabling the provider.
- private ContentQueryMap mContentQueryMap;
-
- private Observer mSettingsObserver;
+ private PreferenceScreen mLocationMode;
+ private LocationEnabler mLocationEnabler;
@Override
- public void onStart() {
- super.onStart();
- // listen for Location Manager settings changes
- Cursor settingsCursor = getContentResolver().query(Settings.Secure.CONTENT_URI, null,
- "(" + Settings.System.NAME + "=?)",
- new String[]{Settings.Secure.LOCATION_PROVIDERS_ALLOWED},
- null);
- mContentQueryMap = new ContentQueryMap(settingsCursor, Settings.System.NAME, true, null);
+ public void onActivityResult(int requestCode, int resultCode, Intent data) {
+ super.onActivityResult(requestCode, resultCode, data);
+ createPreferenceHierarchy();
}
@Override
- public void onStop() {
- super.onStop();
- if (mSettingsObserver != null) {
- mContentQueryMap.deleteObserver(mSettingsObserver);
- }
- mContentQueryMap.close();
+ public void onResume() {
+ super.onResume();
+
+ // Make sure we reload the preference hierarchy since some of these settings
+ // depend on others...
+ createPreferenceHierarchy();
}
private PreferenceScreen createPreferenceHierarchy() {
addPreferencesFromResource(R.xml.location_settings);
root = getPreferenceScreen();
- mLocationAccess = (SwitchPreference) root.findPreference(KEY_LOCATION_TOGGLE);
- mNetwork = (CheckBoxPreference) root.findPreference(KEY_LOCATION_NETWORK);
- mGps = (CheckBoxPreference) root.findPreference(KEY_LOCATION_GPS);
- mAssistedGps = (CheckBoxPreference) root.findPreference(KEY_ASSISTED_GPS);
-
- // Only enable these controls if this user is allowed to change location
- // sharing settings.
- final UserManager um = (UserManager) getActivity().getSystemService(Context.USER_SERVICE);
- boolean isToggleAllowed = !um.hasUserRestriction(UserManager.DISALLOW_SHARE_LOCATION);
- if (mLocationAccess != null) mLocationAccess.setEnabled(isToggleAllowed);
- if (mNetwork != null) mNetwork.setEnabled(isToggleAllowed);
- if (mGps != null) mGps.setEnabled(isToggleAllowed);
- if (mAssistedGps != null) mAssistedGps.setEnabled(isToggleAllowed);
-
- mLocationAccess.setOnPreferenceChangeListener(this);
- return root;
- }
-
- @Override
- public void onResume() {
- super.onResume();
-
- // Make sure we reload the preference hierarchy since some of these settings
- // depend on others...
- createPreferenceHierarchy();
- updateLocationToggles();
-
- if (mSettingsObserver == null) {
- mSettingsObserver = new Observer() {
- @Override
- public void update(Observable o, Object arg) {
- updateLocationToggles();
- }
- };
- }
-
- mContentQueryMap.addObserver(mSettingsObserver);
- }
-
- @Override
- public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
- final ContentResolver cr = getContentResolver();
- final UserManager um = (UserManager) getActivity().getSystemService(Context.USER_SERVICE);
- if (preference == mNetwork) {
- if (!um.hasUserRestriction(UserManager.DISALLOW_SHARE_LOCATION)) {
- Settings.Secure.setLocationProviderEnabled(cr,
- LocationManager.NETWORK_PROVIDER, mNetwork.isChecked());
+ mLocationMode = (PreferenceScreen) root.findPreference((KEY_LOCATION_MODE));
+ mLocationMode.setOnPreferenceClickListener(
+ new Preference.OnPreferenceClickListener() {
+ @Override
+ public boolean onPreferenceClick(Preference preference) {
+ PreferenceActivity preferenceActivity =
+ (PreferenceActivity) getActivity();
+ preferenceActivity.startPreferencePanel(
+ LocationMode.class.getName(), null,
+ R.string.location_mode_screen_title, null, LocationSettings.this,
+ 0);
+ return true;
+ }
+ });
+
+ Activity activity = getActivity();
+ Switch actionBarSwitch = new Switch(activity);
+
+ if (activity instanceof PreferenceActivity) {
+ PreferenceActivity preferenceActivity = (PreferenceActivity) activity;
+ // Only show the master switch when we're not in multi-pane mode, and not being used as
+ // Setup Wizard.
+ if (preferenceActivity.onIsHidingHeaders() || !preferenceActivity.onIsMultiPane()) {
+ final int padding = activity.getResources().getDimensionPixelSize(
+ R.dimen.action_bar_switch_padding);
+ actionBarSwitch.setPaddingRelative(0, 0, padding, 0);
+ activity.getActionBar().setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM,
+ ActionBar.DISPLAY_SHOW_CUSTOM);
+ activity.getActionBar().setCustomView(actionBarSwitch, new ActionBar.LayoutParams(
+ ActionBar.LayoutParams.WRAP_CONTENT,
+ ActionBar.LayoutParams.WRAP_CONTENT,
+ Gravity.CENTER_VERTICAL | Gravity.END));
}
- } else if (preference == mGps) {
- boolean enabled = mGps.isChecked();
- if (!um.hasUserRestriction(UserManager.DISALLOW_SHARE_LOCATION)) {
- Settings.Secure.setLocationProviderEnabled(cr,
- LocationManager.GPS_PROVIDER, enabled);
- if (mAssistedGps != null) {
- mAssistedGps.setEnabled(enabled);
- }
- }
- } else if (preference == mAssistedGps) {
- Settings.Global.putInt(cr, Settings.Global.ASSISTED_GPS_ENABLED,
- mAssistedGps.isChecked() ? 1 : 0);
} else {
- // If we didn't handle it, let preferences handle it.
- return super.onPreferenceTreeClick(preferenceScreen, preference);
- }
-
- return true;
- }
-
- /*
- * Creates toggles for each available location provider
- */
- private void updateLocationToggles() {
- ContentResolver res = getContentResolver();
- boolean gpsEnabled = Settings.Secure.isLocationProviderEnabled(
- res, LocationManager.GPS_PROVIDER);
- boolean networkEnabled = Settings.Secure.isLocationProviderEnabled(
- res, LocationManager.NETWORK_PROVIDER);
- mGps.setChecked(gpsEnabled);
- mNetwork.setChecked(networkEnabled);
- mLocationAccess.setChecked(gpsEnabled || networkEnabled);
- if (mAssistedGps != null) {
- mAssistedGps.setChecked(Settings.Global.getInt(res,
- Settings.Global.ASSISTED_GPS_ENABLED, 2) == 1);
- mAssistedGps.setEnabled(gpsEnabled);
+ Log.wtf(TAG, "Current activity is not an instance of PreferenceActivity!");
}
- }
- /**
- * see confirmPatternThenDisableAndClear
- */
- @Override
- public void onActivityResult(int requestCode, int resultCode, Intent data) {
- super.onActivityResult(requestCode, resultCode, data);
- createPreferenceHierarchy();
- }
+ mLocationEnabler = new LocationEnabler(activity, actionBarSwitch);
+ setHasOptionsMenu(true);
- /** Enable or disable all providers when the master toggle is changed. */
- private void onToggleLocationAccess(boolean checked) {
- final UserManager um = (UserManager) getActivity().getSystemService(Context.USER_SERVICE);
- if (um.hasUserRestriction(UserManager.DISALLOW_SHARE_LOCATION)) {
- return;
- }
- final ContentResolver cr = getContentResolver();
- Settings.Secure.setLocationProviderEnabled(cr,
- LocationManager.GPS_PROVIDER, checked);
- Settings.Secure.setLocationProviderEnabled(cr,
- LocationManager.NETWORK_PROVIDER, checked);
- updateLocationToggles();
- }
-
- @Override
- public boolean onPreferenceChange(Preference pref, Object newValue) {
- if (pref.getKey().equals(KEY_LOCATION_TOGGLE)) {
- onToggleLocationAccess((Boolean) newValue);
- }
- return true;
+ return root;
}
@Override
public int getHelpResource() {
return R.string.help_url_location_access;
}
-}
-
-class WrappingSwitchPreference extends SwitchPreference {
-
- public WrappingSwitchPreference(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
- }
-
- public WrappingSwitchPreference(Context context, AttributeSet attrs) {
- super(context, attrs);
- }
@Override
- protected void onBindView(View view) {
- super.onBindView(view);
-
- TextView title = (TextView) view.findViewById(android.R.id.title);
- if (title != null) {
- title.setSingleLine(false);
- title.setMaxLines(3);
- }
+ public boolean onPreferenceChange(Preference preference, Object newValue) {
+ return true;
}
}