@@ -100,7 +100,7 @@ public class KeyguardUpdateMonitor {
100100
101101 private boolean mClockVisible ;
102102
103- private ArrayList <WeakReference <KeyguardUpdateMonitorCallback >>
103+ private final ArrayList <WeakReference <KeyguardUpdateMonitorCallback >>
104104 mCallbacks = Lists .newArrayList ();
105105 private ContentObserver mContentObserver ;
106106
@@ -586,39 +586,46 @@ private CharSequence getTelephonySpnFrom(Intent intent) {
586586 /**
587587 * Remove the given observer's callback.
588588 *
589- * @param observer The observer to remove
589+ * @param callback The callback to remove
590590 */
591- public void removeCallback (Object observer ) {
592- mCallbacks .remove (observer );
591+ public void removeCallback (KeyguardUpdateMonitorCallback callback ) {
592+ if (DEBUG ) Log .v (TAG , "*** unregister callback for " + callback );
593+ for (int i = mCallbacks .size () - 1 ; i >= 0 ; i --) {
594+ if (mCallbacks .get (i ).get () == callback ) {
595+ mCallbacks .remove (i );
596+ }
597+ }
593598 }
594599
595600 /**
596601 * Register to receive notifications about general keyguard information
597602 * (see {@link InfoCallback}.
598- * @param callback The callback.
603+ * @param callback The callback to register
599604 */
600605 public void registerCallback (KeyguardUpdateMonitorCallback callback ) {
601- if (!mCallbacks .contains (callback )) {
602- mCallbacks .add (new WeakReference <KeyguardUpdateMonitorCallback >(callback ));
603- // Notify listener of the current state
604- callback .onRefreshBatteryInfo (mBatteryStatus );
605- callback .onTimeChanged ();
606- callback .onRingerModeChanged (mRingMode );
607- callback .onPhoneStateChanged (mPhoneState );
608- callback .onRefreshCarrierInfo (mTelephonyPlmn , mTelephonySpn );
609- callback .onClockVisibilityChanged ();
610- callback .onSimStateChanged (mSimState );
611- } else {
612- if (DEBUG ) Log .e (TAG , "Object tried to add another callback" ,
613- new Exception ("Called by" ));
614- }
615-
616- // Clean up any unused references
617- for (int i = mCallbacks .size () - 1 ; i >= 0 ; i --) {
618- if (mCallbacks .get (i ).get () == null ) {
619- mCallbacks .remove (i );
606+ if (DEBUG ) Log .v (TAG , "*** register callback for " + callback );
607+ // Prevent adding duplicate callbacks
608+ for (int i = 0 ; i < mCallbacks .size (); i ++) {
609+ if (mCallbacks .get (i ).get () == callback ) {
610+ if (DEBUG ) Log .e (TAG , "Object tried to add another callback" ,
611+ new Exception ("Called by" ));
612+ return ;
620613 }
621614 }
615+ mCallbacks .add (new WeakReference <KeyguardUpdateMonitorCallback >(callback ));
616+ removeCallback (null ); // remove unused references
617+ sendUpdates (callback );
618+ }
619+
620+ private void sendUpdates (KeyguardUpdateMonitorCallback callback ) {
621+ // Notify listener of the current state
622+ callback .onRefreshBatteryInfo (mBatteryStatus );
623+ callback .onTimeChanged ();
624+ callback .onRingerModeChanged (mRingMode );
625+ callback .onPhoneStateChanged (mPhoneState );
626+ callback .onRefreshCarrierInfo (mTelephonyPlmn , mTelephonySpn );
627+ callback .onClockVisibilityChanged ();
628+ callback .onSimStateChanged (mSimState );
622629 }
623630
624631 public void reportClockVisible (boolean visible ) {
0 commit comments