Merge "Avoid memory leak by only registering callback while attached to window." into jb-dev
diff --git a/core/java/android/app/MediaRouteButton.java b/core/java/android/app/MediaRouteButton.java
index 5863ad0..65f9f87 100644
--- a/core/java/android/app/MediaRouteButton.java
+++ b/core/java/android/app/MediaRouteButton.java
@@ -39,6 +39,8 @@
     private final MediaRouteCallback mRouterCallback = new MediaRouteCallback();
     private int mRouteTypes;
 
+    private boolean mAttachedToWindow;
+
     private Drawable mRemoteIndicator;
     private boolean mRemoteActive;
     private boolean mToggleMode;
@@ -132,13 +134,22 @@
             // 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() {
@@ -214,6 +225,25 @@
     }
 
     @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);
         final int heightSize = MeasureSpec.getSize(heightMeasureSpec);