summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGaoxiang Chen <gaochen@codeaurora.org>2014-04-16 15:15:05 +0800
committerGerrit - the friendly Code Review server <code-review@localhost>2014-04-24 19:54:28 -0700
commitd29d0d636ad8eebd3f1d5b9baed5741c5fe95d0d (patch)
treede4eb9e8e6b35775f5f1212f1a10be3c71d2fed3
parent4180872a42f636db1d6c4b6e68a08bef95e189ee (diff)
downloadandroid_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
-rw-r--r--jni/feature_mos/src/mosaic/Mosaic.cpp4
-rw-r--r--src/com/android/camera/CameraActivity.java1
-rw-r--r--src/com/android/camera/PhotoModule.java33
-rw-r--r--src/com/android/camera/WideAnglePanoramaUI.java1
-rw-r--r--src/com/android/camera/app/AppManagerFactory.java2
5 files changed, 31 insertions, 10 deletions
diff --git a/jni/feature_mos/src/mosaic/Mosaic.cpp b/jni/feature_mos/src/mosaic/Mosaic.cpp
index 7b96fa5c5..9388b0a87 100644
--- a/jni/feature_mos/src/mosaic/Mosaic.cpp
+++ b/jni/feature_mos/src/mosaic/Mosaic.cpp
@@ -39,7 +39,7 @@ Mosaic::Mosaic()
Mosaic::~Mosaic()
{
- for (int i = 0; i < frames_size; i++)
+ for (int i = 0; i < max_frames; i++)
{
if (frames[i])
delete frames[i];
@@ -77,7 +77,9 @@ int Mosaic::initialize(int blendingType, int stripType, int width, int height, i
imageMosaicYVU = NULL;
frames = new MosaicFrame *[max_frames];
+ memset(frames, 0, sizeof(MosaicFrame *) * max_frames);
rframes = new MosaicFrame *[max_frames];
+ memset(rframes, 0, sizeof(MosaicFrame *) * max_frames);
if(nframes>-1)
{
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;
}