Skip to content
Snippets Groups Projects
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
No related branches found
No related tags found
No related merge requests found
......@@ -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.
*/
......
......@@ -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);
startTransaction.apply();
finishCallback.onTransitionFinished(null);
return true;
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);
}
}
......@@ -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();
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment