Merge "Set the same vibrate settings for ringer and notifications." into ics-mr1
diff --git a/res/layout/preference_progress_category.xml b/res/layout/preference_progress_category.xml
index af411ee..0a860af 100644
--- a/res/layout/preference_progress_category.xml
+++ b/res/layout/preference_progress_category.xml
@@ -30,7 +30,7 @@
         android:layout_width="0dp"
         android:layout_height="wrap_content"
         android:layout_weight="1"
-        android:layout_gravity="center_vertical"
+        android:layout_gravity="left|bottom"
     />
 
     <TextView
@@ -38,10 +38,10 @@
         android:background="@null"
         android:paddingLeft="0dip"
         android:id="@+id/scanning_text"
-        android:layout_width="wrap_content"
+        android:layout_width="0dp"
         android:layout_height="wrap_content"
-        android:layout_gravity="center_vertical"
-        android:layout_marginRight="5sp"
+        android:layout_weight="1"
+        android:layout_gravity="right|bottom"
         android:text="@string/progress_scanning"
         />
 
@@ -51,6 +51,7 @@
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_gravity="center_vertical"
+        android:layout_marginLeft="16dip"
         android:layout_marginRight="16dip"
         style="?android:attr/progressBarStyleSmallTitle"
         />
diff --git a/src/com/android/settings/IccLockSettings.java b/src/com/android/settings/IccLockSettings.java
index 0df69a0..755be83 100644
--- a/src/com/android/settings/IccLockSettings.java
+++ b/src/com/android/settings/IccLockSettings.java
@@ -16,7 +16,10 @@
 
 package com.android.settings;
 
+import android.content.BroadcastReceiver;
 import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
 import android.content.res.Resources;
 import android.os.AsyncResult;
 import android.os.Bundle;
@@ -30,6 +33,7 @@
 
 import com.android.internal.telephony.Phone;
 import com.android.internal.telephony.PhoneFactory;
+import com.android.internal.telephony.TelephonyIntents;
 
 /**
  * Implements the preference screen to enable/disable ICC lock and
@@ -40,7 +44,7 @@
  * these operations.
  *
  */
