Fix extra transition animation played after back gesture trigger.

Add type check for TaskFragment.

Bug: 274997067
Test: triger back-to-activity animation on TaskFragment, then verify
there won't load no extra transition animation.

Change-Id: I9aff6399020df9012ba807a1b834c74ee07a7c50
This commit is contained in:
wilsonshih
2023-03-21 11:48:44 +00:00
parent 23b25b07d3
commit d6d8503b35
2 changed files with 29 additions and 24 deletions

View File

@@ -666,14 +666,29 @@ class BackNavigationController {
private static final int TASK_SWITCH = 1;
private static final int ACTIVITY_SWITCH = 2;
private static boolean isActivitySwitch(WindowContainer close, WindowContainer open) {
if (close.asActivityRecord() == null || open.asActivityRecord() == null
|| (close.asActivityRecord().getTask()
!= open.asActivityRecord().getTask())) {
return false;
}
return true;
}
private static boolean isTaskSwitch(WindowContainer close, WindowContainer open) {
if (close.asTask() == null || open.asTask() == null
|| (close.asTask() == open.asTask())) {
return false;
}
return true;
}
private void initiate(WindowContainer close, WindowContainer open) {
WindowContainer closeTarget;
if (close.asActivityRecord() != null && open.asActivityRecord() != null
&& (close.asActivityRecord().getTask() == open.asActivityRecord().getTask())) {
if (isActivitySwitch(close, open)) {
mSwitchType = ACTIVITY_SWITCH;
closeTarget = close.asActivityRecord();
} else if (close.asTask() != null && open.asTask() != null
&& close.asTask() != open.asTask()) {
} else if (isTaskSwitch(close, open)) {
mSwitchType = TASK_SWITCH;
closeTarget = close.asTask().getTopNonFinishingActivity();
} else {
@@ -748,15 +763,15 @@ class BackNavigationController {
}
boolean isTarget(WindowContainer wc, boolean open) {
if (open) {
return wc == mOpenAdaptor.mTarget || mOpenAdaptor.mTarget.hasChild(wc);
if (!mComposed) {
return false;
}
final WindowContainer target = open ? mOpenAdaptor.mTarget : mCloseAdaptor.mTarget;
if (mSwitchType == TASK_SWITCH) {
return wc == mCloseAdaptor.mTarget
|| (wc.asTask() != null && wc.hasChild(mCloseAdaptor.mTarget));
return wc == target
|| (wc.asTask() != null && wc.hasChild(target));
} else if (mSwitchType == ACTIVITY_SWITCH) {
return wc == mCloseAdaptor.mTarget;
return wc == target || (wc.asTaskFragment() != null && wc.hasChild(target));
}
return false;
}

View File

@@ -2363,6 +2363,9 @@ class Transition implements BLASTSyncEngine.TransactionReadyListener {
if (isTranslucent(wc)) {
flags |= FLAG_TRANSLUCENT;
}
if (wc.mWmService.mAtmService.mBackNavigationController.isMonitorTransitionTarget(wc)) {
flags |= TransitionInfo.FLAG_BACK_GESTURE_ANIMATED;
}
final Task task = wc.asTask();
if (task != null) {
final ActivityRecord topActivity = task.getTopNonFinishingActivity();
@@ -2371,19 +2374,10 @@ class Transition implements BLASTSyncEngine.TransactionReadyListener {
&& topActivity.mStartingData.hasImeSurface()) {
flags |= FLAG_WILL_IME_SHOWN;
}
if (topActivity.mAtmService.mBackNavigationController
.isMonitorTransitionTarget(topActivity)) {
flags |= TransitionInfo.FLAG_BACK_GESTURE_ANIMATED;
}
if (topActivity != null && topActivity.mLaunchTaskBehind) {
if (topActivity.mLaunchTaskBehind) {
Slog.e(TAG, "Unexpected launch-task-behind operation in shell transition");
flags |= FLAG_TASK_LAUNCHING_BEHIND;
}
} else {
if (task.mAtmService.mBackNavigationController
.isMonitorTransitionTarget(task)) {
flags |= TransitionInfo.FLAG_BACK_GESTURE_ANIMATED;
}
}
if (task.voiceSession != null) {
flags |= FLAG_IS_VOICE_INTERACTION;
@@ -2397,10 +2391,6 @@ class Transition implements BLASTSyncEngine.TransactionReadyListener {
flags |= FLAG_IS_VOICE_INTERACTION;
}
flags |= record.mTransitionChangeFlags;
if (record.mAtmService.mBackNavigationController
.isMonitorTransitionTarget(record)) {
flags |= TransitionInfo.FLAG_BACK_GESTURE_ANIMATED;
}
}
final TaskFragment taskFragment = wc.asTaskFragment();
if (taskFragment != null && task == null) {