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
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;
}
/**
+ * 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.
@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());
@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);
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;
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;