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

Commit 660008c5 authored by Hongwei Wang's avatar Hongwei Wang Committed by Android (Google) Code Review
Browse files

Merge "Apply the whole auto pip transaction in recents animation" into sc-dev

parents 6242b006 de204a57
Loading
Loading
Loading
Loading
+4 −4
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@ import android.app.ActivityManager;
import android.view.IRemoteAnimationFinishedCallback;
import android.graphics.GraphicBuffer;
import android.graphics.Rect;
import android.window.PictureInPictureSurfaceTransaction;
import android.window.TaskSnapshot;

/**
@@ -43,11 +44,10 @@ interface IRecentsAnimationController {
     * accordingly. This should be called before `finish`
     * @param taskId for which the leash should be updated
     * @param destinationBounds bounds of the final PiP window
     * @param windowCrop bounds to crop as part of final transform.
     * @param float9 An array of 9 floats to be used as matrix transform.
     * @param finishTransaction leash operations for the final transform.
     */
     void setFinishTaskBounds(int taskId, in Rect destinationBounds, in Rect windowCrop,
             in float[] float9);
     void setFinishTaskBounds(int taskId, in Rect destinationBounds,
             in PictureInPictureSurfaceTransaction finishTransaction);

    /**
     * Notifies to the system that the animation into Recents should end, and all leashes associated
+19 −0
Original line number Diff line number Diff line
/**
 * Copyright (c) 2021, The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package android.window;

parcelable PictureInPictureSurfaceTransaction;
+140 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2021 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package android.window;

import android.annotation.Nullable;
import android.graphics.Rect;
import android.os.Parcel;
import android.os.Parcelable;

import java.util.Objects;

/**
 * Represents a set of {@link android.view.SurfaceControl.Transaction} operations used to
 * operate on the {@link android.view.SurfaceControl} for picture-in-picture.
 *
 * @hide
 */
public final class PictureInPictureSurfaceTransaction implements Parcelable {

    public final float mPositionX;
    public final float mPositionY;

    public final float mScaleX;
    public final float mScaleY;

    public final float mRotation;
    public final float mCornerRadius;

    private final Rect mWindowCrop = new Rect();

    public PictureInPictureSurfaceTransaction(Parcel in) {
        mPositionX = in.readFloat();
        mPositionY = in.readFloat();
        mScaleX = in.readFloat();
        mScaleY = in.readFloat();
        mRotation = in.readFloat();
        mCornerRadius = in.readFloat();
        mWindowCrop.set(Objects.requireNonNull(in.readTypedObject(Rect.CREATOR)));
    }

    public PictureInPictureSurfaceTransaction(float positionX, float positionY,
            float scaleX, float scaleY,
            float rotation, float cornerRadius,
            @Nullable Rect windowCrop) {
        mPositionX = positionX;
        mPositionY = positionY;
        mScaleX = scaleX;
        mScaleY = scaleY;
        mRotation = rotation;
        mCornerRadius = cornerRadius;
        if (windowCrop != null) {
            mWindowCrop.set(windowCrop);
        }
    }

    public PictureInPictureSurfaceTransaction(PictureInPictureSurfaceTransaction other) {
        this(other.mPositionX, other.mPositionY,
                other.mScaleX, other.mScaleY,
                other.mRotation, other.mCornerRadius,
                other.mWindowCrop);
    }

