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

Commit 7a2bb440 authored by Matt Casey's avatar Matt Casey Committed by Automerger Merge Worker
Browse files

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

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

Change-Id: I9935006e18082d4082012f08f1523efa3713469a
parents 801cc006 bfcadd02
Loading
Loading
Loading
Loading
+11 −0
Original line number Original line Diff line number Diff line
@@ -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>
+62 −8
Original line number Original line Diff line number Diff line
@@ -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,12 +307,23 @@ 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);


        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);
            startActivityAsUser(intent, UserHandle.CURRENT);
            finishAndRemoveTask();
            finishAndRemoveTask();
        }
        }
    }


    private void doShare(Uri uri) {
    private void doShare(Uri uri) {
        Intent intent = new Intent(Intent.ACTION_SEND);
        Intent intent = new Intent(Intent.ACTION_SEND);
@@ -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);
    }
    }
}
}