diff options
author | Sascha Haeberling <haeberling@google.com> | 2014-10-17 19:05:12 -0700 |
---|---|---|
committer | Sascha Haeberling <haeberling@google.com> | 2014-10-22 12:42:48 -0700 |
commit | 375f9d11af33688eb0074e3828c870076cfa21b3 (patch) | |
tree | 55d7d57428289b5564708ff82fefb3e5c786d0d3 /src/com/android/camera/FocusOverlayManager.java | |
parent | 05edd2eec40d2a3ce7a76dc9f4d7dfe65e576ab7 (diff) | |
download | android_packages_apps_Camera2-375f9d11af33688eb0074e3828c870076cfa21b3.tar.gz android_packages_apps_Camera2-375f9d11af33688eb0074e3828c870076cfa21b3.tar.bz2 android_packages_apps_Camera2-375f9d11af33688eb0074e3828c870076cfa21b3.zip |
Stop activity leaks
Bug: 12805279
This CL fixes all known activity leaks that occur from our
app. One leak remains that is caused by Camera Framework and
is tracked under b/18077200.
For details on how to find and chase these leaks down, see
http://go/camera-activity-leaks
Change-Id: I9608e2fcf77fe97528b883ed40e0c08bbbf45bdf
Diffstat (limited to 'src/com/android/camera/FocusOverlayManager.java')
-rw-r--r-- | src/com/android/camera/FocusOverlayManager.java | 27 |
1 files changed, 22 insertions, 5 deletions
diff --git a/src/com/android/camera/FocusOverlayManager.java b/src/com/android/camera/FocusOverlayManager.java index 1c5e00ace..4e4d54c7e 100644 --- a/src/com/android/camera/FocusOverlayManager.java +++ b/src/com/android/camera/FocusOverlayManager.java @@ -38,6 +38,7 @@ import com.android.camera.util.CameraUtil; import com.android.camera.util.UsageStatistics; import com.android.ex.camera2.portability.CameraCapabilities; +import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.List; @@ -133,17 +134,33 @@ public class FocusOverlayManager implements PreviewStatusListener.PreviewAreaCha public void setFocusParameters(); } - private class MainHandler extends Handler { - public MainHandler(Looper looper) { + /** + * TODO: Refactor this so that we either don't need a handler or make + * mListener not be the activity. + */ + private static class MainHandler extends Handler { + /** + * The outer mListener at the moment is actually the CameraActivity, + * which we would leak if we didn't break the GC path here using a + * WeakReference. + */ + final WeakReference<FocusOverlayManager> mManager; + public MainHandler(FocusOverlayManager manager, Looper looper) { super(looper); + mManager = new WeakReference<FocusOverlayManager>(manager); } @Override public void handleMessage(Message msg) { + FocusOverlayManager manager = mManager.get(); + if (manager == null) { + return; + } + switch (msg.what) { case RESET_TOUCH_FOCUS: { - cancelAutoFocus(); - mListener.startFaceDetection(); + manager.cancelAutoFocus(); + manager.mListener.startFaceDetection(); break; } } @@ -155,7 +172,7 @@ public class FocusOverlayManager implements PreviewStatusListener.PreviewAreaCha Listener listener, boolean mirror, Looper looper, FocusUI ui) { mAppController = appController; mSettingsManager = appController.getSettingsManager(); - mHandler = new MainHandler(looper); + mHandler = new MainHandler(this, looper); mMatrix = new Matrix(); mDefaultFocusModes = new ArrayList<CameraCapabilities.FocusMode>(defaultFocusModes); updateCapabilities(capabilities); |