    public Rect getWindowCrop() {
        return new Rect(mWindowCrop);
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof PictureInPictureSurfaceTransaction)) return false;
        PictureInPictureSurfaceTransaction that = (PictureInPictureSurfaceTransaction) o;
        return Objects.equals(mPositionX, that.mPositionX)
                && Objects.equals(mPositionY, that.mPositionY)
                && Objects.equals(mScaleX, that.mScaleX)
                && Objects.equals(mScaleY, that.mScaleY)
                && Objects.equals(mRotation, that.mRotation)
                && Objects.equals(mCornerRadius, that.mCornerRadius)
                && Objects.equals(mWindowCrop, that.mWindowCrop);
    }

    @Override
    public int hashCode() {
        return Objects.hash(mPositionX, mPositionY, mScaleX, mScaleY,
                mRotation, mCornerRadius, mWindowCrop);
    }

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel out, int flags) {
        out.writeFloat(mPositionX);
        out.writeFloat(mPositionY);
        out.writeFloat(mScaleX);
        out.writeFloat(mScaleY);
        out.writeFloat(mRotation);
        out.writeFloat(mCornerRadius);
        out.writeTypedObject(mWindowCrop, 0 /* flags */);
    }

    @Override
    public String toString() {
        return "PictureInPictureSurfaceTransaction("
                + " posX=" + mPositionX
                + " posY=" + mPositionY
                + " scaleX=" + mScaleX
                + " scaleY=" + mScaleY
                + " rotation=" + mRotation
                + " cornerRadius=" + mCornerRadius
                + " crop=" + mWindowCrop
                + ")";
    }

    public static final @android.annotation.NonNull Creator<PictureInPictureSurfaceTransaction>
            CREATOR =
            new Creator<PictureInPictureSurfaceTransaction>() {
                public PictureInPictureSurfaceTransaction createFromParcel(Parcel in) {
                    return new PictureInPictureSurfaceTransaction(in);
                }
                public PictureInPictureSurfaceTransaction[] newArray(int size) {
                    return new PictureInPictureSurfaceTransaction[size];
                }
            };
}
+35 −18
Original line number Diff line number Diff line
@@ -16,11 +16,15 @@

package com.android.systemui.shared.pip;

import static android.graphics.Matrix.MSCALE_X;
import static android.graphics.Matrix.MSCALE_Y;

import android.graphics.Matrix;
import android.graphics.Rect;
import android.graphics.RectF;
import android.view.Choreographer;
import android.view.SurfaceControl;
import android.window.PictureInPictureSurfaceTransaction;

/**
 * TODO(b/171721389): unify this class with
@@ -28,22 +32,32 @@ import android.view.SurfaceControl;
 * source of truth on enabling/disabling and the actual value of corner radius.
 */
public class PipSurfaceTransactionHelper {
    /** corner radius is currently disabled. */
    private final float mCornerRadius = 0f;

    private final Matrix mTmpTransform = new Matrix();
    private final float[] mTmpFloat9 = new float[9];
    private final RectF mTmpSourceRectF = new RectF();
    private final RectF mTmpDestinationRectF = new RectF();
    private final Rect mTmpDestinationRect = new Rect();

