Address TaskFragmentOrganizer style comments
1. Rename onActivityReparentToTask to onActivityReparentedToTask 2. Annotate @NonNull and @Nullable for the Extensions methods that are not yet annotated. Bug: 240519866 Test: Refactor and add annotation. Pass existing tests. Change-Id: I85c5927e6e7261cae3bce715b1955523d430e1e2
This commit is contained in:
@@ -16,7 +16,7 @@
|
||||
|
||||
package android.window;
|
||||
|
||||
import static android.window.TaskFragmentTransaction.TYPE_ACTIVITY_REPARENT_TO_TASK;
|
||||
import static android.window.TaskFragmentTransaction.TYPE_ACTIVITY_REPARENTED_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;
|
||||
@@ -238,7 +238,7 @@ public class TaskFragmentOrganizer extends WindowOrganizer {
|
||||
* {@link WindowContainerTransaction} if needed.
|
||||
* @hide
|
||||
*/
|
||||
public void onActivityReparentToTask(int taskId, @NonNull Intent activityIntent,
|
||||
public void onActivityReparentedToTask(int taskId, @NonNull Intent activityIntent,
|
||||
@NonNull IBinder activityToken) {}
|
||||
|
||||
/**
|
||||
@@ -298,8 +298,8 @@ public class TaskFragmentOrganizer extends WindowOrganizer {
|
||||
errorBundle.getSerializable(KEY_ERROR_CALLBACK_EXCEPTION,
|
||||
java.lang.Throwable.class));
|
||||
break;
|
||||
case TYPE_ACTIVITY_REPARENT_TO_TASK:
|
||||
onActivityReparentToTask(
|
||||
case TYPE_ACTIVITY_REPARENTED_TO_TASK:
|
||||
onActivityReparentedToTask(
|
||||
change.getTaskId(),
|
||||
change.getActivityIntent(),
|
||||
change.getActivityToken());
|
||||
|
||||
@@ -122,7 +122,7 @@ public final class TaskFragmentTransaction implements Parcelable {
|
||||
* then exits Picture-in-picture, it will be reparented back to its original Task. In this case,
|
||||
* we need to notify the organizer so that it can check if the Activity matches any split rule.
|
||||
*/
|
||||
public static final int TYPE_ACTIVITY_REPARENT_TO_TASK = 6;
|
||||
public static final int TYPE_ACTIVITY_REPARENTED_TO_TASK = 6;
|
||||
|
||||
@IntDef(prefix = { "TYPE_" }, value = {
|
||||
TYPE_TASK_FRAGMENT_APPEARED,
|
||||
@@ -130,7 +130,7 @@ public final class TaskFragmentTransaction implements Parcelable {
|
||||
TYPE_TASK_FRAGMENT_VANISHED,
|
||||
TYPE_TASK_FRAGMENT_PARENT_INFO_CHANGED,
|
||||
TYPE_TASK_FRAGMENT_ERROR,
|
||||
TYPE_ACTIVITY_REPARENT_TO_TASK
|
||||
TYPE_ACTIVITY_REPARENTED_TO_TASK
|
||||
})
|
||||
@Retention(RetentionPolicy.SOURCE)
|
||||
@interface ChangeType {}
|
||||
@@ -247,7 +247,7 @@ public final class TaskFragmentTransaction implements Parcelable {
|
||||
|
||||
/**
|
||||
* Intent of the activity that is reparented to the Task for
|
||||
* {@link #TYPE_ACTIVITY_REPARENT_TO_TASK}.
|
||||
* {@link #TYPE_ACTIVITY_REPARENTED_TO_TASK}.
|
||||
*/
|
||||
public Change setActivityIntent(@NonNull Intent intent) {
|
||||
mActivityIntent = requireNonNull(intent);
|
||||
@@ -255,7 +255,7 @@ public final class TaskFragmentTransaction implements Parcelable {
|
||||
}
|
||||
|
||||
/**
|
||||
* Token of the reparent activity for {@link #TYPE_ACTIVITY_REPARENT_TO_TASK}.
|
||||
* Token of the reparent activity for {@link #TYPE_ACTIVITY_REPARENTED_TO_TASK}.
|
||||
* If the activity belongs to the same process as the organizer, this will be the actual
|
||||
* activity token; if the activity belongs to a different process, the server will generate
|
||||
* a temporary token that the organizer can use to reparent the activity through
|
||||
|
||||
@@ -51,8 +51,11 @@ class JetpackTaskFragmentOrganizer extends TaskFragmentOrganizer {
|
||||
@VisibleForTesting
|
||||
final Map<IBinder, TaskFragmentInfo> mFragmentInfos = new ArrayMap<>();
|
||||
|
||||
@NonNull
|
||||
private final TaskFragmentCallback mCallback;
|
||||
|
||||
@VisibleForTesting
|
||||
@Nullable
|
||||
TaskFragmentAnimationController mAnimationController;
|
||||
|
||||
/**
|
||||
@@ -63,7 +66,7 @@ class JetpackTaskFragmentOrganizer extends TaskFragmentOrganizer {
|
||||
void onTaskFragmentInfoChanged(@NonNull TaskFragmentInfo taskFragmentInfo);
|
||||
void onTaskFragmentVanished(@NonNull TaskFragmentInfo taskFragmentInfo);
|
||||
void onTaskFragmentParentInfoChanged(int taskId, @NonNull Configuration parentConfig);
|
||||
void onActivityReparentToTask(int taskId, @NonNull Intent activityIntent,
|
||||
void onActivityReparentedToTask(int taskId, @NonNull Intent activityIntent,
|
||||
@NonNull IBinder activityToken);
|
||||
void onTaskFragmentError(@Nullable TaskFragmentInfo taskFragmentInfo, int opType);
|
||||
}
|
||||
@@ -72,7 +75,8 @@ class JetpackTaskFragmentOrganizer extends TaskFragmentOrganizer {
|
||||
* @param executor callbacks from WM Core are posted on this executor. It should be tied to the
|
||||
* UI thread that all other calls into methods of this class are also on.
|
||||
*/
|
||||
JetpackTaskFragmentOrganizer(@NonNull Executor executor, TaskFragmentCallback callback) {
|
||||
JetpackTaskFragmentOrganizer(@NonNull Executor executor,
|
||||
@NonNull TaskFragmentCallback callback) {
|
||||
super(executor);
|
||||
mCallback = callback;
|
||||
}
|
||||
@@ -147,7 +151,8 @@ class JetpackTaskFragmentOrganizer extends TaskFragmentOrganizer {
|
||||
* @param wct WindowContainerTransaction in which the task fragment should be resized.
|
||||
* @param fragmentToken token of an existing TaskFragment.
|
||||
*/
|
||||
void expandTaskFragment(WindowContainerTransaction wct, IBinder fragmentToken) {
|
||||
void expandTaskFragment(@NonNull WindowContainerTransaction wct,
|
||||
@NonNull IBinder fragmentToken) {
|
||||
resizeTaskFragment(wct, fragmentToken, new Rect());
|
||||
setAdjacentTaskFragments(wct, fragmentToken, null /* secondary */, null /* splitRule */);
|
||||
updateWindowingMode(wct, fragmentToken, WINDOWING_MODE_UNDEFINED);
|
||||
@@ -157,7 +162,7 @@ class JetpackTaskFragmentOrganizer extends TaskFragmentOrganizer {
|
||||
* Expands an existing TaskFragment to fill parent.
|
||||
* @param fragmentToken token of an existing TaskFragment.
|
||||
*/
|
||||
void expandTaskFragment(IBinder fragmentToken) {
|
||||
void expandTaskFragment(@NonNull IBinder fragmentToken) {
|
||||
WindowContainerTransaction wct = new WindowContainerTransaction();
|
||||
expandTaskFragment(wct, fragmentToken);
|
||||
applyTransaction(wct);
|
||||
@@ -168,7 +173,7 @@ class JetpackTaskFragmentOrganizer extends TaskFragmentOrganizer {
|
||||
* @param fragmentToken token to create new TaskFragment with.
|
||||
* @param activity activity to move to the fill-parent TaskFragment.
|
||||
*/
|
||||
void expandActivity(IBinder fragmentToken, Activity activity) {
|
||||
void expandActivity(@NonNull IBinder fragmentToken, @NonNull Activity activity) {
|
||||
final WindowContainerTransaction wct = new WindowContainerTransaction();
|
||||
createTaskFragmentAndReparentActivity(
|
||||
wct, fragmentToken, activity.getActivityToken(), new Rect(),
|
||||
@@ -180,8 +185,8 @@ class JetpackTaskFragmentOrganizer extends TaskFragmentOrganizer {
|
||||
* @param ownerToken The token of the activity that creates this task fragment. It does not
|
||||
* have to be a child of this task fragment, but must belong to the same task.
|
||||
*/
|
||||
void createTaskFragment(WindowContainerTransaction wct, IBinder fragmentToken,
|
||||
IBinder ownerToken, @NonNull Rect bounds, @WindowingMode int windowingMode) {
|
||||
void createTaskFragment(@NonNull WindowContainerTransaction wct, @NonNull IBinder fragmentToken,
|
||||
@NonNull IBinder ownerToken, @NonNull Rect bounds, @WindowingMode int windowingMode) {
|
||||
final TaskFragmentCreationParams fragmentOptions =
|
||||
createFragmentOptions(fragmentToken, ownerToken, bounds, windowingMode);
|
||||
wct.createTaskFragment(fragmentOptions);
|
||||
@@ -191,9 +196,9 @@ class JetpackTaskFragmentOrganizer extends TaskFragmentOrganizer {
|
||||
* @param ownerToken The token of the activity that creates this task fragment. It does not
|
||||
* have to be a child of this task fragment, but must belong to the same task.
|
||||
*/
|
||||
private void createTaskFragmentAndReparentActivity(
|
||||
WindowContainerTransaction wct, IBinder fragmentToken, IBinder ownerToken,
|
||||
@NonNull Rect bounds, @WindowingMode int windowingMode, Activity activity) {
|
||||
private void createTaskFragmentAndReparentActivity(@NonNull WindowContainerTransaction wct,
|
||||
@NonNull IBinder fragmentToken, @NonNull IBinder ownerToken, @NonNull Rect bounds,
|
||||
@WindowingMode int windowingMode, @NonNull Activity activity) {
|
||||
createTaskFragment(wct, fragmentToken, ownerToken, bounds, windowingMode);
|
||||
wct.reparentActivityToTaskFragment(fragmentToken, activity.getActivityToken());
|
||||
}
|
||||
@@ -202,9 +207,9 @@ class JetpackTaskFragmentOrganizer extends TaskFragmentOrganizer {
|
||||
* @param ownerToken The token of the activity that creates this task fragment. It does not
|
||||
* have to be a child of this task fragment, but must belong to the same task.
|
||||
*/
|
||||
private void createTaskFragmentAndStartActivity(
|
||||
WindowContainerTransaction wct, IBinder fragmentToken, IBinder ownerToken,
|
||||
@NonNull Rect bounds, @WindowingMode int windowingMode, Intent activityIntent,
|
||||
private void createTaskFragmentAndStartActivity(@NonNull WindowContainerTransaction wct,
|
||||
@NonNull IBinder fragmentToken, @NonNull IBinder ownerToken, @NonNull Rect bounds,
|
||||
@WindowingMode int windowingMode, @NonNull Intent activityIntent,
|
||||
@Nullable Bundle activityOptions) {
|
||||
createTaskFragment(wct, fragmentToken, ownerToken, bounds, windowingMode);
|
||||
wct.startActivityInTaskFragment(fragmentToken, ownerToken, activityIntent, activityOptions);
|
||||
@@ -225,8 +230,8 @@ class JetpackTaskFragmentOrganizer extends TaskFragmentOrganizer {
|
||||
wct.setAdjacentTaskFragments(primary, secondary, adjacentParams);
|
||||
}
|
||||
|
||||
TaskFragmentCreationParams createFragmentOptions(IBinder fragmentToken, IBinder ownerToken,
|
||||
Rect bounds, @WindowingMode int windowingMode) {
|
||||
TaskFragmentCreationParams createFragmentOptions(@NonNull IBinder fragmentToken,
|
||||
@NonNull IBinder ownerToken, @NonNull Rect bounds, @WindowingMode int windowingMode) {
|
||||
if (mFragmentInfos.containsKey(fragmentToken)) {
|
||||
throw new IllegalArgumentException(
|
||||
"There is an existing TaskFragment with fragmentToken=" + fragmentToken);
|
||||
@@ -241,7 +246,7 @@ class JetpackTaskFragmentOrganizer extends TaskFragmentOrganizer {
|
||||
.build();
|
||||
}
|
||||
|
||||
void resizeTaskFragment(WindowContainerTransaction wct, IBinder fragmentToken,
|
||||
void resizeTaskFragment(@NonNull WindowContainerTransaction wct, @NonNull IBinder fragmentToken,
|
||||
@Nullable Rect bounds) {
|
||||
if (!mFragmentInfos.containsKey(fragmentToken)) {
|
||||
throw new IllegalArgumentException(
|
||||
@@ -253,8 +258,8 @@ class JetpackTaskFragmentOrganizer extends TaskFragmentOrganizer {
|
||||
wct.setBounds(mFragmentInfos.get(fragmentToken).getToken(), bounds);
|
||||
}
|
||||
|
||||
void updateWindowingMode(WindowContainerTransaction wct, IBinder fragmentToken,
|
||||
@WindowingMode int windowingMode) {
|
||||
void updateWindowingMode(@NonNull WindowContainerTransaction wct,
|
||||
@NonNull IBinder fragmentToken, @WindowingMode int windowingMode) {
|
||||
if (!mFragmentInfos.containsKey(fragmentToken)) {
|
||||
throw new IllegalArgumentException(
|
||||
"Can't find an existing TaskFragment with fragmentToken=" + fragmentToken);
|
||||
@@ -262,7 +267,8 @@ class JetpackTaskFragmentOrganizer extends TaskFragmentOrganizer {
|
||||
wct.setWindowingMode(mFragmentInfos.get(fragmentToken).getToken(), windowingMode);
|
||||
}
|
||||
|
||||
void deleteTaskFragment(WindowContainerTransaction wct, IBinder fragmentToken) {
|
||||
void deleteTaskFragment(@NonNull WindowContainerTransaction wct,
|
||||
@NonNull IBinder fragmentToken) {
|
||||
if (!mFragmentInfos.containsKey(fragmentToken)) {
|
||||
throw new IllegalArgumentException(
|
||||
"Can't find an existing TaskFragment with fragmentToken=" + fragmentToken);
|
||||
@@ -274,44 +280,31 @@ class JetpackTaskFragmentOrganizer extends TaskFragmentOrganizer {
|
||||
public void onTaskFragmentAppeared(@NonNull TaskFragmentInfo taskFragmentInfo) {
|
||||
final IBinder fragmentToken = taskFragmentInfo.getFragmentToken();
|
||||
mFragmentInfos.put(fragmentToken, taskFragmentInfo);
|
||||
|
||||
if (mCallback != null) {
|
||||
mCallback.onTaskFragmentAppeared(taskFragmentInfo);
|
||||
}
|
||||
mCallback.onTaskFragmentAppeared(taskFragmentInfo);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onTaskFragmentInfoChanged(@NonNull TaskFragmentInfo taskFragmentInfo) {
|
||||
final IBinder fragmentToken = taskFragmentInfo.getFragmentToken();
|
||||
mFragmentInfos.put(fragmentToken, taskFragmentInfo);
|
||||
|
||||
if (mCallback != null) {
|
||||
mCallback.onTaskFragmentInfoChanged(taskFragmentInfo);
|
||||
}
|
||||
mCallback.onTaskFragmentInfoChanged(taskFragmentInfo);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onTaskFragmentVanished(@NonNull TaskFragmentInfo taskFragmentInfo) {
|
||||
mFragmentInfos.remove(taskFragmentInfo.getFragmentToken());
|
||||
|
||||
if (mCallback != null) {
|
||||
mCallback.onTaskFragmentVanished(taskFragmentInfo);
|
||||
}
|
||||
mCallback.onTaskFragmentVanished(taskFragmentInfo);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onTaskFragmentParentInfoChanged(int taskId, @NonNull Configuration parentConfig) {
|
||||
if (mCallback != null) {
|
||||
mCallback.onTaskFragmentParentInfoChanged(taskId, parentConfig);
|
||||
}
|
||||
mCallback.onTaskFragmentParentInfoChanged(taskId, parentConfig);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onActivityReparentToTask(int taskId, @NonNull Intent activityIntent,
|
||||
public void onActivityReparentedToTask(int taskId, @NonNull Intent activityIntent,
|
||||
@NonNull IBinder activityToken) {
|
||||
if (mCallback != null) {
|
||||
mCallback.onActivityReparentToTask(taskId, activityIntent, activityToken);
|
||||
}
|
||||
mCallback.onActivityReparentedToTask(taskId, activityIntent, activityToken);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -322,9 +315,6 @@ class JetpackTaskFragmentOrganizer extends TaskFragmentOrganizer {
|
||||
final IBinder fragmentToken = taskFragmentInfo.getFragmentToken();
|
||||
mFragmentInfos.put(fragmentToken, taskFragmentInfo);
|
||||
}
|
||||
|
||||
if (mCallback != null) {
|
||||
mCallback.onTaskFragmentError(taskFragmentInfo, opType);
|
||||
}
|
||||
mCallback.onTaskFragmentError(taskFragmentInfo, opType);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,17 +16,21 @@
|
||||
|
||||
package androidx.window.extensions.embedding;
|
||||
|
||||
import android.annotation.NonNull;
|
||||
import android.app.Activity;
|
||||
import android.util.Pair;
|
||||
import android.util.Size;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
|
||||
/**
|
||||
* Client-side descriptor of a split that holds two containers.
|
||||
*/
|
||||
class SplitContainer {
|
||||
@NonNull
|
||||
private final TaskFragmentContainer mPrimaryContainer;
|
||||
@NonNull
|
||||
private final TaskFragmentContainer mSecondaryContainer;
|
||||
@NonNull
|
||||
private final SplitRule mSplitRule;
|
||||
|
||||
SplitContainer(@NonNull TaskFragmentContainer primaryContainer,
|
||||
|
||||
@@ -264,7 +264,7 @@ public class SplitController implements JetpackTaskFragmentOrganizer.TaskFragmen
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onActivityReparentToTask(int taskId, @NonNull Intent activityIntent,
|
||||
public void onActivityReparentedToTask(int taskId, @NonNull Intent activityIntent,
|
||||
@NonNull IBinder activityToken) {
|
||||
synchronized (mLock) {
|
||||
// If the activity belongs to the current app process, we treat it as a new activity
|
||||
@@ -1523,7 +1523,8 @@ public class SplitController implements JetpackTaskFragmentOrganizer.TaskFragmen
|
||||
private final class LifecycleCallbacks extends EmptyLifecycleCallbacksAdapter {
|
||||
|
||||
@Override
|
||||
public void onActivityPreCreated(Activity activity, Bundle savedInstanceState) {
|
||||
public void onActivityPreCreated(@NonNull Activity activity,
|
||||
@Nullable Bundle savedInstanceState) {
|
||||
synchronized (mLock) {
|
||||
final IBinder activityToken = activity.getActivityToken();
|
||||
final IBinder initialTaskFragmentToken = getInitialTaskFragmentToken(activity);
|
||||
@@ -1552,7 +1553,8 @@ public class SplitController implements JetpackTaskFragmentOrganizer.TaskFragmen
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onActivityPostCreated(Activity activity, Bundle savedInstanceState) {
|
||||
public void onActivityPostCreated(@NonNull Activity activity,
|
||||
@Nullable Bundle savedInstanceState) {
|
||||
// Calling after Activity#onCreate is complete to allow the app launch something
|
||||
// first. In case of a configured placeholder activity we want to make sure
|
||||
// that we don't launch it if an activity itself already requested something to be
|
||||
@@ -1563,14 +1565,14 @@ public class SplitController implements JetpackTaskFragmentOrganizer.TaskFragmen
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onActivityConfigurationChanged(Activity activity) {
|
||||
public void onActivityConfigurationChanged(@NonNull Activity activity) {
|
||||
synchronized (mLock) {
|
||||
SplitController.this.onActivityConfigurationChanged(activity);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onActivityPostDestroyed(Activity activity) {
|
||||
public void onActivityPostDestroyed(@NonNull Activity activity) {
|
||||
synchronized (mLock) {
|
||||
SplitController.this.onActivityDestroyed(activity);
|
||||
}
|
||||
@@ -1582,7 +1584,7 @@ public class SplitController implements JetpackTaskFragmentOrganizer.TaskFragmen
|
||||
private final Handler mHandler = new Handler(Looper.getMainLooper());
|
||||
|
||||
@Override
|
||||
public void execute(Runnable r) {
|
||||
public void execute(@NonNull Runnable r) {
|
||||
mHandler.post(r);
|
||||
}
|
||||
}
|
||||
@@ -1662,7 +1664,7 @@ public class SplitController implements JetpackTaskFragmentOrganizer.TaskFragmen
|
||||
* If the two rules have the same presentation, we can reuse the same {@link SplitContainer} if
|
||||
* there is any.
|
||||
*/
|
||||
private static boolean canReuseContainer(SplitRule rule1, SplitRule rule2) {
|
||||
private static boolean canReuseContainer(@NonNull SplitRule rule1, @NonNull SplitRule rule2) {
|
||||
if (!isContainerReusableRule(rule1) || !isContainerReusableRule(rule2)) {
|
||||
return false;
|
||||
}
|
||||
@@ -1670,7 +1672,8 @@ public class SplitController implements JetpackTaskFragmentOrganizer.TaskFragmen
|
||||
}
|
||||
|
||||
/** Whether the two rules have the same presentation. */
|
||||
private static boolean haveSamePresentation(SplitPairRule rule1, SplitPairRule rule2) {
|
||||
private static boolean haveSamePresentation(@NonNull SplitPairRule rule1,
|
||||
@NonNull SplitPairRule rule2) {
|
||||
// TODO(b/231655482): add util method to do the comparison in SplitPairRule.
|
||||
return rule1.getSplitRatio() == rule2.getSplitRatio()
|
||||
&& rule1.getLayoutDirection() == rule2.getLayoutDirection()
|
||||
@@ -1684,7 +1687,7 @@ public class SplitController implements JetpackTaskFragmentOrganizer.TaskFragmen
|
||||
* Whether it is ok for other rule to reuse the {@link TaskFragmentContainer} of the given
|
||||
* rule.
|
||||
*/
|
||||
private static boolean isContainerReusableRule(SplitRule rule) {
|
||||
private static boolean isContainerReusableRule(@NonNull SplitRule rule) {
|
||||
// We don't expect to reuse the placeholder rule.
|
||||
if (!(rule instanceof SplitPairRule)) {
|
||||
return false;
|
||||
|
||||
@@ -102,7 +102,7 @@ class SplitPresenter extends JetpackTaskFragmentOrganizer {
|
||||
|
||||
private final SplitController mController;
|
||||
|
||||
SplitPresenter(@NonNull Executor executor, SplitController controller) {
|
||||
SplitPresenter(@NonNull Executor executor, @NonNull SplitController controller) {
|
||||
super(executor, controller);
|
||||
mController = controller;
|
||||
registerOrganizer();
|
||||
@@ -502,14 +502,14 @@ class SplitPresenter extends JetpackTaskFragmentOrganizer {
|
||||
}
|
||||
|
||||
@NonNull
|
||||
static Pair<Size, Size> getActivitiesMinDimensionsPair(Activity primaryActivity,
|
||||
Activity secondaryActivity) {
|
||||
static Pair<Size, Size> getActivitiesMinDimensionsPair(@NonNull Activity primaryActivity,
|
||||
@NonNull Activity secondaryActivity) {
|
||||
return new Pair<>(getMinDimensions(primaryActivity), getMinDimensions(secondaryActivity));
|
||||
}
|
||||
|
||||
@NonNull
|
||||
static Pair<Size, Size> getActivityIntentMinDimensionsPair(Activity primaryActivity,
|
||||
Intent secondaryIntent) {
|
||||
static Pair<Size, Size> getActivityIntentMinDimensionsPair(@NonNull Activity primaryActivity,
|
||||
@NonNull Intent secondaryIntent) {
|
||||
return new Pair<>(getMinDimensions(primaryActivity), getMinDimensions(secondaryIntent));
|
||||
}
|
||||
|
||||
|
||||
@@ -21,8 +21,6 @@ import static android.app.WindowConfiguration.WINDOWING_MODE_MULTI_WINDOW;
|
||||
import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED;
|
||||
import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED;
|
||||
|
||||
import android.annotation.NonNull;
|
||||
import android.annotation.Nullable;
|
||||
import android.app.Activity;
|
||||
import android.app.WindowConfiguration;
|
||||
import android.app.WindowConfiguration.WindowingMode;
|
||||
@@ -31,6 +29,9 @@ import android.os.IBinder;
|
||||
import android.util.ArraySet;
|
||||
import android.window.TaskFragmentInfo;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
@@ -30,6 +30,8 @@ import android.view.RemoteAnimationAdapter;
|
||||
import android.view.RemoteAnimationDefinition;
|
||||
import android.window.TaskFragmentOrganizer;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
|
||||
import com.android.internal.annotations.VisibleForTesting;
|
||||
|
||||
/** Controls the TaskFragment remote animations. */
|
||||
@@ -45,7 +47,7 @@ class TaskFragmentAnimationController {
|
||||
/** Task Ids that we have registered for remote animation. */
|
||||
private final ArraySet<Integer> mRegisterTasks = new ArraySet<>();
|
||||
|
||||
TaskFragmentAnimationController(TaskFragmentOrganizer organizer) {
|
||||
TaskFragmentAnimationController(@NonNull TaskFragmentOrganizer organizer) {
|
||||
mOrganizer = organizer;
|
||||
mDefinition = new RemoteAnimationDefinition();
|
||||
final RemoteAnimationAdapter animationAdapter =
|
||||
|
||||
@@ -112,6 +112,7 @@ class TaskFragmentAnimationRunner extends IRemoteAnimationRunner.Stub {
|
||||
}
|
||||
|
||||
/** Creates the animator given the transition type and windows. */
|
||||
@NonNull
|
||||
private Animator createAnimator(@WindowManager.TransitionOldType int transit,
|
||||
@NonNull RemoteAnimationTarget[] targets,
|
||||
@NonNull IRemoteAnimationFinishedCallback finishedCallback) {
|
||||
@@ -161,6 +162,7 @@ class TaskFragmentAnimationRunner extends IRemoteAnimationRunner.Stub {
|
||||
}
|
||||
|
||||
/** List of {@link TaskFragmentAnimationAdapter} to handle animations on all window targets. */
|
||||
@NonNull
|
||||
private List<TaskFragmentAnimationAdapter> createAnimationAdapters(
|
||||
@WindowManager.TransitionOldType int transit,
|
||||
@NonNull RemoteAnimationTarget[] targets) {
|
||||
@@ -180,12 +182,14 @@ class TaskFragmentAnimationRunner extends IRemoteAnimationRunner.Stub {
|
||||
}
|
||||
}
|
||||
|
||||
@NonNull
|
||||
private List<TaskFragmentAnimationAdapter> createOpenAnimationAdapters(
|
||||
@NonNull RemoteAnimationTarget[] targets) {
|
||||
return createOpenCloseAnimationAdapters(targets, true /* isOpening */,
|
||||
mAnimationSpec::loadOpenAnimation);
|
||||
}
|
||||
|
||||
@NonNull
|
||||
private List<TaskFragmentAnimationAdapter> createCloseAnimationAdapters(
|
||||
@NonNull RemoteAnimationTarget[] targets) {
|
||||
return createOpenCloseAnimationAdapters(targets, false /* isOpening */,
|
||||
@@ -196,6 +200,7 @@ class TaskFragmentAnimationRunner extends IRemoteAnimationRunner.Stub {
|
||||
* Creates {@link TaskFragmentAnimationAdapter} for OPEN and CLOSE types of transition.
|
||||
* @param isOpening {@code true} for OPEN type, {@code false} for CLOSE type.
|
||||
*/
|
||||
@NonNull
|
||||
private List<TaskFragmentAnimationAdapter> createOpenCloseAnimationAdapters(
|
||||
@NonNull RemoteAnimationTarget[] targets, boolean isOpening,
|
||||
@NonNull BiFunction<RemoteAnimationTarget, Rect, Animation> animationProvider) {
|
||||
@@ -238,6 +243,7 @@ class TaskFragmentAnimationRunner extends IRemoteAnimationRunner.Stub {
|
||||
return adapters;
|
||||
}
|
||||
|
||||
@NonNull
|
||||
private TaskFragmentAnimationAdapter createOpenCloseAnimationAdapter(
|
||||
@NonNull RemoteAnimationTarget target,
|
||||
@NonNull BiFunction<RemoteAnimationTarget, Rect, Animation> animationProvider,
|
||||
@@ -259,6 +265,7 @@ class TaskFragmentAnimationRunner extends IRemoteAnimationRunner.Stub {
|
||||
return new TaskFragmentAnimationAdapter(animation, target);
|
||||
}
|
||||
|
||||
@NonNull
|
||||
private List<TaskFragmentAnimationAdapter> createChangeAnimationAdapters(
|
||||
@NonNull RemoteAnimationTarget[] targets) {
|
||||
final List<TaskFragmentAnimationAdapter> adapters = new ArrayList<>();
|
||||
|
||||
@@ -78,6 +78,7 @@ class TaskFragmentAnimationSpec {
|
||||
}
|
||||
|
||||
/** For target that doesn't need to be animated. */
|
||||
@NonNull
|
||||
static Animation createNoopAnimation(@NonNull RemoteAnimationTarget target) {
|
||||
// Noop but just keep the target showing/hiding.
|
||||
final float alpha = target.mode == MODE_CLOSING ? 0f : 1f;
|
||||
@@ -85,6 +86,7 @@ class TaskFragmentAnimationSpec {
|
||||
}
|
||||
|
||||
/** Animation for target that is opening in a change transition. */
|
||||
@NonNull
|
||||
Animation createChangeBoundsOpenAnimation(@NonNull RemoteAnimationTarget target) {
|
||||
final Rect bounds = target.localBounds;
|
||||
// The target will be animated in from left or right depends on its position.
|
||||
@@ -101,6 +103,7 @@ class TaskFragmentAnimationSpec {
|
||||
}
|
||||
|
||||
/** Animation for target that is closing in a change transition. */
|
||||
@NonNull
|
||||
Animation createChangeBoundsCloseAnimation(@NonNull RemoteAnimationTarget target) {
|
||||
final Rect bounds = target.localBounds;
|
||||
// The target will be animated out to left or right depends on its position.
|
||||
@@ -121,6 +124,7 @@ class TaskFragmentAnimationSpec {
|
||||
* @return the return array always has two elements. The first one is for the start leash, and
|
||||
* the second one is for the end leash.
|
||||
*/
|
||||
@NonNull
|
||||
Animation[] createChangeBoundsChangeAnimations(@NonNull RemoteAnimationTarget target) {
|
||||
// Both start bounds and end bounds are in screen coordinates. We will post translate
|
||||
// to the local coordinates in TaskFragmentAnimationAdapter#onAnimationUpdate
|
||||
@@ -177,6 +181,7 @@ class TaskFragmentAnimationSpec {
|
||||
return new Animation[]{startSet, endSet};
|
||||
}
|
||||
|
||||
@NonNull
|
||||
Animation loadOpenAnimation(@NonNull RemoteAnimationTarget target,
|
||||
@NonNull Rect wholeAnimationBounds) {
|
||||
final boolean isEnter = target.mode != MODE_CLOSING;
|
||||
@@ -198,6 +203,7 @@ class TaskFragmentAnimationSpec {
|
||||
return animation;
|
||||
}
|
||||
|
||||
@NonNull
|
||||
Animation loadCloseAnimation(@NonNull RemoteAnimationTarget target,
|
||||
@NonNull Rect wholeAnimationBounds) {
|
||||
final boolean isEnter = target.mode != MODE_CLOSING;
|
||||
|
||||
@@ -18,8 +18,6 @@ package androidx.window.extensions.embedding;
|
||||
|
||||
import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED;
|
||||
|
||||
import android.annotation.NonNull;
|
||||
import android.annotation.Nullable;
|
||||
import android.app.Activity;
|
||||
import android.app.WindowConfiguration.WindowingMode;
|
||||
import android.content.Intent;
|
||||
@@ -30,6 +28,9 @@ import android.util.Size;
|
||||
import android.window.TaskFragmentInfo;
|
||||
import android.window.WindowContainerTransaction;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
import com.android.internal.annotations.VisibleForTesting;
|
||||
|
||||
import java.util.ArrayList;
|
||||
@@ -175,6 +176,7 @@ class TaskFragmentContainer {
|
||||
&& mInfo.getActivities().size() == collectNonFinishingActivities().size();
|
||||
}
|
||||
|
||||
@NonNull
|
||||
ActivityStack toActivityStack() {
|
||||
return new ActivityStack(collectNonFinishingActivities(), isEmpty());
|
||||
}
|
||||
|
||||
@@ -322,8 +322,8 @@ public class SplitControllerTest {
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testOnActivityReparentToTask_sameProcess() {
|
||||
mSplitController.onActivityReparentToTask(TASK_ID, new Intent(),
|
||||
public void testOnActivityReparentedToTask_sameProcess() {
|
||||
mSplitController.onActivityReparentedToTask(TASK_ID, new Intent(),
|
||||
mActivity.getActivityToken());
|
||||
|
||||
// Treated as on activity created, but allow to split as primary.
|
||||
@@ -333,13 +333,13 @@ public class SplitControllerTest {
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testOnActivityReparentToTask_diffProcess() {
|
||||
public void testOnActivityReparentedToTask_diffProcess() {
|
||||
// Create an empty TaskFragment to initialize for the Task.
|
||||
mSplitController.newContainer(new Intent(), mActivity, TASK_ID);
|
||||
final IBinder activityToken = new Binder();
|
||||
final Intent intent = new Intent();
|
||||
|
||||
mSplitController.onActivityReparentToTask(TASK_ID, intent, activityToken);
|
||||
mSplitController.onActivityReparentedToTask(TASK_ID, intent, activityToken);
|
||||
|
||||
// Treated as starting new intent
|
||||
verify(mSplitController, never()).resolveActivityToContainer(any(), anyBoolean());
|
||||
|
||||
@@ -1561,7 +1561,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
|
||||
if (task == mLastParentBeforePip && task != null) {
|
||||
// Notify the TaskFragmentOrganizer that the activity is reparented back from pip.
|
||||
mAtmService.mWindowOrganizerController.mTaskFragmentOrganizerController
|
||||
.onActivityReparentToTask(this);
|
||||
.onActivityReparentedToTask(this);
|
||||
// Activity's reparented back from pip, clear the links once established
|
||||
clearLastParentBeforePip();
|
||||
}
|
||||
|
||||
@@ -18,7 +18,7 @@ package com.android.server.wm;
|
||||
|
||||
import static android.app.ActivityTaskManager.INVALID_TASK_ID;
|
||||
import static android.window.TaskFragmentOrganizer.putErrorInfoInBundle;
|
||||
import static android.window.TaskFragmentTransaction.TYPE_ACTIVITY_REPARENT_TO_TASK;
|
||||
import static android.window.TaskFragmentTransaction.TYPE_ACTIVITY_REPARENTED_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;
|
||||
@@ -277,7 +277,7 @@ public class TaskFragmentOrganizerController extends ITaskFragmentOrganizerContr
|
||||
}
|
||||
|
||||
@Nullable
|
||||
TaskFragmentTransaction.Change prepareActivityReparentToTask(
|
||||
TaskFragmentTransaction.Change prepareActivityReparentedToTask(
|
||||
@NonNull ActivityRecord activity) {
|
||||
if (activity.finishing) {
|
||||
Slog.d(TAG, "Reparent activity=" + activity.token + " is finishing");
|
||||
@@ -315,7 +315,7 @@ public class TaskFragmentOrganizerController extends ITaskFragmentOrganizerContr
|
||||
}
|
||||
ProtoLog.v(WM_DEBUG_WINDOW_ORGANIZER, "Activity=%s reparent to taskId=%d",
|
||||
activity.token, task.mTaskId);
|
||||
return new TaskFragmentTransaction.Change(TYPE_ACTIVITY_REPARENT_TO_TASK)
|
||||
return new TaskFragmentTransaction.Change(TYPE_ACTIVITY_REPARENTED_TO_TASK)
|
||||
.setTaskId(task.mTaskId)
|
||||
.setActivityIntent(activity.intent)
|
||||
.setActivityToken(activityToken);
|
||||
@@ -521,7 +521,7 @@ public class TaskFragmentOrganizerController extends ITaskFragmentOrganizerContr
|
||||
mAtmService.mWindowManager.mWindowPlacerLocked.requestTraversal();
|
||||
}
|
||||
|
||||
void onActivityReparentToTask(@NonNull ActivityRecord activity) {
|
||||
void onActivityReparentedToTask(@NonNull ActivityRecord activity) {
|
||||
final ITaskFragmentOrganizer organizer;
|
||||
if (activity.mLastTaskFragmentOrganizerBeforePip != null) {
|
||||
// If the activity is previously embedded in an organized TaskFragment.
|
||||
@@ -547,7 +547,7 @@ public class TaskFragmentOrganizerController extends ITaskFragmentOrganizerContr
|
||||
return;
|
||||
}
|
||||
addPendingEvent(new PendingTaskFragmentEvent.Builder(
|
||||
PendingTaskFragmentEvent.EVENT_ACTIVITY_REPARENT_TO_TASK, organizer)
|
||||
PendingTaskFragmentEvent.EVENT_ACTIVITY_REPARENTED_TO_TASK, organizer)
|
||||
.setActivity(activity)
|
||||
.build());
|
||||
}
|
||||
@@ -601,7 +601,7 @@ public class TaskFragmentOrganizerController extends ITaskFragmentOrganizerContr
|
||||
static final int EVENT_INFO_CHANGED = 2;
|
||||
static final int EVENT_PARENT_INFO_CHANGED = 3;
|
||||
static final int EVENT_ERROR = 4;
|
||||
static final int EVENT_ACTIVITY_REPARENT_TO_TASK = 5;
|
||||
static final int EVENT_ACTIVITY_REPARENTED_TO_TASK = 5;
|
||||
|
||||
@IntDef(prefix = "EVENT_", value = {
|
||||
EVENT_APPEARED,
|
||||
@@ -609,7 +609,7 @@ public class TaskFragmentOrganizerController extends ITaskFragmentOrganizerContr
|
||||
EVENT_INFO_CHANGED,
|
||||
EVENT_PARENT_INFO_CHANGED,
|
||||
EVENT_ERROR,
|
||||
EVENT_ACTIVITY_REPARENT_TO_TASK
|
||||
EVENT_ACTIVITY_REPARENTED_TO_TASK
|
||||
})
|
||||
@Retention(RetentionPolicy.SOURCE)
|
||||
public @interface EventType {}
|
||||
@@ -900,8 +900,8 @@ public class TaskFragmentOrganizerController extends ITaskFragmentOrganizerContr
|
||||
case PendingTaskFragmentEvent.EVENT_ERROR:
|
||||
return state.prepareTaskFragmentError(event.mErrorCallbackToken, taskFragment,
|
||||
event.mOpType, event.mException);
|
||||
case PendingTaskFragmentEvent.EVENT_ACTIVITY_REPARENT_TO_TASK:
|
||||
return state.prepareActivityReparentToTask(event.mActivity);
|
||||
case PendingTaskFragmentEvent.EVENT_ACTIVITY_REPARENTED_TO_TASK:
|
||||
return state.prepareActivityReparentedToTask(event.mActivity);
|
||||
default:
|
||||
throw new IllegalArgumentException("Unknown TaskFragmentEvent=" + event.mEventType);
|
||||
}
|
||||
|
||||
@@ -474,7 +474,7 @@ public class AppTransitionTests extends WindowTestsBase {
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testActivityRecordReparentToTaskFragment() {
|
||||
public void testActivityRecordReparentedToTaskFragment() {
|
||||
final ActivityRecord activity = createActivityRecord(mDc);
|
||||
final SurfaceControl activityLeash = mock(SurfaceControl.class);
|
||||
doNothing().when(activity).setDropInputMode(anyInt());
|
||||
|
||||
@@ -302,7 +302,7 @@ public class TaskFragmentOrganizerControllerTest extends WindowTestsBase {
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testOnActivityReparentToTask_activityInOrganizerProcess_useActivityToken() {
|
||||
public void testOnActivityReparentedToTask_activityInOrganizerProcess_useActivityToken() {
|
||||
// Make sure the activity pid/uid is the same as the organizer caller.
|
||||
final int pid = Binder.getCallingPid();
|
||||
final int uid = Binder.getCallingUid();
|
||||
@@ -314,17 +314,18 @@ public class TaskFragmentOrganizerControllerTest extends WindowTestsBase {
|
||||
task.effectiveUid = uid;
|
||||
|
||||
// No need to notify organizer if it is not embedded.
|
||||
mController.onActivityReparentToTask(activity);
|
||||
mController.onActivityReparentedToTask(activity);
|
||||
mController.dispatchPendingEvents();
|
||||
|
||||
verify(mOrganizer, never()).onActivityReparentToTask(anyInt(), any(), any());
|
||||
verify(mOrganizer, never()).onActivityReparentedToTask(anyInt(), any(), any());
|
||||
|
||||
// Notify organizer if it was embedded before entered Pip.
|
||||
activity.mLastTaskFragmentOrganizerBeforePip = mIOrganizer;
|
||||
mController.onActivityReparentToTask(activity);
|
||||
mController.onActivityReparentedToTask(activity);
|
||||
mController.dispatchPendingEvents();
|
||||
|
||||
verify(mOrganizer).onActivityReparentToTask(task.mTaskId, activity.intent, activity.token);
|
||||
verify(mOrganizer).onActivityReparentedToTask(task.mTaskId, activity.intent,
|
||||
activity.token);
|
||||
|
||||
// Notify organizer if there is any embedded in the Task.
|
||||
final TaskFragment taskFragment = new TaskFragmentBuilder(mAtm)
|
||||
@@ -335,15 +336,15 @@ public class TaskFragmentOrganizerControllerTest extends WindowTestsBase {
|
||||
DEFAULT_TASK_FRAGMENT_ORGANIZER_PROCESS_NAME);
|
||||
activity.reparent(taskFragment, POSITION_TOP);
|
||||
activity.mLastTaskFragmentOrganizerBeforePip = null;
|
||||
mController.onActivityReparentToTask(activity);
|
||||
mController.onActivityReparentedToTask(activity);
|
||||
mController.dispatchPendingEvents();
|
||||
|
||||
verify(mOrganizer, times(2))
|
||||
.onActivityReparentToTask(task.mTaskId, activity.intent, activity.token);
|
||||
.onActivityReparentedToTask(task.mTaskId, activity.intent, activity.token);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testOnActivityReparentToTask_activityNotInOrganizerProcess_useTemporaryToken() {
|
||||
public void testOnActivityReparentedToTask_activityNotInOrganizerProcess_useTemporaryToken() {
|
||||
final int pid = Binder.getCallingPid();
|
||||
final int uid = Binder.getCallingUid();
|
||||
mTaskFragment.setTaskFragmentOrganizer(mOrganizer.getOrganizerToken(), uid,
|
||||
@@ -364,11 +365,11 @@ public class TaskFragmentOrganizerControllerTest extends WindowTestsBase {
|
||||
// Notify organizer if it was embedded before entered Pip.
|
||||
// Create a temporary token since the activity doesn't belong to the same process.
|
||||
activity.mLastTaskFragmentOrganizerBeforePip = mIOrganizer;
|
||||
mController.onActivityReparentToTask(activity);
|
||||
mController.onActivityReparentedToTask(activity);
|
||||
mController.dispatchPendingEvents();
|
||||
|
||||
// Allow organizer to reparent activity in other process using the temporary token.
|
||||
verify(mOrganizer).onActivityReparentToTask(eq(task.mTaskId), eq(activity.intent),
|
||||
verify(mOrganizer).onActivityReparentedToTask(eq(task.mTaskId), eq(activity.intent),
|
||||
token.capture());
|
||||
final IBinder temporaryToken = token.getValue();
|
||||
assertNotEquals(activity.token, temporaryToken);
|
||||
|
||||
@@ -322,7 +322,7 @@ public class TaskFragmentTest extends WindowTestsBase {
|
||||
activity.reparent(task, POSITION_TOP);
|
||||
|
||||
// Notify the organizer about the reparent.
|
||||
verify(mAtm.mTaskFragmentOrganizerController).onActivityReparentToTask(activity);
|
||||
verify(mAtm.mTaskFragmentOrganizerController).onActivityReparentedToTask(activity);
|
||||
assertNull(activity.mLastTaskFragmentOrganizerBeforePip);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user