From d29d0d636ad8eebd3f1d5b9baed5741c5fe95d0d Mon Sep 17 00:00:00 2001 From: Gaoxiang Chen Date: Wed, 16 Apr 2014 15:15:05 +0800 Subject: 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 --- src/com/android/camera/CameraActivity.java | 1 + src/com/android/camera/PhotoModule.java | 33 +++++++++++++++++------ src/com/android/camera/WideAnglePanoramaUI.java | 1 + src/com/android/camera/app/AppManagerFactory.java | 2 +- 4 files changed, 28 insertions(+), 9 deletions(-) (limited to 'src') 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; } -- cgit v1.2.3