From 2bc0ca2455875273827e0bbbe6301a74a9dbd38d Mon Sep 17 00:00:00 2001 From: Louis Chang Date: Thu, 23 Sep 2021 11:46:33 +0800 Subject: [PATCH] Sends TaskFragment info before scheduling activity launch Otherwise, the app developers are not able to know whether the activity is in split while activity created. Bug: 200303250 Test: run demo app Change-Id: I42fa20280db0158dcb5cfb8ece1f74e66b246ed2 --- .../server/wm/ActivityTaskSupervisor.java | 6 ++ .../wm/TaskFragmentOrganizerController.java | 61 ++++++++++++------- 2 files changed, 45 insertions(+), 22 deletions(-) diff --git a/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java b/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java index 0497fb5001d47..76acca9917d19 100644 --- a/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java +++ b/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java @@ -841,6 +841,12 @@ public class ActivityTaskSupervisor implements RecentTasks.Callbacks { logIfTransactionTooLarge(r.intent, r.getSavedState()); + if (r.isEmbedded()) { + // Sending TaskFragmentInfo to client to ensure the info is updated before + // the activity creation. + mService.mTaskFragmentOrganizerController.dispatchPendingInfoChangedEvent( + r.getOrganizedTaskFragment()); + } // Create activity launch transaction. final ClientTransaction clientTransaction = ClientTransaction.obtain( diff --git a/services/core/java/com/android/server/wm/TaskFragmentOrganizerController.java b/services/core/java/com/android/server/wm/TaskFragmentOrganizerController.java index 30d2a323aabe9..d91165685c636 100644 --- a/services/core/java/com/android/server/wm/TaskFragmentOrganizerController.java +++ b/services/core/java/com/android/server/wm/TaskFragmentOrganizerController.java @@ -505,29 +505,46 @@ public class TaskFragmentOrganizerController extends ITaskFragmentOrganizerContr } for (int i = 0, n = mPendingTaskFragmentEvents.size(); i < n; i++) { PendingTaskFragmentEvent event = mPendingTaskFragmentEvents.get(i); - final ITaskFragmentOrganizer taskFragmentOrg = event.mTaskFragmentOrg; - final TaskFragment taskFragment = event.mTaskFragment; - final TaskFragmentOrganizerState state = - mTaskFragmentOrganizerState.get(taskFragmentOrg.asBinder()); - if (state == null) continue; - switch (event.mEventType) { - case PendingTaskFragmentEvent.EVENT_APPEARED: - state.onTaskFragmentAppeared(taskFragmentOrg, taskFragment); - break; - case PendingTaskFragmentEvent.EVENT_VANISHED: - state.onTaskFragmentVanished(taskFragmentOrg, taskFragment); - break; - case PendingTaskFragmentEvent.EVENT_INFO_CHANGED: - state.onTaskFragmentInfoChanged(taskFragmentOrg, taskFragment); - break; - case PendingTaskFragmentEvent.EVENT_PARENT_INFO_CHANGED: - state.onTaskFragmentParentInfoChanged(taskFragmentOrg, taskFragment); - break; - case PendingTaskFragmentEvent.EVENT_ERROR: - state.onTaskFragmentError(taskFragmentOrg, event.mErrorCallback, - event.mException); - } + dispatchEvent(event); } mPendingTaskFragmentEvents.clear(); } + + void dispatchPendingInfoChangedEvent(TaskFragment taskFragment) { + PendingTaskFragmentEvent event = getPendingTaskFragmentEvent(taskFragment, + PendingTaskFragmentEvent.EVENT_INFO_CHANGED); + if (event == null) { + return; + } + + dispatchEvent(event); + mPendingTaskFragmentEvents.remove(event); + } + + private void dispatchEvent(PendingTaskFragmentEvent event) { + final ITaskFragmentOrganizer taskFragmentOrg = event.mTaskFragmentOrg; + final TaskFragment taskFragment = event.mTaskFragment; + final TaskFragmentOrganizerState state = + mTaskFragmentOrganizerState.get(taskFragmentOrg.asBinder()); + if (state == null) { + return; + } + switch (event.mEventType) { + case PendingTaskFragmentEvent.EVENT_APPEARED: + state.onTaskFragmentAppeared(taskFragmentOrg, taskFragment); + break; + case PendingTaskFragmentEvent.EVENT_VANISHED: + state.onTaskFragmentVanished(taskFragmentOrg, taskFragment); + break; + case PendingTaskFragmentEvent.EVENT_INFO_CHANGED: + state.onTaskFragmentInfoChanged(taskFragmentOrg, taskFragment); + break; + case PendingTaskFragmentEvent.EVENT_PARENT_INFO_CHANGED: + state.onTaskFragmentParentInfoChanged(taskFragmentOrg, taskFragment); + break; + case PendingTaskFragmentEvent.EVENT_ERROR: + state.onTaskFragmentError(taskFragmentOrg, event.mErrorCallback, + event.mException); + } + } }