diff --git a/packages/SystemUI/res/layout/long_screenshot.xml b/packages/SystemUI/res/layout/long_screenshot.xml
index e775de2d8e068..7edf7ede7bbf2 100644
--- a/packages/SystemUI/res/layout/long_screenshot.xml
+++ b/packages/SystemUI/res/layout/long_screenshot.xml
@@ -19,6 +19,7 @@
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:background="?android:colorBackgroundFloating"
+ android:id="@+id/root"
android:layout_width="match_parent"
android:layout_height="match_parent">
@@ -118,4 +119,14 @@
app:layout_constraintRight_toRightOf="parent"
/>
+
+
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/LongScreenshotActivity.java b/packages/SystemUI/src/com/android/systemui/screenshot/LongScreenshotActivity.java
index 9ce0eebfd4411..f5df9024d88a2 100644
--- a/packages/SystemUI/src/com/android/systemui/screenshot/LongScreenshotActivity.java
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/LongScreenshotActivity.java
@@ -17,11 +17,13 @@
package com.android.systemui.screenshot;
import android.app.Activity;
+import android.app.ActivityOptions;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.HardwareRenderer;
+import android.graphics.Matrix;
import android.graphics.RecordingCanvas;
import android.graphics.Rect;
import android.graphics.RenderNode;
@@ -35,8 +37,12 @@ import android.util.Log;
import android.view.IWindowManager;
import android.view.ScrollCaptureResponse;
import android.view.View;
+import android.view.Window;
import android.widget.ImageView;
+import androidx.constraintlayout.widget.ConstraintLayout;
+
+import com.android.internal.app.ChooserActivity;
import com.android.internal.logging.UiEventLogger;
import com.android.systemui.R;
import com.android.systemui.dagger.qualifiers.Background;
@@ -64,6 +70,8 @@ public class LongScreenshotActivity extends Activity {
public static final String EXTRA_CAPTURE_RESPONSE = "capture-response";
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 ScrollCaptureController mScrollCaptureController;
private final Executor mUiExecutor;
@@ -75,6 +83,7 @@ public class LongScreenshotActivity extends Activity {
private boolean mRestoringInstance;
private ImageView mPreview;
+ private ImageView mTransitionView;
private View mSave;
private View mEdit;
private View mShare;
@@ -88,6 +97,7 @@ public class LongScreenshotActivity extends Activity {
private ListenableFuture mLongScreenshotFuture;
private LongScreenshot mLongScreenshot;
+ private boolean mTransitionStarted;
private enum PendingAction {
SHARE,
@@ -110,8 +120,8 @@ public class LongScreenshotActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
Log.d(TAG, "onCreate(savedInstanceState = " + savedInstanceState + ")");
-
super.onCreate(savedInstanceState);
+ getWindow().requestFeature(Window.FEATURE_ACTIVITY_TRANSITIONS);
setContentView(R.layout.long_screenshot);
mPreview = requireViewById(R.id.preview);
@@ -121,6 +131,7 @@ public class LongScreenshotActivity extends Activity {
mCropView = requireViewById(R.id.crop_view);
mMagnifierView = requireViewById(R.id.magnifier);
mCropView.setCropInteractionListener(mMagnifierView);
+ mTransitionView = requireViewById(R.id.transition);
mSave.setOnClickListener(this::onClicked);
mEdit.setOnClickListener(this::onClicked);
@@ -206,6 +217,7 @@ public class LongScreenshotActivity extends Activity {
Log.d(TAG, "onCaptureCompleted(longScreenshot=" + longScreenshot + ")");
mLongScreenshot = longScreenshot;
mPreview.setImageDrawable(mLongScreenshot.getDrawable());
+ mTransitionView.setImageDrawable(mLongScreenshot.getDrawable());
updateImageDimensions();
mMagnifierView.setDrawable(mLongScreenshot.getDrawable(),
mLongScreenshot.getWidth(), mLongScreenshot.getHeight());
@@ -275,6 +287,9 @@ public class LongScreenshotActivity extends Activity {
protected void onStop() {
Log.d(TAG, "onStop finishing=" + isFinishing());
super.onStop();
+ if (mTransitionStarted) {
+ finish();
+ }
if (isFinishing()) {
if (mScrollCaptureResponse != null) {
mScrollCaptureResponse.close();
@@ -321,11 +336,22 @@ public class LongScreenshotActivity extends Activity {
intent.setComponent(ComponentName.unflattenFromString(editorPackage));
}
intent.setDataAndType(uri, "image/png");
- intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK
- | Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
+ intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION
+ | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
- startActivityAsUser(intent, UserHandle.CURRENT);
- finishAndRemoveTask();
+ if (USE_SHARED_ELEMENT) {
+ 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) {
@@ -415,19 +441,47 @@ public class LongScreenshotActivity extends Activity {
- mPreview.getPaddingBottom();
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) {
// Image is full width and height is constrained, compute extra padding to inform
// CropView
- float imageHeight = previewHeight * viewRatio / imageRatio;
- int extraPadding = (int) (previewHeight - imageHeight) / 2;
+ imageHeight = (int) (previewHeight * viewRatio / imageRatio);
+ int extraPadding = (previewHeight - imageHeight) / 2;
mCropView.setExtraPadding(extraPadding + mPreview.getPaddingTop(),
extraPadding + mPreview.getPaddingBottom());
+ imageTop += (previewHeight - imageHeight) / 2;
+ scale = imageHeight / bounds.height();
+ mCropView.setExtraPadding(extraPadding, extraPadding);
mCropView.setImageWidth(previewWidth);
} else {
+ imageWidth = (int) (previewWidth * imageRatio / viewRatio);
+ imageLeft += (previewWidth - imageWidth) / 2;
+ scale = imageWidth / (float) bounds.width();
// Image is full height
mCropView.setExtraPadding(mPreview.getPaddingTop(), mPreview.getPaddingBottom());
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);
}
}