diff options
5 files changed, 50 insertions, 0 deletions
diff --git a/core/java/android/window/ITaskFragmentOrganizerController.aidl b/core/java/android/window/ITaskFragmentOrganizerController.aidl index 1ad0452dd837..4399207fcc27 100644 --- a/core/java/android/window/ITaskFragmentOrganizerController.aidl +++ b/core/java/android/window/ITaskFragmentOrganizerController.aidl @@ -44,4 +44,10 @@ interface ITaskFragmentOrganizerController { * Unregisters remote animations per transition type for the organizer. */ void unregisterRemoteAnimations(in ITaskFragmentOrganizer organizer); + + /** + * Checks if an activity organized by a {@link android.window.TaskFragmentOrganizer} and + * only occupies a portion of Task bounds. + */ + boolean isActivityEmbedded(in IBinder activityToken); } diff --git a/core/java/android/window/TaskFragmentOrganizer.java b/core/java/android/window/TaskFragmentOrganizer.java index 7e7d37083b5b..9c2fde04e4d2 100644 --- a/core/java/android/window/TaskFragmentOrganizer.java +++ b/core/java/android/window/TaskFragmentOrganizer.java @@ -216,4 +216,17 @@ public class TaskFragmentOrganizer extends WindowOrganizer { return null; } } + + /** + * Checks if an activity organized by a {@link android.window.TaskFragmentOrganizer} and + * only occupies a portion of Task bounds. + * @hide + */ + public boolean isActivityEmbedded(@NonNull IBinder activityToken) { + try { + return getController().isActivityEmbedded(activityToken); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } } 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 dc4e27a4c8d8..af19bd0a79ac 100644 --- a/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/SplitController.java +++ b/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/SplitController.java @@ -860,4 +860,12 @@ public class SplitController implements JetpackTaskFragmentOrganizer.TaskFragmen launchingContainer.getTaskFragmentToken()); } } + + /** + * Checks if an activity is embedded and its presentation is customized by a + * {@link android.window.TaskFragmentOrganizer} to only occupy a portion of Task bounds. + */ + public boolean isActivityEmbedded(@NonNull Activity activity) { + return mPresenter.isActivityEmbedded(activity.getActivityToken()); + } } diff --git a/libs/WindowManager/Jetpack/window-extensions-release.aar b/libs/WindowManager/Jetpack/window-extensions-release.aar Binary files differindex d6678bf9b320..f54ab08d8a8a 100644 --- a/libs/WindowManager/Jetpack/window-extensions-release.aar +++ b/libs/WindowManager/Jetpack/window-extensions-release.aar diff --git a/services/core/java/com/android/server/wm/TaskFragmentOrganizerController.java b/services/core/java/com/android/server/wm/TaskFragmentOrganizerController.java index 29c27f9f3af6..c7fdefc412cc 100644 --- a/services/core/java/com/android/server/wm/TaskFragmentOrganizerController.java +++ b/services/core/java/com/android/server/wm/TaskFragmentOrganizerController.java @@ -24,6 +24,7 @@ import static com.android.server.wm.WindowOrganizerController.configurationsAreE import android.annotation.IntDef; import android.annotation.Nullable; import android.content.res.Configuration; +import android.graphics.Rect; import android.os.Binder; import android.os.Bundle; import android.os.IBinder; @@ -579,4 +580,26 @@ public class TaskFragmentOrganizerController extends ITaskFragmentOrganizerContr event.mException); } } + + // TODO(b/204399167): change to push the embedded state to the client side + @Override + public boolean isActivityEmbedded(IBinder activityToken) { + synchronized (mGlobalLock) { + final ActivityRecord activity = ActivityRecord.forTokenLocked(activityToken); + if (activity == null) { + return false; + } + final TaskFragment taskFragment = activity.getOrganizedTaskFragment(); + if (taskFragment == null) { + return false; + } + final Task parentTask = taskFragment.getTask(); + if (parentTask != null) { + final Rect taskBounds = parentTask.getBounds(); + final Rect taskFragBounds = taskFragment.getBounds(); + return !taskBounds.equals(taskFragBounds) && taskBounds.contains(taskFragBounds); + } + return false; + } + } } |