Keep camera preview in view hierarchy.
Camera preview is a special case that needs to be kept to avoid unnecessary
start and stop preview.
Change-Id: I6c922d4b35ff86981fa6a3ec3b76417d07a68a0e
diff --git a/src/com/android/camera/ui/FilmStripView.java b/src/com/android/camera/ui/FilmStripView.java
index f18bba1..b2e36e4 100644
--- a/src/com/android/camera/ui/FilmStripView.java
+++ b/src/com/android/camera/ui/FilmStripView.java
@@ -56,6 +56,9 @@
private Listener mListener;
+ private View mCameraView;
+ private ImageData mCameraData;
+
// This is used to resolve the misalignment problem when the device
// orientation is changed. If the current item is in fullscreen, it might
// be shifted because mCenterX is not adjusted with the orientation.
@@ -338,15 +341,20 @@
View v = mDataAdapter.getView(mContext, dataID);
if (v == null) return null;
ViewInfo info = new ViewInfo(dataID, v);
- addView(info.getView());
+ v = info.getView();
+ if (v != mCameraView) {
+ addView(info.getView());
+ } else {
+ v.setVisibility(View.VISIBLE);
+ }
return info;
}
private void removeInfo(int infoID) {
if (infoID >= mViewInfo.length || mViewInfo[infoID] == null) return;
- removeView(mViewInfo[infoID].getView());
- mDataAdapter.getImageData(mViewInfo[infoID].getID()).recycle();
+ ImageData data = mDataAdapter.getImageData(mViewInfo[infoID].getID());
+ checkForRemoval(data, mViewInfo[infoID].getView());
mViewInfo[infoID] = null;
}
@@ -464,6 +472,23 @@
layoutChildren();
}
+ // Keeps the view in the view hierarchy if it's camera preview.
+ // Remove from the hierarchy otherwise.
+ private void checkForRemoval(ImageData data, View v) {
+ if (data.getType() != ImageData.TYPE_CAMERA_PREVIEW) {
+ removeView(v);
+ data.recycle();
+ } else {
+ v.setVisibility(View.INVISIBLE);
+ if (mCameraView != null && mCameraView != v) {
+ removeView(mCameraView);
+ mCameraData = null;
+ }
+ mCameraView = v;
+ mCameraData = data;
+ }
+ }
+
private void slideViewBack(View v) {
v.animate()
.translationX(0)
@@ -557,8 +582,7 @@
.withEndAction(new Runnable() {
@Override
public void run() {
- removeView(removedView);
- data.recycle();
+ checkForRemoval(data, removedView);
}
})
.start();