From 113ae0258d8a0aac363e397ad025cb65df237328 Mon Sep 17 00:00:00 2001 From: Jim Miller Date: Wed, 30 Nov 2011 19:16:31 -0800 Subject: [PATCH] Fix 5636798: Watch for SIM state changes in IccSettings. This fixes a bug where the SIM enable checkbox was showing the wrong state. The code now registers for state changes and updates the checkbox state appropriately. Change-Id: Icd4f040140e9f71e75e288968ee7ae616dfd08ce --- src/com/android/settings/IccLockSettings.java | 95 ++++++++++++------- 1 file changed, 63 insertions(+), 32 deletions(-) diff --git a/src/com/android/settings/IccLockSettings.java b/src/com/android/settings/IccLockSettings.java index 0df69a01d7d..755be83f7ee 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 android.widget.Toast; 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 @@ import com.android.internal.telephony.PhoneFactory; * 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 @@ public class IccLockSettings extends PreferenceActivity 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 @@ public class IccLockSettings extends PreferenceActivity // (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 @@ public class IccLockSettings extends PreferenceActivity } 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 @@ public class IccLockSettings extends PreferenceActivity 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 @@ public class IccLockSettings extends PreferenceActivity 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 @@ public class IccLockSettings extends PreferenceActivity resetDialogState(); return; } - + mPin = preference.getText(); if (!reasonablePin(mPin)) { // inject error message and display dialog again @@ -296,13 +327,13 @@ public class IccLockSettings extends PreferenceActivity 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 @@ public class IccLockSettings extends PreferenceActivity } 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 @@ public class IccLockSettings extends PreferenceActivity } 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); }