summaryrefslogtreecommitdiff
path: root/core/java/android/window/TaskFragmentOrganizer.java
diff options
context:
space:
mode:
authorChris Li <lihongyu@google.com>2022-07-27 15:43:30 +0800
committerChris Li <lihongyu@google.com>2022-08-04 10:32:34 +0800
commit6b94ca2d5f5ead527532b2a1c489c861485bacb6 (patch)
tree7082a16f9e041a70c0471510840b08d0aa2e28ad /core/java/android/window/TaskFragmentOrganizer.java
parent8a1fa447594d05619ada655192348cdfc8789c48 (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.java116
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));
}
};