summaryrefslogtreecommitdiffstats
path: root/src/com/android/settings/LocationSettings.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/android/settings/LocationSettings.java')
-rw-r--r--src/com/android/settings/LocationSettings.java193
1 files changed, 193 insertions, 0 deletions
diff --git a/src/com/android/settings/LocationSettings.java b/src/com/android/settings/LocationSettings.java
new file mode 100644
index 0000000..645e6d7
--- /dev/null
+++ b/src/com/android/settings/LocationSettings.java
@@ -0,0 +1,193 @@
+/*
+ * 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.
+ */
+
+package com.android.settings;
+
+
+import android.content.ContentQueryMap;
+import android.content.ContentResolver;
+import android.content.Intent;
+import android.database.Cursor;
+import android.location.LocationManager;
+import android.preference.CheckBoxPreference;
+import android.preference.Preference;
+import android.preference.Preference.OnPreferenceChangeListener;
+import android.preference.PreferenceScreen;
+import android.provider.Settings;
+
+import java.util.Observable;
+import java.util.Observer;
+
+/**
+ * Gesture lock pattern settings.
+ */
+public class LocationSettings extends SettingsPreferenceFragment
+ implements OnPreferenceChangeListener {
+
+ // Location Settings
+ 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 static final String KEY_USE_LOCATION = "location_use_for_services";
+
+ private CheckBoxPreference mNetwork;
+ private CheckBoxPreference mGps;
+ private CheckBoxPreference mAssistedGps;
+ private CheckBoxPreference mUseLocation;
+
+ // 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;
+
+ @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);
+ }
+
+ @Override
+ public void onStop() {
+ super.onStop();
+ if (mSettingsObserver != null) {
+ mContentQueryMap.deleteObserver(mSettingsObserver);
+ }
+ }
+
+ private PreferenceScreen createPreferenceHierarchy() {
+ PreferenceScreen root = getPreferenceScreen();
+ if (root != null) {
+ root.removeAll();
+ }
+ addPreferencesFromResource(R.xml.location_settings);
+ root = getPreferenceScreen();
+
+ mNetwork = (CheckBoxPreference) root.findPreference(KEY_LOCATION_NETWORK);
+ mGps = (CheckBoxPreference) root.findPreference(KEY_LOCATION_GPS);
+ mAssistedGps = (CheckBoxPreference) root.findPreference(KEY_ASSISTED_GPS);
+ if (GoogleLocationSettingHelper.isAvailable(getActivity())) {
+ // GSF present, Add setting for 'Use My Location'
+ CheckBoxPreference useLocation = new CheckBoxPreference(getActivity());
+ useLocation.setKey(KEY_USE_LOCATION);
+ useLocation.setTitle(R.string.use_location_title);
+ useLocation.setSummaryOn(R.string.use_location_summary_enabled);
+ useLocation.setSummaryOff(R.string.use_location_summary_disabled);
+ useLocation.setChecked(
+ GoogleLocationSettingHelper.getUseLocationForServices(getActivity())
+ == GoogleLocationSettingHelper.USE_LOCATION_FOR_SERVICES_ON);
+ useLocation.setPersistent(false);
+ useLocation.setOnPreferenceChangeListener(this);
+ getPreferenceScreen().addPreference(useLocation);
+ mUseLocation = useLocation;
+ }
+
+ // Change the summary for wifi-only devices
+ if (Utils.isWifiOnly()) {
+ mNetwork.setSummaryOn(R.string.location_neighborhood_level_wifi);
+ }
+
+ 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() {
+ public void update(Observable o, Object arg) {
+ updateLocationToggles();
+ }
+ };
+ mContentQueryMap.addObserver(mSettingsObserver);
+ }
+ }
+
+ @Override
+ public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
+
+ if (preference == mNetwork) {
+ Settings.Secure.setLocationProviderEnabled(getContentResolver(),
+ LocationManager.NETWORK_PROVIDER, mNetwork.isChecked());
+ } else if (preference == mGps) {
+ boolean enabled = mGps.isChecked();
+ Settings.Secure.setLocationProviderEnabled(getContentResolver(),
+ LocationManager.GPS_PROVIDER, enabled);
+ if (mAssistedGps != null) {
+ mAssistedGps.setEnabled(enabled);
+ }
+ } else if (preference == mAssistedGps) {
+ Settings.Secure.putInt(getContentResolver(), Settings.Secure.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);
+ mNetwork.setChecked(Settings.Secure.isLocationProviderEnabled(
+ res, LocationManager.NETWORK_PROVIDER));
+ mGps.setChecked(gpsEnabled);
+ if (mAssistedGps != null) {
+ mAssistedGps.setChecked(Settings.Secure.getInt(res,
+ Settings.Secure.ASSISTED_GPS_ENABLED, 2) == 1);
+ mAssistedGps.setEnabled(gpsEnabled);
+ }
+ }
+
+ /**
+ * see confirmPatternThenDisableAndClear
+ */
+ @Override
+ public void onActivityResult(int requestCode, int resultCode, Intent data) {
+ super.onActivityResult(requestCode, resultCode, data);
+ createPreferenceHierarchy();
+ }
+
+ public boolean onPreferenceChange(Preference preference, Object value) {
+ if (preference == mUseLocation) {
+ boolean newValue = (value == null ? false : (Boolean) value);
+ GoogleLocationSettingHelper.setUseLocationForServices(getActivity(), newValue);
+ // We don't want to change the value immediately here, since the user may click
+ // disagree in the dialog that pops up. When the activity we just launched exits, this
+ // activity will be restated and the new value re-read, so the checkbox will get its
+ // new value then.
+ return false;
+ }
+ return true;
+ }
+}