diff options
Diffstat (limited to 'src/com/android/settings/location/LocationSettings.java')
-rw-r--r-- | src/com/android/settings/location/LocationSettings.java | 260 |
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); + } + } +} |