Skip to content

Commit d2d4a64

Browse files
Jim MillerAndroid (Google) Code Review
authored andcommitted
Merge "Keep local reference to KeyguardStatusViewManager so it doesn't get GC'd" into jb-mr1-dev
2 parents e7376e2 + 6212cc0 commit d2d4a64

File tree

3 files changed

+34
-26
lines changed

3 files changed

+34
-26
lines changed

policy/src/com/android/internal/policy/impl/keyguard/KeyguardSelectorView.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,6 @@ protected void onFinishInflate() {
149149
mGlowPadView = (GlowPadView) findViewById(R.id.glow_pad_view);
150150
mGlowPadView.setOnTriggerListener(mOnTriggerListener);
151151
mEmergencyCallButton = (Button) findViewById(R.id.emergency_call_button);
152-
KeyguardUpdateMonitor.getInstance(getContext()).registerCallback(mInfoCallback);
153152
updateTargets();
154153
}
155154

policy/src/com/android/internal/policy/impl/keyguard/KeyguardStatusView.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@
2121
import android.widget.GridLayout;
2222

2323
public class KeyguardStatusView extends GridLayout {
24+
private KeyguardStatusViewManager mStatusViewManager;
25+
2426
public KeyguardStatusView(Context context) {
2527
this(context, null, 0);
2628
}
@@ -38,7 +40,7 @@ protected void onFinishInflate() {
3840
super.onFinishInflate();
3941

4042
// StatusView manages all of the widgets in this view.
41-
new KeyguardStatusViewManager(this);
43+
mStatusViewManager = new KeyguardStatusViewManager(this);
4244
}
4345

4446
}

policy/src/com/android/internal/policy/impl/keyguard/KeyguardUpdateMonitor.java

Lines changed: 31 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)