From 47088bbbef61e3bd8d2930f4a2b72884129b5bd5 Mon Sep 17 00:00:00 2001 From: Jim Miller Date: Tue, 24 Nov 2009 00:40:16 -0800 Subject: [PATCH] Fix 2270597: Add callback to watch ringer state and update lock screen UI when it changes. --- .../policy/impl/KeyguardUpdateMonitor.java | 53 +++++++++++++------ .../internal/policy/impl/LockScreen.java | 12 ++++- .../internal/policy/impl/UnlockScreen.java | 19 ++++--- 3 files changed, 60 insertions(+), 24 deletions(-) diff --git a/policy/com/android/internal/policy/impl/KeyguardUpdateMonitor.java b/policy/com/android/internal/policy/impl/KeyguardUpdateMonitor.java index 58905a10c4354..3483405fb96a6 100644 --- a/policy/com/android/internal/policy/impl/KeyguardUpdateMonitor.java +++ b/policy/com/android/internal/policy/impl/KeyguardUpdateMonitor.java @@ -25,6 +25,7 @@ import android.database.ContentObserver; import static android.os.BatteryManager.BATTERY_STATUS_CHARGING; import static android.os.BatteryManager.BATTERY_STATUS_FULL; import static android.os.BatteryManager.BATTERY_STATUS_UNKNOWN; +import android.media.AudioManager; import android.os.Handler; import android.os.Message; import android.provider.Settings; @@ -69,9 +70,9 @@ public class KeyguardUpdateMonitor { private boolean mKeyguardBypassEnabled; private boolean mDevicePluggedIn; - + private boolean mDeviceProvisioned; - + private int mBatteryLevel; private CharSequence mTelephonyPlmn; @@ -86,7 +87,7 @@ public class KeyguardUpdateMonitor { private ArrayList mInfoCallbacks = Lists.newArrayList(); private ArrayList mSimStateCallbacks = Lists.newArrayList(); private ContentObserver mContentObserver; - + // messages for the handler private static final int MSG_CONFIGURATION_CHANGED = 300; @@ -94,14 +95,15 @@ public class KeyguardUpdateMonitor { private static final int MSG_BATTERY_UPDATE = 302; private static final int MSG_CARRIER_INFO_UPDATE = 303; private static final int MSG_SIM_STATE_CHANGE = 304; + private static final int MSG_RINGER_MODE_CHANGED = 305; /** - * When we receive a - * {@link com.android.internal.telephony.TelephonyIntents#ACTION_SIM_STATE_CHANGED} broadcast, + * When we receive a + * {@link com.android.internal.telephony.TelephonyIntents#ACTION_SIM_STATE_CHANGED} broadcast, * and then pass a result via our handler to {@link KeyguardUpdateMonitor#handleSimStateChange}, * we need a single object to pass to the handler. This class helps decode - * the intent and provide a {@link SimCard.State} result. + * the intent and provide a {@link SimCard.State} result. */ private static class SimArgs { @@ -140,7 +142,7 @@ public class KeyguardUpdateMonitor { public KeyguardUpdateMonitor(Context context) { mContext = context; - + mHandler = new Handler() { @Override public void handleMessage(Message msg) { @@ -160,6 +162,9 @@ public class KeyguardUpdateMonitor { case MSG_SIM_STATE_CHANGE: handleSimStateChange((SimArgs) msg.obj); break; + case MSG_RINGER_MODE_CHANGED: + handleRingerModeChange(msg.arg1); + break; } } }; @@ -169,7 +174,7 @@ public class KeyguardUpdateMonitor { mDeviceProvisioned = Settings.Secure.getInt( mContext.getContentResolver(), Settings.Secure.DEVICE_PROVISIONED, 0) != 0; - + // Since device can't be un-provisioned, we only need to register a content observer // to update mDeviceProvisioned when we are... if (!mDeviceProvisioned) { @@ -177,7 +182,7 @@ public class KeyguardUpdateMonitor { @Override public void onChange(boolean selfChange) { super.onChange(selfChange); - mDeviceProvisioned = Settings.Secure.getInt(mContext.getContentResolver(), + mDeviceProvisioned = Settings.Secure.getInt(mContext.getContentResolver(), Settings.Secure.DEVICE_PROVISIONED, 0) != 0; if (mDeviceProvisioned && mContentObserver != null) { // We don't need the observer anymore... @@ -187,17 +192,17 @@ public class KeyguardUpdateMonitor { if (DEBUG) Log.d(TAG, "DEVICE_PROVISIONED state = " + mDeviceProvisioned); } }; - + mContext.getContentResolver().registerContentObserver( Settings.Secure.getUriFor(Settings.Secure.DEVICE_PROVISIONED), false, mContentObserver); - + // prevent a race condition between where we check the flag and where we register the // observer by grabbing the value once again... - mDeviceProvisioned = Settings.Secure.getInt(mContext.getContentResolver(), + mDeviceProvisioned = Settings.Secure.getInt(mContext.getContentResolver(), Settings.Secure.DEVICE_PROVISIONED, 0) != 0; } - + mInPortrait = queryInPortrait(); mKeyboardOpen = queryKeyboardOpen(); @@ -217,6 +222,7 @@ public class KeyguardUpdateMonitor { filter.addAction(Intent.ACTION_TIMEZONE_CHANGED); filter.addAction(TelephonyIntents.ACTION_SIM_STATE_CHANGED); filter.addAction(SPN_STRINGS_UPDATED_ACTION); + filter.addAction(AudioManager.RINGER_MODE_CHANGED_ACTION); context.registerReceiver(new BroadcastReceiver() { public void onReceive(Context context, Intent intent) { @@ -242,15 +248,25 @@ public class KeyguardUpdateMonitor { pluggedInStatus, batteryLevel); mHandler.sendMessage(msg); - } else if (TelephonyIntents.ACTION_SIM_STATE_CHANGED.equals(action)){ + } else if (TelephonyIntents.ACTION_SIM_STATE_CHANGED.equals(action)) { mHandler.sendMessage(mHandler.obtainMessage( MSG_SIM_STATE_CHANGE, new SimArgs(intent))); + } else if (AudioManager.RINGER_MODE_CHANGED_ACTION.equals(action)) { + mHandler.sendMessage(mHandler.obtainMessage(MSG_RINGER_MODE_CHANGED, + intent.getIntExtra(AudioManager.EXTRA_RINGER_MODE, -1), 0)); } } }, filter); } + protected void handleRingerModeChange(int mode) { + if (DEBUG) Log.d(TAG, "handleRingerModeChange(" + mode + ")"); + for (int i = 0; i < mInfoCallbacks.size(); i++) { + mInfoCallbacks.get(i).onRingerModeChanged(mode); + } + } + /** * Handle {@link #MSG_CONFIGURATION_CHANGED} */ @@ -443,7 +459,7 @@ public class KeyguardUpdateMonitor { } /** - * Callback for general information releveant to lock screen. + * Callback for general information relevant to lock screen. */ interface InfoCallback { void onRefreshBatteryInfo(boolean showBatteryInfo, boolean pluggedIn, int batteryLevel); @@ -455,6 +471,13 @@ public class KeyguardUpdateMonitor { * @param spn The service provider name. May be null if it shouldn't be displayed. */ void onRefreshCarrierInfo(CharSequence plmn, CharSequence spn); + + /** + * Called when the ringer mode changes. + * @param state the current ringer state, as defined in + * {@link AudioManager#RINGER_MODE_CHANGED_ACTION} + */ + void onRingerModeChanged(int state); } /** diff --git a/policy/com/android/internal/policy/impl/LockScreen.java b/policy/com/android/internal/policy/impl/LockScreen.java index 67fe0b372611c..6da03ab441e04 100644 --- a/policy/com/android/internal/policy/impl/LockScreen.java +++ b/policy/com/android/internal/policy/impl/LockScreen.java @@ -36,7 +36,6 @@ import android.os.SystemProperties; import java.util.Date; import java.io.File; -import java.text.SimpleDateFormat; /** * The screen within {@link LockPatternKeyguardView} that shows general @@ -562,7 +561,7 @@ class LockScreen extends LinearLayout implements KeyguardScreen, KeyguardUpdateM public boolean needsInput() { return false; } - + /** {@inheritDoc} */ public void onPause() { @@ -577,4 +576,13 @@ class LockScreen extends LinearLayout implements KeyguardScreen, KeyguardUpdateM public void cleanUp() { mUpdateMonitor.removeCallback(this); } + + /** {@inheritDoc} */ + public void onRingerModeChanged(int state) { + boolean silent = AudioManager.RINGER_MODE_SILENT == state; + if (silent != mSilentMode) { + mSilentMode = silent; + updateRightTabResources(); + } + } } diff --git a/policy/com/android/internal/policy/impl/UnlockScreen.java b/policy/com/android/internal/policy/impl/UnlockScreen.java index e413d6bed6079..e090ac5e9fd01 100644 --- a/policy/com/android/internal/policy/impl/UnlockScreen.java +++ b/policy/com/android/internal/policy/impl/UnlockScreen.java @@ -104,7 +104,7 @@ class UnlockScreen extends LinearLayoutWithDefaultTouchRecepient * Keeps track of the last time we poked the wake lock during dispatching * of the touch event, initalized to something gauranteed to make us * poke it when the user starts drawing the pattern. - * @see #dispatchTouchEvent(android.view.MotionEvent) + * @see #dispatchTouchEvent(android.view.MotionEvent) */ private long mLastPokeTime = -UNLOCK_PATTERN_WAKE_INTERVAL_MS; @@ -167,7 +167,7 @@ class UnlockScreen extends LinearLayoutWithDefaultTouchRecepient if (DEBUG) Log.d(TAG, "UnlockScreen() ctor: totalFailedAttempts=" + totalFailedAttempts + ", mFailedPat...=" - + mFailedPatternAttemptsSinceLastTimeout + + mFailedPatternAttemptsSinceLastTimeout ); if (mUpdateMonitor.isInPortrait()) { @@ -250,7 +250,7 @@ class UnlockScreen extends LinearLayoutWithDefaultTouchRecepient if (DEBUG) Log.d(TAG, "setEnableFallback(" + state + ")"); mEnableFallback = state; } - + private void resetStatusInfo() { mInstructions = null; mShowingBatteryInfo = mUpdateMonitor.shouldShowBatteryInfo(); @@ -368,6 +368,11 @@ class UnlockScreen extends LinearLayoutWithDefaultTouchRecepient mCarrier.setText(LockScreen.getCarrierString(plmn, spn)); } + /** {@inheritDoc} */ + public void onRingerModeChanged(int state) { + // not currently used + } + // ---------- SimStateCallback /** {@inheritDoc} */ @@ -391,7 +396,7 @@ class UnlockScreen extends LinearLayoutWithDefaultTouchRecepient public boolean needsInput() { return false; } - + /** {@inheritDoc} */ public void onPause() { if (mCountdownTimer != null) { @@ -409,9 +414,9 @@ class UnlockScreen extends LinearLayoutWithDefaultTouchRecepient mLockPatternView.enableInput(); mLockPatternView.setEnabled(true); mLockPatternView.clearPattern(); - + // show "forgot pattern?" button if we have an alternate authentication method - mForgotPatternButton.setVisibility(mCallback.doesFallbackUnlockScreenExist() + mForgotPatternButton.setVisibility(mCallback.doesFallbackUnlockScreenExist() ? View.VISIBLE : View.INVISIBLE); // if the user is currently locked out, enforce it. @@ -457,7 +462,7 @@ class UnlockScreen extends LinearLayoutWithDefaultTouchRecepient public void onPatternCellAdded(List pattern) { // To guard against accidental poking of the wakelock, look for - // the user actually trying to draw a pattern of some minimal length. + // the user actually trying to draw a pattern of some minimal length. if (pattern.size() > MIN_PATTERN_BEFORE_POKE_WAKELOCK) { mCallback.pokeWakelock(UNLOCK_PATTERN_WAKE_INTERVAL_MS); }