diff options
author | Lifu Tang <lifu@google.com> | 2013-08-01 17:23:10 -0700 |
---|---|---|
committer | Lifu Tang <lifu@google.com> | 2013-08-02 16:57:07 -0700 |
commit | d5fbbc4e49727f98188aeb89e32146c7fe546c75 (patch) | |
tree | 2f181af0148cf37e35c94a12449b801690ecd661 | |
parent | 34605e1dcf4ac61109911836e7bba864f62080d6 (diff) | |
download | packages_apps_Settings-d5fbbc4e49727f98188aeb89e32146c7fe546c75.zip packages_apps_Settings-d5fbbc4e49727f98188aeb89e32146c7fe546c75.tar.gz packages_apps_Settings-d5fbbc4e49727f98188aeb89e32146c7fe546c75.tar.bz2 |
Added UI widgets for new location settings page
Change-Id: I87eee999a4dd0189609f58d6f3e4ffe517d63a0e
-rw-r--r-- | res/values/strings.xml | 25 | ||||
-rw-r--r-- | res/xml/location_mode.xml | 36 | ||||
-rw-r--r-- | res/xml/location_settings.xml | 42 | ||||
-rw-r--r-- | src/com/android/settings/Settings.java | 1 | ||||
-rw-r--r-- | src/com/android/settings/location/LocationEnabler.java | 76 | ||||
-rw-r--r-- | src/com/android/settings/location/LocationMode.java | 74 | ||||
-rw-r--r-- | src/com/android/settings/location/LocationSettings.java | 234 |
7 files changed, 279 insertions, 209 deletions
diff --git a/res/values/strings.xml b/res/values/strings.xml index 1d2ba38..1bdef29 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -684,7 +684,7 @@ <!-- 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 --> @@ -2354,6 +2354,27 @@ <!-- 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--> @@ -4579,7 +4600,7 @@ <!-- 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> diff --git a/res/xml/location_mode.xml b/res/xml/location_mode.xml new file mode 100644 index 0000000..3627f11 --- /dev/null +++ b/res/xml/location_mode.xml @@ -0,0 +1,36 @@ +<?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> diff --git a/res/xml/location_settings.xml b/res/xml/location_settings.xml index 9af36da..293b772 100644 --- a/res/xml/location_settings.xml +++ b/res/xml/location_settings.xml @@ -16,38 +16,20 @@ <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> diff --git a/src/com/android/settings/Settings.java b/src/com/android/settings/Settings.java index 54f64c8..5d93491 100644 --- a/src/com/android/settings/Settings.java +++ b/src/com/android/settings/Settings.java @@ -482,6 +482,7 @@ public class Settings extends PreferenceActivity 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); } diff --git a/src/com/android/settings/location/LocationEnabler.java b/src/com/android/settings/location/LocationEnabler.java new file mode 100644 index 0000000..61816a1 --- /dev/null +++ b/src/com/android/settings/location/LocationEnabler.java @@ -0,0 +1,76 @@ +/* + * 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); + } + } + } +} diff --git a/src/com/android/settings/location/LocationMode.java b/src/com/android/settings/location/LocationMode.java new file mode 100644 index 0000000..3422b1a --- /dev/null +++ b/src/com/android/settings/location/LocationMode.java @@ -0,0 +1,74 @@ +/* + * 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; + } +} diff --git a/src/com/android/settings/location/LocationSettings.java b/src/com/android/settings/location/LocationSettings.java index 8ddde56..8d0baae 100644 --- a/src/com/android/settings/location/LocationSettings.java +++ b/src/com/android/settings/location/LocationSettings.java @@ -16,71 +16,43 @@ 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() { @@ -91,148 +63,56 @@ public class LocationSettings extends SettingsPreferenceFragment 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; } } |