    public void scale(SurfaceControl.Transaction tx, SurfaceControl leash,
    public PictureInPictureSurfaceTransaction scale(
            SurfaceControl.Transaction tx, SurfaceControl leash,
            Rect sourceBounds, Rect destinationBounds) {
        mTmpSourceRectF.set(sourceBounds);
        mTmpDestinationRectF.set(destinationBounds);
        mTmpTransform.setRectToRect(mTmpSourceRectF, mTmpDestinationRectF, Matrix.ScaleToFit.FILL);
        tx.setMatrix(leash, mTmpTransform, mTmpFloat9)
                .setPosition(leash, mTmpDestinationRectF.left, mTmpDestinationRectF.top);
                .setPosition(leash, mTmpDestinationRectF.left, mTmpDestinationRectF.top)
                .setCornerRadius(leash, mCornerRadius);
        return new PictureInPictureSurfaceTransaction(
                mTmpDestinationRectF.left, mTmpDestinationRectF.top,
                mTmpFloat9[MSCALE_X], mTmpFloat9[MSCALE_Y],
                0 /* rotation*/, mCornerRadius, sourceBounds);
    }

    public void scale(SurfaceControl.Transaction tx, SurfaceControl leash,
    public PictureInPictureSurfaceTransaction scale(
            SurfaceControl.Transaction tx, SurfaceControl leash,
            Rect sourceBounds, Rect destinationBounds,
            float degree, float positionX, float positionY) {
        mTmpSourceRectF.set(sourceBounds);
@@ -51,10 +65,16 @@ public class PipSurfaceTransactionHelper {
        mTmpTransform.setRectToRect(mTmpSourceRectF, mTmpDestinationRectF, Matrix.ScaleToFit.FILL);
        mTmpTransform.postRotate(degree, 0, 0);
        tx.setMatrix(leash, mTmpTransform, mTmpFloat9)
                .setPosition(leash, positionX, positionY);
                .setPosition(leash, positionX, positionY)
                .setCornerRadius(leash, mCornerRadius);
        return new PictureInPictureSurfaceTransaction(
                positionX, positionY,
                mTmpFloat9[MSCALE_X], mTmpFloat9[MSCALE_Y],
                degree, mCornerRadius, sourceBounds);
    }

    public void scaleAndCrop(SurfaceControl.Transaction tx, SurfaceControl leash,
    public PictureInPictureSurfaceTransaction scaleAndCrop(
            SurfaceControl.Transaction tx, SurfaceControl leash,
            Rect sourceBounds, Rect destinationBounds, Rect insets) {
        mTmpSourceRectF.set(sourceBounds);
        mTmpDestinationRect.set(sourceBounds);
@@ -69,10 +89,14 @@ public class PipSurfaceTransactionHelper {
        mTmpTransform.setScale(scale, scale);
        tx.setMatrix(leash, mTmpTransform, mTmpFloat9)
                .setWindowCrop(leash, mTmpDestinationRect)
                .setPosition(leash, left, top);
                .setPosition(leash, left, top)
                .setCornerRadius(leash, mCornerRadius);
        return new PictureInPictureSurfaceTransaction(
                left, top, scale, scale, 0 /* rotation */, mCornerRadius, mTmpDestinationRect);
    }

    public void scaleAndRotate(SurfaceControl.Transaction tx, SurfaceControl leash,
    public PictureInPictureSurfaceTransaction scaleAndRotate(
            SurfaceControl.Transaction tx, SurfaceControl leash,
            Rect sourceBounds, Rect destinationBounds, Rect insets,
            float degree, float positionX, float positionY) {
        mTmpSourceRectF.set(sourceBounds);
@@ -87,17 +111,10 @@ public class PipSurfaceTransactionHelper {
        mTmpTransform.postScale(scale, scale);
        tx.setMatrix(leash, mTmpTransform, mTmpFloat9)
                .setWindowCrop(leash, mTmpDestinationRect)
                .setPosition(leash, positionX, positionY);
    }

    public void resetCornerRadius(SurfaceControl.Transaction tx, SurfaceControl leash) {
        tx.setCornerRadius(leash, 0);
    }

    public void crop(SurfaceControl.Transaction tx, SurfaceControl leash,
            Rect destinationBounds) {
        tx.setWindowCrop(leash, destinationBounds.width(), destinationBounds.height())
                .setPosition(leash, destinationBounds.left, destinationBounds.top);
                .setPosition(leash, positionX, positionY)
                .setCornerRadius(leash, mCornerRadius);
        return new PictureInPictureSurfaceTransaction(
                positionX, positionY, scale, scale, degree, mCornerRadius, mTmpDestinationRect);
    }

    /** @return {@link SurfaceControl.Transaction} instance with vsync-id */
+6 −7
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@ import android.graphics.Rect;
import android.os.RemoteException;
import android.util.Log;
import android.view.IRecentsAnimationController;
import android.window.PictureInPictureSurfaceTransaction;
import android.window.TaskSnapshot;

import com.android.systemui.shared.recents.model.ThumbnailData;
@@ -76,14 +77,12 @@ public class RecentsAnimationControllerCompat {
     * accordingly. This should be called before `finish`
     * @param taskId Task id of the Activity in PiP mode.
     * @param destinationBounds Bounds of the PiP window on home.
     * @param windowCrop bounds to crop as part of final transform.
     * @param float9 An array of 9 floats to be used as matrix transform.
     * @param finishTransaction leash operations for the final transform.
     */
    public void setFinishTaskBounds(int taskId, Rect destinationBounds, Rect windowCrop,
            float[] float9) {
    public void setFinishTaskBounds(int taskId, Rect destinationBounds,
            PictureInPictureSurfaceTransaction finishTransaction) {
        try {
            mAnimationController.setFinishTaskBounds(taskId, destinationBounds, windowCrop,
                    float9);
            mAnimationController.setFinishTaskBounds(taskId, destinationBounds, finishTransaction);
        } catch (RemoteException e) {
            Log.d(TAG, "Failed to set finish task bounds", e);
        }
Loading