OSDN Git Service

Fix transform issue in CaptureIntent.
authorSenpo Hu <senpo@google.com>
Fri, 12 Jun 2015 23:20:46 +0000 (16:20 -0700)
committerSenpo Hu <senpo@google.com>
Thu, 25 Jun 2015 17:32:07 +0000 (13:32 -0400)
On M, EventOnTextureViewLayoutChanged comes earlier during app
initialization in StateForeground which doesn't handle it. So
here in StateReadyForCapture, we pull the current preview layout
size and inform ResourceSurfaceTexture to allow it to calculate
transform.

Noted that we also need to bring this fix to Ivvavik.

Bug: 21786937
Bug: 20173626
Change-Id: I417aef2f09247e77059fc5b066cbf10602ce5cf1

src/com/android/camera/captureintent/CaptureIntentModuleUI.java
src/com/android/camera/captureintent/resource/ResourceSurfaceTextureImpl.java
src/com/android/camera/captureintent/state/StateReadyForCapture.java

index 5f518a4..7402181 100644 (file)
@@ -25,6 +25,7 @@ import com.android.camera.ui.PreviewStatusListener;
 import com.android.camera.ui.ProgressOverlay;
 import com.android.camera.ui.focus.FocusRing;
 import com.android.camera.util.AndroidServices;
+import com.android.camera.util.Size;
 import com.android.camera2.R;
 
 import android.graphics.Bitmap;
@@ -112,6 +113,13 @@ public class CaptureIntentModuleUI {
     }
 
     /**
+     * Obtains the current preview layout size.
+     */
+    public Size getPreviewSurfaceSize() {
+        return new Size(mAppUI.getSurfaceWidth(), mAppUI.getSurfaceHeight());
+    }
+
+    /**
      * Configures the bottom bar UI.
      *
      * @param hardwareSpec The hardware spec.
index c980f94..a4e63e7 100644 (file)
@@ -96,7 +96,20 @@ public class ResourceSurfaceTextureImpl implements ResourceSurfaceTexture {
     @Override
     public void setPreviewSize(Size previewSize) {
         // Update preview transform when preview stream size is changed.
-        mPreviewSize = previewSize;
+        if (!mPreviewSize.equals(previewSize)) {
+            mPreviewSize = previewSize;
+
+            /**
+             * Update transform here since preview size might change when
+             * switching between back and front camera.
+             */
+            mResourceConstructed.get().getMainThread().execute(new Runnable() {
+                @Override
+                public void run() {
+                    updatePreviewTransform();
+                }
+            });
+        }
 
         // Update surface texture's default buffer size. See b/17286155.
         mSurfaceTexture.setDefaultBufferSize(mPreviewSize.width(), mPreviewSize.height());
@@ -124,10 +137,15 @@ public class ResourceSurfaceTextureImpl implements ResourceSurfaceTexture {
     @Override
     public void updatePreviewTransform() {
         MainThread.checkMainThread();
-        if (mPreviewSize.getWidth() == 0 || mPreviewSize.getHeight() == 0 ||
-                mPreviewLayoutSize.getWidth() == 0 || mPreviewLayoutSize.getHeight() == 0) {
+        if (mPreviewSize.getWidth() == 0 || mPreviewSize.getHeight() == 0) {
+            Log.w(TAG, "Do nothing since mPreviewSize is 0");
+            return;
+        }
+        if (mPreviewLayoutSize.getWidth() == 0 || mPreviewLayoutSize.getHeight() == 0) {
+            Log.w(TAG, "Do nothing since mPreviewLayoutSize is 0");
             return;
         }
+
         Matrix transformMatrix = mPreviewTransformCalculator.toTransformMatrix(
                 mPreviewLayoutSize, mPreviewSize);
         mResourceConstructed.get().getModuleUI().updatePreviewTransform(transformMatrix);
index 481c039..d4fb5e8 100644 (file)
@@ -65,6 +65,8 @@ import com.android.camera.settings.SettingsManager;
 import com.android.camera.ui.CountDownView;
 import com.android.camera.ui.TouchCoordinate;
 import com.android.camera.ui.focus.FocusController;
+import com.android.camera.util.Size;
+
 import com.google.common.base.Optional;
 
 import javax.annotation.Nullable;
@@ -224,8 +226,15 @@ public final class StateReadyForCapture extends StateImpl {
                     public Optional<State> processEvent(EventOnSurfaceTextureUpdated event) {
                         if (mShouldUpdateTransformOnNextSurfaceTextureUpdate) {
                             mShouldUpdateTransformOnNextSurfaceTextureUpdate = false;
+
+                            // We have to provide a preview layout size to
+                            // ResourceSurfaceTexture. Otherwise, it will
+                            // not be able to calculate transform matrix.
+                            Size previewSurfaceSize = mResourceCaptureTools.get().getModuleUI()
+                                    .getPreviewSurfaceSize();
                             mResourceCaptureTools.get().getResourceSurfaceTexture().get()
-                                    .updatePreviewTransform();
+                                    .setPreviewLayoutSize(previewSurfaceSize);
+
                             removeEventHandler(EventOnSurfaceTextureUpdated.class);
                         }
                         return NO_CHANGE;