diff options
3 files changed, 34 insertions, 26 deletions
diff --git a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardSelectorView.java b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardSelectorView.java index a38b247..28f5e8c 100644 --- a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardSelectorView.java +++ b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardSelectorView.java @@ -149,7 +149,6 @@ public class KeyguardSelectorView extends LinearLayout implements KeyguardSecuri mGlowPadView = (GlowPadView) findViewById(R.id.glow_pad_view); mGlowPadView.setOnTriggerListener(mOnTriggerListener); mEmergencyCallButton = (Button) findViewById(R.id.emergency_call_button); - KeyguardUpdateMonitor.getInstance(getContext()).registerCallback(mInfoCallback); updateTargets(); } diff --git a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardStatusView.java b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardStatusView.java index d6ce967..481e9ad 100644 --- a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardStatusView.java +++ b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardStatusView.java @@ -21,6 +21,8 @@ import android.util.AttributeSet; import android.widget.GridLayout; public class KeyguardStatusView extends GridLayout { + private KeyguardStatusViewManager mStatusViewManager; + public KeyguardStatusView(Context context) { this(context, null, 0); } @@ -38,7 +40,7 @@ public class KeyguardStatusView extends GridLayout { super.onFinishInflate(); // StatusView manages all of the widgets in this view. - new KeyguardStatusViewManager(this); + mStatusViewManager = new KeyguardStatusViewManager(this); } } diff --git a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardUpdateMonitor.java b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardUpdateMonitor.java index 39df5a2..281ed19 100644 --- a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardUpdateMonitor.java +++ b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardUpdateMonitor.java @@ -100,7 +100,7 @@ public class KeyguardUpdateMonitor { private boolean mClockVisible; - private ArrayList<WeakReference<KeyguardUpdateMonitorCallback>> + private final ArrayList<WeakReference<KeyguardUpdateMonitorCallback>> mCallbacks = Lists.newArrayList(); private ContentObserver mContentObserver; @@ -586,39 +586,46 @@ public class KeyguardUpdateMonitor { /** * Remove the given observer's callback. * - * @param observer The observer to remove + * @param callback The callback to remove */ - public void removeCallback(Object observer) { - mCallbacks.remove(observer); + public void removeCallback(KeyguardUpdateMonitorCallback callback) { + if (DEBUG) Log.v(TAG, "*** unregister callback for " + callback); + for (int i = mCallbacks.size() - 1; i >= 0; i--) { + if (mCallbacks.get(i).get() == callback) { + mCallbacks.remove(i); + } + } } /** * Register to receive notifications about general keyguard information * (see {@link InfoCallback}. - * @param callback The callback. + * @param callback The callback to register */ public void registerCallback(KeyguardUpdateMonitorCallback callback) { - if (!mCallbacks.contains(callback)) { - mCallbacks.add(new WeakReference<KeyguardUpdateMonitorCallback>(callback)); - // Notify listener of the current state - callback.onRefreshBatteryInfo(mBatteryStatus); - callback.onTimeChanged(); - callback.onRingerModeChanged(mRingMode); - callback.onPhoneStateChanged(mPhoneState); - callback.onRefreshCarrierInfo(mTelephonyPlmn, mTelephonySpn); - callback.onClockVisibilityChanged(); - callback.onSimStateChanged(mSimState); - } else { - if (DEBUG) Log.e(TAG, "Object tried to add another callback", - new Exception("Called by")); - } - - // Clean up any unused references - for (int i = mCallbacks.size() - 1; i >= 0; i--) { - if (mCallbacks.get(i).get() == null) { - mCallbacks.remove(i); + if (DEBUG) Log.v(TAG, "*** register callback for " + callback); + // Prevent adding duplicate callbacks + for (int i = 0; i < mCallbacks.size(); i++) { + if (mCallbacks.get(i).get() == callback) { + if (DEBUG) Log.e(TAG, "Object tried to add another callback", + new Exception("Called by")); + return; } } + mCallbacks.add(new WeakReference<KeyguardUpdateMonitorCallback>(callback)); + removeCallback(null); // remove unused references + sendUpdates(callback); + } + + private void sendUpdates(KeyguardUpdateMonitorCallback callback) { + // Notify listener of the current state + callback.onRefreshBatteryInfo(mBatteryStatus); + callback.onTimeChanged(); + callback.onRingerModeChanged(mRingMode); + callback.onPhoneStateChanged(mPhoneState); + callback.onRefreshCarrierInfo(mTelephonyPlmn, mTelephonySpn); + callback.onClockVisibilityChanged(); + callback.onSimStateChanged(mSimState); } public void reportClockVisible(boolean visible) { |