Merge "Toggle dim according to progress of recents animation" into udc-dev

This commit is contained in:
Riddle Hsu
2023-06-15 12:20:06 +00:00
committed by Android (Google) Code Review
6 changed files with 58 additions and 2 deletions

View File

@@ -178,6 +178,10 @@ class Dimmer {
mSurfaceAnimatorStarter = surfaceAnimatorStarter;
}
WindowContainer<?> getHost() {
return mHost;
}
private SurfaceControl makeDimLayer() {
return mHost.makeChildSurface(null)
.setParent(mHost.getSurfaceControl())

View File

@@ -790,7 +790,8 @@ public class DisplayArea<T extends WindowContainer> extends WindowContainer<T> {
// If SystemUI is dragging for recents, we want to reset the dim state so any dim layer
// on the display level fades out.
if (forAllTasks(task -> !task.canAffectSystemUiFlags())) {
if (!mTransitionController.isShellTransitionsEnabled()
&& forAllTasks(task -> !task.canAffectSystemUiFlags())) {
mDimmer.resetDimStates();
}

View File

@@ -397,6 +397,28 @@ class Transition implements BLASTSyncEngine.TransactionReadyListener {
return false;
}
boolean canApplyDim(@NonNull Task task) {
if (mTransientLaunches == null) return true;
final Dimmer dimmer = task.getDimmer();
final WindowContainer<?> dimmerHost = dimmer != null ? dimmer.getHost() : null;
if (dimmerHost == null) return false;
if (isInTransientHide(dimmerHost)) {
// The layer of dimmer is inside transient-hide task, then allow to dim.
return true;
}
// The dimmer host of a translucent task can be a display, then it is not in transient-hide.
for (int i = mTransientLaunches.size() - 1; i >= 0; --i) {
// The transient task is usually the task of recents/home activity.
final Task transientTask = mTransientLaunches.keyAt(i).getTask();
if (transientTask != null && transientTask.canAffectSystemUiFlags()) {
// It usually means that the recents animation has moved the transient-hide task
// an noticeable distance, then the display level dimmer should not show.
return false;
}
}
return true;
}
boolean hasTransientLaunch() {
return mTransientLaunches != null && !mTransientLaunches.isEmpty();
}
@@ -1224,6 +1246,16 @@ class Transition implements BLASTSyncEngine.TransactionReadyListener {
mController.mAtm.mRootWindowContainer.getDisplayContent(mRecentsDisplayId);
dc.getInputMonitor().setActiveRecents(null /* activity */, null /* layer */);
}
if (mTransientLaunches != null) {
for (int i = mTransientLaunches.size() - 1; i >= 0; --i) {
// Reset the ability of controlling SystemUi which might be changed by
// setTransientLaunch or setRecentsAppBehindSystemBars.
final Task task = mTransientLaunches.keyAt(i).getTask();
if (task != null) {
task.setCanAffectSystemUiFlags(true);
}
}
}
for (int i = 0; i < mTargetDisplays.size(); ++i) {
final DisplayContent dc = mTargetDisplays.get(i);

View File

@@ -477,6 +477,19 @@ class TransitionController {
return false;
}
boolean canApplyDim(@Nullable Task task) {
if (task == null) {
// Always allow non-activity window.
return true;
}
for (int i = mPlayingTransitions.size() - 1; i >= 0; --i) {
if (!mPlayingTransitions.get(i).canApplyDim(task)) {
return false;
}
}
return true;
}
/**
* During transient-launch, the "behind" app should retain focus during the transition unless
* something takes focus from it explicitly (eg. by calling ATMS.setFocusedTask or by another

View File

@@ -5120,12 +5120,13 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
private void applyDims() {
if (((mAttrs.flags & FLAG_DIM_BEHIND) != 0 || shouldDrawBlurBehind())
&& isVisibleNow() && !mHidden) {
&& isVisibleNow() && !mHidden && mTransitionController.canApplyDim(getTask())) {
// Only show the Dimmer when the following is satisfied:
// 1. The window has the flag FLAG_DIM_BEHIND or blur behind is requested
// 2. The WindowToken is not hidden so dims aren't shown when the window is exiting.
// 3. The WS is considered visible according to the isVisible() method
// 4. The WS is not hidden.
// 5. The window is not in a transition or is in a transition that allows to dim.
mIsDimming = true;
final float dimAmount = (mAttrs.flags & FLAG_DIM_BEHIND) != 0 ? mAttrs.dimAmount : 0;
final int blurRadius = shouldDrawBlurBehind() ? mAttrs.getBlurBehindRadius() : 0;

View File

@@ -1452,6 +1452,11 @@ public class TransitionTests extends WindowTestsBase {
}
});
assertTrue(activity1.isVisible());
doReturn(false).when(task1).isTranslucent(null);
assertTrue(controller.canApplyDim(task1));
doReturn(true).when(task1).isTranslucent(null);
assertFalse(controller.canApplyDim(task1));
controller.finishTransition(closeTransition);
assertTrue(wasInFinishingTransition[0]);
assertNull(controller.mFinishingTransition);