From 0c0eefe288ca100e289fabc84d43abc4b8311277 Mon Sep 17 00:00:00 2001 From: Charles Chen Date: Tue, 3 Oct 2023 16:48:00 +0800 Subject: [PATCH] Add support to launch Overlay container Bug: 243518738 Test: atest OverlayPresentationTest Change-Id: Ie26f6d4e6f6330649bb11a34ec98022196aa2dd7 --- .../embedding/OverlayCreateParams.java | 119 ++++++ .../extensions/embedding/SplitController.java | 202 ++++++++- .../extensions/embedding/SplitPresenter.java | 24 +- .../extensions/embedding/TaskContainer.java | 65 ++- .../embedding/TaskFragmentContainer.java | 36 +- .../Jetpack/tests/unittest/Android.bp | 1 + .../embedding/OverlayPresentationTest.java | 393 ++++++++++++++++++ .../embedding/SplitControllerTest.java | 10 +- 8 files changed, 804 insertions(+), 46 deletions(-) create mode 100644 libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/OverlayCreateParams.java create mode 100644 libs/WindowManager/Jetpack/tests/unittest/src/androidx/window/extensions/embedding/OverlayPresentationTest.java diff --git a/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/OverlayCreateParams.java b/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/OverlayCreateParams.java new file mode 100644 index 000000000000..ff49cdcab349 --- /dev/null +++ b/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/OverlayCreateParams.java @@ -0,0 +1,119 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package androidx.window.extensions.embedding; + +import static java.util.Objects.requireNonNull; + +import android.graphics.Rect; +import android.os.Bundle; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.annotation.VisibleForTesting; + +/** + * The parameter to create an overlay container that retrieved from + * {@link android.app.ActivityOptions} bundle. + */ +class OverlayCreateParams { + + // TODO(b/295803704): Move them to WM Extensions so that we can reuse in WM Jetpack. + @VisibleForTesting + static final String KEY_OVERLAY_CREATE_PARAMS = + "androidx.window.extensions.OverlayCreateParams"; + + @VisibleForTesting + static final String KEY_OVERLAY_CREATE_PARAMS_TASK_ID = + "androidx.window.extensions.OverlayCreateParams.taskId"; + + @VisibleForTesting + static final String KEY_OVERLAY_CREATE_PARAMS_TAG = + "androidx.window.extensions.OverlayCreateParams.tag"; + + @VisibleForTesting + static final String KEY_OVERLAY_CREATE_PARAMS_BOUNDS = + "androidx.window.extensions.OverlayCreateParams.bounds"; + + private final int mTaskId; + + @NonNull + private final String mTag; + + @NonNull + private final Rect mBounds; + + OverlayCreateParams(int taskId, @NonNull String tag, @NonNull Rect bounds) { + mTaskId = taskId; + mTag = requireNonNull(tag); + mBounds = requireNonNull(bounds); + } + + int getTaskId() { + return mTaskId; + } + + @NonNull + String getTag() { + return mTag; + } + + @NonNull + Rect getBounds() { + return mBounds; + } + + @Override + public int hashCode() { + int result = mTaskId; + result = 31 * result + mTag.hashCode(); + result = 31 * result + mBounds.hashCode(); + return result; + } + + @Override + public boolean equals(Object obj) { + if (obj == this) return true; + if (!(obj instanceof OverlayCreateParams thatParams)) return false; + return mTaskId == thatParams.mTaskId + && mTag.equals(thatParams.mTag) + && mBounds.equals(thatParams.mBounds); + } + + @Override + public String toString() { + return OverlayCreateParams.class.getSimpleName() + ": {" + + "taskId=" + mTaskId + + ", tag=" + mTag + + ", bounds=" + mBounds + + "}"; + } + + /** Retrieves the {@link OverlayCreateParams} from {@link android.app.ActivityOptions} bundle */ + @Nullable + static OverlayCreateParams fromBundle(@NonNull Bundle bundle) { + final Bundle paramsBundle = bundle.getBundle(KEY_OVERLAY_CREATE_PARAMS); + if (paramsBundle == null) { + return null; + } + final int taskId = paramsBundle.getInt(KEY_OVERLAY_CREATE_PARAMS_TASK_ID); + final String tag = requireNonNull(paramsBundle.getString(KEY_OVERLAY_CREATE_PARAMS_TAG)); + final Rect bounds = requireNonNull(paramsBundle.getParcelable( + KEY_OVERLAY_CREATE_PARAMS_BOUNDS, Rect.class)); + + return new OverlayCreateParams(taskId, tag, bounds); + } +} diff --git a/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/SplitController.java b/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/SplitController.java index cdfc4c87d271..2f1eec15e415 100644 --- a/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/SplitController.java +++ b/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/SplitController.java @@ -40,9 +40,10 @@ import static androidx.window.extensions.embedding.SplitContainer.isStickyPlaceh import static androidx.window.extensions.embedding.SplitContainer.shouldFinishAssociatedContainerWhenAdjacent; import static androidx.window.extensions.embedding.SplitContainer.shouldFinishAssociatedContainerWhenStacked; import static androidx.window.extensions.embedding.SplitPresenter.RESULT_EXPAND_FAILED_NO_TF_INFO; +import static androidx.window.extensions.embedding.SplitPresenter.boundsSmallerThanMinDimensions; import static androidx.window.extensions.embedding.SplitPresenter.getActivitiesMinDimensionsPair; import static androidx.window.extensions.embedding.SplitPresenter.getActivityIntentMinDimensionsPair; -import static androidx.window.extensions.embedding.SplitPresenter.getTaskWindowMetrics; +import static androidx.window.extensions.embedding.SplitPresenter.getMinDimensions; import static androidx.window.extensions.embedding.SplitPresenter.shouldShowSplit; import android.app.Activity; @@ -87,6 +88,7 @@ import androidx.window.extensions.embedding.TransactionManager.TransactionRecord import androidx.window.extensions.layout.WindowLayoutComponentImpl; import com.android.internal.annotations.VisibleForTesting; +import com.android.window.flags.Flags; import java.util.ArrayList; import java.util.Collections; @@ -123,8 +125,7 @@ public class SplitController implements JetpackTaskFragmentOrganizer.TaskFragmen * and unregistered via {@link #clearSplitAttributesCalculator()}. * This is called when: *