From 2b86d873ca4fb3a921139633ed7be9959ab452df Mon Sep 17 00:00:00 2001 From: Doris Liu Date: Thu, 26 Sep 2013 15:23:41 -0700 Subject: [PATCH] Fix memory leak of context in LocalMediaObserver Bug: 10728773 Change-Id: Ie5a50590e71fd4b853cb7590db4fa14f5b6dc73b --- src/com/android/camera/CameraActivity.java | 27 ++++++------------ .../android/camera/data/LocalMediaObserver.java | 32 ++++++++++++++-------- 2 files changed, 29 insertions(+), 30 deletions(-) diff --git a/src/com/android/camera/CameraActivity.java b/src/com/android/camera/CameraActivity.java index 83314f061..21be8e740 100644 --- a/src/com/android/camera/CameraActivity.java +++ b/src/com/android/camera/CameraActivity.java @@ -175,8 +175,6 @@ public class CameraActivity extends Activity private Intent mPanoramaShareIntent; private LocalMediaObserver mLocalImagesObserver; private LocalMediaObserver mLocalVideosObserver; - private boolean mActivityPaused; - private boolean mMediaDataChangedDuringPause; private final int DEFAULT_SYSTEM_UI_VISIBILITY = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION; @@ -986,8 +984,8 @@ public class CameraActivity extends Activity setupNfcBeamPush(); - mLocalImagesObserver = new LocalMediaObserver(mMainHandler, this); - mLocalVideosObserver = new LocalMediaObserver(mMainHandler, this); + mLocalImagesObserver = new LocalMediaObserver(); + mLocalVideosObserver = new LocalMediaObserver(); getContentResolver().registerContentObserver( MediaStore.Images.Media.EXTERNAL_CONTENT_URI, true, @@ -1035,7 +1033,9 @@ public class CameraActivity extends Activity mCurrentModule.onPauseBeforeSuper(); super.onPause(); mCurrentModule.onPauseAfterSuper(); - mActivityPaused = true; + + mLocalImagesObserver.setActivityPaused(true); + mLocalVideosObserver.setActivityPaused(true); } @Override @@ -1075,11 +1075,12 @@ public class CameraActivity extends Activity // than the preview. mResetToPreviewOnResume = true; - mActivityPaused = false; - if (mMediaDataChangedDuringPause) { + if (mLocalVideosObserver.isMediaDataChangedDuringPause() + || mLocalImagesObserver.isMediaDataChangedDuringPause()) { mDataAdapter.requestLoad(getContentResolver()); - mMediaDataChangedDuringPause = false; } + mLocalImagesObserver.setActivityPaused(false); + mLocalVideosObserver.setActivityPaused(false); } @Override @@ -1448,14 +1449,4 @@ public class CameraActivity extends Activity public CameraOpenErrorCallback getCameraOpenErrorCallback() { return mCameraOpenErrorCallback; } - - /** - * When the activity is paused and MediaObserver get onChange() call, then - * we would like to set a dirty bit to reload the data at onResume(). - */ - public void setDirtyWhenPaused() { - if (mActivityPaused && !mMediaDataChangedDuringPause) { - mMediaDataChangedDuringPause = true; - } - } } diff --git a/src/com/android/camera/data/LocalMediaObserver.java b/src/com/android/camera/data/LocalMediaObserver.java index 4dd0f8897..d676396a7 100644 --- a/src/com/android/camera/data/LocalMediaObserver.java +++ b/src/com/android/camera/data/LocalMediaObserver.java @@ -17,10 +17,6 @@ package com.android.camera.data; import android.database.ContentObserver; -import android.net.Uri; -import android.os.Handler; - -import com.android.camera.CameraActivity; /** * Listening to the changes to the local image and video data. onChange will @@ -28,20 +24,32 @@ import com.android.camera.CameraActivity; */ public class LocalMediaObserver extends ContentObserver { - private final CameraActivity mActivity; + private boolean mActivityPaused = false; + private boolean mMediaDataChangedDuringPause = false; - public LocalMediaObserver(Handler handler, CameraActivity activity) { - super(handler); - mActivity = activity; + public LocalMediaObserver() { + super(null); } + /** + * When the activity is paused and MediaObserver get onChange() call, then + * we would like to set a dirty bit to reload the data at onResume(). + */ @Override public void onChange(boolean selfChange) { - this.onChange(selfChange, null); + if (mActivityPaused) { + mMediaDataChangedDuringPause = true; + } } - @Override - public void onChange(boolean selfChange, Uri uri) { - mActivity.setDirtyWhenPaused(); + public void setActivityPaused(boolean paused) { + mActivityPaused = paused; + if (!paused) { + mMediaDataChangedDuringPause = false; + } + } + + public boolean isMediaDataChangedDuringPause() { + return mMediaDataChangedDuringPause; } } -- 2.11.0