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

Commit 70370017 authored by Robin Lee's avatar Robin Lee Committed by Automerger Merge Worker
Browse files

Merge "Play SLEEP transitions if they contain changes" into udc-qpr-dev am: 2985ffb9

parents 233588b9 2985ffb9
Loading
Loading
Loading
Loading
+10 −0
Original line number Diff line number Diff line
@@ -29,6 +29,7 @@ import static android.view.Display.INVALID_DISPLAY;
import static android.view.WindowManager.LayoutParams.ROTATION_ANIMATION_UNSPECIFIED;
import static android.view.WindowManager.TRANSIT_CHANGE;
import static android.view.WindowManager.TRANSIT_CLOSE;
import static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_APPEARING;
import static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_GOING_AWAY;
import static android.view.WindowManager.TRANSIT_NONE;
import static android.view.WindowManager.TRANSIT_OPEN;
@@ -360,6 +361,15 @@ public final class TransitionInfo implements Parcelable {
        mChanges.add(change);
    }

    /**
     * Whether this transition contains any changes to the window hierarchy,
     * including keyguard visibility.
     */
    public boolean hasChangesOrSideEffects() {
        return !mChanges.isEmpty() || isKeyguardGoingAway()
                || (mFlags & TRANSIT_FLAG_KEYGUARD_APPEARING) != 0;
    }

    /**
     * Whether this transition includes keyguard going away.
     */
+9 −15
Original line number Diff line number Diff line
@@ -19,13 +19,12 @@ package com.android.wm.shell.transition;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.os.IBinder;
import android.util.Slog;
import android.view.SurfaceControl;
import android.window.TransitionInfo;
import android.window.TransitionRequestInfo;
import android.window.WindowContainerTransaction;

import java.util.ArrayList;

/**
 * A Simple handler that tracks SLEEP transitions. We track them specially since we (ab)use these
 * as sentinels for fast-forwarding through animations when the screen is off.
@@ -34,30 +33,25 @@ import java.util.ArrayList;
 * don't register it like a normal handler.
 */
class SleepHandler implements Transitions.TransitionHandler {
    final ArrayList<IBinder> mSleepTransitions = new ArrayList<>();

    @Override
    public boolean startAnimation(@NonNull IBinder transition, @NonNull TransitionInfo info,
            @NonNull SurfaceControl.Transaction startTransaction,
            @NonNull SurfaceControl.Transaction finishTransaction,
            @NonNull Transitions.TransitionFinishCallback finishCallback) {
        mSleepTransitions.remove(transition);
        if (info.hasChangesOrSideEffects()) {
            Slog.e(Transitions.TAG, "Real changes included in a SLEEP transition");
            return false;
        } else {
            startTransaction.apply();
            finishCallback.onTransitionFinished(null);
            return true;
        }
    }

    @Override
    @Nullable
    public WindowContainerTransaction handleRequest(@NonNull IBinder transition,
            @NonNull TransitionRequestInfo request) {
        mSleepTransitions.add(transition);
        return new WindowContainerTransaction();
    }

    @Override
    public void onTransitionConsumed(@NonNull IBinder transition, boolean aborted,
            @Nullable SurfaceControl.Transaction finishTransaction) {
        mSleepTransitions.remove(transition);
    }
}
+60 −1
Original line number Diff line number Diff line
@@ -1152,7 +1152,7 @@ public class ShellTransitionTests extends ShellTestCase {
    }

    @Test
    public void testEmptyTransitionStillReportsKeyguardGoingAway() {
    public void testEmptyTransition_withKeyguardGoingAway_plays() {
        Transitions transitions = createTestTransitions();
        transitions.replaceDefaultHandlerForTest(mDefaultHandler);

@@ -1170,6 +1170,65 @@ public class ShellTransitionTests extends ShellTestCase {
        assertEquals(1, mDefaultHandler.activeCount());
    }

    @Test
    public void testSleepTransition_withKeyguardGoingAway_plays(){
        Transitions transitions = createTestTransitions();
        transitions.replaceDefaultHandlerForTest(mDefaultHandler);

        IBinder transitToken = new Binder();
        transitions.requestStartTransition(transitToken,
                new TransitionRequestInfo(TRANSIT_SLEEP, null /* trigger */, null /* remote */));

        // Make a no-op transition
        TransitionInfo info = new TransitionInfoBuilder(
                TRANSIT_SLEEP, TRANSIT_FLAG_KEYGUARD_GOING_AWAY, true /* noOp */).build();
        transitions.onTransitionReady(transitToken, info, new StubTransaction(),
                new StubTransaction());

        // If keyguard-going-away flag set, then it shouldn't be aborted.
        assertEquals(1, mDefaultHandler.activeCount());
    }

    @Test
    public void testSleepTransition_withChanges_plays(){
        Transitions transitions = createTestTransitions();
        transitions.replaceDefaultHandlerForTest(mDefaultHandler);

        IBinder transitToken = new Binder();
        transitions.requestStartTransition(transitToken,
                new TransitionRequestInfo(TRANSIT_SLEEP, null /* trigger */, null /* remote */));

        // Make a transition with some changes
        TransitionInfo info = new TransitionInfoBuilder(TRANSIT_SLEEP)
                .addChange(TRANSIT_OPEN).build();
        info.setTrack(0);
        transitions.onTransitionReady(transitToken, info, new StubTransaction(),
                new StubTransaction());

        // If there is an actual change, then it shouldn't be aborted.
        assertEquals(1, mDefaultHandler.activeCount());
    }


    @Test
    public void testSleepTransition_empty_SyncBySleepHandler() {
        Transitions transitions = createTestTransitions();
        transitions.replaceDefaultHandlerForTest(mDefaultHandler);

        IBinder transitToken = new Binder();
        transitions.requestStartTransition(transitToken,
                new TransitionRequestInfo(TRANSIT_SLEEP, null /* trigger */, null /* remote */));

        // Make a no-op transition
        TransitionInfo info = new TransitionInfoBuilder(
                TRANSIT_SLEEP, 0x0, true /* noOp */).build();
        transitions.onTransitionReady(transitToken, info, new StubTransaction(),
                new StubTransaction());

        // If there is nothing to actually play, it should not be offered to handlers.
        assertEquals(0, mDefaultHandler.activeCount());
    }

    @Test
    public void testMultipleTracks() {
        Transitions transitions = createTestTransitions();