Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1c040a3a authored by Miranda Kephart's avatar Miranda Kephart Committed by Automerger Merge Worker
Browse files

Merge "Screenshot to long screenshot shared transition" into sc-dev am: 367720d1

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/14684485

Change-Id: I47ed048f3428ab18982988a174a73c9296aebdbf
parents f324b04b 367720d1
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -20,6 +20,11 @@
    android:theme="@style/Screenshot"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <ImageView
        android:id="@+id/screenshot_scrolling_scrim"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:visibility="gone"/>
    <ImageView
        android:id="@+id/global_screenshot_actions_background"
        android:layout_height="@dimen/screenshot_bg_protection_height"
+8 −0
Original line number Diff line number Diff line
@@ -122,4 +122,12 @@
            android:layout_margin="@dimen/screenshot_dismiss_button_margin"
            android:src="@drawable/screenshot_cancel"/>
    </FrameLayout>
    <ImageView
        android:id="@+id/screenshot_scrollable_preview"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:scaleType="matrix"
        app:layout_constraintStart_toStartOf="@id/global_screenshot_preview"
        app:layout_constraintTop_toTopOf="@id/global_screenshot_preview"
        android:elevation="@dimen/screenshot_preview_elevation"/>
</androidx.constraintlayout.widget.ConstraintLayout>
+11 −0
Original line number Diff line number Diff line
@@ -62,6 +62,7 @@
        android:paddingHorizontal="48dp"
        android:paddingTop="8dp"
        android:paddingBottom="42dp"
        android:alpha="0"
        app:layout_constrainedHeight="true"
        app:layout_constrainedWidth="true"
        app:layout_constraintTop_toBottomOf="@id/save"
@@ -72,6 +73,16 @@
        tools:minHeight="100dp"
        tools:minWidth="100dp" />

    <ImageView
        android:id="@+id/enter_transition"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:scaleType="matrix"
        app:layout_constraintTop_toTopOf="@id/preview"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        android:transitionName="screenshot_preview_image"/>

    <com.android.systemui.screenshot.CropView
        android:id="@+id/crop_view"
        android:layout_width="0px"
+58 −7
Original line number Diff line number Diff line
@@ -22,6 +22,7 @@ import android.content.ComponentName;
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;
@@ -31,9 +32,12 @@ import android.net.Uri;
import android.os.Bundle;
import android.os.UserHandle;
import android.text.TextUtils;
import android.transition.Transition;
import android.transition.TransitionListenerAdapter;
import android.util.Log;
import android.view.ScrollCaptureResponse;
import android.view.View;
import android.view.ViewTreeObserver;
import android.widget.ImageView;