-public class IccLockSettings extends PreferenceActivity 
+public class IccLockSettings extends PreferenceActivity
         implements EditPinPreference.OnPinEnteredListener {
 
     private static final int OFF_MODE = 0;
@@ -52,7 +56,7 @@
     private static final int ICC_NEW_MODE = 3;
     // State when entering the new pin - second time
     private static final int ICC_REENTER_MODE = 4;
-    
+
     // Keys in xml file
     private static final String PIN_DIALOG = "sim_pin";
     private static final String PIN_TOGGLE = "sim_toggle";
@@ -66,55 +70,68 @@
     // (ex. portrait<-->landscape) during change PIN code
     private static final String OLD_PINCODE = "oldPinCode";
     private static final String NEW_PINCODE = "newPinCode";
-    
+
     private static final int MIN_PIN_LENGTH = 4;
     private static final int MAX_PIN_LENGTH = 8;
     // Which dialog to show next when popped up
     private int mDialogState = OFF_MODE;
-    
+
     private String mPin;
     private String mOldPin;
     private String mNewPin;
     private String mError;
     // Are we trying to enable or disable ICC lock?
     private boolean mToState;
-    
+
     private Phone mPhone;
-    
+
     private EditPinPreference mPinDialog;
     private CheckBoxPreference mPinToggle;
-    
+
     private Resources mRes;
 
     // For async handler to identify request type
-    private static final int ENABLE_ICC_PIN_COMPLETE = 100;
-    private static final int CHANGE_ICC_PIN_COMPLETE = 101;
+    private static final int MSG_ENABLE_ICC_PIN_COMPLETE = 100;
+    private static final int MSG_CHANGE_ICC_PIN_COMPLETE = 101;
+    private static final int MSG_SIM_STATE_CHANGED = 102;
 
     // For replies from IccCard interface
     private Handler mHandler = new Handler() {
         public void handleMessage(Message msg) {
             AsyncResult ar = (AsyncResult) msg.obj;
             switch (msg.what) {
-                case ENABLE_ICC_PIN_COMPLETE:
+                case MSG_ENABLE_ICC_PIN_COMPLETE:
                     iccLockChanged(ar.exception == null);
                     break;
-                case CHANGE_ICC_PIN_COMPLETE:
+                case MSG_CHANGE_ICC_PIN_COMPLETE:
                     iccPinChanged(ar.exception == null);
                     break;
+                case MSG_SIM_STATE_CHANGED:
+                    updatePreferences();
+                    break;
             }
 
             return;
         }
     };
-    
+
+    private final BroadcastReceiver mSimStateReceiver = new BroadcastReceiver() {
+        public void onReceive(Context context, Intent intent) {
+            final String action = intent.getAction();
+            if (TelephonyIntents.ACTION_SIM_STATE_CHANGED.equals(action)) {
+                mHandler.sendMessage(mHandler.obtainMessage(MSG_SIM_STATE_CHANGED));
+            }
+        }
+    };
+
     // For top-level settings screen to query
     static boolean isIccLockEnabled() {
         return PhoneFactory.getDefaultPhone().getIccCard().getIccLockEnabled();
     }
-    
+
     static String getSummary(Context context) {
         Resources res = context.getResources();
-        String summary = isIccLockEnabled() 
+        String summary = isIccLockEnabled()
                 ? res.getString(R.string.sim_lock_on)
                 : res.getString(R.string.sim_lock_off);
         return summary;
@@ -158,20 +175,28 @@
         }
 
         mPinDialog.setOnPinEnteredListener(this);
-        
+
         // Don't need any changes to be remembered
         getPreferenceScreen().setPersistent(false);
-        
+
         mPhone = PhoneFactory.getDefaultPhone();
         mRes = getResources();
+        updatePreferences();
     }
-    
+
+    private void updatePreferences() {
+        mPinToggle.setChecked(mPhone.getIccCard().getIccLockEnabled());
+    }
+
     @Override
     protected void onResume() {
         super.onResume();
-        
-        mPinToggle.setChecked(mPhone.getIccCard().getIccLockEnabled());
-        
+
+        // ACTION_SIM_STATE_CHANGED is sticky, so we'll receive current state after this call,
+        // which will call updatePreferences().
+        final IntentFilter filter = new IntentFilter(TelephonyIntents.ACTION_SIM_STATE_CHANGED);
+        registerReceiver(mSimStateReceiver, filter);
+
         if (mDialogState != OFF_MODE) {
             showPinDialog();
         } else {
@@ -179,7 +204,13 @@
             resetDialogState();
         }
     }
-    
+
+    @Override
+    protected void onPause() {
+        super.onPause();
+        unregisterReceiver(mSimStateReceiver);
+    }
+
     @Override
     protected void onSaveInstanceState(Bundle out) {
         // Need to store this state for slider open/close
@@ -219,17 +250,17 @@
             return;
         }
         setDialogValues();
-        
+
         mPinDialog.showPinDialog();
     }
