Merge "Remove pending message when fragment is paused."
diff --git a/res/drawable-hdpi/data_grid_border.9.png b/res/drawable-hdpi/data_grid_border.9.png
index e963917..699c513 100644
--- a/res/drawable-hdpi/data_grid_border.9.png
+++ b/res/drawable-hdpi/data_grid_border.9.png
Binary files differ
diff --git a/res/drawable-hdpi/data_grid_primary.9.png b/res/drawable-hdpi/data_grid_primary.9.png
index de0acf0..c0ef65f 100644
--- a/res/drawable-hdpi/data_grid_primary.9.png
+++ b/res/drawable-hdpi/data_grid_primary.9.png
Binary files differ
diff --git a/res/drawable-hdpi/data_grid_secondary.9.png b/res/drawable-hdpi/data_grid_secondary.9.png
index 9a69574..dc01a2c 100644
--- a/res/drawable-hdpi/data_grid_secondary.9.png
+++ b/res/drawable-hdpi/data_grid_secondary.9.png
Binary files differ
diff --git a/res/drawable-mdpi/data_grid_border.9.png b/res/drawable-mdpi/data_grid_border.9.png
index ac6b034..699c513 100644
--- a/res/drawable-mdpi/data_grid_border.9.png
+++ b/res/drawable-mdpi/data_grid_border.9.png
Binary files differ
diff --git a/res/drawable-mdpi/data_grid_primary.9.png b/res/drawable-mdpi/data_grid_primary.9.png
index 491f156..83411cf 100644
--- a/res/drawable-mdpi/data_grid_primary.9.png
+++ b/res/drawable-mdpi/data_grid_primary.9.png
Binary files differ
diff --git a/res/drawable-mdpi/data_grid_secondary.9.png b/res/drawable-mdpi/data_grid_secondary.9.png
index 9a69574..23330d1 100644
--- a/res/drawable-mdpi/data_grid_secondary.9.png
+++ b/res/drawable-mdpi/data_grid_secondary.9.png
Binary files differ
diff --git a/res/drawable-xhdpi/data_grid_border.9.png b/res/drawable-xhdpi/data_grid_border.9.png
index 66b7e31..7557115 100644
--- a/res/drawable-xhdpi/data_grid_border.9.png
+++ b/res/drawable-xhdpi/data_grid_border.9.png
Binary files differ
diff --git a/res/drawable-xhdpi/data_grid_primary.9.png b/res/drawable-xhdpi/data_grid_primary.9.png
index b1a3352..ff69fd8 100644
--- a/res/drawable-xhdpi/data_grid_primary.9.png
+++ b/res/drawable-xhdpi/data_grid_primary.9.png
Binary files differ
diff --git a/res/drawable-xhdpi/data_grid_secondary.9.png b/res/drawable-xhdpi/data_grid_secondary.9.png
index 77e30de..09065bf 100644
--- a/res/drawable-xhdpi/data_grid_secondary.9.png
+++ b/res/drawable-xhdpi/data_grid_secondary.9.png
Binary files differ
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 7307dff..83cefdf 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -788,7 +788,7 @@
     <string name="unlock_set_unlock_launch_picker_enable_summary">Choose a method to lock the screen</string>
 
     <!-- Info explaining the backup lock which is used for facelock -->
-    <string name="unlock_backup_info_summary">When conditions for Face Unlock aren\'t ideal, how do you want to unlock?</string>
+    <string name="unlock_backup_info_summary">When Face Unlock can\'t see you, how do you want to unlock?</string>
 
     <!-- Title for preference that disables unlock security [CHAR LIMIT=22] -->
     <string name="unlock_set_unlock_off_title">None</string>
@@ -2914,7 +2914,7 @@
     <string name="usage_type_cpu_foreground">CPU foreground</string>
     <!-- [CHAR LIMIT=25] Label for keeping device from sleeping -->
     <string name="usage_type_wake_lock">Keep awake</string>
-    <!-- Label for GPU usage time -->
+    <!-- Label for GPS usage time -->
     <string name="usage_type_gps">GPS</string>
     <!-- [CHAR LIMIT=25] Label for WIFI usage time -->
     <string name="usage_type_wifi_running">WiFi running</string>
@@ -3480,9 +3480,9 @@
     <string name="show_cpu_usage_summary">Screen overlay showing current CPU usage</string>
 
     <!-- UI debug setting: force hardware acceleration to render apps [CHAR LIMIT=25] -->
-    <string name="force_hw_ui">Force hardware acceleration</string>
+    <string name="force_hw_ui">Force GPU rendering</string>
     <!-- UI debug setting: force hardware acceleration summary [CHAR LIMIT=50] -->
