OSDN Git Service

Added UI widgets for new location settings page
authorLifu Tang <lifu@google.com>
Fri, 2 Aug 2013 00:23:10 +0000 (17:23 -0700)
committerLifu Tang <lifu@google.com>
Fri, 2 Aug 2013 23:57:07 +0000 (16:57 -0700)
Change-Id: I87eee999a4dd0189609f58d6f3e4ffe517d63a0e

res/values/strings.xml
res/xml/location_mode.xml [new file with mode: 0644]
res/xml/location_settings.xml
src/com/android/settings/Settings.java
src/com/android/settings/location/LocationEnabler.java [new file with mode: 0644]
src/com/android/settings/location/LocationMode.java [new file with mode: 0644]
src/com/android/settings/location/LocationSettings.java

index 1d2ba38..1bdef29 100644 (file)
     <!-- 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 -->
 
     <!-- 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 &amp; mobile network location</string>
     <!-- [CHAR LIMIT=130] Security & location settings screen, setting summary for Google location service check box-->
     <!-- 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 (file)
index 0000000..3627f11
--- /dev/null
@@ -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>
index 9af36da..293b772 100644 (file)
 
 <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>
index 54f64c8..5d93491 100644 (file)
@@ -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 (file)
index 0000000..61816a1
--- /dev/null
@@ -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 (file)
index 0000000..3422b1a
--- /dev/null
@@ -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;
+    }
+}
index 8ddde56..8d0baae 100644 (file)
 
 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;
     }
 }