-    
+
     private void setDialogValues() {
         mPinDialog.setText(mPin);
         String message = "";
         switch (mDialogState) {
             case ICC_LOCK_MODE:
                 message = mRes.getString(R.string.sim_enter_pin);
-                mPinDialog.setDialogTitle(mToState 
+                mPinDialog.setDialogTitle(mToState
                         ? mRes.getString(R.string.sim_enable_sim_lock)
                         : mRes.getString(R.string.sim_disable_sim_lock));
                 break;
@@ -258,7 +289,7 @@
             resetDialogState();
             return;
         }
-        
+
         mPin = preference.getText();
         if (!reasonablePin(mPin)) {
             // inject error message and display dialog again
@@ -296,13 +327,13 @@
                 break;
         }
     }
-    
+
     public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
         if (preference == mPinToggle) {
             // Get the new, preferred state
             mToState = mPinToggle.isChecked();
-            // Flip it back and pop up pin dialog  
-            mPinToggle.setChecked(!mToState);  
+            // Flip it back and pop up pin dialog
+            mPinToggle.setChecked(!mToState);
             mDialogState = ICC_LOCK_MODE;
             showPinDialog();
         } else if (preference == mPinDialog) {
@@ -313,13 +344,13 @@
     }
 
     private void tryChangeIccLockState() {
-        // Try to change icc lock. If it succeeds, toggle the lock state and 
+        // Try to change icc lock. If it succeeds, toggle the lock state and
         // reset dialog state. Else inject error message and show dialog again.
-        Message callback = Message.obtain(mHandler, ENABLE_ICC_PIN_COMPLETE);
+        Message callback = Message.obtain(mHandler, MSG_ENABLE_ICC_PIN_COMPLETE);
         mPhone.getIccCard().setIccLockEnabled(mToState, mPin, callback);
 
     }
-    
+
     private void iccLockChanged(boolean success) {
         if (success) {
             mPinToggle.setChecked(mToState);
@@ -345,7 +376,7 @@
     }
 
     private void tryChangePin() {
-        Message callback = Message.obtain(mHandler, CHANGE_ICC_PIN_COMPLETE);
+        Message callback = Message.obtain(mHandler, MSG_CHANGE_ICC_PIN_COMPLETE);
         mPhone.getIccCard().changeIccLockPassword(mOldPin,
                 mNewPin, callback);
     }
diff --git a/src/com/android/settings/ProgressCategory.java b/src/com/android/settings/ProgressCategory.java
index e854a00..c1b25d8 100644
--- a/src/com/android/settings/ProgressCategory.java
+++ b/src/com/android/settings/ProgressCategory.java
@@ -36,14 +36,14 @@
     @Override
     public void onBindView(View view) {
         super.onBindView(view);
-        final TextView textView = (TextView) view.findViewById(R.id.scanning_text);
+        final TextView scanning = (TextView) view.findViewById(R.id.scanning_text);
         final View progressBar = view.findViewById(R.id.scanning_progress);
 
-        textView.setText(mProgress ? R.string.progress_scanning : R.string.progress_tap_to_pair);
+        scanning.setText(mProgress ? R.string.progress_scanning : R.string.progress_tap_to_pair);
         boolean noDeviceFound = (getPreferenceCount() == 0 ||
                 (getPreferenceCount() == 1 && getPreference(0) == mNoDeviceFoundPreference));
-        textView.setVisibility(noDeviceFound ? View.INVISIBLE : View.VISIBLE);
-        progressBar.setVisibility(mProgress ? View.VISIBLE : View.INVISIBLE);
+        scanning.setVisibility(noDeviceFound ? View.GONE : View.VISIBLE);
+        progressBar.setVisibility(mProgress ? View.VISIBLE : View.GONE);
 
         if (mProgress || !noDeviceFound) {
             if (mNoDeviceFoundAdded) {
diff --git a/src/com/android/settings/applications/RunningState.java b/src/com/android/settings/applications/RunningState.java
index beb9605..1b5310d 100644
--- a/src/com/android/settings/applications/RunningState.java
+++ b/src/com/android/settings/applications/RunningState.java
@@ -815,7 +815,7 @@
         // Build the chains from client processes to the process they are
         // dependent on; also remove any old running processes.
         int NRP = mRunningProcesses.size();
-        for (int i=0; i<NRP; i++) {
+        for (int i = 0; i < NRP;) {
             ProcessItem proc = mRunningProcesses.valueAt(i);
             if (proc.mRunningSeq == mSequence) {
                 int clientPid = proc.mRunningProcessInfo.importanceReasonPid;
@@ -833,9 +833,11 @@
                     // we will detect the change.
                     proc.mClient = null;
                 }
+                i++;
             } else {
                 changed = true;
                 mRunningProcesses.remove(mRunningProcesses.keyAt(i));
+                NRP--;
             }
         }