summaryrefslogtreecommitdiffstats
path: root/src/com/android/settings/location/LocationSettings.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/android/settings/location/LocationSettings.java')
-rw-r--r--src/com/android/settings/location/LocationSettings.java260
1 files changed, 260 insertions, 0 deletions
diff --git a/src/com/android/settings/location/LocationSettings.java b/src/com/android/settings/location/LocationSettings.java
new file mode 100644
index 0000000..62bd272
--- /dev/null
+++ b/src/com/android/settings/location/LocationSettings.java
@@ -0,0 +1,260 @@
+/*
+ * 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.location;
+
+
+import android.content.ContentQueryMap;
+import android.content.ContentResolver;
+import android.content.Context;
+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.PreferenceScreen;
+import android.preference.SwitchPreference;
+import android.provider.Settings;
+import android.util.AttributeSet;
+import android.view.View;
+import android.widget.TextView;
+
+import com.android.settings.R;
+import com.android.settings.SettingsPreferenceFragment;
+
+import java.util.Observable;
+import java.util.Observer;
+
+/**
+ * Gesture lock pattern settings.
+ */
+public class LocationSettings extends SettingsPreferenceFragment
+ implements Preference.OnPreferenceChangeListener {
+
+ // 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;
+
+ @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);
+ }
+ mContentQueryMap.close();
+ }
+
+ private PreferenceScreen createPreferenceHierarchy() {
+ PreferenceScreen root = getPreferenceScreen();
+ if (root != null) {
+ root.removeAll();
+ }
+ 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());
+ }
+ } 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);
+ }
+ }
+
+ /**
+ * see confirmPatternThenDisableAndClear
+ */
+ @Override
+ public void onActivityResult(int requestCode, int resultCode, Intent data) {
+ super.onActivityResult(requestCode, resultCode, data);
+ createPreferenceHierarchy();
+ }
+
+ /** 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;
+ }
+
+ @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);
+ }
+ }
+}
+
+class WrappingCheckBoxPreference extends CheckBoxPreference {
+
+ public WrappingCheckBoxPreference(Context context, AttributeSet attrs, int defStyle) {
+ super(context, attrs, defStyle);
+ }
+
+ public WrappingCheckBoxPreference(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);
+ }
+ }
+}