Merge "Toggle dim according to progress of recents animation" into udc-dev
This commit is contained in:
@@ -178,6 +178,10 @@ class Dimmer {
|
|||||||
mSurfaceAnimatorStarter = surfaceAnimatorStarter;
|
mSurfaceAnimatorStarter = surfaceAnimatorStarter;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
WindowContainer<?> getHost() {
|
||||||
|
return mHost;
|
||||||
|
}
|
||||||
|
|
||||||
private SurfaceControl makeDimLayer() {
|
private SurfaceControl makeDimLayer() {
|
||||||
return mHost.makeChildSurface(null)
|
return mHost.makeChildSurface(null)
|
||||||
.setParent(mHost.getSurfaceControl())
|
.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
|
// If SystemUI is dragging for recents, we want to reset the dim state so any dim layer
|
||||||
// on the display level fades out.
|
// on the display level fades out.
|
||||||
if (forAllTasks(task -> !task.canAffectSystemUiFlags())) {
|
if (!mTransitionController.isShellTransitionsEnabled()
|
||||||
|
&& forAllTasks(task -> !task.canAffectSystemUiFlags())) {
|
||||||
mDimmer.resetDimStates();
|
mDimmer.resetDimStates();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -397,6 +397,28 @@ class Transition implements BLASTSyncEngine.TransactionReadyListener {
|
|||||||
return false;
|
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() {
|
boolean hasTransientLaunch() {
|
||||||
return mTransientLaunches != null && !mTransientLaunches.isEmpty();
|
return mTransientLaunches != null && !mTransientLaunches.isEmpty();
|
||||||
}
|
}
|
||||||
@@ -1224,6 +1246,16 @@ class Transition implements BLASTSyncEngine.TransactionReadyListener {
|
|||||||
mController.mAtm.mRootWindowContainer.getDisplayContent(mRecentsDisplayId);
|
mController.mAtm.mRootWindowContainer.getDisplayContent(mRecentsDisplayId);
|
||||||
dc.getInputMonitor().setActiveRecents(null /* activity */, null /* layer */);
|
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) {
|
for (int i = 0; i < mTargetDisplays.size(); ++i) {
|
||||||
final DisplayContent dc = mTargetDisplays.get(i);
|
final DisplayContent dc = mTargetDisplays.get(i);
|
||||||
|
|||||||
@@ -477,6 +477,19 @@ class TransitionController {
|
|||||||
return false;
|
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
|
* 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
|
* 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() {
|
private void applyDims() {
|
||||||
if (((mAttrs.flags & FLAG_DIM_BEHIND) != 0 || shouldDrawBlurBehind())
|
if (((mAttrs.flags & FLAG_DIM_BEHIND) != 0 || shouldDrawBlurBehind())
|
||||||
&& isVisibleNow() && !mHidden) {
|
&& isVisibleNow() && !mHidden && mTransitionController.canApplyDim(getTask())) {
|
||||||
// Only show the Dimmer when the following is satisfied:
|
// Only show the Dimmer when the following is satisfied:
|
||||||
// 1. The window has the flag FLAG_DIM_BEHIND or blur behind is requested
|
// 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.
|
// 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
|
// 3. The WS is considered visible according to the isVisible() method
|
||||||
// 4. The WS is not hidden.
|
// 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;
|
mIsDimming = true;
|
||||||
final float dimAmount = (mAttrs.flags & FLAG_DIM_BEHIND) != 0 ? mAttrs.dimAmount : 0;
|
final float dimAmount = (mAttrs.flags & FLAG_DIM_BEHIND) != 0 ? mAttrs.dimAmount : 0;
|
||||||
final int blurRadius = shouldDrawBlurBehind() ? mAttrs.getBlurBehindRadius() : 0;
|
final int blurRadius = shouldDrawBlurBehind() ? mAttrs.getBlurBehindRadius() : 0;
|
||||||
|
|||||||
@@ -1452,6 +1452,11 @@ public class TransitionTests extends WindowTestsBase {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
assertTrue(activity1.isVisible());
|
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);
|
controller.finishTransition(closeTransition);
|
||||||
assertTrue(wasInFinishingTransition[0]);
|
assertTrue(wasInFinishingTransition[0]);
|
||||||
assertNull(controller.mFinishingTransition);
|
assertNull(controller.mFinishingTransition);
|
||||||
|
|||||||
Reference in New Issue
Block a user