-    <string name="force_hw_ui_summary">Render apps using the GPU</string>
+    <string name="force_hw_ui_summary">Use 2D hardware acceleration in applications</string>
 
     <!-- UI debug setting: scaling factor for window animations [CHAR LIMIT=25] -->
     <string name="window_animation_scale_title">Window animation scale</string>
@@ -3533,6 +3533,11 @@
     <!-- Label for data usage occuring while application in background. [CHAR LIMIT=48] -->
     <string name="data_usage_label_background">Background</string>
 
+    <!-- Disclaimer that contrasts device versus carrier reporting. [CHAR LIMIT=80] -->
+    <string name="data_usage_disclaimer" product="tablet">Measured by your tablet. Your carrier\'s data usage accounting may differ.</string>
+    <!-- Disclaimer that contrasts device versus carrier reporting. [CHAR LIMIT=80] -->
+    <string name="data_usage_disclaimer" product="default">Measured by your phone. Your carrier\'s data usage accounting may differ.</string>
+
     <!-- Body of dialog shown to request confirmation that mobile data will be disabled. [CHAR LIMIT=NONE] -->
     <string name="data_usage_disable_mobile">Disable mobile data?</string>
     <!-- Checkbox label that will disable mobile network data connection when user-defined limit is reached. [CHAR LIMIT=32] -->
@@ -3597,7 +3602,9 @@
     <!-- Title of dialog shown before user limits data usage. [CHAR LIMIT=48] -->
     <string name="data_usage_limit_dialog_title">Limiting data usage</string>
     <!-- Body of dialog shown before user limits mobile data usage. [CHAR LIMIT=NONE] -->
-    <string name="data_usage_limit_dialog">Your <xliff:g id="networks" example="mobile">%1$s</xliff:g> data connection will be disabled when the specified limit is reached.\n\nTo avoid overage charges, consider using a reduced limit, as device and accounting methods may vary.</string>
+    <string name="data_usage_limit_dialog" product="tablet">Your <xliff:g id="networks" example="mobile">%1$s</xliff:g> data connection will be disabled when the specified limit is reached.\n\nSince data usage is measured by your tablet, and your carrier may account for usage differently, consider using a conservative limit.</string>
+    <!-- Body of dialog shown before user limits mobile data usage. [CHAR LIMIT=NONE] -->
+    <string name="data_usage_limit_dialog" product="default">Your <xliff:g id="networks" example="mobile">%1$s</xliff:g> data connection will be disabled when the specified limit is reached.\n\nSince data usage is measured by your phone, and your carrier may account for usage differently, consider using a conservative limit.</string>
 
     <!-- Title of dialog shown before user restricts background data usage. [CHAR LIMIT=48] -->
     <string name="data_usage_restrict_background_title">Restrict background data?</string>
diff --git a/src/com/android/settings/AccessibilitySettings.java b/src/com/android/settings/AccessibilitySettings.java
index 67a5bdb..c9703dc 100644
--- a/src/com/android/settings/AccessibilitySettings.java
+++ b/src/com/android/settings/AccessibilitySettings.java
@@ -35,6 +35,7 @@
 import android.os.Handler;
 import android.os.Message;
 import android.os.RemoteException;
+import android.os.ServiceManager;
 import android.os.SystemProperties;
 import android.preference.CheckBoxPreference;
 import android.preference.ListPreference;
@@ -45,12 +46,15 @@
 import android.provider.Settings;
 import android.text.TextUtils;
 import android.text.TextUtils.SimpleStringSplitter;
+import android.util.Log;
 import android.view.Gravity;
+import android.view.IWindowManager;
 import android.view.KeyCharacterMap;
 import android.view.KeyEvent;
 import android.view.Menu;
 import android.view.MenuInflater;
 import android.view.MenuItem;
+import android.view.Surface;
 import android.view.View;
 import android.view.accessibility.AccessibilityEvent;
 import android.view.accessibility.AccessibilityManager;
