diff options
| author | Chris Li <lihongyu@google.com> | 2022-07-27 15:43:30 +0800 |
|---|---|---|
| committer | Chris Li <lihongyu@google.com> | 2022-08-04 10:32:34 +0800 |
| commit | 6b94ca2d5f5ead527532b2a1c489c861485bacb6 (patch) | |
| tree | 7082a16f9e041a70c0471510840b08d0aa2e28ad /core/java/android/window/TaskFragmentOrganizer.java | |
| parent | 8a1fa447594d05619ada655192348cdfc8789c48 (diff) | |
Convert TaskFragmentOrganizer callbacks to a transaction callback
Before, we have several different callbacks, such as
onTaskFragmentAppeared, onTaskFragmentInfoChanged, etc. As migrating to
Shell transition, we need a new model to better sync between app
process, WM Core and Shell.
The flow will be:
1. WM Shell startTransition with a WindowContainerTransaction
2. After apply the WCT, notify TaskFragmentOrganizerController
3. TFOrganizerController pack the TF related events into one transaction
4. TFOrganizerController call deferTransitionReady and send the
transaction to the TFOrganizer in app process
5. TFOrganizer update TFs based on the transaction and apply a WCT
6. When TFOrganizerController get that WCT, call continueTransitionReady
Bug: 240519866
Test: pass existing
Change-Id: I110953f7b73f565a2b1299ef5c3827eaa39e84b8
Diffstat (limited to 'core/java/android/window/TaskFragmentOrganizer.java')
| -rw-r--r-- | core/java/android/window/TaskFragmentOrganizer.java | 116 |
1 files changed, 71 insertions, 45 deletions
diff --git a/core/java/android/window/TaskFragmentOrganizer.java b/core/java/android/window/TaskFragmentOrganizer.java index e4a6ad87053c..c9a568815fb1 100644 --- a/core/java/android/window/TaskFragmentOrganizer.java +++ b/core/java/android/window/TaskFragmentOrganizer.java @@ -16,6 +16,13 @@ package android.window; +import static android.window.TaskFragmentTransaction.TYPE_ACTIVITY_REPARENT_TO_TASK; +import static android.window.TaskFragmentTransaction.TYPE_TASK_FRAGMENT_APPEARED; +import static android.window.TaskFragmentTransaction.TYPE_TASK_FRAGMENT_ERROR; +import static android.window.TaskFragmentTransaction.TYPE_TASK_FRAGMENT_INFO_CHANGED; +import static android.window.TaskFragmentTransaction.TYPE_TASK_FRAGMENT_PARENT_INFO_CHANGED; +import static android.window.TaskFragmentTransaction.TYPE_TASK_FRAGMENT_VANISHED; + import android.annotation.CallSuper; import android.annotation.NonNull; import android.annotation.Nullable; @@ -27,6 +34,7 @@ import android.os.IBinder; import android.os.RemoteException; import android.view.RemoteAnimationDefinition; +import java.util.List; import java.util.concurrent.Executor; /** @@ -204,6 +212,67 @@ public class TaskFragmentOrganizer extends WindowOrganizer { public void onActivityReparentToTask(int taskId, @NonNull Intent activityIntent, @NonNull IBinder activityToken) {} + /** + * Called when the transaction is ready so that the organizer can update the TaskFragments based + * on the changes in transaction. + * @hide + */ + public void onTransactionReady(@NonNull TaskFragmentTransaction transaction) { + final List<TaskFragmentTransaction.Change> changes = transaction.getChanges(); + for (TaskFragmentTransaction.Change change : changes) { + // TODO(b/240519866): apply all changes in one WCT. + switch (change.getType()) { + case TYPE_TASK_FRAGMENT_APPEARED: + onTaskFragmentAppeared(change.getTaskFragmentInfo()); + if (change.getTaskConfiguration() != null) { + // TODO(b/240519866): convert to pass TaskConfiguration for all TFs in the + // same Task + onTaskFragmentParentInfoChanged( + change.getTaskFragmentToken(), + change.getTaskConfiguration()); + } + break; + case TYPE_TASK_FRAGMENT_INFO_CHANGED: + if (change.getTaskConfiguration() != null) { + // TODO(b/240519866): convert to pass TaskConfiguration for all TFs in the + // same Task + onTaskFragmentParentInfoChanged( + change.getTaskFragmentToken(), + change.getTaskConfiguration()); + } + onTaskFragmentInfoChanged(change.getTaskFragmentInfo()); + break; + case TYPE_TASK_FRAGMENT_VANISHED: + onTaskFragmentVanished(change.getTaskFragmentInfo()); + break; + case TYPE_TASK_FRAGMENT_PARENT_INFO_CHANGED: + onTaskFragmentParentInfoChanged( + change.getTaskFragmentToken(), + change.getTaskConfiguration()); + break; + case TYPE_TASK_FRAGMENT_ERROR: + final Bundle errorBundle = change.getErrorBundle(); + onTaskFragmentError( + change.getErrorCallbackToken(), + errorBundle.getParcelable( + KEY_ERROR_CALLBACK_TASK_FRAGMENT_INFO, TaskFragmentInfo.class), + errorBundle.getInt(KEY_ERROR_CALLBACK_OP_TYPE), + errorBundle.getSerializable(KEY_ERROR_CALLBACK_EXCEPTION, + java.lang.Throwable.class)); + break; + case TYPE_ACTIVITY_REPARENT_TO_TASK: + onActivityReparentToTask( + change.getTaskId(), + change.getActivityIntent(), + change.getActivityToken()); + break; + default: + throw new IllegalArgumentException( + "Unknown TaskFragmentEvent=" + change.getType()); + } + } + } + @Override public void applyTransaction(@NonNull WindowContainerTransaction t) { t.setTaskFragmentOrganizer(mInterface); @@ -221,51 +290,8 @@ public class TaskFragmentOrganizer extends WindowOrganizer { private final ITaskFragmentOrganizer mInterface = new ITaskFragmentOrganizer.Stub() { @Override - public void onTaskFragmentAppeared(@NonNull TaskFragmentInfo taskFragmentInfo) { - mExecutor.execute( - () -> TaskFragmentOrganizer.this.onTaskFragmentAppeared(taskFragmentInfo)); - } - - @Override - public void onTaskFragmentInfoChanged(@NonNull TaskFragmentInfo taskFragmentInfo) { - mExecutor.execute( - () -> TaskFragmentOrganizer.this.onTaskFragmentInfoChanged(taskFragmentInfo)); - } - - @Override - public void onTaskFragmentVanished(@NonNull TaskFragmentInfo taskFragmentInfo) { - mExecutor.execute( - () -> TaskFragmentOrganizer.this.onTaskFragmentVanished(taskFragmentInfo)); - } - - @Override - public void onTaskFragmentParentInfoChanged( - @NonNull IBinder fragmentToken, @NonNull Configuration parentConfig) { - mExecutor.execute( - () -> TaskFragmentOrganizer.this.onTaskFragmentParentInfoChanged( - fragmentToken, parentConfig)); - } - - @Override - public void onTaskFragmentError( - @NonNull IBinder errorCallbackToken, @NonNull Bundle errorBundle) { - mExecutor.execute(() -> { - final TaskFragmentInfo info = errorBundle.getParcelable( - KEY_ERROR_CALLBACK_TASK_FRAGMENT_INFO, TaskFragmentInfo.class); - TaskFragmentOrganizer.this.onTaskFragmentError( - errorCallbackToken, info, - errorBundle.getInt(KEY_ERROR_CALLBACK_OP_TYPE), - (Throwable) errorBundle.getSerializable(KEY_ERROR_CALLBACK_EXCEPTION, - java.lang.Throwable.class)); - }); - } - - @Override - public void onActivityReparentToTask(int taskId, @NonNull Intent activityIntent, - @NonNull IBinder activityToken) { - mExecutor.execute( - () -> TaskFragmentOrganizer.this.onActivityReparentToTask( - taskId, activityIntent, activityToken)); + public void onTransactionReady(@NonNull TaskFragmentTransaction transaction) { + mExecutor.execute(() -> TaskFragmentOrganizer.this.onTransactionReady(transaction)); } }; |
