From 87cc485c6ad2e6755b813333cd4abb98cdc62b90 Mon Sep 17 00:00:00 2001 From: Chris Li Date: Tue, 2 Aug 2022 16:08:37 +0800 Subject: [PATCH] Apply TaskFragmentOrganizer changes in one WCT (2/2) Before, when receive TaskFragment transaction, we apply changes in multiple WindowContainerTransactions. Now, update to apply all changes in one WCT for the whole TaskFragment transaction. Bug: 240519866 Test: pass existing Change-Id: I943d6232ff226ed6f67367fa9b7f73e1f861de64 --- core/api/test-current.txt | 11 +- .../android/window/TaskFragmentOrganizer.java | 104 +++++++----------- .../JetpackTaskFragmentOrganizer.java | 31 ++---- .../TaskFragmentOrganizerControllerTest.java | 70 ++++++------ 4 files changed, 90 insertions(+), 126 deletions(-) diff --git a/core/api/test-current.txt b/core/api/test-current.txt index d758dd52410b5..fefdfd8d7b15d 100644 --- a/core/api/test-current.txt +++ b/core/api/test-current.txt @@ -3333,11 +3333,12 @@ package android.window { ctor public TaskFragmentOrganizer(@NonNull java.util.concurrent.Executor); method @NonNull public java.util.concurrent.Executor getExecutor(); method @NonNull public android.window.TaskFragmentOrganizerToken getOrganizerToken(); - method public void onTaskFragmentAppeared(@NonNull android.window.TaskFragmentInfo); - method public void onTaskFragmentError(@NonNull android.os.IBinder, @Nullable android.window.TaskFragmentInfo, int, @NonNull Throwable); - method public void onTaskFragmentInfoChanged(@NonNull android.window.TaskFragmentInfo); - method public void onTaskFragmentParentInfoChanged(@NonNull android.os.IBinder, @NonNull android.content.res.Configuration); - method public void onTaskFragmentVanished(@NonNull android.window.TaskFragmentInfo); + method public void onActivityReparentedToTask(@NonNull android.window.WindowContainerTransaction, int, @NonNull android.content.Intent, @NonNull android.os.IBinder); + method public void onTaskFragmentAppeared(@NonNull android.window.WindowContainerTransaction, @NonNull android.window.TaskFragmentInfo); + method public void onTaskFragmentError(@NonNull android.window.WindowContainerTransaction, @NonNull android.os.IBinder, @Nullable android.window.TaskFragmentInfo, int, @NonNull Throwable); + method public void onTaskFragmentInfoChanged(@NonNull android.window.WindowContainerTransaction, @NonNull android.window.TaskFragmentInfo); + method public void onTaskFragmentParentInfoChanged(@NonNull android.window.WindowContainerTransaction, int, @NonNull android.content.res.Configuration); + method public void onTaskFragmentVanished(@NonNull android.window.WindowContainerTransaction, @NonNull android.window.TaskFragmentInfo); method @CallSuper public void registerOrganizer(); method @CallSuper public void unregisterOrganizer(); } diff --git a/core/java/android/window/TaskFragmentOrganizer.java b/core/java/android/window/TaskFragmentOrganizer.java index 49849a473814f..cd15df84debda 100644 --- a/core/java/android/window/TaskFragmentOrganizer.java +++ b/core/java/android/window/TaskFragmentOrganizer.java @@ -26,16 +26,15 @@ import static android.window.TaskFragmentTransaction.TYPE_TASK_FRAGMENT_VANISHED import android.annotation.CallSuper; import android.annotation.NonNull; import android.annotation.Nullable; +import android.annotation.SuppressLint; import android.annotation.TestApi; import android.content.Intent; import android.content.res.Configuration; import android.os.Bundle; import android.os.IBinder; import android.os.RemoteException; -import android.util.SparseArray; import android.view.RemoteAnimationDefinition; -import java.util.ArrayList; import java.util.List; import java.util.concurrent.Executor; @@ -74,12 +73,6 @@ public class TaskFragmentOrganizer extends WindowOrganizer { */ private final Executor mExecutor; - // TODO(b/240519866): doing so to keep CTS compatibility. Remove in the next release. - /** Map from Task id to client tokens of TaskFragments in the Task. */ - private final SparseArray> mTaskIdToFragmentTokens = new SparseArray<>(); - /** Map from Task id to Task configuration. */ - private final SparseArray mTaskIdToConfigurations = new SparseArray<>(); - public TaskFragmentOrganizer(@NonNull Executor executor) { mExecutor = executor; } @@ -150,35 +143,32 @@ public class TaskFragmentOrganizer extends WindowOrganizer { /** * Called when a TaskFragment is created and organized by this organizer. * + * @param wct The {@link WindowContainerTransaction} to make any changes with if needed. No + * need to call {@link #applyTransaction} as it will be applied by the caller. * @param taskFragmentInfo Info of the TaskFragment that is created. */ - public void onTaskFragmentAppeared(@NonNull TaskFragmentInfo taskFragmentInfo) {} + public void onTaskFragmentAppeared(@NonNull WindowContainerTransaction wct, + @NonNull TaskFragmentInfo taskFragmentInfo) {} /** * Called when the status of an organized TaskFragment is changed. * + * @param wct The {@link WindowContainerTransaction} to make any changes with if needed. No + * need to call {@link #applyTransaction} as it will be applied by the caller. * @param taskFragmentInfo Info of the TaskFragment that is changed. */ - public void onTaskFragmentInfoChanged(@NonNull TaskFragmentInfo taskFragmentInfo) {} + public void onTaskFragmentInfoChanged(@NonNull WindowContainerTransaction wct, + @NonNull TaskFragmentInfo taskFragmentInfo) {} /** * Called when an organized TaskFragment is removed. * + * @param wct The {@link WindowContainerTransaction} to make any changes with if needed. No + * need to call {@link #applyTransaction} as it will be applied by the caller. * @param taskFragmentInfo Info of the TaskFragment that is removed. */ - public void onTaskFragmentVanished(@NonNull TaskFragmentInfo taskFragmentInfo) {} - - /** - * Called when the parent leaf Task of organized TaskFragments is changed. - * When the leaf Task is changed, the organizer may want to update the TaskFragments in one - * transaction. - * - * For case like screen size change, it will trigger onTaskFragmentParentInfoChanged with new - * Task bounds, but may not trigger onTaskFragmentInfoChanged because there can be an override - * bounds. - */ - public void onTaskFragmentParentInfoChanged( - @NonNull IBinder fragmentToken, @NonNull Configuration parentConfig) {} + public void onTaskFragmentVanished(@NonNull WindowContainerTransaction wct, + @NonNull TaskFragmentInfo taskFragmentInfo) {} /** * Called when the parent leaf Task of organized TaskFragments is changed. @@ -189,25 +179,20 @@ public class TaskFragmentOrganizer extends WindowOrganizer { * Task bounds, but may not trigger onTaskFragmentInfoChanged because there can be an override * bounds. * + * @param wct The {@link WindowContainerTransaction} to make any changes with if needed. No + * need to call {@link #applyTransaction} as it will be applied by the caller. * @param taskId Id of the parent Task that is changed. * @param parentConfig Config of the parent Task. - * @hide */ - public void onTaskFragmentParentInfoChanged(int taskId, @NonNull Configuration parentConfig) { - // TODO(b/240519866): doing so to keep CTS compatibility. Remove in the next release. - final List tokens = mTaskIdToFragmentTokens.get(taskId); - if (tokens == null || tokens.isEmpty()) { - return; - } - for (int i = tokens.size() - 1; i >= 0; i--) { - onTaskFragmentParentInfoChanged(tokens.get(i), parentConfig); - } - } + public void onTaskFragmentParentInfoChanged(@NonNull WindowContainerTransaction wct, int taskId, + @NonNull Configuration parentConfig) {} /** * Called when the {@link WindowContainerTransaction} created with * {@link WindowContainerTransaction#setErrorCallbackToken(IBinder)} failed on the server side. * + * @param wct The {@link WindowContainerTransaction} to make any changes with if needed. No + * need to call {@link #applyTransaction} as it will be applied by the caller. * @param errorCallbackToken token set in * {@link WindowContainerTransaction#setErrorCallbackToken(IBinder)} * @param taskFragmentInfo The {@link TaskFragmentInfo}. This could be {@code null} if no @@ -216,7 +201,7 @@ public class TaskFragmentOrganizer extends WindowOrganizer { * transaction operation. * @param exception exception from the server side. */ - public void onTaskFragmentError( + public void onTaskFragmentError(@NonNull WindowContainerTransaction wct, @NonNull IBinder errorCallbackToken, @Nullable TaskFragmentInfo taskFragmentInfo, int opType, @NonNull Throwable exception) {} @@ -226,6 +211,8 @@ public class TaskFragmentOrganizer extends WindowOrganizer { * original Task. In this case, we need to notify the organizer so that it can check if the * Activity matches any split rule. * + * @param wct The {@link WindowContainerTransaction} to make any changes with if needed. No + * need to call {@link #applyTransaction} as it will be applied by the caller. * @param taskId The Task that the activity is reparented to. * @param activityIntent The intent that the activity is original launched with. * @param activityToken If the activity belongs to the same process as the organizer, this @@ -233,61 +220,41 @@ public class TaskFragmentOrganizer extends WindowOrganizer { * different process, the server will generate a temporary token that * the organizer can use to reparent the activity through * {@link WindowContainerTransaction} if needed. - * @hide */ - public void onActivityReparentedToTask(int taskId, @NonNull Intent activityIntent, - @NonNull IBinder activityToken) {} + public void onActivityReparentedToTask(@NonNull WindowContainerTransaction wct, + 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. + * Note: {@link WindowOrganizer#applyTransaction} permission requirement is conditional for + * {@link TaskFragmentOrganizer}. + * @see com.android.server.wm.WindowOrganizerController#enforceTaskPermission * @hide */ + @SuppressLint("AndroidFrameworkRequiresPermission") public void onTransactionReady(@NonNull TaskFragmentTransaction transaction) { + final WindowContainerTransaction wct = new WindowContainerTransaction(); final List changes = transaction.getChanges(); for (TaskFragmentTransaction.Change change : changes) { - // TODO(b/240519866): apply all changes in one WCT. final int taskId = change.getTaskId(); switch (change.getType()) { case TYPE_TASK_FRAGMENT_APPEARED: - // TODO(b/240519866): doing so to keep CTS compatibility. Remove in the next - // release. - if (!mTaskIdToFragmentTokens.contains(taskId)) { - mTaskIdToFragmentTokens.put(taskId, new ArrayList<>()); - } - mTaskIdToFragmentTokens.get(taskId).add(change.getTaskFragmentToken()); - onTaskFragmentParentInfoChanged(change.getTaskFragmentToken(), - mTaskIdToConfigurations.get(taskId)); - - onTaskFragmentAppeared(change.getTaskFragmentInfo()); + onTaskFragmentAppeared(wct, change.getTaskFragmentInfo()); break; case TYPE_TASK_FRAGMENT_INFO_CHANGED: - onTaskFragmentInfoChanged(change.getTaskFragmentInfo()); + onTaskFragmentInfoChanged(wct, change.getTaskFragmentInfo()); break; case TYPE_TASK_FRAGMENT_VANISHED: - // TODO(b/240519866): doing so to keep CTS compatibility. Remove in the next - // release. - if (mTaskIdToFragmentTokens.contains(taskId)) { - final List tokens = mTaskIdToFragmentTokens.get(taskId); - tokens.remove(change.getTaskFragmentToken()); - if (tokens.isEmpty()) { - mTaskIdToFragmentTokens.remove(taskId); - mTaskIdToConfigurations.remove(taskId); - } - } - - onTaskFragmentVanished(change.getTaskFragmentInfo()); + onTaskFragmentVanished(wct, change.getTaskFragmentInfo()); break; case TYPE_TASK_FRAGMENT_PARENT_INFO_CHANGED: - // TODO(b/240519866): doing so to keep CTS compatibility. Remove in the next - // release. - mTaskIdToConfigurations.put(taskId, change.getTaskConfiguration()); - - onTaskFragmentParentInfoChanged(taskId, change.getTaskConfiguration()); + onTaskFragmentParentInfoChanged(wct, taskId, change.getTaskConfiguration()); break; case TYPE_TASK_FRAGMENT_ERROR: final Bundle errorBundle = change.getErrorBundle(); onTaskFragmentError( + wct, change.getErrorCallbackToken(), errorBundle.getParcelable( KEY_ERROR_CALLBACK_TASK_FRAGMENT_INFO, TaskFragmentInfo.class), @@ -297,6 +264,7 @@ public class TaskFragmentOrganizer extends WindowOrganizer { break; case TYPE_ACTIVITY_REPARENTED_TO_TASK: onActivityReparentedToTask( + wct, change.getTaskId(), change.getActivityIntent(), change.getActivityToken()); @@ -306,6 +274,8 @@ public class TaskFragmentOrganizer extends WindowOrganizer { "Unknown TaskFragmentEvent=" + change.getType()); } } + // TODO(b/240519866): notify TaskFragmentOrganizerController that the transition is done. + applyTransaction(wct); } @Override diff --git a/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/JetpackTaskFragmentOrganizer.java b/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/JetpackTaskFragmentOrganizer.java index 9fb7d1988772f..1335e5ea051f5 100644 --- a/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/JetpackTaskFragmentOrganizer.java +++ b/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/JetpackTaskFragmentOrganizer.java @@ -271,56 +271,49 @@ class JetpackTaskFragmentOrganizer extends TaskFragmentOrganizer { } @Override - public void onTaskFragmentAppeared(@NonNull TaskFragmentInfo taskFragmentInfo) { - final WindowContainerTransaction wct = new WindowContainerTransaction(); + public void onTaskFragmentAppeared(@NonNull WindowContainerTransaction wct, + @NonNull TaskFragmentInfo taskFragmentInfo) { final IBinder fragmentToken = taskFragmentInfo.getFragmentToken(); mFragmentInfos.put(fragmentToken, taskFragmentInfo); mCallback.onTaskFragmentAppeared(wct, taskFragmentInfo); - applyTransaction(wct); } @Override - public void onTaskFragmentInfoChanged(@NonNull TaskFragmentInfo taskFragmentInfo) { - final WindowContainerTransaction wct = new WindowContainerTransaction(); + public void onTaskFragmentInfoChanged(@NonNull WindowContainerTransaction wct, + @NonNull TaskFragmentInfo taskFragmentInfo) { final IBinder fragmentToken = taskFragmentInfo.getFragmentToken(); mFragmentInfos.put(fragmentToken, taskFragmentInfo); mCallback.onTaskFragmentInfoChanged(wct, taskFragmentInfo); - applyTransaction(wct); } @Override - public void onTaskFragmentVanished(@NonNull TaskFragmentInfo taskFragmentInfo) { - final WindowContainerTransaction wct = new WindowContainerTransaction(); + public void onTaskFragmentVanished(@NonNull WindowContainerTransaction wct, + @NonNull TaskFragmentInfo taskFragmentInfo) { mFragmentInfos.remove(taskFragmentInfo.getFragmentToken()); mCallback.onTaskFragmentVanished(wct, taskFragmentInfo); - applyTransaction(wct); } @Override - public void onTaskFragmentParentInfoChanged(int taskId, @NonNull Configuration parentConfig) { - final WindowContainerTransaction wct = new WindowContainerTransaction(); + public void onTaskFragmentParentInfoChanged(@NonNull WindowContainerTransaction wct, + int taskId, @NonNull Configuration parentConfig) { mCallback.onTaskFragmentParentInfoChanged(wct, taskId, parentConfig); - applyTransaction(wct); } @Override - public void onActivityReparentedToTask(int taskId, @NonNull Intent activityIntent, - @NonNull IBinder activityToken) { - final WindowContainerTransaction wct = new WindowContainerTransaction(); + public void onActivityReparentedToTask(@NonNull WindowContainerTransaction wct, + int taskId, @NonNull Intent activityIntent, @NonNull IBinder activityToken) { mCallback.onActivityReparentedToTask(wct, taskId, activityIntent, activityToken); - applyTransaction(wct); } @Override - public void onTaskFragmentError(@NonNull IBinder errorCallbackToken, + public void onTaskFragmentError(@NonNull WindowContainerTransaction wct, + @NonNull IBinder errorCallbackToken, @Nullable TaskFragmentInfo taskFragmentInfo, int opType, @NonNull Throwable exception) { - final WindowContainerTransaction wct = new WindowContainerTransaction(); if (taskFragmentInfo != null) { final IBinder fragmentToken = taskFragmentInfo.getFragmentToken(); mFragmentInfos.put(fragmentToken, taskFragmentInfo); } mCallback.onTaskFragmentError(wct, taskFragmentInfo, opType); - applyTransaction(wct); } } diff --git a/services/tests/wmtests/src/com/android/server/wm/TaskFragmentOrganizerControllerTest.java b/services/tests/wmtests/src/com/android/server/wm/TaskFragmentOrganizerControllerTest.java index 8332cb4209efa..da72030b313d9 100644 --- a/services/tests/wmtests/src/com/android/server/wm/TaskFragmentOrganizerControllerTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/TaskFragmentOrganizerControllerTest.java @@ -158,7 +158,7 @@ public class TaskFragmentOrganizerControllerTest extends WindowTestsBase { mController.onTaskFragmentAppeared(mTaskFragment.getTaskFragmentOrganizer(), mTaskFragment); mController.dispatchPendingEvents(); - verify(mOrganizer, never()).onTaskFragmentAppeared(any()); + verify(mOrganizer, never()).onTaskFragmentAppeared(any(), any()); // Send callback when the TaskFragment is attached. setupMockParent(mTaskFragment, mTask); @@ -166,7 +166,7 @@ public class TaskFragmentOrganizerControllerTest extends WindowTestsBase { mController.onTaskFragmentAppeared(mTaskFragment.getTaskFragmentOrganizer(), mTaskFragment); mController.dispatchPendingEvents(); - verify(mOrganizer).onTaskFragmentAppeared(any()); + verify(mOrganizer).onTaskFragmentAppeared(any(), any()); } @Test @@ -179,13 +179,13 @@ public class TaskFragmentOrganizerControllerTest extends WindowTestsBase { mTaskFragment); mController.dispatchPendingEvents(); - verify(mOrganizer, never()).onTaskFragmentInfoChanged(any()); + verify(mOrganizer, never()).onTaskFragmentInfoChanged(any(), any()); // Call onTaskFragmentAppeared first. mController.onTaskFragmentAppeared(mTaskFragment.getTaskFragmentOrganizer(), mTaskFragment); mController.dispatchPendingEvents(); - verify(mOrganizer).onTaskFragmentAppeared(any()); + verify(mOrganizer).onTaskFragmentAppeared(any(), any()); // No callback if the info is not changed. doReturn(true).when(mTaskFragmentInfo).equalsForTaskFragmentOrganizer(any()); @@ -195,7 +195,7 @@ public class TaskFragmentOrganizerControllerTest extends WindowTestsBase { mTaskFragment); mController.dispatchPendingEvents(); - verify(mOrganizer, never()).onTaskFragmentInfoChanged(any()); + verify(mOrganizer, never()).onTaskFragmentInfoChanged(any(), any()); // Trigger callback if the info is changed. doReturn(false).when(mTaskFragmentInfo).equalsForTaskFragmentOrganizer(any()); @@ -204,7 +204,7 @@ public class TaskFragmentOrganizerControllerTest extends WindowTestsBase { mTaskFragment); mController.dispatchPendingEvents(); - verify(mOrganizer).onTaskFragmentInfoChanged(eq(mTaskFragmentInfo)); + verify(mOrganizer).onTaskFragmentInfoChanged(any(), eq(mTaskFragmentInfo)); } @Test @@ -215,7 +215,7 @@ public class TaskFragmentOrganizerControllerTest extends WindowTestsBase { mController.onTaskFragmentVanished(mTaskFragment.getTaskFragmentOrganizer(), mTaskFragment); mController.dispatchPendingEvents(); - verify(mOrganizer).onTaskFragmentVanished(any()); + verify(mOrganizer).onTaskFragmentVanished(any(), any()); } @Test @@ -228,10 +228,10 @@ public class TaskFragmentOrganizerControllerTest extends WindowTestsBase { mController.onTaskFragmentVanished(mTaskFragment.getTaskFragmentOrganizer(), mTaskFragment); mController.dispatchPendingEvents(); - verify(mOrganizer, never()).onTaskFragmentAppeared(any()); - verify(mOrganizer, never()).onTaskFragmentInfoChanged(any()); - verify(mOrganizer, never()).onTaskFragmentParentInfoChanged(anyInt(), any()); - verify(mOrganizer).onTaskFragmentVanished(eq(mTaskFragmentInfo)); + verify(mOrganizer, never()).onTaskFragmentAppeared(any(), any()); + verify(mOrganizer, never()).onTaskFragmentInfoChanged(any(), any()); + verify(mOrganizer, never()).onTaskFragmentParentInfoChanged(any(), anyInt(), any()); + verify(mOrganizer).onTaskFragmentVanished(any(), eq(mTaskFragmentInfo)); // Not trigger onTaskFragmentInfoChanged. // Call onTaskFragmentAppeared before calling onTaskFragmentInfoChanged. @@ -244,10 +244,10 @@ public class TaskFragmentOrganizerControllerTest extends WindowTestsBase { mController.onTaskFragmentVanished(mTaskFragment.getTaskFragmentOrganizer(), mTaskFragment); mController.dispatchPendingEvents(); - verify(mOrganizer, never()).onTaskFragmentAppeared(any()); - verify(mOrganizer, never()).onTaskFragmentInfoChanged(any()); - verify(mOrganizer, never()).onTaskFragmentParentInfoChanged(anyInt(), any()); - verify(mOrganizer).onTaskFragmentVanished(eq(mTaskFragmentInfo)); + verify(mOrganizer, never()).onTaskFragmentAppeared(any(), any()); + verify(mOrganizer, never()).onTaskFragmentInfoChanged(any(), any()); + verify(mOrganizer, never()).onTaskFragmentParentInfoChanged(any(), anyInt(), any()); + verify(mOrganizer).onTaskFragmentVanished(any(), eq(mTaskFragmentInfo)); } @Test @@ -260,7 +260,7 @@ public class TaskFragmentOrganizerControllerTest extends WindowTestsBase { mTaskFragment.getTaskFragmentOrganizer(), mTaskFragment); mController.dispatchPendingEvents(); - verify(mOrganizer).onTaskFragmentParentInfoChanged(eq(mTask.mTaskId), any()); + verify(mOrganizer).onTaskFragmentParentInfoChanged(any(), eq(mTask.mTaskId), any()); // No extra callback if the info is not changed. clearInvocations(mOrganizer); @@ -269,7 +269,7 @@ public class TaskFragmentOrganizerControllerTest extends WindowTestsBase { mTaskFragment.getTaskFragmentOrganizer(), mTaskFragment); mController.dispatchPendingEvents(); - verify(mOrganizer, never()).onTaskFragmentParentInfoChanged(anyInt(), any()); + verify(mOrganizer, never()).onTaskFragmentParentInfoChanged(any(), anyInt(), any()); // Trigger callback if the size is changed. mTask.getConfiguration().smallestScreenWidthDp = 100; @@ -277,7 +277,7 @@ public class TaskFragmentOrganizerControllerTest extends WindowTestsBase { mTaskFragment.getTaskFragmentOrganizer(), mTaskFragment); mController.dispatchPendingEvents(); - verify(mOrganizer).onTaskFragmentParentInfoChanged(eq(mTask.mTaskId), any()); + verify(mOrganizer).onTaskFragmentParentInfoChanged(any(), eq(mTask.mTaskId), any()); // Trigger callback if the windowing mode is changed. clearInvocations(mOrganizer); @@ -286,7 +286,7 @@ public class TaskFragmentOrganizerControllerTest extends WindowTestsBase { mTaskFragment.getTaskFragmentOrganizer(), mTaskFragment); mController.dispatchPendingEvents(); - verify(mOrganizer).onTaskFragmentParentInfoChanged(eq(mTask.mTaskId), any()); + verify(mOrganizer).onTaskFragmentParentInfoChanged(any(), eq(mTask.mTaskId), any()); } @Test @@ -298,7 +298,7 @@ public class TaskFragmentOrganizerControllerTest extends WindowTestsBase { mErrorToken, null /* taskFragment */, -1 /* opType */, exception); mController.dispatchPendingEvents(); - verify(mOrganizer).onTaskFragmentError(eq(mErrorToken), eq(null), eq(-1), + verify(mOrganizer).onTaskFragmentError(any(), eq(mErrorToken), eq(null), eq(-1), eq(exception)); } @@ -318,14 +318,14 @@ public class TaskFragmentOrganizerControllerTest extends WindowTestsBase { mController.onActivityReparentedToTask(activity); mController.dispatchPendingEvents(); - verify(mOrganizer, never()).onActivityReparentedToTask(anyInt(), any(), any()); + verify(mOrganizer, never()).onActivityReparentedToTask(any(), anyInt(), any(), any()); // Notify organizer if it was embedded before entered Pip. activity.mLastTaskFragmentOrganizerBeforePip = mIOrganizer; mController.onActivityReparentedToTask(activity); mController.dispatchPendingEvents(); - verify(mOrganizer).onActivityReparentedToTask(eq(task.mTaskId), eq(activity.intent), + verify(mOrganizer).onActivityReparentedToTask(any(), eq(task.mTaskId), eq(activity.intent), eq(activity.token)); // Notify organizer if there is any embedded in the Task. @@ -341,7 +341,7 @@ public class TaskFragmentOrganizerControllerTest extends WindowTestsBase { mController.dispatchPendingEvents(); verify(mOrganizer, times(2)) - .onActivityReparentedToTask(eq(task.mTaskId), eq(activity.intent), + .onActivityReparentedToTask(any(), eq(task.mTaskId), eq(activity.intent), eq(activity.token)); } @@ -371,7 +371,7 @@ public class TaskFragmentOrganizerControllerTest extends WindowTestsBase { mController.dispatchPendingEvents(); // Allow organizer to reparent activity in other process using the temporary token. - verify(mOrganizer).onActivityReparentedToTask(eq(task.mTaskId), eq(activity.intent), + verify(mOrganizer).onActivityReparentedToTask(any(), eq(task.mTaskId), eq(activity.intent), token.capture()); final IBinder temporaryToken = token.getValue(); assertNotEquals(activity.token, temporaryToken); @@ -801,7 +801,7 @@ public class TaskFragmentOrganizerControllerTest extends WindowTestsBase { mController.dispatchPendingEvents(); // Verifies that event was not sent - verify(mOrganizer, never()).onTaskFragmentInfoChanged(any()); + verify(mOrganizer, never()).onTaskFragmentInfoChanged(any(), any()); } @Test @@ -827,7 +827,7 @@ public class TaskFragmentOrganizerControllerTest extends WindowTestsBase { mController.dispatchPendingEvents(); // Verifies that event was not sent - verify(mOrganizer, never()).onTaskFragmentInfoChanged(any()); + verify(mOrganizer, never()).onTaskFragmentInfoChanged(any(), any()); // Mock the task becomes visible, and activity resumed doReturn(true).when(task).shouldBeVisible(any()); @@ -835,7 +835,7 @@ public class TaskFragmentOrganizerControllerTest extends WindowTestsBase { // Verifies that event is sent. mController.dispatchPendingEvents(); - verify(mOrganizer).onTaskFragmentInfoChanged(any()); + verify(mOrganizer).onTaskFragmentInfoChanged(any(), any()); } /** @@ -869,7 +869,7 @@ public class TaskFragmentOrganizerControllerTest extends WindowTestsBase { reset(mOrganizer); mController.onTaskFragmentInfoChanged(mIOrganizer, taskFragment); mController.dispatchPendingEvents(); - verify(mOrganizer).onTaskFragmentInfoChanged(any()); + verify(mOrganizer).onTaskFragmentInfoChanged(any(), any()); } /** @@ -887,8 +887,8 @@ public class TaskFragmentOrganizerControllerTest extends WindowTestsBase { .createActivityCount(1) .build(); final ActivityRecord embeddedActivity = taskFragment.getTopNonFinishingActivity(); - // Add another activity in the Task so that it always contains a non-finishing activitiy. - final ActivityRecord nonEmbeddedActivity = createActivityRecord(task); + // Add another activity in the Task so that it always contains a non-finishing activity. + createActivityRecord(task); assertTrue(task.shouldBeVisible(null)); // Dispatch pending info changed event from creating the activity @@ -896,21 +896,21 @@ public class TaskFragmentOrganizerControllerTest extends WindowTestsBase { taskFragment.mTaskFragmentAppearedSent = true; mController.onTaskFragmentInfoChanged(mIOrganizer, taskFragment); mController.dispatchPendingEvents(); - verify(mOrganizer).onTaskFragmentInfoChanged(any()); + verify(mOrganizer).onTaskFragmentInfoChanged(any(), any()); // Verify the info changed callback is not called when the task is invisible reset(mOrganizer); doReturn(false).when(task).shouldBeVisible(any()); mController.onTaskFragmentInfoChanged(mIOrganizer, taskFragment); mController.dispatchPendingEvents(); - verify(mOrganizer, never()).onTaskFragmentInfoChanged(any()); + verify(mOrganizer, never()).onTaskFragmentInfoChanged(any(), any()); // Finish the embedded activity, and verify the info changed callback is called because the // TaskFragment is becoming empty. embeddedActivity.finishing = true; mController.onTaskFragmentInfoChanged(mIOrganizer, taskFragment); mController.dispatchPendingEvents(); - verify(mOrganizer).onTaskFragmentInfoChanged(any()); + verify(mOrganizer).onTaskFragmentInfoChanged(any(), any()); } /** @@ -1020,7 +1020,7 @@ public class TaskFragmentOrganizerControllerTest extends WindowTestsBase { // The pending event will be dispatched on the handler (from requestTraversal). waitHandlerIdle(mWm.mAnimationHandler); - verify(mOrganizer).onTaskFragmentError(eq(mErrorToken), any(), + verify(mOrganizer).onTaskFragmentError(any(), eq(mErrorToken), any(), eq(HIERARCHY_OP_TYPE_REPARENT_ACTIVITY_TO_TASK_FRAGMENT), any(SecurityException.class)); } @@ -1059,7 +1059,7 @@ public class TaskFragmentOrganizerControllerTest extends WindowTestsBase { // The pending event will be dispatched on the handler (from requestTraversal). waitHandlerIdle(mWm.mAnimationHandler); - verify(mOrganizer).onTaskFragmentError(eq(mErrorToken), any(), + verify(mOrganizer).onTaskFragmentError(any(), eq(mErrorToken), any(), eq(HIERARCHY_OP_TYPE_REPARENT_CHILDREN), any(SecurityException.class)); }