Merge "Fade the TV PiP menu surfaces during enter/exit." into udc-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
9c233f2638
@@ -300,7 +300,7 @@ public class PipAnimationController {
|
||||
* @return true if handled by the handler, false otherwise.
|
||||
*/
|
||||
public boolean handlePipTransaction(SurfaceControl leash, SurfaceControl.Transaction tx,
|
||||
Rect destinationBounds) {
|
||||
Rect destinationBounds, float alpha) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -401,9 +401,10 @@ public class PipAnimationController {
|
||||
}
|
||||
|
||||
boolean handlePipTransaction(SurfaceControl leash, SurfaceControl.Transaction tx,
|
||||
Rect destinationBounds) {
|
||||
Rect destinationBounds, float alpha) {
|
||||
if (mPipTransactionHandler != null) {
|
||||
return mPipTransactionHandler.handlePipTransaction(leash, tx, destinationBounds);
|
||||
return mPipTransactionHandler.handlePipTransaction(
|
||||
leash, tx, destinationBounds, alpha);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
@@ -548,7 +549,9 @@ public class PipAnimationController {
|
||||
getSurfaceTransactionHelper().alpha(tx, leash, alpha)
|
||||
.round(tx, leash, shouldApplyCornerRadius())
|
||||
.shadow(tx, leash, shouldApplyShadowRadius());
|
||||
tx.apply();
|
||||
if (!handlePipTransaction(leash, tx, destinationBounds, alpha)) {
|
||||
tx.apply();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -663,7 +666,7 @@ public class PipAnimationController {
|
||||
.shadow(tx, leash, shouldApplyShadowRadius());
|
||||
}
|
||||
}
|
||||
if (!handlePipTransaction(leash, tx, bounds)) {
|
||||
if (!handlePipTransaction(leash, tx, bounds, /* alpha= */ 1f)) {
|
||||
tx.apply();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -44,6 +44,13 @@ public interface PipMenuController {
|
||||
|
||||
String MENU_WINDOW_TITLE = "PipMenuView";
|
||||
|
||||
/**
|
||||
* Used with
|
||||
* {@link PipMenuController#movePipMenu(SurfaceControl, SurfaceControl.Transaction, Rect,
|
||||
* float)} to indicate that we don't want to affect the alpha value of the menu surfaces.
|
||||
*/
|
||||
float ALPHA_NO_CHANGE = -1f;
|
||||
|
||||
/**
|
||||
* Called when
|
||||
* {@link PipTaskOrganizer#onTaskAppeared(RunningTaskInfo, SurfaceControl)}
|
||||
@@ -85,8 +92,8 @@ public interface PipMenuController {
|
||||
* need to synchronize the movements on the same frame as PiP.
|
||||
*/
|
||||
default void movePipMenu(@Nullable SurfaceControl pipLeash,
|
||||
@Nullable SurfaceControl.Transaction t,
|
||||
Rect destinationBounds) {}
|
||||
@Nullable SurfaceControl.Transaction t, Rect destinationBounds, float alpha) {
|
||||
}
|
||||
|
||||
/**
|
||||
* Update the PiP menu with the given bounds for re-layout purposes.
|
||||
|
||||
@@ -249,7 +249,7 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener,
|
||||
}, null);
|
||||
}
|
||||
|
||||
private boolean shouldSyncPipTransactionWithMenu() {
|
||||
protected boolean shouldSyncPipTransactionWithMenu() {
|
||||
return mPipMenuController.isMenuVisible();
|
||||
}
|
||||
|
||||
@@ -277,9 +277,9 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener,
|
||||
new PipAnimationController.PipTransactionHandler() {
|
||||
@Override
|
||||
public boolean handlePipTransaction(SurfaceControl leash,
|
||||
SurfaceControl.Transaction tx, Rect destinationBounds) {
|
||||
SurfaceControl.Transaction tx, Rect destinationBounds, float alpha) {
|
||||
if (shouldSyncPipTransactionWithMenu()) {
|
||||
mPipMenuController.movePipMenu(leash, tx, destinationBounds);
|
||||
mPipMenuController.movePipMenu(leash, tx, destinationBounds, alpha);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
@@ -381,6 +381,10 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener,
|
||||
return mPipTransitionController;
|
||||
}
|
||||
|
||||
PipAnimationController.PipTransactionHandler getPipTransactionHandler() {
|
||||
return mPipTransactionHandler;
|
||||
}
|
||||
|
||||
public Rect getCurrentOrAnimatingBounds() {
|
||||
PipAnimationController.PipTransitionAnimator animator =
|
||||
mPipAnimationController.getCurrentAnimator();
|
||||
@@ -1385,7 +1389,7 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener,
|
||||
.scale(tx, mLeash, startBounds, toBounds, degrees)
|
||||
.round(tx, mLeash, startBounds, toBounds);
|
||||
if (shouldSyncPipTransactionWithMenu()) {
|
||||
mPipMenuController.movePipMenu(mLeash, tx, toBounds);
|
||||
mPipMenuController.movePipMenu(mLeash, tx, toBounds, PipMenuController.ALPHA_NO_CHANGE);
|
||||
} else {
|
||||
tx.apply();
|
||||
}
|
||||
@@ -1551,7 +1555,8 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener,
|
||||
if (!isInPip()) {
|
||||
return;
|
||||
}
|
||||
mPipMenuController.movePipMenu(null, null, destinationBounds);
|
||||
mPipMenuController.movePipMenu(null, null, destinationBounds,
|
||||
PipMenuController.ALPHA_NO_CHANGE);
|
||||
mPipMenuController.updateMenuBounds(destinationBounds);
|
||||
}
|
||||
|
||||
|
||||
@@ -823,6 +823,7 @@ public class PipTransition extends PipTransitionController {
|
||||
throw new RuntimeException("Unrecognized animation type: " + enterAnimationType);
|
||||
}
|
||||
animator.setTransitionDirection(TRANSITION_DIRECTION_TO_PIP)
|
||||
.setPipTransactionHandler(mPipOrganizer.getPipTransactionHandler())
|
||||
.setPipAnimationCallback(mPipAnimationCallback)
|
||||
.setDuration(mEnterExitAnimationDuration);
|
||||
if (rotationDelta != Surface.ROTATION_0 && mInFixedRotation) {
|
||||
@@ -949,7 +950,8 @@ public class PipTransition extends PipTransitionController {
|
||||
}
|
||||
|
||||
private void finishResizeForMenu(Rect destinationBounds) {
|
||||
mPipMenuController.movePipMenu(null, null, destinationBounds);
|
||||
mPipMenuController.movePipMenu(null, null, destinationBounds,
|
||||
PipMenuController.ALPHA_NO_CHANGE);
|
||||
mPipMenuController.updateMenuBounds(destinationBounds);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -298,7 +298,8 @@ public class PhonePipMenuController implements PipMenuController {
|
||||
}
|
||||
|
||||
// Sync the menu bounds before showing it in case it is out of sync.
|
||||
movePipMenu(null /* pipLeash */, null /* transaction */, stackBounds);
|
||||
movePipMenu(null /* pipLeash */, null /* transaction */, stackBounds,
|
||||
PipMenuController.ALPHA_NO_CHANGE);
|
||||
updateMenuBounds(stackBounds);
|
||||
|
||||
mPipMenuView.showMenu(menuState, stackBounds, allowMenuTimeout, willResizeMenu, withDelay,
|
||||
@@ -311,7 +312,7 @@ public class PhonePipMenuController implements PipMenuController {
|
||||
@Override
|
||||
public void movePipMenu(@Nullable SurfaceControl pipLeash,
|
||||
@Nullable SurfaceControl.Transaction t,
|
||||
Rect destinationBounds) {
|
||||
Rect destinationBounds, float alpha) {
|
||||
if (destinationBounds.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -30,6 +30,7 @@ import android.os.Handler;
|
||||
import android.view.SurfaceControl;
|
||||
import android.view.View;
|
||||
import android.view.ViewRootImpl;
|
||||
import android.view.WindowManager;
|
||||
import android.view.WindowManagerGlobal;
|
||||
import android.window.SurfaceSyncGroup;
|
||||
|
||||
@@ -202,8 +203,10 @@ public class TvPipMenuController implements PipMenuController, TvPipMenuView.Lis
|
||||
}
|
||||
|
||||
private void addPipMenuViewToSystemWindows(View v, String title) {
|
||||
mSystemWindows.addView(v, getPipMenuLayoutParams(mContext, title, 0 /* width */,
|
||||
0 /* height */), 0 /* displayId */, SHELL_ROOT_LAYER_PIP);
|
||||
final WindowManager.LayoutParams layoutParams =
|
||||
getPipMenuLayoutParams(mContext, title, 0 /* width */, 0 /* height */);
|
||||
layoutParams.alpha = 0f;
|
||||
mSystemWindows.addView(v, layoutParams, 0 /* displayId */, SHELL_ROOT_LAYER_PIP);
|
||||
}
|
||||
|
||||
void onPipTransitionFinished(boolean enterTransition) {
|
||||
@@ -309,9 +312,9 @@ public class TvPipMenuController implements PipMenuController, TvPipMenuView.Lis
|
||||
|
||||
@Override
|
||||
public void movePipMenu(SurfaceControl pipLeash, SurfaceControl.Transaction pipTx,
|
||||
Rect pipBounds) {
|
||||
Rect pipBounds, float alpha) {
|
||||
ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE,
|
||||
"%s: movePipMenu: %s", TAG, pipBounds.toShortString());
|
||||
"%s: movePipMenu: %s, alpha %s", TAG, pipBounds.toShortString(), alpha);
|
||||
|
||||
if (pipBounds.isEmpty()) {
|
||||
if (pipTx == null) {
|
||||
@@ -333,6 +336,11 @@ public class TvPipMenuController implements PipMenuController, TvPipMenuView.Lis
|
||||
pipTx.setPosition(frontSurface, menuDestBounds.left, menuDestBounds.top);
|
||||
pipTx.setPosition(backSurface, menuDestBounds.left, menuDestBounds.top);
|
||||
|
||||
if (alpha != ALPHA_NO_CHANGE) {
|
||||
pipTx.setAlpha(frontSurface, alpha);
|
||||
pipTx.setAlpha(backSurface, alpha);
|
||||
}
|
||||
|
||||
// Synchronize drawing the content in the front and back surfaces together with the pip
|
||||
// transaction and the position change for the front and back surfaces
|
||||
final SurfaceSyncGroup syncGroup = new SurfaceSyncGroup("TvPip");
|
||||
|
||||
@@ -98,4 +98,11 @@ public class TvPipTaskOrganizer extends PipTaskOrganizer {
|
||||
protected boolean shouldAlwaysFadeIn() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean shouldSyncPipTransactionWithMenu() {
|
||||
// We always have a menu visible and want to sync the pip transaction with the menu, even
|
||||
// when the menu alpha is 0 (e.g. when a fade-in animation starts).
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user