summaryrefslogtreecommitdiffstats
path: root/src/com/android/camera/FocusOverlayManager.java
diff options
context:
space:
mode:
authorSascha Haeberling <haeberling@google.com>2014-10-17 19:05:12 -0700
committerSascha Haeberling <haeberling@google.com>2014-10-22 12:42:48 -0700
commit375f9d11af33688eb0074e3828c870076cfa21b3 (patch)
tree55d7d57428289b5564708ff82fefb3e5c786d0d3 /src/com/android/camera/FocusOverlayManager.java
parent05edd2eec40d2a3ce7a76dc9f4d7dfe65e576ab7 (diff)
downloadandroid_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.java27
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);