Merge "Add transition between LongScreenshotActivity and editor" into sc-dev

This commit is contained in:
Matt Casey
2021-04-17 02:51:07 +00:00
committed by Android (Google) Code Review
2 changed files with 72 additions and 7 deletions

View File

@@ -19,6 +19,7 @@
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:background="?android:colorBackgroundFloating" android:background="?android:colorBackgroundFloating"
android:id="@+id/root"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent">
@@ -119,4 +120,14 @@
app:layout_constraintRight_toRightOf="parent" app:layout_constraintRight_toRightOf="parent"
/> />
<ImageView
android:id="@+id/transition"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintTop_toBottomOf="@id/save"
app:layout_constraintStart_toStartOf="parent"
android:scaleType="matrix"
android:visibility="gone"
/>
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>

View File

@@ -17,10 +17,12 @@
package com.android.systemui.screenshot; package com.android.systemui.screenshot;
import android.app.Activity; import android.app.Activity;
import android.app.ActivityOptions;
import android.content.ComponentName; import android.content.ComponentName;
import android.content.Intent; import android.content.Intent;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import android.graphics.HardwareRenderer; import android.graphics.HardwareRenderer;
import android.graphics.Matrix;
import android.graphics.RecordingCanvas; import android.graphics.RecordingCanvas;
import android.graphics.Rect; import android.graphics.Rect;
import android.graphics.RenderNode; import android.graphics.RenderNode;
@@ -33,8 +35,12 @@ import android.text.TextUtils;
import android.util.Log; import android.util.Log;
import android.view.ScrollCaptureResponse; import android.view.ScrollCaptureResponse;
import android.view.View; import android.view.View;
import android.view.Window;
import android.widget.ImageView; import android.widget.ImageView;
import androidx.constraintlayout.widget.ConstraintLayout;
import com.android.internal.app.ChooserActivity;
import com.android.internal.logging.UiEventLogger; import com.android.internal.logging.UiEventLogger;
import com.android.systemui.R; import com.android.systemui.R;
import com.android.systemui.dagger.qualifiers.Background; import com.android.systemui.dagger.qualifiers.Background;
@@ -62,6 +68,8 @@ public class LongScreenshotActivity extends Activity {
public static final String EXTRA_CAPTURE_RESPONSE = "capture-response"; public static final String EXTRA_CAPTURE_RESPONSE = "capture-response";
private static final String KEY_SAVED_IMAGE_PATH = "saved-image-path"; private static final String KEY_SAVED_IMAGE_PATH = "saved-image-path";
private static final boolean USE_SHARED_ELEMENT = false;
private final UiEventLogger mUiEventLogger; private final UiEventLogger mUiEventLogger;
private final Executor mUiExecutor; private final Executor mUiExecutor;
private final Executor mBackgroundExecutor; private final Executor mBackgroundExecutor;
@@ -69,6 +77,7 @@ public class LongScreenshotActivity extends Activity {
private final LongScreenshotHolder mLongScreenshotHolder; private final LongScreenshotHolder mLongScreenshotHolder;
private ImageView mPreview; private ImageView mPreview;
private ImageView mTransitionView;
private View mSave; private View mSave;
private View mEdit; private View mEdit;
private View mShare; private View mShare;
@@ -81,6 +90,7 @@ public class LongScreenshotActivity extends Activity {
private ListenableFuture<ImageLoader.Result> mCacheLoadFuture; private ListenableFuture<ImageLoader.Result> mCacheLoadFuture;
private LongScreenshot mLongScreenshot; private LongScreenshot mLongScreenshot;
private boolean mTransitionStarted;
private enum PendingAction { private enum PendingAction {
SHARE, SHARE,
@@ -103,8 +113,8 @@ public class LongScreenshotActivity extends Activity {
@Override @Override
public void onCreate(Bundle savedInstanceState) { public void onCreate(Bundle savedInstanceState) {
Log.d(TAG, "onCreate(savedInstanceState = " + savedInstanceState + ")"); Log.d(TAG, "onCreate(savedInstanceState = " + savedInstanceState + ")");
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
getWindow().requestFeature(Window.FEATURE_ACTIVITY_TRANSITIONS);
setContentView(R.layout.long_screenshot); setContentView(R.layout.long_screenshot);
mPreview = requireViewById(R.id.preview); mPreview = requireViewById(R.id.preview);
@@ -114,6 +124,7 @@ public class LongScreenshotActivity extends Activity {
mCropView = requireViewById(R.id.crop_view); mCropView = requireViewById(R.id.crop_view);
mMagnifierView = requireViewById(R.id.magnifier); mMagnifierView = requireViewById(R.id.magnifier);
mCropView.setCropInteractionListener(mMagnifierView); mCropView.setCropInteractionListener(mMagnifierView);
mTransitionView = requireViewById(R.id.transition);
mSave.setOnClickListener(this::onClicked); mSave.setOnClickListener(this::onClicked);
mEdit.setOnClickListener(this::onClicked); mEdit.setOnClickListener(this::onClicked);
@@ -178,6 +189,7 @@ public class LongScreenshotActivity extends Activity {
Log.d(TAG, "onLongScreenshotReceived(longScreenshot=" + longScreenshot + ")"); Log.d(TAG, "onLongScreenshotReceived(longScreenshot=" + longScreenshot + ")");
mLongScreenshot = longScreenshot; mLongScreenshot = longScreenshot;
mPreview.setImageDrawable(mLongScreenshot.getDrawable()); mPreview.setImageDrawable(mLongScreenshot.getDrawable());
mTransitionView.setImageDrawable(mLongScreenshot.getDrawable());
updateImageDimensions(); updateImageDimensions();
mCropView.setVisibility(View.VISIBLE); mCropView.setVisibility(View.VISIBLE);
mMagnifierView.setDrawable(mLongScreenshot.getDrawable(), mMagnifierView.setDrawable(mLongScreenshot.getDrawable(),
@@ -249,6 +261,9 @@ public class LongScreenshotActivity extends Activity {
protected void onStop() { protected void onStop() {
Log.d(TAG, "onStop finishing=" + isFinishing()); Log.d(TAG, "onStop finishing=" + isFinishing());
super.onStop(); super.onStop();
if (mTransitionStarted) {
finish();
}
if (isFinishing()) { if (isFinishing()) {
if (mScrollCaptureResponse != null) { if (mScrollCaptureResponse != null) {
mScrollCaptureResponse.close(); mScrollCaptureResponse.close();
@@ -292,11 +307,22 @@ public class LongScreenshotActivity extends Activity {
intent.setComponent(ComponentName.unflattenFromString(editorPackage)); intent.setComponent(ComponentName.unflattenFromString(editorPackage));
} }
intent.setDataAndType(uri, "image/png"); intent.setDataAndType(uri, "image/png");
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION
| Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION); | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
startActivityAsUser(intent, UserHandle.CURRENT); if (USE_SHARED_ELEMENT) {
finishAndRemoveTask(); updateImageDimensions();
mTransitionView.setVisibility(View.VISIBLE);
// TODO: listen for transition completing instead of finishing onStop
mTransitionStarted = true;
startActivity(intent,
ActivityOptions.makeSceneTransitionAnimation(this, mTransitionView,
ChooserActivity.FIRST_IMAGE_PREVIEW_TRANSITION_NAME).toBundle());
} else {
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivityAsUser(intent, UserHandle.CURRENT);
finishAndRemoveTask();
}
} }
private void doShare(Uri uri) { private void doShare(Uri uri) {
@@ -386,19 +412,47 @@ public class LongScreenshotActivity extends Activity {
- mPreview.getPaddingBottom(); - mPreview.getPaddingBottom();
float viewRatio = previewWidth / (float) previewHeight; float viewRatio = previewWidth / (float) previewHeight;
// Top and left offsets of the image relative to mPreview.
int imageLeft = mPreview.getPaddingLeft();
int imageTop = mPreview.getPaddingTop();
// The image width and height on screen
int imageHeight = previewHeight;
int imageWidth = previewWidth;
float scale;
if (imageRatio > viewRatio) { if (imageRatio > viewRatio) {
// Image is full width and height is constrained, compute extra padding to inform // Image is full width and height is constrained, compute extra padding to inform
// CropView // CropView
float imageHeight = previewHeight * viewRatio / imageRatio; imageHeight = (int) (previewHeight * viewRatio / imageRatio);
int extraPadding = (int) (previewHeight - imageHeight) / 2; int extraPadding = (previewHeight - imageHeight) / 2;
mCropView.setExtraPadding(extraPadding + mPreview.getPaddingTop(), mCropView.setExtraPadding(extraPadding + mPreview.getPaddingTop(),
extraPadding + mPreview.getPaddingBottom()); extraPadding + mPreview.getPaddingBottom());
imageTop += (previewHeight - imageHeight) / 2;
scale = imageHeight / bounds.height();
mCropView.setExtraPadding(extraPadding, extraPadding);
mCropView.setImageWidth(previewWidth); mCropView.setImageWidth(previewWidth);
} else { } else {
imageWidth = (int) (previewWidth * imageRatio / viewRatio);
imageLeft += (previewWidth - imageWidth) / 2;
scale = imageWidth / (float) bounds.width();
// Image is full height // Image is full height
mCropView.setExtraPadding(mPreview.getPaddingTop(), mPreview.getPaddingBottom()); mCropView.setExtraPadding(mPreview.getPaddingTop(), mPreview.getPaddingBottom());
mCropView.setImageWidth((int) (previewHeight * imageRatio)); mCropView.setImageWidth((int) (previewHeight * imageRatio));
} }
// Update transition view's position and scale.
Rect boundaries = mCropView.getCropBoundaries(imageWidth, imageHeight);
mTransitionView.setTranslationX(imageLeft + boundaries.left);
mTransitionView.setTranslationY(imageTop + boundaries.top);
ConstraintLayout.LayoutParams params =
(ConstraintLayout.LayoutParams) mTransitionView.getLayoutParams();
params.width = boundaries.width();
params.height = boundaries.height();
mTransitionView.setLayoutParams(params);
Matrix matrix = new Matrix();
matrix.postScale(scale, scale, 0, 0);
matrix.postTranslate(-boundaries.left, -boundaries.top);
mTransitionView.setImageMatrix(matrix);
} }
} }