Merge "[Shell Transition] Schedule another transition to update visibility." into tm-qpr-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
925181d781
@@ -132,8 +132,11 @@ public final class TransitionInfo implements Parcelable {
|
|||||||
*/
|
*/
|
||||||
public static final int FLAG_IS_BEHIND_STARTING_WINDOW = 1 << 14;
|
public static final int FLAG_IS_BEHIND_STARTING_WINDOW = 1 << 14;
|
||||||
|
|
||||||
|
/** This change happened underneath something else. */
|
||||||
|
public static final int FLAG_IS_OCCLUDED = 1 << 15;
|
||||||
|
|
||||||
/** The first unused bit. This can be used by remotes to attach custom flags to this change. */
|
/** The first unused bit. This can be used by remotes to attach custom flags to this change. */
|
||||||
public static final int FLAG_FIRST_CUSTOM = 1 << 15;
|
public static final int FLAG_FIRST_CUSTOM = 1 << 16;
|
||||||
|
|
||||||
/** @hide */
|
/** @hide */
|
||||||
@IntDef(prefix = { "FLAG_" }, value = {
|
@IntDef(prefix = { "FLAG_" }, value = {
|
||||||
@@ -153,6 +156,7 @@ public final class TransitionInfo implements Parcelable {
|
|||||||
FLAG_CROSS_PROFILE_OWNER_THUMBNAIL,
|
FLAG_CROSS_PROFILE_OWNER_THUMBNAIL,
|
||||||
FLAG_CROSS_PROFILE_WORK_THUMBNAIL,
|
FLAG_CROSS_PROFILE_WORK_THUMBNAIL,
|
||||||
FLAG_IS_BEHIND_STARTING_WINDOW,
|
FLAG_IS_BEHIND_STARTING_WINDOW,
|
||||||
|
FLAG_IS_OCCLUDED,
|
||||||
FLAG_FIRST_CUSTOM
|
FLAG_FIRST_CUSTOM
|
||||||
})
|
})
|
||||||
public @interface ChangeFlags {}
|
public @interface ChangeFlags {}
|
||||||
@@ -362,6 +366,9 @@ public final class TransitionInfo implements Parcelable {
|
|||||||
if ((flags & FLAG_IS_BEHIND_STARTING_WINDOW) != 0) {
|
if ((flags & FLAG_IS_BEHIND_STARTING_WINDOW) != 0) {
|
||||||
sb.append(sb.length() == 0 ? "" : "|").append("IS_BEHIND_STARTING_WINDOW");
|
sb.append(sb.length() == 0 ? "" : "|").append("IS_BEHIND_STARTING_WINDOW");
|
||||||
}
|
}
|
||||||
|
if ((flags & FLAG_IS_OCCLUDED) != 0) {
|
||||||
|
sb.append(sb.length() == 0 ? "" : "|").append("IS_OCCLUDED");
|
||||||
|
}
|
||||||
if ((flags & FLAG_FIRST_CUSTOM) != 0) {
|
if ((flags & FLAG_FIRST_CUSTOM) != 0) {
|
||||||
sb.append(sb.length() == 0 ? "" : "|").append("FIRST_CUSTOM");
|
sb.append(sb.length() == 0 ? "" : "|").append("FIRST_CUSTOM");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ import static android.view.WindowManager.TRANSIT_TO_BACK;
|
|||||||
import static android.view.WindowManager.TRANSIT_TO_FRONT;
|
import static android.view.WindowManager.TRANSIT_TO_FRONT;
|
||||||
import static android.view.WindowManager.fixScale;
|
import static android.view.WindowManager.fixScale;
|
||||||
import static android.window.TransitionInfo.FLAG_IS_INPUT_METHOD;
|
import static android.window.TransitionInfo.FLAG_IS_INPUT_METHOD;
|
||||||
|
import static android.window.TransitionInfo.FLAG_IS_OCCLUDED;
|
||||||
import static android.window.TransitionInfo.FLAG_IS_WALLPAPER;
|
import static android.window.TransitionInfo.FLAG_IS_WALLPAPER;
|
||||||
import static android.window.TransitionInfo.FLAG_STARTING_WINDOW_TRANSFER_RECIPIENT;
|
import static android.window.TransitionInfo.FLAG_STARTING_WINDOW_TRANSFER_RECIPIENT;
|
||||||
|
|
||||||
@@ -441,32 +442,35 @@ public class Transitions implements RemoteCallable<Transitions> {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// apply transfer starting window directly if there is no other task change. Since this
|
|
||||||
// is an activity->activity situation, we can detect it by selecting transitions with only
|
|
||||||
// 2 changes where neither are tasks and one is a starting-window recipient.
|
|
||||||
final int changeSize = info.getChanges().size();
|
final int changeSize = info.getChanges().size();
|
||||||
if (changeSize == 2) {
|
boolean taskChange = false;
|
||||||
boolean nonTaskChange = true;
|
boolean transferStartingWindow = false;
|
||||||
boolean transferStartingWindow = false;
|
boolean allOccluded = changeSize > 0;
|
||||||
for (int i = changeSize - 1; i >= 0; --i) {
|
for (int i = changeSize - 1; i >= 0; --i) {
|
||||||
final TransitionInfo.Change change = info.getChanges().get(i);
|
final TransitionInfo.Change change = info.getChanges().get(i);
|
||||||
if (change.getTaskInfo() != null) {
|
taskChange |= change.getTaskInfo() != null;
|
||||||
nonTaskChange = false;
|
transferStartingWindow |= change.hasFlags(FLAG_STARTING_WINDOW_TRANSFER_RECIPIENT);
|
||||||
break;
|
if (!change.hasFlags(FLAG_IS_OCCLUDED)) {
|
||||||
}
|
allOccluded = false;
|
||||||
if ((change.getFlags() & FLAG_STARTING_WINDOW_TRANSFER_RECIPIENT) != 0) {
|
|
||||||
transferStartingWindow = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (nonTaskChange && transferStartingWindow) {
|
|
||||||
t.apply();
|
|
||||||
finishT.apply();
|
|
||||||
// Treat this as an abort since we are bypassing any merge logic and effectively
|
|
||||||
// finishing immediately.
|
|
||||||
onAbort(transitionToken);
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// There does not need animation when:
|
||||||
|
// A. Transfer starting window. Apply transfer starting window directly if there is no other
|
||||||
|
// task change. Since this is an activity->activity situation, we can detect it by selecting
|
||||||
|
// transitions with only 2 changes where neither are tasks and one is a starting-window
|
||||||
|
// recipient.
|
||||||
|
if (!taskChange && transferStartingWindow && changeSize == 2
|
||||||
|
// B. It's visibility change if the TRANSIT_TO_BACK/TO_FRONT happened when all
|
||||||
|
// changes are underneath another change.
|
||||||
|
|| ((info.getType() == TRANSIT_TO_BACK || info.getType() == TRANSIT_TO_FRONT)
|
||||||
|
&& allOccluded)) {
|
||||||
|
t.apply();
|
||||||
|
finishT.apply();
|
||||||
|
// Treat this as an abort since we are bypassing any merge logic and effectively
|
||||||
|
// finishing immediately.
|
||||||
|
onAbort(transitionToken);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
final ActiveTransition active = mActiveTransitions.get(activeIdx);
|
final ActiveTransition active = mActiveTransitions.get(activeIdx);
|
||||||
active.mInfo = info;
|
active.mInfo = info;
|
||||||
|
|||||||
@@ -27,6 +27,8 @@ import static android.os.Trace.TRACE_TAG_WINDOW_MANAGER;
|
|||||||
import static android.service.voice.VoiceInteractionSession.SHOW_SOURCE_APPLICATION;
|
import static android.service.voice.VoiceInteractionSession.SHOW_SOURCE_APPLICATION;
|
||||||
import static android.view.Display.DEFAULT_DISPLAY;
|
import static android.view.Display.DEFAULT_DISPLAY;
|
||||||
import static android.view.Display.INVALID_DISPLAY;
|
import static android.view.Display.INVALID_DISPLAY;
|
||||||
|
import static android.view.WindowManager.TRANSIT_TO_BACK;
|
||||||
|
import static android.view.WindowManager.TRANSIT_TO_FRONT;
|
||||||
|
|
||||||
import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_CONFIGURATION;
|
import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_CONFIGURATION;
|
||||||
import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_IMMERSIVE;
|
import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_IMMERSIVE;
|
||||||
@@ -707,7 +709,26 @@ class ActivityClientController extends IActivityClientController.Stub {
|
|||||||
try {
|
try {
|
||||||
synchronized (mGlobalLock) {
|
synchronized (mGlobalLock) {
|
||||||
final ActivityRecord r = ActivityRecord.isInRootTaskLocked(token);
|
final ActivityRecord r = ActivityRecord.isInRootTaskLocked(token);
|
||||||
return r != null && r.setOccludesParent(true);
|
// Create a transition if the activity is playing in case the below activity didn't
|
||||||
|
// commit invisible. That's because if any activity below this one has changed its
|
||||||
|
// visibility while playing transition, there won't able to commit visibility until
|
||||||
|
// the running transition finish.
|
||||||
|
final Transition transition = r != null
|
||||||
|
&& r.mTransitionController.inPlayingTransition(r)
|
||||||
|
? r.mTransitionController.createTransition(TRANSIT_TO_BACK) : null;
|
||||||
|
if (transition != null) {
|
||||||
|
r.mTransitionController.requestStartTransition(transition, null /*startTask */,
|
||||||
|
null /* remoteTransition */, null /* displayChange */);
|
||||||
|
}
|
||||||
|
final boolean changed = r != null && r.setOccludesParent(true);
|
||||||
|
if (transition != null) {
|
||||||
|
if (changed) {
|
||||||
|
r.mTransitionController.setReady(r.getDisplayContent());
|
||||||
|
} else {
|
||||||
|
transition.abort();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return changed;
|
||||||
}
|
}
|
||||||
} finally {
|
} finally {
|
||||||
Binder.restoreCallingIdentity(origId);
|
Binder.restoreCallingIdentity(origId);
|
||||||
@@ -728,7 +749,25 @@ class ActivityClientController extends IActivityClientController.Stub {
|
|||||||
if (under != null) {
|
if (under != null) {
|
||||||
under.returningOptions = safeOptions != null ? safeOptions.getOptions(r) : null;
|
under.returningOptions = safeOptions != null ? safeOptions.getOptions(r) : null;
|
||||||
}
|
}
|
||||||
return r.setOccludesParent(false);
|
// Create a transition if the activity is playing in case the current activity
|
||||||
|
// didn't commit invisible. That's because if this activity has changed its
|
||||||
|
// visibility while playing transition, there won't able to commit visibility until
|
||||||
|
// the running transition finish.
|
||||||
|
final Transition transition = r.mTransitionController.inPlayingTransition(r)
|
||||||
|
? r.mTransitionController.createTransition(TRANSIT_TO_FRONT) : null;
|
||||||
|
if (transition != null) {
|
||||||
|
r.mTransitionController.requestStartTransition(transition, null /*startTask */,
|
||||||
|
null /* remoteTransition */, null /* displayChange */);
|
||||||
|
}
|
||||||
|
final boolean changed = r.setOccludesParent(false);
|
||||||
|
if (transition != null) {
|
||||||
|
if (changed) {
|
||||||
|
r.mTransitionController.setReady(r.getDisplayContent());
|
||||||
|
} else {
|
||||||
|
transition.abort();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return changed;
|
||||||
}
|
}
|
||||||
} finally {
|
} finally {
|
||||||
Binder.restoreCallingIdentity(origId);
|
Binder.restoreCallingIdentity(origId);
|
||||||
|
|||||||
@@ -120,6 +120,8 @@ import static android.view.WindowManager.LayoutParams.TYPE_BASE_APPLICATION;
|
|||||||
import static android.view.WindowManager.TRANSIT_CLOSE;
|
import static android.view.WindowManager.TRANSIT_CLOSE;
|
||||||
import static android.view.WindowManager.TRANSIT_FLAG_OPEN_BEHIND;
|
import static android.view.WindowManager.TRANSIT_FLAG_OPEN_BEHIND;
|
||||||
import static android.view.WindowManager.TRANSIT_OLD_UNSET;
|
import static android.view.WindowManager.TRANSIT_OLD_UNSET;
|
||||||
|
import static android.window.TransitionInfo.FLAG_IS_OCCLUDED;
|
||||||
|
import static android.window.TransitionInfo.FLAG_STARTING_WINDOW_TRANSFER_RECIPIENT;
|
||||||
|
|
||||||
import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_ADD_REMOVE;
|
import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_ADD_REMOVE;
|
||||||
import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_ANIM;
|
import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_ANIM;
|
||||||
@@ -658,7 +660,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
|
|||||||
private final WindowState.UpdateReportedVisibilityResults mReportedVisibilityResults =
|
private final WindowState.UpdateReportedVisibilityResults mReportedVisibilityResults =
|
||||||
new WindowState.UpdateReportedVisibilityResults();
|
new WindowState.UpdateReportedVisibilityResults();
|
||||||
|
|
||||||
boolean mUseTransferredAnimation;
|
int mTransitionChangeFlags;
|
||||||
|
|
||||||
/** Whether we need to setup the animation to animate only within the letterbox. */
|
/** Whether we need to setup the animation to animate only within the letterbox. */
|
||||||
private boolean mNeedsLetterboxedAnimation;
|
private boolean mNeedsLetterboxedAnimation;
|
||||||
@@ -4395,10 +4397,10 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
|
|||||||
// When transferring an animation, we no longer need to apply an animation to
|
// When transferring an animation, we no longer need to apply an animation to
|
||||||
// the token we transfer the animation over. Thus, set this flag to indicate
|
// the token we transfer the animation over. Thus, set this flag to indicate
|
||||||
// we've transferred the animation.
|
// we've transferred the animation.
|
||||||
mUseTransferredAnimation = true;
|
mTransitionChangeFlags |= FLAG_STARTING_WINDOW_TRANSFER_RECIPIENT;
|
||||||
} else if (mTransitionController.getTransitionPlayer() != null) {
|
} else if (mTransitionController.getTransitionPlayer() != null) {
|
||||||
// In the new transit system, just set this every time we transfer the window
|
// In the new transit system, just set this every time we transfer the window
|
||||||
mUseTransferredAnimation = true;
|
mTransitionChangeFlags |= FLAG_STARTING_WINDOW_TRANSFER_RECIPIENT;
|
||||||
}
|
}
|
||||||
// Post cleanup after the visibility and animation are transferred.
|
// Post cleanup after the visibility and animation are transferred.
|
||||||
fromActivity.postWindowRemoveStartingWindowCleanup(tStartingWindow);
|
fromActivity.postWindowRemoveStartingWindowCleanup(tStartingWindow);
|
||||||
@@ -5247,6 +5249,10 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
|
|||||||
|
|
||||||
// If in a transition, defer commits for activities that are going invisible
|
// If in a transition, defer commits for activities that are going invisible
|
||||||
if (!visible && inTransition()) {
|
if (!visible && inTransition()) {
|
||||||
|
if (mTransitionController.inPlayingTransition(this)
|
||||||
|
&& mTransitionController.isCollecting(this)) {
|
||||||
|
mTransitionChangeFlags |= FLAG_IS_OCCLUDED;
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// If we are preparing an app transition, then delay changing
|
// If we are preparing an app transition, then delay changing
|
||||||
@@ -5297,7 +5303,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
|
|||||||
@Override
|
@Override
|
||||||
boolean applyAnimation(LayoutParams lp, @TransitionOldType int transit, boolean enter,
|
boolean applyAnimation(LayoutParams lp, @TransitionOldType int transit, boolean enter,
|
||||||
boolean isVoiceInteraction, @Nullable ArrayList<WindowContainer> sources) {
|
boolean isVoiceInteraction, @Nullable ArrayList<WindowContainer> sources) {
|
||||||
if (mUseTransferredAnimation) {
|
if ((mTransitionChangeFlags & FLAG_STARTING_WINDOW_TRANSFER_RECIPIENT) != 0) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
// If it was set to true, reset the last request to force the transition.
|
// If it was set to true, reset the last request to force the transition.
|
||||||
@@ -5370,7 +5376,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
|
|||||||
mWmService.mWindowPlacerLocked.performSurfacePlacement();
|
mWmService.mWindowPlacerLocked.performSurfacePlacement();
|
||||||
}
|
}
|
||||||
displayContent.getInputMonitor().updateInputWindowsLw(false /*force*/);
|
displayContent.getInputMonitor().updateInputWindowsLw(false /*force*/);
|
||||||
mUseTransferredAnimation = false;
|
mTransitionChangeFlags = 0;
|
||||||
|
|
||||||
postApplyAnimation(visible, fromTransition);
|
postApplyAnimation(visible, fromTransition);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -55,7 +55,6 @@ import static android.window.TransitionInfo.FLAG_IS_VOICE_INTERACTION;
|
|||||||
import static android.window.TransitionInfo.FLAG_IS_WALLPAPER;
|
import static android.window.TransitionInfo.FLAG_IS_WALLPAPER;
|
||||||
import static android.window.TransitionInfo.FLAG_OCCLUDES_KEYGUARD;
|
import static android.window.TransitionInfo.FLAG_OCCLUDES_KEYGUARD;
|
||||||
import static android.window.TransitionInfo.FLAG_SHOW_WALLPAPER;
|
import static android.window.TransitionInfo.FLAG_SHOW_WALLPAPER;
|
||||||
import static android.window.TransitionInfo.FLAG_STARTING_WINDOW_TRANSFER_RECIPIENT;
|
|
||||||
import static android.window.TransitionInfo.FLAG_TRANSLUCENT;
|
import static android.window.TransitionInfo.FLAG_TRANSLUCENT;
|
||||||
import static android.window.TransitionInfo.FLAG_WILL_IME_SHOWN;
|
import static android.window.TransitionInfo.FLAG_WILL_IME_SHOWN;
|
||||||
|
|
||||||
@@ -1889,12 +1888,10 @@ class Transition extends Binder implements BLASTSyncEngine.TransactionReadyListe
|
|||||||
final ActivityRecord record = wc.asActivityRecord();
|
final ActivityRecord record = wc.asActivityRecord();
|
||||||
if (record != null) {
|
if (record != null) {
|
||||||
parentTask = record.getTask();
|
parentTask = record.getTask();
|
||||||
if (record.mUseTransferredAnimation) {
|
|
||||||
flags |= FLAG_STARTING_WINDOW_TRANSFER_RECIPIENT;
|
|
||||||
}
|
|
||||||
if (record.mVoiceInteraction) {
|
if (record.mVoiceInteraction) {
|
||||||
flags |= FLAG_IS_VOICE_INTERACTION;
|
flags |= FLAG_IS_VOICE_INTERACTION;
|
||||||
}
|
}
|
||||||
|
flags |= record.mTransitionChangeFlags;
|
||||||
}
|
}
|
||||||
final TaskFragment taskFragment = wc.asTaskFragment();
|
final TaskFragment taskFragment = wc.asTaskFragment();
|
||||||
if (taskFragment != null && task == null) {
|
if (taskFragment != null && task == null) {
|
||||||
|
|||||||
Reference in New Issue
Block a user