LocationSettingsBase.java revision e63142329060fabe105a8fd939cb637d530ae4a3
1e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tang/* 2e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tang * Copyright (C) 2011 The Android Open Source Project 3e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tang * 4e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tang * Licensed under the Apache License, Version 2.0 (the "License"); 5e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tang * you may not use this file except in compliance with the License. 6e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tang * You may obtain a copy of the License at 7e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tang * 8e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tang * http://www.apache.org/licenses/LICENSE-2.0 9e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tang * 10e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tang * Unless required by applicable law or agreed to in writing, software 11e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tang * distributed under the License is distributed on an "AS IS" BASIS, 12e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tang * See the License for the specific language governing permissions and 14e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tang * limitations under the License. 15e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tang */ 16e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tang 17e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tangpackage com.android.settings.location; 18e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tang 19e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tangimport android.content.ContentQueryMap; 20e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tangimport android.content.ContentResolver; 21e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tangimport android.content.Context; 22e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tangimport android.database.Cursor; 23e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tangimport android.location.LocationManager; 24e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tangimport android.os.UserManager; 25e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tangimport android.provider.Settings; 26e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tangimport android.util.Log; 27e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tang 28e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tangimport com.android.settings.SettingsPreferenceFragment; 29e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tang 30e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tangimport java.util.Observable; 31e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tangimport java.util.Observer; 32e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tang 33e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tang/** 34e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tang * A base class that listens to location settings change and modifies location 35e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tang * settings. 36e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tang */ 37e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tangpublic abstract class LocationSettingsBase extends SettingsPreferenceFragment { 38e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tang private static final String TAG = LocationSettingsBase.class.getSimpleName(); 39e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tang 40e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tang /** Location disabled */ 41e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tang public static final int MODE_LOCATION_OFF = 0; 42e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tang /** GPS-only */ 43e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tang public static final int MODE_SENSORS_ONLY = 1; 44e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tang /** Network location only */ 45e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tang public static final int MODE_BATTERY_SAVING = 2; 46e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tang /** GPS and network location */ 47e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tang public static final int MODE_HIGH_ACCURACY = 3; 48e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tang 49e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tang private ContentQueryMap mContentQueryMap; 50e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tang private Observer mSettingsObserver; 51e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tang 52e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tang @Override 53e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tang public void onStart() { 54e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tang super.onStart(); 55e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tang // listen for Location Manager settings changes 56e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tang Cursor settingsCursor = getContentResolver().query(Settings.Secure.CONTENT_URI, null, 57e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tang "(" + Settings.System.NAME + "=?)", 58e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tang new String[] { Settings.Secure.LOCATION_PROVIDERS_ALLOWED }, 59e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tang null); 60e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tang mContentQueryMap = new ContentQueryMap(settingsCursor, Settings.System.NAME, true, null); 61e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tang mSettingsObserver = new Observer() { 62e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tang @Override 63e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tang public void update(Observable o, Object arg) { 64e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tang refreshLocationMode(); 65e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tang } 66e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tang }; 67e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tang } 68e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tang 69e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tang @Override 70e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tang public void onResume() { 71e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tang super.onResume(); 72e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tang mContentQueryMap.addObserver(mSettingsObserver); 73e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tang } 74e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tang 75e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tang @Override 76e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tang public void onPause() { 77e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tang super.onPause(); 78e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tang mContentQueryMap.deleteObserver(mSettingsObserver); 79e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tang } 80e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tang 81e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tang @Override 82e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tang public void onStop() { 83e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tang super.onStop(); 84e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tang mContentQueryMap.close(); 85e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tang } 86e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tang 87e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tang /** Called when location mode has changed. */ 88e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tang public abstract void onModeChanged(int mode); 89e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tang 90e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tang public void setLocationMode(int mode) { 91e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tang boolean gps = false; 92e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tang boolean network = false; 93e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tang switch (mode) { 94e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tang case MODE_LOCATION_OFF: 95e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tang break; 96e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tang case MODE_SENSORS_ONLY: 97e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tang gps = true; 98e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tang break; 99e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tang case MODE_BATTERY_SAVING: 100e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tang network = true; 101e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tang break; 102e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tang case MODE_HIGH_ACCURACY: 103e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tang gps = true; 104e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tang network = true; 105e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tang break; 106e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tang default: 107e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tang Log.wtf(TAG, "Invalid location mode: " + mode); 108e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tang } 109e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tang final UserManager um = (UserManager) getActivity().getSystemService(Context.USER_SERVICE); 110e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tang if (um.hasUserRestriction(UserManager.DISALLOW_SHARE_LOCATION)) { 111e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tang return; 112e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tang } 113e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tang // TODO(lifu): use new atomic API to change location mode. 114e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tang Settings.Secure.setLocationProviderEnabled( 115e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tang getContentResolver(), LocationManager.GPS_PROVIDER, gps); 116e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tang Settings.Secure.setLocationProviderEnabled( 117e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tang getContentResolver(), LocationManager.NETWORK_PROVIDER, network); 118e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tang refreshLocationMode(); 119e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tang } 120e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tang 121e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tang public void refreshLocationMode() { 122e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tang ContentResolver res = getContentResolver(); 123e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tang boolean gpsEnabled = Settings.Secure.isLocationProviderEnabled( 124e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tang res, LocationManager.GPS_PROVIDER); 125e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tang boolean networkEnabled = Settings.Secure.isLocationProviderEnabled( 126e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tang res, LocationManager.NETWORK_PROVIDER); 127e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tang boolean enabled = gpsEnabled || networkEnabled; 128e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tang if (!enabled) { 129e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tang onModeChanged(MODE_LOCATION_OFF); 130e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tang } else if (gpsEnabled && !networkEnabled) { 131e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tang onModeChanged(MODE_SENSORS_ONLY); 132e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tang } else if (!gpsEnabled && networkEnabled) { 133e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tang onModeChanged(MODE_BATTERY_SAVING); 134e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tang } else { 135e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tang onModeChanged(MODE_HIGH_ACCURACY); 136e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tang } 137e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tang } 138e63142329060fabe105a8fd939cb637d530ae4a3Lifu Tang} 139