Merge "Fix delay on TYPE_TASK_FRAGMENT_VANISHED" into tm-qpr-dev am: 05dbbf292f
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/20731415 Change-Id: Iadfffd5c4d053153723b913d0d4f7cb70bad33af Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
@@ -227,10 +227,15 @@ class TaskFragment extends WindowContainer<WindowContainer> {
|
|||||||
private TaskFragment mCompanionTaskFragment;
|
private TaskFragment mCompanionTaskFragment;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Prevents duplicate calls to onTaskAppeared.
|
* Prevents duplicate calls to onTaskFragmentAppeared.
|
||||||
*/
|
*/
|
||||||
boolean mTaskFragmentAppearedSent;
|
boolean mTaskFragmentAppearedSent;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Prevents unnecessary callbacks after onTaskFragmentVanished.
|
||||||
|
*/
|
||||||
|
boolean mTaskFragmentVanishedSent;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The last running activity of the TaskFragment was finished due to clear task while launching
|
* The last running activity of the TaskFragment was finished due to clear task while launching
|
||||||
* an activity in the Task.
|
* an activity in the Task.
|
||||||
|
|||||||
@@ -553,6 +553,9 @@ public class TaskFragmentOrganizerController extends ITaskFragmentOrganizerContr
|
|||||||
|
|
||||||
void onTaskFragmentAppeared(@NonNull ITaskFragmentOrganizer organizer,
|
void onTaskFragmentAppeared(@NonNull ITaskFragmentOrganizer organizer,
|
||||||
@NonNull TaskFragment taskFragment) {
|
@NonNull TaskFragment taskFragment) {
|
||||||
|
if (taskFragment.mTaskFragmentVanishedSent) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (taskFragment.getTask() == null) {
|
if (taskFragment.getTask() == null) {
|
||||||
Slog.w(TAG, "onTaskFragmentAppeared failed because it is not attached tf="
|
Slog.w(TAG, "onTaskFragmentAppeared failed because it is not attached tf="
|
||||||
+ taskFragment);
|
+ taskFragment);
|
||||||
@@ -574,6 +577,9 @@ public class TaskFragmentOrganizerController extends ITaskFragmentOrganizerContr
|
|||||||
|
|
||||||
void onTaskFragmentInfoChanged(@NonNull ITaskFragmentOrganizer organizer,
|
void onTaskFragmentInfoChanged(@NonNull ITaskFragmentOrganizer organizer,
|
||||||
@NonNull TaskFragment taskFragment) {
|
@NonNull TaskFragment taskFragment) {
|
||||||
|
if (taskFragment.mTaskFragmentVanishedSent) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
validateAndGetState(organizer);
|
validateAndGetState(organizer);
|
||||||
if (!taskFragment.mTaskFragmentAppearedSent) {
|
if (!taskFragment.mTaskFragmentAppearedSent) {
|
||||||
// Skip if TaskFragment still not appeared.
|
// Skip if TaskFragment still not appeared.
|
||||||
@@ -586,10 +592,6 @@ public class TaskFragmentOrganizerController extends ITaskFragmentOrganizerContr
|
|||||||
.setTaskFragment(taskFragment)
|
.setTaskFragment(taskFragment)
|
||||||
.build();
|
.build();
|
||||||
} else {
|
} else {
|
||||||
if (pendingEvent.mEventType == PendingTaskFragmentEvent.EVENT_VANISHED) {
|
|
||||||
// Skipped the info changed event if vanished event is pending.
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// Remove and add for re-ordering.
|
// Remove and add for re-ordering.
|
||||||
removePendingEvent(pendingEvent);
|
removePendingEvent(pendingEvent);
|
||||||
// Reset the defer time when TaskFragment is changed, so that it can check again if
|
// Reset the defer time when TaskFragment is changed, so that it can check again if
|
||||||
@@ -602,6 +604,10 @@ public class TaskFragmentOrganizerController extends ITaskFragmentOrganizerContr
|
|||||||
|
|
||||||
void onTaskFragmentVanished(@NonNull ITaskFragmentOrganizer organizer,
|
void onTaskFragmentVanished(@NonNull ITaskFragmentOrganizer organizer,
|
||||||
@NonNull TaskFragment taskFragment) {
|
@NonNull TaskFragment taskFragment) {
|
||||||
|
if (taskFragment.mTaskFragmentVanishedSent) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
taskFragment.mTaskFragmentVanishedSent = true;
|
||||||
final TaskFragmentOrganizerState state = validateAndGetState(organizer);
|
final TaskFragmentOrganizerState state = validateAndGetState(organizer);
|
||||||
final List<PendingTaskFragmentEvent> pendingEvents = mPendingTaskFragmentEvents
|
final List<PendingTaskFragmentEvent> pendingEvents = mPendingTaskFragmentEvents
|
||||||
.get(organizer.asBinder());
|
.get(organizer.asBinder());
|
||||||
@@ -617,20 +623,18 @@ public class TaskFragmentOrganizerController extends ITaskFragmentOrganizerContr
|
|||||||
.setTaskFragment(taskFragment)
|
.setTaskFragment(taskFragment)
|
||||||
.build());
|
.build());
|
||||||
state.removeTaskFragment(taskFragment);
|
state.removeTaskFragment(taskFragment);
|
||||||
|
// Make sure the vanished event will be dispatched if there are no other changes.
|
||||||
|
mAtmService.mWindowManager.mWindowPlacerLocked.requestTraversal();
|
||||||
}
|
}
|
||||||
|
|
||||||
void onTaskFragmentError(@NonNull ITaskFragmentOrganizer organizer,
|
void onTaskFragmentError(@NonNull ITaskFragmentOrganizer organizer,
|
||||||
@Nullable IBinder errorCallbackToken, @Nullable TaskFragment taskFragment,
|
@Nullable IBinder errorCallbackToken, @Nullable TaskFragment taskFragment,
|
||||||
int opType, @NonNull Throwable exception) {
|
int opType, @NonNull Throwable exception) {
|
||||||
validateAndGetState(organizer);
|
if (taskFragment != null && taskFragment.mTaskFragmentVanishedSent) {
|
||||||
Slog.w(TAG, "onTaskFragmentError ", exception);
|
|
||||||
final PendingTaskFragmentEvent vanishedEvent = taskFragment != null
|
|
||||||
? getPendingTaskFragmentEvent(taskFragment, PendingTaskFragmentEvent.EVENT_VANISHED)
|
|
||||||
: null;
|
|
||||||
if (vanishedEvent != null) {
|
|
||||||
// No need to notify if the TaskFragment has been removed.
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
validateAndGetState(organizer);
|
||||||
|
Slog.w(TAG, "onTaskFragmentError ", exception);
|
||||||
addPendingEvent(new PendingTaskFragmentEvent.Builder(
|
addPendingEvent(new PendingTaskFragmentEvent.Builder(
|
||||||
PendingTaskFragmentEvent.EVENT_ERROR, organizer)
|
PendingTaskFragmentEvent.EVENT_ERROR, organizer)
|
||||||
.setErrorCallbackToken(errorCallbackToken)
|
.setErrorCallbackToken(errorCallbackToken)
|
||||||
|
|||||||
@@ -247,6 +247,7 @@ public class TaskFragmentOrganizerControllerTest extends WindowTestsBase {
|
|||||||
mController.onTaskFragmentVanished(mTaskFragment.getTaskFragmentOrganizer(), mTaskFragment);
|
mController.onTaskFragmentVanished(mTaskFragment.getTaskFragmentOrganizer(), mTaskFragment);
|
||||||
mController.dispatchPendingEvents();
|
mController.dispatchPendingEvents();
|
||||||
|
|
||||||
|
assertTrue(mTaskFragment.mTaskFragmentVanishedSent);
|
||||||
assertTaskFragmentVanishedTransaction();
|
assertTaskFragmentVanishedTransaction();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -259,10 +260,12 @@ public class TaskFragmentOrganizerControllerTest extends WindowTestsBase {
|
|||||||
mController.onTaskFragmentVanished(mTaskFragment.getTaskFragmentOrganizer(), mTaskFragment);
|
mController.onTaskFragmentVanished(mTaskFragment.getTaskFragmentOrganizer(), mTaskFragment);
|
||||||
mController.dispatchPendingEvents();
|
mController.dispatchPendingEvents();
|
||||||
|
|
||||||
|
assertTrue(mTaskFragment.mTaskFragmentVanishedSent);
|
||||||
assertTaskFragmentVanishedTransaction();
|
assertTaskFragmentVanishedTransaction();
|
||||||
|
|
||||||
// Not trigger onTaskFragmentInfoChanged.
|
// Not trigger onTaskFragmentInfoChanged.
|
||||||
// Call onTaskFragmentAppeared before calling onTaskFragmentInfoChanged.
|
// Call onTaskFragmentAppeared before calling onTaskFragmentInfoChanged.
|
||||||
|
mTaskFragment.mTaskFragmentVanishedSent = false;
|
||||||
mController.onTaskFragmentAppeared(mTaskFragment.getTaskFragmentOrganizer(), mTaskFragment);
|
mController.onTaskFragmentAppeared(mTaskFragment.getTaskFragmentOrganizer(), mTaskFragment);
|
||||||
mController.dispatchPendingEvents();
|
mController.dispatchPendingEvents();
|
||||||
clearInvocations(mOrganizer);
|
clearInvocations(mOrganizer);
|
||||||
|
|||||||
Reference in New Issue
Block a user