import androidx.constraintlayout.widget.ConstraintLayout;
@@ -74,6 +78,7 @@ public class LongScreenshotActivity extends Activity {

    private ImageView mPreview;
    private ImageView mTransitionView;
    private ImageView mEnterTransitionView;
    private View mSave;
    private View mEdit;
    private View mShare;
@@ -111,7 +116,7 @@ public class LongScreenshotActivity extends Activity {
    public void onCreate(Bundle savedInstanceState) {
        Log.d(TAG, "onCreate(savedInstanceState = " + savedInstanceState + ")");
        super.onCreate(savedInstanceState);

        postponeEnterTransition();
        setContentView(R.layout.long_screenshot);

        mPreview = requireViewById(R.id.preview);
@@ -122,6 +127,7 @@ public class LongScreenshotActivity extends Activity {
        mMagnifierView = requireViewById(R.id.magnifier);
        mCropView.setCropInteractionListener(mMagnifierView);
        mTransitionView = requireViewById(R.id.transition);
        mEnterTransitionView = requireViewById(R.id.enter_transition);

        mSave.setOnClickListener(this::onClicked);
        mEdit.setOnClickListener(this::onClicked);
@@ -184,8 +190,8 @@ public class LongScreenshotActivity extends Activity {
    private void onLongScreenshotReceived(LongScreenshot longScreenshot) {
        Log.d(TAG, "onLongScreenshotReceived(longScreenshot=" + longScreenshot + ")");
        mLongScreenshot = longScreenshot;
        mPreview.setImageDrawable(mLongScreenshot.getDrawable());
        updateImageDimensions();
        Drawable drawable = mLongScreenshot.getDrawable();
        mPreview.setImageDrawable(drawable);
        mCropView.setVisibility(View.VISIBLE);
        mMagnifierView.setDrawable(mLongScreenshot.getDrawable(),
                mLongScreenshot.getWidth(), mLongScreenshot.getHeight());
@@ -196,9 +202,35 @@ public class LongScreenshotActivity extends Activity {
        float bottomFraction = Math.min(1f,
                1 - (mLongScreenshot.getBottom() - mLongScreenshot.getPageHeight())
                        / (float) mLongScreenshot.getHeight());
        mCropView.animateBoundaryTo(CropView.CropBoundary.TOP, topFraction);
        mCropView.animateBoundaryTo(CropView.CropBoundary.BOTTOM, bottomFraction);

        mEnterTransitionView.setImageDrawable(drawable);

        mEnterTransitionView.getViewTreeObserver().addOnPreDrawListener(
                new ViewTreeObserver.OnPreDrawListener() {
                    @Override
                    public boolean onPreDraw() {
                        mEnterTransitionView.getViewTreeObserver().removeOnPreDrawListener(this);
                        updateImageDimensions();
                        startPostponedEnterTransition();
                        if (isActivityTransitionRunning()) {
                            getWindow().getSharedElementEnterTransition().addListener(
                                    new TransitionListenerAdapter() {
                                        @Override
                                        public void onTransitionEnd(Transition transition) {
                                            super.onTransitionEnd(transition);
                                            mPreview.animate().alpha(1f);
                                            mCropView.animateBoundaryTo(
                                                    CropView.CropBoundary.TOP, topFraction);
                                            mCropView.animateBoundaryTo(
                                                    CropView.CropBoundary.BOTTOM, bottomFraction);
                                            setButtonsEnabled(true);
                                            mEnterTransitionView.setVisibility(View.GONE);
                                        }
                                    });
                        }
                        return true;
                    }
                });

        // Immediately export to temp image file for saved state
        mCacheSaveFuture = mImageExporter.exportAsTempFile(mBackgroundExecutor,
@@ -412,22 +444,26 @@ public class LongScreenshotActivity extends Activity {
        // The image width and height on screen
        int imageHeight = previewHeight;
        int imageWidth = previewWidth;
        float scale;
        int extraPadding = 0;
        if (imageRatio > viewRatio) {
            // Image is full width and height is constrained, compute extra padding to inform
            // CropView
            imageHeight = (int) (previewHeight * viewRatio / imageRatio);
            int extraPadding = (previewHeight - imageHeight) / 2;
            extraPadding = (previewHeight - imageHeight) / 2;
            mCropView.setExtraPadding(extraPadding + mPreview.getPaddingTop(),
                    extraPadding + mPreview.getPaddingBottom());
            imageTop += (previewHeight - imageHeight) / 2;
            mCropView.setExtraPadding(extraPadding, extraPadding);
            mCropView.setImageWidth(previewWidth);
            scale = previewWidth / (float) mPreview.getDrawable().getIntrinsicWidth();
        } else {
            imageWidth = (int) (previewWidth * imageRatio / viewRatio);
            imageLeft += (previewWidth - imageWidth) / 2;
            // Image is full height
            mCropView.setExtraPadding(mPreview.getPaddingTop(), mPreview.getPaddingBottom());
            mCropView.setImageWidth((int) (previewHeight * imageRatio));
            scale = previewHeight / (float) mPreview.getDrawable().getIntrinsicHeight();
        }

        // Update transition view's position and scale.
@@ -439,5 +475,20 @@ public class LongScreenshotActivity extends Activity {
        params.width = boundaries.width();
        params.height = boundaries.height();
        mTransitionView.setLayoutParams(params);

        ConstraintLayout.LayoutParams enterTransitionParams =
                (ConstraintLayout.LayoutParams) mEnterTransitionView.getLayoutParams();
        float topFraction = Math.max(0,
                -mLongScreenshot.getTop() / (float) mLongScreenshot.getHeight());
        enterTransitionParams.width = (int) (scale * drawable.getIntrinsicWidth());
        enterTransitionParams.height = (int) (scale * mLongScreenshot.getPageHeight());
        mEnterTransitionView.setLayoutParams(enterTransitionParams);

        Matrix matrix = new Matrix();
        matrix.setScale(scale, scale);
        matrix.postTranslate(0, -scale * drawable.getIntrinsicHeight() * topFraction);
        mEnterTransitionView.setImageMatrix(matrix);
        mEnterTransitionView.setTranslationY(
                topFraction * previewHeight + mPreview.getPaddingTop() + extraPadding);
    }
}
+29 −21
Original line number Diff line number Diff line
@@ -606,6 +606,7 @@ public class ScreenshotController {

            final ScrollCaptureResponse response = mLastScrollCaptureResponse;
            mScreenshotView.showScrollChip(/* onClick */ () -> {
                mScreenshotView.prepareScrollingTransition(response, mScreenBitmap);
                // Clear the reference to prevent close() in dismissScreenshot
                mLastScrollCaptureResponse = null;
                final ListenableFuture<ScrollCaptureController.LongScreenshot> future =
@@ -623,9 +624,14 @@ public class ScreenshotController {

                    final Intent intent = new Intent(mContext, LongScreenshotActivity.class);
                    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
                    mContext.startActivity(intent);

                    dismissScreenshot(false);
                    Pair<ActivityOptions, ExitTransitionCoordinator> transition =
                            ActivityOptions.startSharedElementAnimation(
                                    mWindow, new ScreenshotExitTransitionCallbacks(), null,
                                    Pair.create(mScreenshotView.getScrollablePreview(),
                                            ChooserActivity.FIRST_IMAGE_PREVIEW_TRANSITION_NAME));
                    transition.second.startExit();
                    mContext.startActivity(intent, transition.first.toBundle());
                }, mMainExecutor);
            });
        } catch (CancellationException e) {
@@ -649,7 +655,8 @@ public class ScreenshotController {
                        }

                        @Override
                        public void onWindowDetached() { }
                        public void onWindowDetached() {
                        }
                    });

        }
@@ -847,24 +854,9 @@ public class ScreenshotController {
     */
    private Supplier<ActionTransition> getActionTransitionSupplier() {
        return () -> {
            ExitTransitionCallbacks cb = new ExitTransitionCallbacks() {
                @Override
                public boolean isReturnTransitionAllowed() {
                    return false;
                }

                @Override
                public void hideSharedElements() {
                    finishDismiss();
                }

                @Override
                public void onFinish() {
                }
            };

            Pair<ActivityOptions, ExitTransitionCoordinator> transition =
                    ActivityOptions.startSharedElementAnimation(mWindow, cb, null,
                    ActivityOptions.startSharedElementAnimation(
                            mWindow, new ScreenshotExitTransitionCallbacks(), null,
                            Pair.create(mScreenshotView.getScreenshotPreview(),
                                    ChooserActivity.FIRST_IMAGE_PREVIEW_TRANSITION_NAME));
            transition.second.startExit();
@@ -950,4 +942,20 @@ public class ScreenshotController {
        }
        return matchWithinTolerance;
    }

    private class ScreenshotExitTransitionCallbacks implements ExitTransitionCallbacks {
        @Override
        public boolean isReturnTransitionAllowed() {
            return false;
        }

        @Override
        public void hideSharedElements() {
            finishDismiss();
        }

        @Override
        public void onFinish() {
        }
    }
}
Loading