From 101c44915259fb76d14f917712a51fb0b08a7594 Mon Sep 17 00:00:00 2001 From: Jack Palevich Date: Fri, 22 Jun 2012 16:06:57 +0800 Subject: [PATCH] Avoid memory leak by only registering callback while attached to window. Bug: 6710307 Change-Id: Idf57251e6feb48ec3e75e797144ff800fa874cc8 --- core/java/android/app/MediaRouteButton.java | 34 +++++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) diff --git a/core/java/android/app/MediaRouteButton.java b/core/java/android/app/MediaRouteButton.java index 18713f5ce06ce..8f2cb74d078e7 100644 --- a/core/java/android/app/MediaRouteButton.java +++ b/core/java/android/app/MediaRouteButton.java @@ -38,6 +38,8 @@ public class MediaRouteButton extends View { private final MediaRouteCallback mRouterCallback = new MediaRouteCallback(); private int mRouteTypes; + private boolean mAttachedToWindow; + private Drawable mRemoteIndicator; private boolean mRemoteActive; private boolean mToggleMode; @@ -131,13 +133,22 @@ public class MediaRouteButton extends View { // Already registered; nothing to do. return; } - if (mRouteTypes != 0) { + + if (mAttachedToWindow && mRouteTypes != 0) { mRouter.removeCallback(mRouterCallback); } + mRouteTypes = types; + + if (mAttachedToWindow) { + updateRouteInfo(); + mRouter.addCallback(types, mRouterCallback); + } + } + + private void updateRouteInfo() { updateRemoteIndicator(); updateRouteCount(); - mRouter.addCallback(types, mRouterCallback); } public int getRouteTypes() { @@ -207,6 +218,25 @@ public class MediaRouteButton extends View { } } + @Override + public void onAttachedToWindow() { + super.onAttachedToWindow(); + mAttachedToWindow = true; + if (mRouteTypes != 0) { + mRouter.addCallback(mRouteTypes, mRouterCallback); + updateRouteInfo(); + } + } + + @Override + public void onDetachedFromWindow() { + if (mRouteTypes != 0) { + mRouter.removeCallback(mRouterCallback); + } + mAttachedToWindow = false; + super.onDetachedFromWindow(); + } + @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { final int widthSize = MeasureSpec.getSize(widthMeasureSpec);