Merge "Toggle dim according to progress of recents animation" into udc-dev am: f51e500180
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/23693824 Change-Id: I538d5d6eaf2ad12098f6683004c8a1f6defb8c02 Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
@@ -178,6 +178,10 @@ class Dimmer {
|
||||
mSurfaceAnimatorStarter = surfaceAnimatorStarter;
|
||||
}
|
||||
|
||||
WindowContainer<?> getHost() {
|
||||
return mHost;
|
||||
}
|
||||
|
||||
private SurfaceControl makeDimLayer() {
|
||||
return mHost.makeChildSurface(null)
|
||||
.setParent(mHost.getSurfaceControl())
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user