@@ -72,6 +76,7 @@
  */
 public class AccessibilitySettings extends SettingsPreferenceFragment implements DialogCreatable,
         Preference.OnPreferenceChangeListener {
+    private static final String TAG = "AccessibilitySettings";
 
     private static final String DEFAULT_SCREENREADER_MARKET_LINK =
         "market://search?q=pname:com.google.android.marvin.talkback";
@@ -230,9 +235,17 @@
     }
 
     private void handleToggleAutoRotateScreenPreferenceClick() {
-        Settings.System.putInt(getContentResolver(),
-                Settings.System.ACCELEROMETER_ROTATION,
-                (mToggleAutoRotateScreenPreference.isChecked() ? 1 : 0));
+        try {
+            IWindowManager wm = IWindowManager.Stub.asInterface(
+                    ServiceManager.getService(Context.WINDOW_SERVICE));
+            if (mToggleAutoRotateScreenPreference.isChecked()) {
+                wm.thawRotation();
+            } else {
+                wm.freezeRotation(Surface.ROTATION_0);
+            }
+        } catch (RemoteException exc) {
+            Log.w(TAG, "Unable to save auto-rotate setting");
+        }
     }
 
     private void initializeAllPreferences() {
diff --git a/src/com/android/settings/DisplaySettings.java b/src/com/android/settings/DisplaySettings.java
index 8b7545c..5887140 100644
--- a/src/com/android/settings/DisplaySettings.java
+++ b/src/com/android/settings/DisplaySettings.java
@@ -28,6 +28,7 @@
 import android.os.Bundle;
 import android.os.Handler;
 import android.os.RemoteException;
+import android.os.ServiceManager;
 import android.preference.CheckBoxPreference;
 import android.preference.ListPreference;
 import android.preference.Preference;
@@ -35,6 +36,8 @@
 import android.provider.Settings;
 import android.provider.Settings.SettingNotFoundException;
 import android.util.Log;
+import android.view.IWindowManager;
+import android.view.Surface;
 
 import java.util.ArrayList;
 
@@ -230,9 +233,17 @@
     @Override
     public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
         if (preference == mAccelerometer) {
-            Settings.System.putInt(getContentResolver(),
-                    Settings.System.ACCELEROMETER_ROTATION,
-                    mAccelerometer.isChecked() ? 1 : 0);
+            try {
+                IWindowManager wm = IWindowManager.Stub.asInterface(
+                        ServiceManager.getService(Context.WINDOW_SERVICE));
+                if (mAccelerometer.isChecked()) {
+                    wm.thawRotation();
+                } else {
+                    wm.freezeRotation(Surface.ROTATION_0);
+                }
+            } catch (RemoteException exc) {
+                Log.w(TAG, "Unable to save auto-rotate setting");
+            }
         } else if (preference == mNotificationPulse) {
             boolean value = mNotificationPulse.isChecked();
             Settings.System.putInt(getContentResolver(), Settings.System.NOTIFICATION_LIGHT_PULSE,
diff --git a/src/com/android/settings/TetherSettings.java b/src/com/android/settings/TetherSettings.java
index 3ecde80..107b53a 100644
--- a/src/com/android/settings/TetherSettings.java
+++ b/src/com/android/settings/TetherSettings.java
@@ -40,6 +40,7 @@
 import android.preference.CheckBoxPreference;
 import android.preference.Preference;
 import android.preference.PreferenceScreen;
+import android.text.TextUtils;
 import android.view.ViewGroup;
 import android.view.ViewParent;
 import android.webkit.WebView;
@@ -52,7 +53,7 @@
  * Displays preferences for Tethering.
  */
 public class TetherSettings extends SettingsPreferenceFragment
-        implements DialogInterface.OnClickListener {
+        implements DialogInterface.OnClickListener, Preference.OnPreferenceChangeListener {
 
     private static final String USB_TETHER_SETTINGS = "usb_tether_settings";
     private static final String ENABLE_WIFI_AP = "enable_wifi_ap";
@@ -70,6 +71,8 @@
     private CheckBoxPreference mUsbTether;
 
     private WifiApEnabler mWifiApEnabler;
+    private CheckBoxPreference mEnableWifiAp;
+    private static final int MHS_REQUEST = 0;
 
     private CheckBoxPreference mBluetoothTether;
 
@@ -89,7 +92,6 @@
 
     private String[] mSecurityType;
     private Preference mCreateNetwork;
-    private CheckBoxPreference mEnableWifiAp;
 
     private WifiApDialog mDialog;
     private WifiManager mWifiManager;
@@ -112,7 +114,7 @@
                     BluetoothProfile.PAN);
         }
 
-        CheckBoxPreference enableWifiAp =
+        mEnableWifiAp =
                 (CheckBoxPreference) findPreference(ENABLE_WIFI_AP);
         Preference wifiApSettings = findPreference(WIFI_AP_SSID_AND_SECURITY);
         mUsbTether = (CheckBoxPreference) findPreference(USB_TETHER_SETTINGS);
@@ -135,10 +137,10 @@
         }
 
         if (wifiAvailable) {
-            mWifiApEnabler = new WifiApEnabler(activity, enableWifiAp);
+            mWifiApEnabler = new WifiApEnabler(activity, mEnableWifiAp);
             initWifiTethering();
         } else {
-            getPreferenceScreen().removePreference(enableWifiAp);
+            getPreferenceScreen().removePreference(mEnableWifiAp);
             getPreferenceScreen().removePreference(wifiApSettings);
         }
 
@@ -162,7 +164,6 @@
         mSecurityType = getResources().getStringArray(R.array.wifi_ap_security);
 
         mCreateNetwork = findPreference(WIFI_AP_SSID_AND_SECURITY);
-        mEnableWifiAp = (CheckBoxPreference) findPreference(ENABLE_WIFI_AP);
 
         if (mWifiConfig == null) {
             final String s = activity.getString(
@@ -315,6 +316,7 @@
 
         if (intent != null) mTetherChangeReceiver.onReceive(activity, intent);
         if (mWifiApEnabler != null) {
+            mEnableWifiAp.setOnPreferenceChangeListener(this);
             mWifiApEnabler.resume();
         }
 
@@ -327,6 +329,7 @@
         getActivity().unregisterReceiver(mTetherChangeReceiver);
         mTetherChangeReceiver = null;
         if (mWifiApEnabler != null) {
+            mEnableWifiAp.setOnPreferenceChangeListener(null);
             mWifiApEnabler.pause();
         }
     }
@@ -447,6 +450,35 @@
         }
     }
 
+    public boolean onPreferenceChange(Preference preference, Object value) {
+        boolean enable = (Boolean) value;
+
+        if (enable) {
+            //Check if provisioning is needed
+            String intentStr = getActivity().getString(
+                    com.android.internal.R.string.config_mobile_hotspot_provision_intent);
+
+            if (TextUtils.isEmpty(intentStr)) {
+                mWifiApEnabler.setSoftapEnabled(true);
+            } else {
+                Intent intent = new Intent(intentStr);
+                startActivityForResult(intent, MHS_REQUEST);
+            }
+        } else {
+            mWifiApEnabler.setSoftapEnabled(false);
+        }
+        return false;
+    }
+
+    public void onActivityResult(int requestCode, int resultCode, Intent intent) {
+        super.onActivityResult(requestCode, resultCode, intent);
+        if (requestCode == MHS_REQUEST) {
+            if (resultCode == Activity.RESULT_OK) {
+                mWifiApEnabler.setSoftapEnabled(true);
+            }
+        }
+    }
+
     @Override
     public boolean onPreferenceTreeClick(PreferenceScreen screen, Preference preference) {
         ConnectivityManager cm =
diff --git a/src/com/android/settings/wifi/WifiApEnabler.java b/src/com/android/settings/wifi/WifiApEnabler.java
index e4e092c..92e1c92 100644
--- a/src/com/android/settings/wifi/WifiApEnabler.java
+++ b/src/com/android/settings/wifi/WifiApEnabler.java
@@ -33,14 +33,13 @@
 import android.net.wifi.WifiConfiguration;
 import android.net.wifi.WifiInfo;
 import android.net.wifi.WifiManager;
-import android.preference.Preference;
 import android.preference.CheckBoxPreference;
 import android.provider.Settings;
 import android.text.TextUtils;
 import android.util.Log;
 import android.widget.Toast;
 
-public class WifiApEnabler implements Preference.OnPreferenceChangeListener {
+public class WifiApEnabler {
     private final Context mContext;
     private final CheckBoxPreference mCheckBox;
     private final CharSequence mOriginalSummary;
@@ -92,12 +91,10 @@
     public void resume() {
         mContext.registerReceiver(mReceiver, mIntentFilter);
         enableWifiCheckBox();
-        mCheckBox.setOnPreferenceChangeListener(this);
     }
 
     public void pause() {
         mContext.unregisterReceiver(mReceiver);
-        mCheckBox.setOnPreferenceChangeListener(null);
     }
 
     private void enableWifiCheckBox() {
@@ -111,11 +108,8 @@
         }
     }
 
-    public boolean onPreferenceChange(Preference preference, Object value) {
-
+    public void setSoftapEnabled(boolean enable) {
         final ContentResolver cr = mContext.getContentResolver();
-        boolean enable = (Boolean)value;
-
         /**
          * Disable Wifi if enabling tethering
          */
@@ -148,8 +142,6 @@
                 Settings.Secure.putInt(cr, Settings.Secure.WIFI_SAVED_STATE, 0);
             }
         }
-
-        return false;
     }
 
     public void updateConfigSummary(WifiConfiguration wifiConfig) {