diff options
author | Gaoxiang Chen <gaochen@codeaurora.org> | 2014-04-16 15:15:05 +0800 |
---|---|---|
committer | Gerrit - the friendly Code Review server <code-review@localhost> | 2014-04-24 19:54:28 -0700 |
commit | d29d0d636ad8eebd3f1d5b9baed5741c5fe95d0d (patch) | |
tree | de4eb9e8e6b35775f5f1212f1a10be3c71d2fed3 /src/com/android | |
parent | 4180872a42f636db1d6c4b6e68a08bef95e189ee (diff) | |
download | android_packages_apps_Snap-d29d0d636ad8eebd3f1d5b9baed5741c5fe95d0d.tar.gz android_packages_apps_Snap-d29d0d636ad8eebd3f1d5b9baed5741c5fe95d0d.tar.bz2 android_packages_apps_Snap-d29d0d636ad8eebd3f1d5b9baed5741c5fe95d0d.zip |
Camera2: Fix camera application memory leak
This change fix potential memory leak of camera application
when swith between camera and panorama:
1. free allocated frames in jni/Mosaic
2. use application context instead of acitivity context
3. clear disappearing children of ViewGroup explicitly
4. remove IdleHandler during camera exit
CRs-fixed: 622518
Change-Id: I2583709489ab2cf1fc20865fe7d2a8f56f2763c9
Diffstat (limited to 'src/com/android')
-rw-r--r-- | src/com/android/camera/CameraActivity.java | 1 | ||||
-rw-r--r-- | src/com/android/camera/PhotoModule.java | 33 | ||||
-rw-r--r-- | src/com/android/camera/WideAnglePanoramaUI.java | 1 | ||||
-rw-r--r-- | src/com/android/camera/app/AppManagerFactory.java | 2 |
4 files changed, 28 insertions, 9 deletions
diff --git a/src/com/android/camera/CameraActivity.java b/src/com/android/camera/CameraActivity.java index 7c8e911d0..cd0511536 100644 --- a/src/com/android/camera/CameraActivity.java +++ b/src/com/android/camera/CameraActivity.java @@ -1514,6 +1514,7 @@ public class CameraActivity extends Activity module.onPauseBeforeSuper(); module.onPauseAfterSuper(); ((ViewGroup) mCameraModuleRootView).removeAllViews(); + ((ViewGroup) mCameraModuleRootView).clearDisappearingChildren(); } private void performDeletion() { diff --git a/src/com/android/camera/PhotoModule.java b/src/com/android/camera/PhotoModule.java index d889ad4fc..1d3fb7ad4 100644 --- a/src/com/android/camera/PhotoModule.java +++ b/src/com/android/camera/PhotoModule.java @@ -302,6 +302,7 @@ public class PhotoModule private String mCurrTouchAfAec = Parameters.TOUCH_AF_AEC_ON; private final Handler mHandler = new MainHandler(); + private MessageQueue.IdleHandler mIdleHandler = null; private PreferenceGroup mPreferenceGroup; @@ -718,6 +719,7 @@ public class PhotoModule } mFirstTimeInitialized = true; + Log.d(TAG, "addIdleHandler in first time initialization"); addIdleHandler(); mActivity.updateStorageSpaceAndHint(); @@ -752,14 +754,26 @@ public class PhotoModule } private void addIdleHandler() { - MessageQueue queue = Looper.myQueue(); - queue.addIdleHandler(new MessageQueue.IdleHandler() { - @Override - public boolean queueIdle() { - Storage.ensureOSXCompatible(); - return false; - } - }); + if (mIdleHandler == null) { + mIdleHandler = new MessageQueue.IdleHandler() { + @Override + public boolean queueIdle() { + Storage.ensureOSXCompatible(); + return false; + } + }; + + MessageQueue queue = Looper.myQueue(); + queue.addIdleHandler(mIdleHandler); + } + } + + private void removeIdleHandler() { + if (mIdleHandler != null) { + MessageQueue queue = Looper.myQueue(); + queue.removeIdleHandler(mIdleHandler); + mIdleHandler = null; + } } @Override @@ -1871,6 +1885,9 @@ public class PhotoModule if (msensor != null) { mSensorManager.unregisterListener(this, msensor); } + + Log.d(TAG, "remove idle handleer in onPause"); + removeIdleHandler(); } @Override diff --git a/src/com/android/camera/WideAnglePanoramaUI.java b/src/com/android/camera/WideAnglePanoramaUI.java index 2cf27576d..f41653982 100644 --- a/src/com/android/camera/WideAnglePanoramaUI.java +++ b/src/com/android/camera/WideAnglePanoramaUI.java @@ -290,6 +290,7 @@ public class WideAnglePanoramaUI implements mActivity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); mReviewControl.removeAllViews(); + ((ViewGroup) mReviewControl).clearDisappearingChildren(); inflater.inflate(R.layout.pano_review_control, mReviewControl, true); mRootView.bringChildToFront(mCameraControls); diff --git a/src/com/android/camera/app/AppManagerFactory.java b/src/com/android/camera/app/AppManagerFactory.java index 43d2a00cd..5cd70a796 100644 --- a/src/com/android/camera/app/AppManagerFactory.java +++ b/src/com/android/camera/app/AppManagerFactory.java @@ -29,7 +29,7 @@ public class AppManagerFactory { public static synchronized AppManagerFactory getInstance(Context ctx) { if (sFactory == null) { - sFactory = new AppManagerFactory(ctx); + sFactory = new AppManagerFactory(ctx.getApplicationContext()); } return sFactory; } |