Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 153bf507 authored by Chris Li's avatar Chris Li Committed by Android (Google) Code Review
Browse files

Merge "Address TaskFragmentOrganizer style comments" into tm-qpr-dev

parents 620e37ed 99da16cd
Loading
Loading
Loading
Loading
+4 −4
Original line number Diff line number Diff line
@@ -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());
+4 −4
Original line number Diff line number Diff line
@@ -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
+32 −42
Original line number Diff line number Diff line
@@ -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);
    }
    }

    @Override
    public void onTaskFragmentInfoChanged(@NonNull TaskFragmentInfo taskFragmentInfo) {
        final IBinder fragmentToken = taskFragmentInfo.getFragmentToken();
        mFragmentInfos.put(fragmentToken, taskFragmentInfo);

        if (mCallback != null) {
        mCallback.onTaskFragmentInfoChanged(taskFragmentInfo);
    }
    }

    @Override
    public void onTaskFragmentVanished(@NonNull TaskFragmentInfo taskFragmentInfo) {
        mFragmentInfos.remove(taskFragmentInfo.getFragmentToken());

        if (mCallback != null) {
        mCallback.onTaskFragmentVanished(taskFragmentInfo);
    }
    }

    @Override
    public void onTaskFragmentParentInfoChanged(int taskId, @NonNull Configuration parentConfig) {
        if (mCallback != null) {
        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);
    }
}
}
+5 −1
Original line number Diff line number Diff line
@@ -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,
+12 −9
Original line number Diff line number Diff line
@@ -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;
Loading