summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorSuman Mukherjee <sumam@codeaurora.org>2014-06-09 17:17:44 +0530
committerSuman Mukherjee <sumam@codeaurora.org>2014-06-09 17:17:44 +0530
commitbfdbd64ee7e4bbfead91366ccea218258a8ec845 (patch)
tree53c09ca1531fdd72c8e8080447b55ae6a32cf581 /src
parent24a14562871c2f3277aadb5b0388ebf5b5e278dd (diff)
downloadandroid_packages_apps_Snap-bfdbd64ee7e4bbfead91366ccea218258a8ec845.tar.gz
android_packages_apps_Snap-bfdbd64ee7e4bbfead91366ccea218258a8ec845.tar.bz2
android_packages_apps_Snap-bfdbd64ee7e4bbfead91366ccea218258a8ec845.zip
Camera: Mem-leak
Hprof identified memleak in localdatalist from list and hashmap Reason: removedata was not getting invoked. Fix Made: Invoke removedata from ondestroy and onresume of camera activity Cleanup bitmaps before reallocation on same variable. CRs-Fixed: 655256 Change-Id: I42d99beb7e493eea2394462ee02cbe956e86c502
Diffstat (limited to 'src')
-rw-r--r--src/com/android/camera/CameraActivity.java43
-rw-r--r--src/com/android/camera/PhotoModule.java6
-rw-r--r--src/com/android/camera/WideAnglePanoramaModule.java2
-rw-r--r--src/com/android/camera/WideAnglePanoramaUI.java2
-rw-r--r--src/com/android/camera/data/CameraDataAdapter.java19
-rw-r--r--src/com/android/camera/data/FixedFirstDataAdapter.java2
-rw-r--r--src/com/android/camera/data/LocalDataList.java10
7 files changed, 74 insertions, 10 deletions
diff --git a/src/com/android/camera/CameraActivity.java b/src/com/android/camera/CameraActivity.java
index 5b8cf06d4..1f3a12146 100644
--- a/src/com/android/camera/CameraActivity.java
+++ b/src/com/android/camera/CameraActivity.java
@@ -144,9 +144,9 @@ public class CameraActivity extends Activity
private static final int SUPPORT_ALL = 0xffffffff;
/** This data adapter is used by FilmStripView. */
- private LocalDataAdapter mDataAdapter;
+ private LocalDataAdapter mDataAdapter = null;
/** This data adapter represents the real local camera data. */
- private LocalDataAdapter mWrappedDataAdapter;
+ private LocalDataAdapter mWrappedDataAdapter = null;
private PanoramaStitchingManager mPanoramaManager;
private PlaceholderManager mPlaceholderManager;
@@ -1239,6 +1239,35 @@ public class CameraActivity extends Activity
@Override
public void onResume() {
+ if (!mSecureCamera) {
+ if (mWrappedDataAdapter == null) {
+ mWrappedDataAdapter = new FixedFirstDataAdapter(
+ new CameraDataAdapter(new ColorDrawable(
+ getResources().getColor(R.color.photo_placeholder))),
+ mCameraPreviewData);
+ }
+ mDataAdapter = mWrappedDataAdapter;
+ mFilmStripView.setDataAdapter(mDataAdapter);
+ if (!isCaptureIntent()) {
+ mDataAdapter.requestLoad(getContentResolver());
+ }
+ } else {
+ ImageView v = (ImageView) getLayoutInflater().inflate(
+ R.layout.secure_album_placeholder, null);
+ if (mDataAdapter == null) {
+ mDataAdapter = new FixedLastDataAdapter(
+ mWrappedDataAdapter,
+ new SimpleViewData(
+ v,
+ v.getDrawable().getIntrinsicWidth(),
+ v.getDrawable().getIntrinsicHeight(),
+ 0, 0));
+ }
+ // Flush out all the original data.
+ mDataAdapter.flush();
+ mFilmStripView.setDataAdapter(mDataAdapter);
+ }
+
// TODO: Handle this in OrientationManager.
// Auto-rotate off
if (Settings.System.getInt(getContentResolver(),
@@ -1299,12 +1328,22 @@ public class CameraActivity extends Activity
@Override
protected void onStop() {
super.onStop();
+ if (mDataAdapter != null) {
+ mDataAdapter.removeData(CameraActivity.this,-1);
+ }
+ mDataAdapter = null;
+ mWrappedDataAdapter = null;
mPanoramaViewHelper.onStop();
unbindMediaSaveService();
}
@Override
public void onDestroy() {
+
+ if (mDataAdapter != null) {
+ mDataAdapter.removeData(CameraActivity.this,-1);
+ }
+
if (mSecureCamera) {
unregisterReceiver(mScreenOffReceiver);
}
diff --git a/src/com/android/camera/PhotoModule.java b/src/com/android/camera/PhotoModule.java
index c71cb4d84..4a0b38f8b 100644
--- a/src/com/android/camera/PhotoModule.java
+++ b/src/com/android/camera/PhotoModule.java
@@ -3281,7 +3281,7 @@ class JpegEncodingQualityMappings {
}
class GraphView extends View {
- private Bitmap mBitmap;
+ private Bitmap mBitmap = null;
private Paint mPaint = new Paint();
private Paint mPaintRect = new Paint();
private Canvas mCanvas = new Canvas();
@@ -3304,6 +3304,10 @@ class GraphView extends View {
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
+ if (mBitmap != null) {
+ mBitmap.recycle();
+ mBitmap = null;
+ }
mBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.RGB_565);
mCanvas.setBitmap(mBitmap);
mWidth = w;
diff --git a/src/com/android/camera/WideAnglePanoramaModule.java b/src/com/android/camera/WideAnglePanoramaModule.java
index f6daa6019..16fc8bf10 100644
--- a/src/com/android/camera/WideAnglePanoramaModule.java
+++ b/src/com/android/camera/WideAnglePanoramaModule.java
@@ -91,7 +91,7 @@ public class WideAnglePanoramaModule
private ContentResolver mContentResolver;
private WideAnglePanoramaUI mUI;
- private MosaicPreviewRenderer mMosaicPreviewRenderer;
+ private MosaicPreviewRenderer mMosaicPreviewRenderer = null;
private Object mRendererLock = new Object();
private Object mWaitObject = new Object();
diff --git a/src/com/android/camera/WideAnglePanoramaUI.java b/src/com/android/camera/WideAnglePanoramaUI.java
index f41653982..c2a31a987 100644
--- a/src/com/android/camera/WideAnglePanoramaUI.java
+++ b/src/com/android/camera/WideAnglePanoramaUI.java
@@ -276,6 +276,8 @@ public class WideAnglePanoramaUI implements
}
mReview.setImageBitmap(bitmap);
+ bitmap.recycle();
+ bitmap = null;
mCaptureLayout.setVisibility(View.GONE);
mReviewLayout.setVisibility(View.VISIBLE);
}
diff --git a/src/com/android/camera/data/CameraDataAdapter.java b/src/com/android/camera/data/CameraDataAdapter.java
index 4643d03bf..ac61934fc 100644
--- a/src/com/android/camera/data/CameraDataAdapter.java
+++ b/src/com/android/camera/data/CameraDataAdapter.java
@@ -44,7 +44,7 @@ public class CameraDataAdapter implements LocalDataAdapter {
private static final int DEFAULT_DECODE_SIZE = 1600;
private static final String[] CAMERA_PATH = { Storage.DIRECTORY + "/%" ,SDCard.instance().getDirectory() + "/%"};
- private LocalDataList mImages;
+ private LocalDataList mImages = null;
private Listener mListener;
private Drawable mPlaceHolder;
@@ -124,11 +124,18 @@ public class CameraDataAdapter implements LocalDataAdapter {
@Override
public void removeData(Context c, int dataID) {
if (dataID >= mImages.size()) return;
- LocalData d = mImages.remove(dataID);
- // Delete previously removed data first.
- executeDeletion(c);
- mLocalDataToDelete = d;
- mListener.onDataRemoved(dataID, d);
+ if (dataID == -1) {
+ if ( (mImages != null) && (mImages.size() > 0) ) {
+ mImages.cleanup();
+ mImages = null;
+ }
+ } else {
+ LocalData d = mImages.remove(dataID);
+ // Delete previously removed data first.
+ executeDeletion(c);
+ mLocalDataToDelete = d;
+ mListener.onDataRemoved(dataID, d);
+ }
}
// TODO: put the database query on background thread
diff --git a/src/com/android/camera/data/FixedFirstDataAdapter.java b/src/com/android/camera/data/FixedFirstDataAdapter.java
index e26ec2785..f89f1ca94 100644
--- a/src/com/android/camera/data/FixedFirstDataAdapter.java
+++ b/src/com/android/camera/data/FixedFirstDataAdapter.java
@@ -67,6 +67,8 @@ public class FixedFirstDataAdapter extends AbstractLocalDataAdapterWrapper
public void removeData(Context context, int dataID) {
if (dataID > 0) {
mAdapter.removeData(context, dataID - 1);
+ } else {
+ mAdapter.removeData(context, dataID);
}
}
diff --git a/src/com/android/camera/data/LocalDataList.java b/src/com/android/camera/data/LocalDataList.java
index 3ccc4de54..7e6fc453d 100644
--- a/src/com/android/camera/data/LocalDataList.java
+++ b/src/com/android/camera/data/LocalDataList.java
@@ -64,6 +64,16 @@ public class LocalDataList {
return mUriMap.get(uri);
}
+ public void cleanup() {
+ if ((mList != null) && (mList.size() > 0)) {
+ for(int i=0;i<mList.size();i++) {
+ remove(i);
+ }
+ }
+ mList = null;
+ mUriMap = null;
+ }
+
public void set(int pos, LocalData data) {
mList.set(pos, data);
mUriMap.put(data.getContentUri(), data);