Merge "Fix memory leak in Bluetooth settings"
diff --git a/res/values/strings.xml b/res/values/strings.xml
index e177112..648bd2b 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -1687,6 +1687,8 @@
     <string name="wifi_wps_failed_auth">Authentication failure. Please try again.</string>
      <!-- Text displayed when WPS fails due to another session [CHAR LIMIT=150] -->
     <string name="wifi_wps_failed_overlap">Another WPS session was detected. Please try again in a few minutes.</string>
+    <!-- Text displayed when WPS fails due to wifi disconnected [CHAR LIMIT=150] -->
+    <string name="wifi_wps_failed_wifi_disconnected">Wi\u2011Fi disconnected. WPS setup canceled.</string>
     <!-- Label for the SSID of the network -->
     <string name="wifi_ssid">Network name</string>
     <!-- Hint for a text field to enter the SSID of a hidden wifi network. [CHAR LIMIT=35] -->
diff --git a/src/com/android/settings/applications/AppStateAppOpsBridge.java b/src/com/android/settings/applications/AppStateAppOpsBridge.java
old mode 100644
new mode 100755
index cfbb2fc..c74699f
--- a/src/com/android/settings/applications/AppStateAppOpsBridge.java
+++ b/src/com/android/settings/applications/AppStateAppOpsBridge.java
@@ -187,7 +187,11 @@
      * PermissionState, which describes a particular package.
      */
     private void loadPermissionsStates(SparseArray<ArrayMap<String, PermissionState>> entries) {
-         // Load the packages that have been granted the permission specified in mPermission.
+        // Load the packages that have been granted the permission specified in mPermission.
+        if (entries == null) {
+            return;
+        }
+
         try {
             for (final UserHandle profile : mProfiles) {
                 final int profileId = profile.getIdentifier();
diff --git a/src/com/android/settings/datausage/BillingCycleSettings.java b/src/com/android/settings/datausage/BillingCycleSettings.java
index d755a7b..e6c09fd 100644
--- a/src/com/android/settings/datausage/BillingCycleSettings.java
+++ b/src/com/android/settings/datausage/BillingCycleSettings.java
@@ -275,7 +275,7 @@
             Spinner spinner = (Spinner) mView.findViewById(R.id.size_spinner);
 
             String bytesString = bytesField.getText().toString();
-            if (bytesString.isEmpty()) {
+            if (bytesString.isEmpty() || bytesString.equals(".")) {
                 bytesString = "0";
             }
             final long bytes = (long) (Float.valueOf(bytesString)
diff --git a/src/com/android/settings/fingerprint/FingerprintEnrollEnrolling.java b/src/com/android/settings/fingerprint/FingerprintEnrollEnrolling.java
index b414627..8689530 100644
--- a/src/com/android/settings/fingerprint/FingerprintEnrollEnrolling.java
+++ b/src/com/android/settings/fingerprint/FingerprintEnrollEnrolling.java
@@ -33,6 +33,7 @@
 import android.hardware.fingerprint.FingerprintManager;
 import android.os.Bundle;
 import android.os.UserHandle;
+import android.text.TextUtils;
 import android.view.MotionEvent;
 import android.view.View;
 import android.view.animation.AnimationUtils;
@@ -264,7 +265,10 @@
 
     @Override
     public void onEnrollmentHelp(CharSequence helpString) {
-        mErrorText.setText(helpString);
+        if (!TextUtils.isEmpty(helpString)) {
+            mErrorText.removeCallbacks(mTouchAgainRunnable);
+            showError(helpString);
+        }
     }
 
     @Override
diff --git a/src/com/android/settings/sim/SimPreferenceDialog.java b/src/com/android/settings/sim/SimPreferenceDialog.java
index 530cb38..d195724 100644
--- a/src/com/android/settings/sim/SimPreferenceDialog.java
+++ b/src/com/android/settings/sim/SimPreferenceDialog.java
@@ -167,7 +167,6 @@
                 mSubInfoRecord.setIconTint(tint);
                 mSubscriptionManager.setIconTint(tint, subscriptionId);
                 dialog.dismiss();
-                finish();
             }
         });
 
@@ -175,10 +174,16 @@
             @Override
             public void onClick(DialogInterface dialog, int whichButton) {
                 dialog.dismiss();
-                finish();
             }
         });
 
+        mBuilder.setOnDismissListener(new DialogInterface.OnDismissListener() {
+           @Override
+           public void onDismiss(DialogInterface dialogInListener) {
+               finish();
+           }
+        });
+
         mBuilder.create().show();
     }
 
diff --git a/src/com/android/settings/wifi/WpsDialog.java b/src/com/android/settings/wifi/WpsDialog.java
index 3de2729..440b72d 100644
--- a/src/com/android/settings/wifi/WpsDialog.java
+++ b/src/com/android/settings/wifi/WpsDialog.java
@@ -125,6 +125,7 @@
 
 
         mFilter = new IntentFilter();
+        mFilter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);
         mFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
         mReceiver = new BroadcastReceiver() {
             @Override
@@ -261,7 +262,18 @@
 
     private void handleEvent(Context context, Intent intent) {
         String action = intent.getAction();
-        if (WifiManager.NETWORK_STATE_CHANGED_ACTION.equals(action)) {
+        if (WifiManager.WIFI_STATE_CHANGED_ACTION.equals(action)) {
+            final int state = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE,
+                    WifiManager.WIFI_STATE_UNKNOWN);
+            if (state == WifiManager.WIFI_STATE_DISABLED) {
+                if (mTimer != null) {
+                    mTimer.cancel();
+                    mTimer = null;
+                }
+                String msg = mContext.getString(R.string.wifi_wps_failed_wifi_disconnected);
+                updateDialog(DialogState.WPS_FAILED, msg);
+            }
+        } else if (WifiManager.NETWORK_STATE_CHANGED_ACTION.equals(action)) {
             NetworkInfo info = (NetworkInfo) intent.getParcelableExtra(
                     WifiManager.EXTRA_NETWORK_INFO);
             final NetworkInfo.DetailedState state = info.getDetailedState();