Merge "Deleting ActivityView" into sc-dev
diff --git a/core/api/test-current.txt b/core/api/test-current.txt
index 6dc7450..5a9dc82 100644
--- a/core/api/test-current.txt
+++ b/core/api/test-current.txt
@@ -176,42 +176,6 @@
field public static final int INVALID_STACK_ID = -1; // 0xffffffff
}
- public class ActivityView extends android.view.ViewGroup {
- ctor public ActivityView(android.content.Context);
- ctor public ActivityView(android.content.Context, android.util.AttributeSet);
- ctor public ActivityView(@NonNull android.content.Context, @NonNull android.util.AttributeSet, int, boolean);
- method public int getVirtualDisplayId();
- method public void onLayout(boolean, int, int, int, int);
- method public void onLocationChanged();
- method public void performBackPress();
- method public void release();
- method public void setCallback(android.app.ActivityView.StateCallback);
- method public void setForwardedInsets(android.graphics.Insets);
- method public void startActivity(@NonNull android.content.Intent);
- method public void startActivity(@NonNull android.content.Intent, android.os.UserHandle);
- method public void startActivity(@NonNull android.app.PendingIntent);
- method public void startActivity(@NonNull android.app.PendingIntent, @Nullable android.content.Intent, @NonNull android.app.ActivityOptions);
- }
-
- public static final class ActivityView.Builder {
- ctor public ActivityView.Builder(@NonNull android.content.Context);
- method @NonNull public android.app.ActivityView build();
- method @NonNull public android.app.ActivityView.Builder setAttributeSet(@Nullable android.util.AttributeSet);
- method @NonNull public android.app.ActivityView.Builder setDefaultStyle(int);
- method @NonNull public android.app.ActivityView.Builder setDisableSurfaceViewBackgroundLayer(boolean);
- method @NonNull public android.app.ActivityView.Builder setUsePublicVirtualDisplay(boolean);
- method @NonNull public android.app.ActivityView.Builder setUseTrustedDisplay(boolean);
- }
-
- public abstract static class ActivityView.StateCallback {
- ctor public ActivityView.StateCallback();
- method public abstract void onActivityViewDestroyed(android.app.ActivityView);
- method public abstract void onActivityViewReady(android.app.ActivityView);
- method public void onTaskCreated(int, android.content.ComponentName);
- method public void onTaskMovedToFront(int);
- method public void onTaskRemovalStarted(int);
- }
-
public class AlarmManager {
method public boolean hasScheduleExactAlarm(@NonNull String, int);
}
diff --git a/core/api/test-lint-baseline.txt b/core/api/test-lint-baseline.txt
index 1833ed5..5409165 100644
--- a/core/api/test-lint-baseline.txt
+++ b/core/api/test-lint-baseline.txt
@@ -413,8 +413,6 @@
-GenericException: android.app.ActivityView#finalize():
-
GenericException: android.app.prediction.AppPredictor#finalize():
GenericException: android.service.autofill.CharSequenceTransformation#apply(android.service.autofill.ValueFinder, android.widget.RemoteViews, int):
@@ -601,20 +599,6 @@
-MissingGetterMatchingBuilder: android.app.ActivityView.Builder#setAttributeSet(android.util.AttributeSet):
-
-MissingGetterMatchingBuilder: android.app.ActivityView.Builder#setDefaultStyle(int):
-
-MissingGetterMatchingBuilder: android.app.ActivityView.Builder#setDisableSurfaceViewBackgroundLayer(boolean):
-
-MissingGetterMatchingBuilder: android.app.ActivityView.Builder#setSingleInstance(boolean):
-
-MissingGetterMatchingBuilder: android.app.ActivityView.Builder#setUsePublicVirtualDisplay(boolean):
-
-MissingGetterMatchingBuilder: android.app.ActivityView.Builder#setUseTrustedDisplay(boolean):
-
-MissingGetterMatchingBuilder: android.app.AppOpsManager.HistoricalOpsRequest.Builder#setAttributionTag(String):
-
MissingGetterMatchingBuilder: android.app.AppOpsManager.HistoricalOpsRequest.Builder#setFlags(int):
MissingGetterMatchingBuilder: android.app.AppOpsManager.HistoricalOpsRequest.Builder#setOpNames(java.util.List<java.lang.String>):
@@ -791,36 +775,6 @@
MissingNullability: android.app.ActivityTaskManager#supportsSplitScreenMultiWindow(android.content.Context) parameter #0:
-MissingNullability: android.app.ActivityView#ActivityView(android.content.Context) parameter #0:
-
-MissingNullability: android.app.ActivityView#ActivityView(android.content.Context, android.util.AttributeSet) parameter #0:
-
-MissingNullability: android.app.ActivityView#ActivityView(android.content.Context, android.util.AttributeSet) parameter #1:
-
-MissingNullability: android.app.ActivityView#ActivityView(android.content.Context, android.util.AttributeSet, int) parameter #0:
-
-MissingNullability: android.app.ActivityView#ActivityView(android.content.Context, android.util.AttributeSet, int) parameter #1:
-
-MissingNullability: android.app.ActivityView#ActivityView(android.content.Context, android.util.AttributeSet, int, boolean) parameter #0:
-
-MissingNullability: android.app.ActivityView#ActivityView(android.content.Context, android.util.AttributeSet, int, boolean) parameter #1:
-
-MissingNullability: android.app.ActivityView#gatherTransparentRegion(android.graphics.Region) parameter #0:
-
-MissingNullability: android.app.ActivityView#onVisibilityChanged(android.view.View, int) parameter #0:
-
-MissingNullability: android.app.ActivityView#setCallback(android.app.ActivityView.StateCallback) parameter #0:
-
-MissingNullability: android.app.ActivityView#setForwardedInsets(android.graphics.Insets) parameter #0:
-
-MissingNullability: android.app.ActivityView#startActivity(android.content.Intent, android.os.UserHandle) parameter #1:
-
-MissingNullability: android.app.ActivityView.StateCallback#onActivityViewDestroyed(android.app.ActivityView) parameter #0:
-
-MissingNullability: android.app.ActivityView.StateCallback#onActivityViewReady(android.app.ActivityView) parameter #0:
-
-MissingNullability: android.app.ActivityView.StateCallback#onTaskCreated(int, android.content.ComponentName) parameter #1:
-
MissingNullability: android.app.AppDetailsActivity#onCreate(android.os.Bundle) parameter #0:
MissingNullability: android.app.AppOpsManager#getOpStrs():
@@ -2641,8 +2595,6 @@
-NotCloseable: android.app.ActivityView:
-
NotCloseable: android.app.prediction.AppPredictor:
NotCloseable: android.net.EthernetManager.TetheredInterfaceRequest:
@@ -2773,8 +2725,6 @@
-ProtectedMember: android.app.ActivityView#onVisibilityChanged(android.view.View, int):
-
ProtectedMember: android.app.AppDetailsActivity#onCreate(android.os.Bundle):
ProtectedMember: android.os.VibrationEffect#scale(int, float, int):
@@ -3025,8 +2975,6 @@
-UserHandleName: android.app.ActivityView#startActivity(android.content.Intent, android.os.UserHandle):
-
UserHandleName: android.content.AutofillOptions:
UserHandleName: android.content.ContentCaptureOptions:
diff --git a/core/java/android/app/ActivityView.java b/core/java/android/app/ActivityView.java
deleted file mode 100644
index 8c42a8a..0000000
--- a/core/java/android/app/ActivityView.java
+++ /dev/null
@@ -1,720 +0,0 @@
-/**
- * Copyright (c) 2017 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 android.app;
-
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.annotation.TestApi;
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.Intent;
-import android.content.pm.LauncherApps;
-import android.content.pm.ShortcutInfo;
-import android.graphics.Insets;
-import android.graphics.Matrix;
-import android.graphics.Point;
-import android.graphics.Rect;
-import android.graphics.Region;
-import android.hardware.display.VirtualDisplay;
-import android.os.Bundle;
-import android.os.UserHandle;
-import android.util.AttributeSet;
-import android.util.DisplayMetrics;
-import android.util.Log;
-import android.view.Display;
-import android.view.DisplayInfo;
-import android.view.IWindow;
-import android.view.IWindowManager;
-import android.view.KeyEvent;
-import android.view.SurfaceControl;
-import android.view.SurfaceHolder;
-import android.view.SurfaceView;
-import android.view.View;
-import android.view.ViewGroup;
-import android.view.ViewParent;
-import android.window.TaskEmbedder;
-import android.window.TaskOrganizerTaskEmbedder;
-import android.window.VirtualDisplayTaskEmbedder;
-
-import dalvik.system.CloseGuard;
-
-/**
- * Task container that allows launching activities into itself.
- * <p>Activity launching into this container is restricted by the same rules that apply to launching
- * on VirtualDisplays.
- * @hide
- */
-@TestApi
-public class ActivityView extends ViewGroup implements android.window.TaskEmbedder.Host {
-
- private static final String TAG = "ActivityView";
-
- private android.window.TaskEmbedder mTaskEmbedder;
-
- private final SurfaceView mSurfaceView;
- private final SurfaceCallback mSurfaceCallback;
-
- private final CloseGuard mGuard = CloseGuard.get();
- private boolean mOpened; // Protected by mGuard.
-
- private final SurfaceControl.Transaction mTmpTransaction = new SurfaceControl.Transaction();
-
- // For Host
- private final Point mWindowPosition = new Point();
- private final int[] mTmpArray = new int[2];
- private final Rect mTmpRect = new Rect();
- private final Matrix mScreenSurfaceMatrix = new Matrix();
- private final Region mTapExcludeRegion = new Region();
-
- public ActivityView(Context context) {
- this(context, null /* attrs */);
- }
-
- public ActivityView(Context context, AttributeSet attrs) {
- this(context, attrs, 0 /* defStyle */, false /* usePublicVirtualDisplay */,
- false /* disableSurfaceViewBackgroundLayer */, false /* useTrustedDisplay */);
- }
-
- /**
- * This constructor let's the caller explicitly request a public virtual display as the backing
- * display. Using a public display is not recommended as it exposes it to other applications,
- * but it might be needed for backwards compatibility.
- */
- public ActivityView(
- @NonNull Context context, @NonNull AttributeSet attrs, int defStyle,
- boolean usePublicVirtualDisplay) {
- this(context, attrs, defStyle, usePublicVirtualDisplay,
- false /* disableSurfaceViewBackgroundLayer */, false /* useTrustedDisplay */);
- }
-
- private ActivityView(
- @NonNull Context context, @NonNull AttributeSet attrs, int defStyle,
- boolean usePublicVirtualDisplay, boolean disableSurfaceViewBackgroundLayer,
- boolean useTrustedDisplay) {
- super(context, attrs, defStyle);
- if (useTaskOrganizer()) {
- mTaskEmbedder = new TaskOrganizerTaskEmbedder(context, this);
- } else {
- mTaskEmbedder = new VirtualDisplayTaskEmbedder(context, this, usePublicVirtualDisplay,
- useTrustedDisplay);
- }
- mSurfaceView = new SurfaceView(context, null, 0, 0, disableSurfaceViewBackgroundLayer);
- // Since ActivityView#getAlpha has been overridden, we should use parent class's alpha
- // as authoritative to synchronize surface view's alpha value.
- mSurfaceView.setAlpha(super.getAlpha());
- mSurfaceView.setUseAlpha();
- mSurfaceCallback = new SurfaceCallback();
- mSurfaceView.getHolder().addCallback(mSurfaceCallback);
- addView(mSurfaceView);
-
- mOpened = true;
- mGuard.open("release");
- }
-
- /** Callback that notifies when the container is ready or destroyed. */
- public abstract static class StateCallback {
-
- /**
- * Called when the container is ready for launching activities. Calling
- * {@link #startActivity(Intent)} prior to this callback will result in an
- * {@link IllegalStateException}.
- *
- * @see #startActivity(Intent)
- */
- public abstract void onActivityViewReady(ActivityView view);
-
- /**
- * Called when the container can no longer launch activities. Calling
- * {@link #startActivity(Intent)} after this callback will result in an
- * {@link IllegalStateException}.
- *
- * @see #startActivity(Intent)
- */
- public abstract void onActivityViewDestroyed(ActivityView view);
-
- /**
- * Called when a task is created inside the container.
- * This is a filtered version of {@link TaskStackListener}
- */
- public void onTaskCreated(int taskId, ComponentName componentName) { }
-
- /**
- * Called when a task visibility changes.
- * @hide
- */
- public void onTaskVisibilityChanged(int taskId, boolean visible) { }
-
- /**
- * Called when a task is moved to the front of the stack inside the container.
- * This is a filtered version of {@link TaskStackListener}
- */
- public void onTaskMovedToFront(int taskId) { }
-
- /**
- * Called when a task is about to be removed from the stack inside the container.
- * This is a filtered version of {@link TaskStackListener}
- */
- public void onTaskRemovalStarted(int taskId) { }
-
- /**
- * Called when back is pressed on the root activity of the task.
- * @hide
- */
- public void onBackPressedOnTaskRoot(int taskId) { }
- }
-
- /**
- * Set the callback to be notified about state changes.
- * <p>This class must finish initializing before {@link #startActivity(Intent)} can be called.
- * <p>Note: If the instance was ready prior to this call being made, then
- * {@link StateCallback#onActivityViewReady(ActivityView)} will be called from within
- * this method call.
- *
- * @param callback The callback to report events to.
- *
- * @see StateCallback
- * @see #startActivity(Intent)
- */
- public void setCallback(StateCallback callback) {
- if (callback == null) {
- mTaskEmbedder.setListener(null);
- return;
- }
- mTaskEmbedder.setListener(new StateCallbackAdapter(callback));
- }
-
- /**
- * Sets the corner radius for the Activity displayed here. The corners will be
- * cropped from the window painted by the contained Activity.
- *
- * @param cornerRadius the radius for the corners, in pixels
- * @hide
- */
- public void setCornerRadius(float cornerRadius) {
- mSurfaceView.setCornerRadius(cornerRadius);
- }
-
- /**
- * @hide
- */
- public float getCornerRadius() {
- return mSurfaceView.getCornerRadius();
- }
-
- /**
- * Control whether the surface is clipped to the same bounds as the View. If true, then
- * the bounds set by {@link #setSurfaceClipBounds(Rect)} are applied to the surface as
- * window-crop.
- *
- * @param clippingEnabled whether to enable surface clipping
- * @hide
- */
- public void setSurfaceClippingEnabled(boolean clippingEnabled) {
- mSurfaceView.setEnableSurfaceClipping(clippingEnabled);
- }
-
- /**
- * Sets an area on the contained surface to which it will be clipped
- * when it is drawn. Setting the value to null will remove the clip bounds
- * and the surface will draw normally, using its full bounds.
- *
- * @param clipBounds The rectangular area, in the local coordinates of
- * this view, to which future drawing operations will be clipped.
- * @hide
- */
- public void setSurfaceClipBounds(Rect clipBounds) {
- mSurfaceView.setClipBounds(clipBounds);
- }
-
- /**
- * @hide
- */
- public boolean getSurfaceClipBounds(Rect outRect) {
- return mSurfaceView.getClipBounds(outRect);
- }
-
- /**
- * Launch an activity represented by {@link ShortcutInfo} into this container.
- * <p>The owner of this container must be allowed to access the shortcut information,
- * as defined in {@link LauncherApps#hasShortcutHostPermission()} to use this method.
- * <p>Activity resolved by the provided {@link ShortcutInfo} must have
- * {@link android.R.attr#resizeableActivity} attribute set to {@code true} in order to be
- * launched here. Also, if activity is not owned by the owner of this container, it must allow
- * embedding and the caller must have permission to embed.
- * <p>Note: This class must finish initializing and
- * {@link StateCallback#onActivityViewReady(ActivityView)} callback must be triggered before
- * this method can be called.
- *
- * @param shortcut the shortcut used to launch the activity.
- * @param options for the activity.
- * @param sourceBounds the rect containing the source bounds of the clicked icon to open
- * this shortcut.
- * @see StateCallback
- * @see LauncherApps#startShortcut(ShortcutInfo, Rect, Bundle)
- *
- * @hide
- */
- public void startShortcutActivity(@NonNull ShortcutInfo shortcut,
- @NonNull ActivityOptions options, @Nullable Rect sourceBounds) {
- mTaskEmbedder.startShortcutActivity(shortcut, options, sourceBounds);
- }
-
- /**
- * Launch a new activity into this container.
- * <p>Activity resolved by the provided {@link Intent} must have
- * {@link android.R.attr#resizeableActivity} attribute set to {@code true} in order to be
- * launched here. Also, if activity is not owned by the owner of this container, it must allow
- * embedding and the caller must have permission to embed.
- * <p>Note: This class must finish initializing and
- * {@link StateCallback#onActivityViewReady(ActivityView)} callback must be triggered before
- * this method can be called.
- *
- * @param intent Intent used to launch an activity.
- *
- * @see StateCallback
- * @see #startActivity(PendingIntent)
- */
- public void startActivity(@NonNull Intent intent) {
- mTaskEmbedder.startActivity(intent);
- }
-
- /**
- * Launch a new activity into this container.
- * <p>Activity resolved by the provided {@link Intent} must have
- * {@link android.R.attr#resizeableActivity} attribute set to {@code true} in order to be
- * launched here. Also, if activity is not owned by the owner of this container, it must allow
- * embedding and the caller must have permission to embed.
- * <p>Note: This class must finish initializing and
- * {@link StateCallback#onActivityViewReady(ActivityView)} callback must be triggered before
- * this method can be called.
- *
- * @param intent Intent used to launch an activity.
- * @param user The UserHandle of the user to start this activity for.
- *
- *
- * @see StateCallback
- * @see #startActivity(PendingIntent)
- */
- public void startActivity(@NonNull Intent intent, UserHandle user) {
- mTaskEmbedder.startActivity(intent, user);
- }
-
- /**
- * Launch a new activity into this container.
- * <p>Activity resolved by the provided {@link PendingIntent} must have
- * {@link android.R.attr#resizeableActivity} attribute set to {@code true} in order to be
- * launched here. Also, if activity is not owned by the owner of this container, it must allow
- * embedding and the caller must have permission to embed.
- * <p>Note: This class must finish initializing and
- * {@link StateCallback#onActivityViewReady(ActivityView)} callback must be triggered before
- * this method can be called.
- *
- * @param pendingIntent Intent used to launch an activity.
- *
- * @see StateCallback
- * @see #startActivity(Intent)
- */
- public void startActivity(@NonNull PendingIntent pendingIntent) {
- mTaskEmbedder.startActivity(pendingIntent);
- }
-
- /**
- * Launch a new activity into this container.
- * <p>Activity resolved by the provided {@link PendingIntent} must have
- * {@link android.R.attr#resizeableActivity} attribute set to {@code true} in order to be
- * launched here. Also, if activity is not owned by the owner of this container, it must allow
- * embedding and the caller must have permission to embed.
- * <p>Note: This class must finish initializing and
- * {@link StateCallback#onActivityViewReady(ActivityView)} callback must be triggered before
- * this method can be called.
- *
- * @param pendingIntent Intent used to launch an activity.
- * @param fillInIntent Additional Intent data, see {@link Intent#fillIn Intent.fillIn()}.
- * @param options options for the activity
- *
- * @see StateCallback
- * @see #startActivity(Intent)
- */
- public void startActivity(@NonNull PendingIntent pendingIntent, @Nullable Intent fillInIntent,
- @NonNull ActivityOptions options) {
- mTaskEmbedder.startActivity(pendingIntent, fillInIntent, options);
- }
-
- /**
- * Release this container if it is initialized. Activity launching will no longer be permitted.
- */
- public void release() {
- performRelease();
- }
-
- /**
- * Triggers an update of {@link ActivityView}'s location in window to properly set tap exclude
- * regions and avoid focus switches by touches on this view.
- */
- public void onLocationChanged() {
- mTaskEmbedder.notifyBoundsChanged();
- }
-
- @Override
- public void onLayout(boolean changed, int l, int t, int r, int b) {
- mSurfaceView.layout(0 /* left */, 0 /* top */, r - l /* right */, b - t /* bottom */);
- }
-
- /**
- * Sets the alpha value when the content of {@link SurfaceView} needs to show or hide.
- * <p>Note: The surface view may ignore the alpha value in some cases. Refer to
- * {@link SurfaceView#setAlpha} for more details.
- *
- * @param alpha The opacity of the view.
- */
- @Override
- public void setAlpha(float alpha) {
- super.setAlpha(alpha);
-
- if (mSurfaceView != null) {
- mSurfaceView.setAlpha(alpha);
- }
- }
-
- @Override
- public float getAlpha() {
- return mSurfaceView.getAlpha();
- }
-
- @Override
- public boolean gatherTransparentRegion(Region region) {
- return mTaskEmbedder.gatherTransparentRegion(region)
- || super.gatherTransparentRegion(region);
- }
-
- private class SurfaceCallback implements SurfaceHolder.Callback {
- private final DisplayInfo mTempDisplayInfo = new DisplayInfo();
- private final DisplayMetrics mTempMetrics = new DisplayMetrics();
-
- @Override
- public void surfaceCreated(SurfaceHolder surfaceHolder) {
- if (!mTaskEmbedder.isInitialized()) {
- initTaskEmbedder(mSurfaceView.getSurfaceControl());
- } else {
- mTmpTransaction.reparent(mTaskEmbedder.getSurfaceControl(),
- mSurfaceView.getSurfaceControl()).apply();
- }
- mTaskEmbedder.resizeTask(getWidth(), getHeight());
- mTaskEmbedder.start();
- }
-
- @Override
- public void surfaceChanged(SurfaceHolder surfaceHolder, int format, int width, int height) {
- final Display display = getVirtualDisplay().getDisplay();
- if (!display.getDisplayInfo(mTempDisplayInfo)) {
- return;
- }
- mTempDisplayInfo.getAppMetrics(mTempMetrics);
- if (width != mTempMetrics.widthPixels || height != mTempMetrics.heightPixels) {
- mTaskEmbedder.resizeTask(width, height);
- mTaskEmbedder.notifyBoundsChanged();
- }
- }
-
- @Override
- public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
- mTaskEmbedder.stop();
- }
- }
-
- @Override
- protected void onVisibilityChanged(View changedView, int visibility) {
- super.onVisibilityChanged(changedView, visibility);
- mSurfaceView.setVisibility(visibility);
- }
-
- /**
- * @return the display id of the virtual display.
- */
- public int getVirtualDisplayId() {
- return mTaskEmbedder.getDisplayId();
- }
-
- /**
- * @hide
- * @return virtual display.
- */
- public VirtualDisplay getVirtualDisplay() {
- return mTaskEmbedder.getVirtualDisplay();
- }
-
- /**
- * Injects a pair of down/up key events with keycode {@link KeyEvent#KEYCODE_BACK} to the
- * virtual display.
- */
- public void performBackPress() {
- mTaskEmbedder.performBackPress();
- }
-
- /**
- * Initializes the task embedder.
- *
- * @param parent control for the surface to parent to
- * @return true if the task embedder has been initialized
- */
- private boolean initTaskEmbedder(SurfaceControl parent) {
- if (!mTaskEmbedder.initialize(parent)) {
- Log.e(TAG, "Failed to initialize ActivityView");
- return false;
- }
- return true;
- }
-
- private void performRelease() {
- if (!mOpened) {
- return;
- }
- mSurfaceView.getHolder().removeCallback(mSurfaceCallback);
- if (mTaskEmbedder.isInitialized()) {
- mTaskEmbedder.release();
- }
- mTaskEmbedder.setListener(null);
-
- mGuard.close();
- mOpened = false;
- }
-
- @Override
- protected void finalize() throws Throwable {
- try {
- if (mGuard != null) {
- mGuard.warnIfOpen();
- performRelease();
- }
- } finally {
- super.finalize();
- }
- }
-
- /**
- * Set forwarded insets on the virtual display.
- *
- * @see IWindowManager#setForwardedInsets
- */
- public void setForwardedInsets(Insets insets) {
- mTaskEmbedder.setForwardedInsets(insets);
- }
-
- // Host
-
- /** @hide */
- @Override
- public void onTaskBackgroundColorChanged(android.window.TaskEmbedder ts, int bgColor) {
- if (mSurfaceView != null) {
- mSurfaceView.setResizeBackgroundColor(bgColor);
- }
- }
-
- /** @hide */
- @Override
- public Region getTapExcludeRegion() {
- if (isAttachedToWindow() && canReceivePointerEvents()) {
- Point windowPos = getPositionInWindow();
- mTapExcludeRegion.set(
- windowPos.x,
- windowPos.y,
- windowPos.x + getWidth(),
- windowPos.y + getHeight());
- // There might be views on top of us. We need to subtract those areas from the tap
- // exclude region.
- final ViewParent parent = getParent();
- if (parent != null) {
- parent.subtractObscuredTouchableRegion(mTapExcludeRegion, this);
- }
- } else {
- mTapExcludeRegion.setEmpty();
- }
- return mTapExcludeRegion;
- }
-
- /** @hide */
- @Override
- public Matrix getScreenToTaskMatrix() {
- getLocationOnScreen(mTmpArray);
- mScreenSurfaceMatrix.set(getMatrix());
- mScreenSurfaceMatrix.postTranslate(mTmpArray[0], mTmpArray[1]);
- return mScreenSurfaceMatrix;
- }
-
- /** @hide */
- @Override
- public Point getPositionInWindow() {
- getLocationInWindow(mTmpArray);
- mWindowPosition.set(mTmpArray[0], mTmpArray[1]);
- return mWindowPosition;
- }
-
- /** @hide */
- @Override
- public Rect getScreenBounds() {
- getBoundsOnScreen(mTmpRect);
- return mTmpRect;
- }
-
- /** @hide */
- @Override
- public IWindow getWindow() {
- return super.getWindow();
- }
-
- /** @hide */
- @Override
- public boolean canReceivePointerEvents() {
- return super.canReceivePointerEvents();
- }
-
- /**
- * Overridden by instances that require the use of the task organizer implementation instead of
- * the virtual display implementation. Not for general use.
- * @hide
- */
- protected boolean useTaskOrganizer() {
- return false;
- }
-
- private final class StateCallbackAdapter implements TaskEmbedder.Listener {
- private final StateCallback mCallback;
-
- private StateCallbackAdapter(ActivityView.StateCallback cb) {
- mCallback = cb;
- }
-
- @Override
- public void onInitialized() {
- mCallback.onActivityViewReady(ActivityView.this);
- }
-
- @Override
- public void onReleased() {
- mCallback.onActivityViewDestroyed(ActivityView.this);
- }
-
- @Override
- public void onTaskCreated(int taskId, ComponentName name) {
- mCallback.onTaskCreated(taskId, name);
- }
-
- @Override
- public void onTaskVisibilityChanged(int taskId, boolean visible) {
- mCallback.onTaskVisibilityChanged(taskId, visible);
- }
-
- @Override
- public void onTaskMovedToFront(int taskId) {
- mCallback.onTaskMovedToFront(taskId);
- }
-
- @Override
- public void onTaskRemovalStarted(int taskId) {
- mCallback.onTaskRemovalStarted(taskId);
- }
-
- @Override
- public void onBackPressedOnTaskRoot(int taskId) {
- mCallback.onBackPressedOnTaskRoot(taskId);
- }
- }
-
- /** The builder of {@link ActivityView} */
- public static final class Builder {
- private final Context mContext;
- private AttributeSet mAttrs;
- private int mDefStyle;
- private boolean mUsePublicVirtualDisplay;
- private boolean mDisableSurfaceViewBackgroundLayer;
- private boolean mUseTrustedDisplay;
-
- public Builder(@NonNull Context context) {
- mContext = context;
- mAttrs = null;
- mDefStyle = 0;
- mUsePublicVirtualDisplay = false;
- mDisableSurfaceViewBackgroundLayer = false;
- mUseTrustedDisplay = false;
- }
-
- /** Sets {@link AttributeSet} to the {@link ActivityView}. */
- @NonNull
- public Builder setAttributeSet(@Nullable AttributeSet attrs) {
- mAttrs = attrs;
- return this;
- }
-
- /**
- * Sets {@code defStyle} to the {@link ActivityView}.
- *
- * @param defaultStyle An attribute in the current theme that contains a
- * reference to a style resource that supplies default values for
- * the view. Can be {@code 0} to not look for defaults.
- */
- @NonNull
- public Builder setDefaultStyle(int defaultStyle) {
- mDefStyle = defaultStyle;
- return this;
- }
-
- /**
- * Sets to {@code true} to use public virtual display for the {@link ActivityView}.
- * <p>
- * Note that using a public display is not recommended as it exposes it to other
- * applications, but it might be needed for backwards compatibility.
- * </p>
- */
- @NonNull
- public Builder setUsePublicVirtualDisplay(boolean usePublicVirtualDisplay) {
- mUsePublicVirtualDisplay = usePublicVirtualDisplay;
- return this;
- }
-
- /**
- * Sets to {@code true} to disable {@link SurfaceView} background for the
- * {@link ActivityView}.
- */
- @NonNull
- public Builder setDisableSurfaceViewBackgroundLayer(
- boolean disableSurfaceViewBackgroundLayer) {
- mDisableSurfaceViewBackgroundLayer = disableSurfaceViewBackgroundLayer;
- return this;
- }
-
- /**
- * Sets to {@code true} to use trusted display for the {@link ActivityView}.
- * <p>
- * It enables the {@link ActivityView} to be focused without users' first touches.
- * </p>
- */
- @NonNull
- public Builder setUseTrustedDisplay(boolean useTrustedDisplay) {
- mUseTrustedDisplay = useTrustedDisplay;
- return this;
- }
-
- /** Creates an {@link ActivityView} */
- @NonNull
- public ActivityView build() {
- return new ActivityView(mContext, mAttrs, mDefStyle,
- mUsePublicVirtualDisplay, mDisableSurfaceViewBackgroundLayer,
- mUseTrustedDisplay);
- }
- }
-}
-
diff --git a/core/java/android/window/TaskEmbedder.java b/core/java/android/window/TaskEmbedder.java
deleted file mode 100644
index 0687a03..0000000
--- a/core/java/android/window/TaskEmbedder.java
+++ /dev/null
@@ -1,490 +0,0 @@
-/*
- * Copyright (C) 2020 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 android.window;
-
-import static android.view.Display.INVALID_DISPLAY;
-
-import android.annotation.CallSuper;
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.app.ActivityOptions;
-import android.app.ActivityTaskManager;
-import android.app.IActivityTaskManager;
-import android.app.PendingIntent;
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.Intent;
-import android.content.pm.LauncherApps;
-import android.content.pm.ShortcutInfo;
-import android.graphics.Insets;
-import android.graphics.Matrix;
-import android.graphics.Point;
-import android.graphics.Rect;
-import android.graphics.Region;
-import android.hardware.display.VirtualDisplay;
-import android.os.RemoteException;
-import android.os.UserHandle;
-import android.view.IWindow;
-import android.view.IWindowManager;
-import android.view.IWindowSession;
-import android.view.KeyEvent;
-import android.view.SurfaceControl;
-import android.view.WindowManagerGlobal;
-
-import dalvik.system.CloseGuard;
-
-/**
- * A component which handles embedded display of tasks within another window. The embedded task can
- * be presented using the SurfaceControl provided from {@link #getSurfaceControl()}.
- *
- * @hide
- */
-public abstract class TaskEmbedder {
- private static final String TAG = "TaskEmbedder";
-
- /**
- * A component which will host the task.
- */
- public interface Host {
- /** @return the screen area where touches should be dispatched to the embedded Task */
- Region getTapExcludeRegion();
-
- /** @return a matrix which transforms from screen-space to the embedded task surface */
- Matrix getScreenToTaskMatrix();
-
- /** @return the window containing the parent surface, if attached and available */
- @Nullable IWindow getWindow();
-
- /** @return the x/y offset from the origin of the window to the surface */
- Point getPositionInWindow();
-
- /** @return the screen bounds of the host */
- Rect getScreenBounds();
-
- /** @return whether this surface is able to receive pointer events */
- boolean canReceivePointerEvents();
-
- /** @return the width of the container for the embedded task */
- int getWidth();
-
- /** @return the height of the container for the embedded task */
- int getHeight();
-
- /**
- * Called to inform the host of the task's background color. This can be used to
- * fill unpainted areas if necessary.
- */
- void onTaskBackgroundColorChanged(TaskEmbedder ts, int bgColor);
-
- /**
- * Posts a runnable to be run on the host's handler.
- */
- boolean post(Runnable r);
- }
-
- /**
- * Describes changes to the state of the TaskEmbedder as well the tasks within.
- */
- public interface Listener {
- /** Called when the container is ready for launching activities. */
- default void onInitialized() {}
-
- /** Called when the container can no longer launch activities. */
- default void onReleased() {}
-
- /** Called when a task is created inside the container. */
- default void onTaskCreated(int taskId, ComponentName name) {}
-
- /** Called when a task visibility changes. */
- default void onTaskVisibilityChanged(int taskId, boolean visible) {}
-
- /** Called when a task is moved to the front of the stack inside the container. */
- default void onTaskMovedToFront(int taskId) {}
-
- /** Called when a task is about to be removed from the stack inside the container. */
- default void onTaskRemovalStarted(int taskId) {}
-
- /** Called when a task is created inside the container. */
- default void onBackPressedOnTaskRoot(int taskId) {}
- }
-
- protected IActivityTaskManager mActivityTaskManager = ActivityTaskManager.getService();
-
- protected final Context mContext;
- protected TaskEmbedder.Host mHost;
-
- protected SurfaceControl.Transaction mTransaction;
- protected SurfaceControl mSurfaceControl;
- protected Listener mListener;
- protected boolean mOpened; // Protected by mGuard.
-
- private final CloseGuard mGuard = CloseGuard.get();
-
-
- /**
- * Constructs a new TaskEmbedder.
- *
- * @param context the context
- * @param host the host for this embedded task
- */
- public TaskEmbedder(Context context, TaskEmbedder.Host host) {
- mContext = context;
- mHost = host;
- }
-
- /**
- * Initialize this container when the ActivityView's SurfaceView is first created.
- *
- * @param parent the surface control for the parent surface
- * @return true if initialized successfully
- */
- public boolean initialize(SurfaceControl parent) {
- if (isInitialized()) {
- throw new IllegalStateException("Trying to initialize for the second time.");
- }
-
- mTransaction = new SurfaceControl.Transaction();
- // Create a container surface to which the task content will be reparented
- final String name = "TaskEmbedder - " + Integer.toHexString(System.identityHashCode(this));
- mSurfaceControl = new SurfaceControl.Builder()
- .setContainerLayer()
- .setParent(parent)
- .setName(name)
- .setCallsite("TaskEmbedder.initialize")
- .build();
-
- if (!onInitialize()) {
- return false;
- }
- if (mListener != null && isInitialized()) {
- mListener.onInitialized();
- }
- mOpened = true;
- mGuard.open("release");
- mTransaction.show(getSurfaceControl()).apply();
- return true;
- }
-
- /**
- * Whether this container has been initialized.
- *
- * @return true if initialized
- */
- public abstract boolean isInitialized();
-
- /**
- * Called when the task embedder should be initialized.
- * NOTE: all overriding methods should call this one after they finish their initialization.
- * @return whether to report whether the embedder was initialized.
- */
- public boolean onInitialize() {
- updateLocationAndTapExcludeRegion();
- return true;
- }
-
- /**
- * Called when the task embedder should be released.
- * @return whether to report whether the embedder was released.
- */
- protected boolean onRelease() {
- // Clear tap-exclude region (if any) for this window.
- clearTapExcludeRegion();
- return true;
- }
-
- /**
- * Starts presentation of tasks in this container.
- */
- public void start() {
- updateLocationAndTapExcludeRegion();
- }
-
- /**
- * Stops presentation of tasks in this container.
- */
- public void stop() {
- clearTapExcludeRegion();
- }
-
- /**
- * This should be called whenever the position or size of the surface changes
- * or if touchable areas above the surface are added or removed.
- */
- public void notifyBoundsChanged() {
- updateLocationAndTapExcludeRegion();
- }
-
- /**
- * Called to update the dimensions whenever the host size changes.
- *
- * @param width the new width of the surface
- * @param height the new height of the surface
- */
- public void resizeTask(int width, int height) {
- // Do nothing
- }
-
- /**
- * Injects a pair of down/up key events with keycode {@link KeyEvent#KEYCODE_BACK} to the
- * virtual display.
- */
- public abstract void performBackPress();
-
- /**
- * An opaque unique identifier for this task surface among others being managed by the app.
- */
- public abstract int getId();
-
- /**
- * Calculates and updates the {@param region} with the transparent region for this task
- * embedder.
- */
- public boolean gatherTransparentRegion(Region region) {
- // Do nothing
- return false;
- }
-
- /**
- * Returns the surface control for the task surface. This should be parented to a screen
- * surface for display/embedding purposes.
- *
- * @return the surface control for the task
- */
- public SurfaceControl getSurfaceControl() {
- return mSurfaceControl;
- }
-
- public int getDisplayId() {
- return INVALID_DISPLAY;
- }
-
- public VirtualDisplay getVirtualDisplay() {
- return null;
- }
-
- /**
- * Set forwarded insets on the task content.
- *
- * @see IWindowManager#setForwardedInsets
- */
- public void setForwardedInsets(Insets insets) {
- // Do nothing
- }
-
- /**
- * Updates position and bounds information needed by WM and IME to manage window
- * focus and touch events properly.
- * <p>
- * This should be called whenever the position or size of the surface changes
- * or if touchable areas above the surface are added or removed.
- */
- protected void updateLocationAndTapExcludeRegion() {
- if (!isInitialized() || mHost.getWindow() == null) {
- return;
- }
- applyTapExcludeRegion(mHost.getWindow(), mHost.getTapExcludeRegion());
- }
-
- /**
- * Call to update the tap exclude region for the window.
- * <p>
- * This should not normally be called directly, but through
- * {@link #updateLocationAndTapExcludeRegion()}. This method
- * is provided as an optimization when managing multiple TaskSurfaces within a view.
- *
- * @see IWindowSession#updateTapExcludeRegion(IWindow, Region)
- */
- private void applyTapExcludeRegion(IWindow window, @Nullable Region tapExcludeRegion) {
- try {
- IWindowSession session = WindowManagerGlobal.getWindowSession();
- session.updateTapExcludeRegion(window, tapExcludeRegion);
- } catch (RemoteException e) {
- e.rethrowAsRuntimeException();
- }
- }
-
- /**
- * Removes the tap exclude region set by {@link #updateLocationAndTapExcludeRegion()}.
- */
- private void clearTapExcludeRegion() {
- if (!isInitialized() || mHost.getWindow() == null) {
- return;
- }
- applyTapExcludeRegion(mHost.getWindow(), null);
- }
-
- /**
- * Set the callback to be notified about state changes.
- * <p>This class must finish initializing before {@link #startActivity(Intent)} can be called.
- * <p>Note: If the instance was ready prior to this call being made, then
- * {@link Listener#onInitialized()} will be called from within this method call.
- *
- * @param listener The listener to report events to.
- *
- * @see ActivityView.StateCallback
- * @see #startActivity(Intent)
- */
- public void setListener(TaskEmbedder.Listener listener) {
- mListener = listener;
- if (mListener != null && isInitialized()) {
- mListener.onInitialized();
- }
- }
-
- /**
- * Launch a new activity into this container.
- *
- * @param intent Intent used to launch an activity
- *
- * @see #startActivity(PendingIntent)
- */
- public void startActivity(@NonNull Intent intent) {
- final ActivityOptions options = prepareActivityOptions(null);
- mContext.startActivity(intent, options.toBundle());
- }
-
- /**
- * Launch a new activity into this container.
- *
- * @param intent Intent used to launch an activity
- * @param user The UserHandle of the user to start this activity for
- *
- * @see #startActivity(PendingIntent)
- */
- public void startActivity(@NonNull Intent intent, UserHandle user) {
- final ActivityOptions options = prepareActivityOptions(null);
- mContext.startActivityAsUser(intent, options.toBundle(), user);
- }
-
- /**
- * Launch a new activity into this container.
- *
- * @param pendingIntent Intent used to launch an activity
- *
- * @see #startActivity(Intent)
- */
- public void startActivity(@NonNull PendingIntent pendingIntent) {
- final ActivityOptions options = prepareActivityOptions(null);
- try {
- pendingIntent.send(null /* context */, 0 /* code */, null /* intent */,
- null /* onFinished */, null /* handler */, null /* requiredPermission */,
- options.toBundle());
- } catch (PendingIntent.CanceledException e) {
- throw new RuntimeException(e);
- }
- }
-
- /**
- * Launch a new activity into this container.
- *
- * @param pendingIntent Intent used to launch an activity
- * @param fillInIntent Additional Intent data, see {@link Intent#fillIn Intent.fillIn()}
- * @param options options for the activity
- *
- * @see #startActivity(Intent)
- */
- public void startActivity(@NonNull PendingIntent pendingIntent, @Nullable Intent fillInIntent,
- @NonNull ActivityOptions options) {
- prepareActivityOptions(options);
- try {
- pendingIntent.send(mContext, 0 /* code */, fillInIntent,
- null /* onFinished */, null /* handler */, null /* requiredPermission */,
- options.toBundle());
- } catch (PendingIntent.CanceledException e) {
- throw new RuntimeException(e);
- }
- }
-
- /**
- * Launch an activity represented by {@link ShortcutInfo} into this container.
- * <p>The owner of this container must be allowed to access the shortcut information,
- * as defined in {@link LauncherApps#hasShortcutHostPermission()} to use this method.
- *
- * @param shortcut the shortcut used to launch the activity.
- * @param options options for the activity.
- * @param sourceBounds the rect containing the source bounds of the clicked icon to open
- * this shortcut.
- *
- * @see #startActivity(Intent)
- */
- public void startShortcutActivity(@NonNull ShortcutInfo shortcut,
- @NonNull ActivityOptions options, @Nullable Rect sourceBounds) {
- LauncherApps service =
- (LauncherApps) mContext.getSystemService(Context.LAUNCHER_APPS_SERVICE);
- prepareActivityOptions(options);
- service.startShortcut(shortcut, sourceBounds, options.toBundle());
- }
-
- /**
- * Check if container is ready to launch and modify {@param options} to target the virtual
- * display, creating them if necessary.
- */
- @CallSuper
- protected ActivityOptions prepareActivityOptions(ActivityOptions options) {
- if (!isInitialized()) {
- throw new IllegalStateException(
- "Trying to start activity before ActivityView is ready.");
- }
- if (options == null) {
- options = ActivityOptions.makeBasic();
- }
- return options;
- }
-
- /**
- * Releases the resources for this TaskEmbedder. Tasks will no longer be launchable
- * within this container.
- *
- * <p>Note: Calling this method is allowed after {@link Listener#onInitialized()} callback is
- * triggered and before {@link Listener#onReleased()}.
- */
- public void release() {
- if (!isInitialized()) {
- throw new IllegalStateException("Trying to release container that is not initialized.");
- }
- performRelease();
- }
-
- private boolean performRelease() {
- if (!mOpened) {
- return false;
- }
-
- mTransaction.reparent(mSurfaceControl, null).apply();
- mSurfaceControl.release();
-
- boolean reportReleased = onRelease();
- if (mListener != null && reportReleased) {
- mListener.onReleased();
- }
- mOpened = false;
- mGuard.close();
- return true;
- }
-
- @Override
- protected void finalize() throws Throwable {
- try {
- if (mGuard != null) {
- mGuard.warnIfOpen();
- performRelease();
- }
- } finally {
- super.finalize();
- }
- }
-}
diff --git a/core/java/android/window/TaskOrganizerTaskEmbedder.java b/core/java/android/window/TaskOrganizerTaskEmbedder.java
deleted file mode 100644
index 1e293df..0000000
--- a/core/java/android/window/TaskOrganizerTaskEmbedder.java
+++ /dev/null
@@ -1,274 +0,0 @@
-/*
- * Copyright (C) 2020 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 android.window;
-
-import static android.app.ActivityTaskManager.INVALID_TASK_ID;
-import static android.app.WindowConfiguration.WINDOWING_MODE_MULTI_WINDOW;
-
-import android.app.ActivityManager;
-import android.app.ActivityOptions;
-import android.content.Context;
-import android.graphics.Rect;
-import android.util.Log;
-import android.view.KeyEvent;
-import android.view.SurfaceControl;
-
-/**
- * A component which handles embedded display of tasks within another window. The embedded task can
- * be presented using the SurfaceControl provided from {@link #getSurfaceControl()}.
- *
- * @hide
- */
-public class TaskOrganizerTaskEmbedder extends TaskEmbedder {
- private static final String TAG = "TaskOrgTaskEmbedder";
- private static final boolean DEBUG = false;
-
- private TaskOrganizer mTaskOrganizer;
- private ActivityManager.RunningTaskInfo mTaskInfo;
- private WindowContainerToken mTaskToken;
- private SurfaceControl mTaskLeash;
- private boolean mPendingNotifyBoundsChanged;
-
- /**
- * Constructs a new TaskEmbedder.
- *
- * @param context the context
- * @param host the host for this embedded task
- */
- public TaskOrganizerTaskEmbedder(Context context, TaskOrganizerTaskEmbedder.Host host) {
- super(context, host);
- }
-
- /**
- * Whether this container has been initialized.
- *
- * @return true if initialized
- */
- @Override
- public boolean isInitialized() {
- return mTaskOrganizer != null;
- }
-
- @Override
- public boolean onInitialize() {
- if (DEBUG) {
- log("onInitialize");
- }
- // Register the task organizer
- mTaskOrganizer = new TaskOrganizerImpl();
- // TODO(wm-shell): This currently prevents other organizers from controlling MULT_WINDOW
- // windowing mode tasks. Plan is to migrate this to a wm-shell front-end when that
- // infrastructure is ready.
- // mTaskOrganizer.registerOrganizer();
- // mTaskOrganizer.setInterceptBackPressedOnTaskRoot(true);
-
- return super.onInitialize();
- }
-
- @Override
- protected boolean onRelease() {
- if (DEBUG) {
- log("onRelease");
- }
- if (!isInitialized()) {
- return false;
- }
- mTaskOrganizer.unregisterOrganizer();
- resetTaskInfo();
- return true;
- }
-
- /**
- * Starts presentation of tasks in this container.
- */
- @Override
- public void start() {
- super.start();
- if (DEBUG) {
- log("start");
- }
- if (!isInitialized()) {
- return;
- }
- if (mTaskToken == null) {
- return;
- }
- WindowContainerTransaction wct = new WindowContainerTransaction();
- wct.setHidden(mTaskToken, false /* hidden */);
- mTaskOrganizer.applyTransaction(wct);
- // TODO(b/151449487): Only call callback once we enable synchronization
- if (mListener != null) {
- mListener.onTaskVisibilityChanged(getTaskId(), true);
- }
- }
-
- /**
- * Stops presentation of tasks in this container.
- */
- @Override
- public void stop() {
- super.stop();
- if (DEBUG) {
- log("stop");
- }
- if (!isInitialized()) {
- return;
- }
- if (mTaskToken == null) {
- return;
- }
- WindowContainerTransaction wct = new WindowContainerTransaction();
- wct.setHidden(mTaskToken, true /* hidden */);
- mTaskOrganizer.applyTransaction(wct);
- // TODO(b/151449487): Only call callback once we enable synchronization
- if (mListener != null) {
- mListener.onTaskVisibilityChanged(getTaskId(), false);
- }
- }
-
- /**
- * This should be called whenever the position or size of the surface changes
- * or if touchable areas above the surface are added or removed.
- */
- @Override
- public void notifyBoundsChanged() {
- super.notifyBoundsChanged();
- if (DEBUG) {
- log("notifyBoundsChanged: screenBounds=" + mHost.getScreenBounds());
- }
- if (mTaskToken == null) {
- mPendingNotifyBoundsChanged = true;
- return;
- }
- mPendingNotifyBoundsChanged = false;
-
- // Update based on the screen bounds
- Rect screenBounds = mHost.getScreenBounds();
- if (screenBounds.left < 0 || screenBounds.top < 0) {
- screenBounds.offsetTo(0, 0);
- }
-
- WindowContainerTransaction wct = new WindowContainerTransaction();
- wct.setBounds(mTaskToken, screenBounds);
- // TODO(b/151449487): Enable synchronization
- mTaskOrganizer.applyTransaction(wct);
- }
-
- /**
- * Injects a pair of down/up key events with keycode {@link KeyEvent#KEYCODE_BACK} to the
- * virtual display.
- */
- @Override
- public void performBackPress() {
- // Do nothing, the task org task should already have focus if the caller is not focused
- return;
- }
-
- /** An opaque unique identifier for this task surface among others being managed by the app. */
- @Override
- public int getId() {
- return getTaskId();
- }
-
- /**
- * Check if container is ready to launch and create {@link ActivityOptions} to target the
- * virtual display.
- * @param options The existing options to amend, or null if the caller wants new options to be
- * created
- */
- @Override
- protected ActivityOptions prepareActivityOptions(ActivityOptions options) {
- options = super.prepareActivityOptions(options);
- options.setLaunchWindowingMode(WINDOWING_MODE_MULTI_WINDOW);
- return options;
- }
-
- private int getTaskId() {
- return mTaskInfo != null
- ? mTaskInfo.taskId
- : INVALID_TASK_ID;
- }
-
- private void resetTaskInfo() {
- if (DEBUG) {
- log("resetTaskInfo");
- }
- mTaskInfo = null;
- mTaskToken = null;
- mTaskLeash = null;
- }
-
- private void log(String msg) {
- Log.d(TAG, "[" + System.identityHashCode(this) + "] " + msg);
- }
-
- private class TaskOrganizerImpl extends TaskOrganizer {
- @Override
- public void onTaskAppeared(ActivityManager.RunningTaskInfo taskInfo, SurfaceControl leash) {
- if (DEBUG) {
- log("taskAppeared: " + taskInfo.taskId);
- }
-
- mTaskInfo = taskInfo;
- mTaskToken = taskInfo.token;
- mTaskLeash = leash;
- mTransaction.reparent(mTaskLeash, mSurfaceControl)
- .show(mTaskLeash)
- .show(mSurfaceControl)
- .apply();
- if (mPendingNotifyBoundsChanged) {
- // TODO: Either defer show or hide and synchronize show with the resize
- notifyBoundsChanged();
- }
- mHost.post(() -> mHost.onTaskBackgroundColorChanged(TaskOrganizerTaskEmbedder.this,
- taskInfo.taskDescription.getBackgroundColor()));
-
- if (mListener != null) {
- mListener.onTaskCreated(taskInfo.taskId, taskInfo.baseActivity);
- }
- }
-
- @Override
- public void onTaskInfoChanged(ActivityManager.RunningTaskInfo taskInfo) {
- mTaskInfo.taskDescription = taskInfo.taskDescription;
- mHost.post(() -> mHost.onTaskBackgroundColorChanged(TaskOrganizerTaskEmbedder.this,
- taskInfo.taskDescription.getBackgroundColor()));
- }
-
- @Override
- public void onTaskVanished(ActivityManager.RunningTaskInfo taskInfo) {
- if (DEBUG) {
- log("taskVanished: " + taskInfo.taskId);
- }
-
- if (mTaskToken != null && (taskInfo == null
- || mTaskToken.asBinder().equals(taskInfo.token.asBinder()))) {
- if (mListener != null) {
- mListener.onTaskRemovalStarted(taskInfo.taskId);
- }
- resetTaskInfo();
- }
- }
-
- @Override
- public void onBackPressedOnTaskRoot(ActivityManager.RunningTaskInfo taskInfo) {
- if (mListener != null) {
- mListener.onBackPressedOnTaskRoot(taskInfo.taskId);
- }
- }
- }
-}
diff --git a/core/java/android/window/VirtualDisplayTaskEmbedder.java b/core/java/android/window/VirtualDisplayTaskEmbedder.java
deleted file mode 100644
index be5d55a..0000000
--- a/core/java/android/window/VirtualDisplayTaskEmbedder.java
+++ /dev/null
@@ -1,426 +0,0 @@
-/*
- * Copyright (C) 2020 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 android.window;
-
-import static android.hardware.display.DisplayManager.VIRTUAL_DISPLAY_FLAG_DESTROY_CONTENT_ON_REMOVAL;
-import static android.hardware.display.DisplayManager.VIRTUAL_DISPLAY_FLAG_OWN_CONTENT_ONLY;
-import static android.hardware.display.DisplayManager.VIRTUAL_DISPLAY_FLAG_PUBLIC;
-import static android.hardware.display.DisplayManager.VIRTUAL_DISPLAY_FLAG_TRUSTED;
-import static android.view.Display.INVALID_DISPLAY;
-
-import android.app.ActivityManager;
-import android.app.ActivityOptions;
-import android.app.ActivityTaskManager;
-import android.app.ActivityTaskManager.RootTaskInfo;
-import android.app.ActivityView;
-import android.app.TaskStackListener;
-import android.content.ComponentName;
-import android.content.Context;
-import android.graphics.Insets;
-import android.graphics.Matrix;
-import android.graphics.Point;
-import android.graphics.Region;
-import android.hardware.display.DisplayManager;
-import android.hardware.display.VirtualDisplay;
-import android.hardware.input.InputManager;
-import android.os.RemoteException;
-import android.os.SystemClock;
-import android.util.DisplayMetrics;
-import android.util.Log;
-import android.view.IWindowManager;
-import android.view.IWindowSession;
-import android.view.InputDevice;
-import android.view.KeyCharacterMap;
-import android.view.KeyEvent;
-import android.view.WindowManagerGlobal;
-import android.view.inputmethod.InputMethodManager;
-
-import java.util.List;
-
-/**
- * A component which handles embedded display of tasks within another window. The embedded task can
- * be presented using the SurfaceControl provided from {@link #getSurfaceControl()}.
- *
- * @hide
- */
-public class VirtualDisplayTaskEmbedder extends TaskEmbedder {
- private static final String TAG = "VirDispTaskEmbedder";
- private static final String DISPLAY_NAME = "TaskVirtualDisplay";
-
- // For Virtual Displays
- private int mDisplayDensityDpi;
- private final boolean mUsePublicVirtualDisplay;
- private final boolean mUseTrustedDisplay;
- private VirtualDisplay mVirtualDisplay;
- private Insets mForwardedInsets;
- private TaskStackListener mTaskStackListener;
-
- /**
- * Constructs a new TaskEmbedder.
- *
- * @param context the context
- * @param host the host for this embedded task
- */
- public VirtualDisplayTaskEmbedder(Context context, VirtualDisplayTaskEmbedder.Host host,
- boolean usePublicVirtualDisplay, boolean useTrustedDisplay) {
- super(context, host);
- mUsePublicVirtualDisplay = usePublicVirtualDisplay;
- mUseTrustedDisplay = useTrustedDisplay;
- }
-
- /**
- * Whether this container has been initialized.
- *
- * @return true if initialized
- */
- @Override
- public boolean isInitialized() {
- return mVirtualDisplay != null;
- }
-
- @Override
- public boolean onInitialize() {
- final DisplayManager displayManager = mContext.getSystemService(DisplayManager.class);
- mDisplayDensityDpi = getBaseDisplayDensity();
-
- int virtualDisplayFlags = VIRTUAL_DISPLAY_FLAG_OWN_CONTENT_ONLY
- | VIRTUAL_DISPLAY_FLAG_DESTROY_CONTENT_ON_REMOVAL;
- if (mUsePublicVirtualDisplay) {
- virtualDisplayFlags |= VIRTUAL_DISPLAY_FLAG_PUBLIC;
- }
- if (mUseTrustedDisplay) {
- virtualDisplayFlags |= VIRTUAL_DISPLAY_FLAG_TRUSTED;
- }
-
- mVirtualDisplay = displayManager.createVirtualDisplay(
- DISPLAY_NAME + "@" + System.identityHashCode(this), mHost.getWidth(),
- mHost.getHeight(), mDisplayDensityDpi, null, virtualDisplayFlags);
-
- if (mVirtualDisplay == null) {
- Log.e(TAG, "Failed to initialize TaskEmbedder");
- return false;
- }
-
- try {
- // TODO: Find a way to consolidate these calls to the server.
- final int displayId = getDisplayId();
- final IWindowManager wm = WindowManagerGlobal.getWindowManagerService();
- WindowManagerGlobal.getWindowSession().reparentDisplayContent(
- mHost.getWindow(), mSurfaceControl, displayId);
- wm.dontOverrideDisplayInfo(displayId);
- setForwardedInsets(mForwardedInsets);
-
- mTaskStackListener = new TaskStackListenerImpl();
- mActivityTaskManager.registerTaskStackListener(mTaskStackListener);
- } catch (RemoteException e) {
- e.rethrowAsRuntimeException();
- }
-
- return super.onInitialize();
- }
-
- @Override
- protected boolean onRelease() {
- super.onRelease();
- // Clear activity view geometry for IME on this display
- clearActivityViewGeometryForIme();
-
- if (mTaskStackListener != null) {
- try {
- mActivityTaskManager.unregisterTaskStackListener(mTaskStackListener);
- } catch (RemoteException e) {
- Log.e(TAG, "Failed to unregister task stack listener", e);
- }
- mTaskStackListener = null;
- }
-
- if (isInitialized()) {
- mVirtualDisplay.release();
- mVirtualDisplay = null;
- return true;
- }
- return false;
- }
-
- /**
- * Starts presentation of tasks in this container.
- */
- @Override
- public void start() {
- super.start();
- if (isInitialized()) {
- mVirtualDisplay.setDisplayState(true);
- }
- }
-
- /**
- * Stops presentation of tasks in this container.
- */
- @Override
- public void stop() {
- super.stop();
- if (isInitialized()) {
- mVirtualDisplay.setDisplayState(false);
- clearActivityViewGeometryForIme();
- }
- }
-
- /**
- * Called to update the dimensions whenever the host size changes.
- *
- * @param width the new width of the surface
- * @param height the new height of the surface
- */
- @Override
- public void resizeTask(int width, int height) {
- mDisplayDensityDpi = getBaseDisplayDensity();
- if (isInitialized()) {
- mVirtualDisplay.resize(width, height, mDisplayDensityDpi);
- }
- }
-
- /**
- * Injects a pair of down/up key events with keycode {@link KeyEvent#KEYCODE_BACK} to the
- * virtual display.
- */
- @Override
- public void performBackPress() {
- if (!isInitialized()) {
- return;
- }
- final int displayId = mVirtualDisplay.getDisplay().getDisplayId();
- final InputManager im = InputManager.getInstance();
- im.injectInputEvent(createKeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_BACK, displayId),
- InputManager.INJECT_INPUT_EVENT_MODE_ASYNC);
- im.injectInputEvent(createKeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_BACK, displayId),
- InputManager.INJECT_INPUT_EVENT_MODE_ASYNC);
- }
-
- @Override
- public boolean gatherTransparentRegion(Region region) {
- // The tap exclude region may be affected by any view on top of it, so we detect the
- // possible change by monitoring this function. The tap exclude region is only used
- // for virtual displays.
- notifyBoundsChanged();
- return super.gatherTransparentRegion(region);
- }
-
- /** An opaque unique identifier for this task surface among others being managed by the app. */
- @Override
- public int getId() {
- return getDisplayId();
- }
-
- @Override
- public int getDisplayId() {
- if (isInitialized()) {
- return mVirtualDisplay.getDisplay().getDisplayId();
- }
- return INVALID_DISPLAY;
- }
-
- @Override
- public VirtualDisplay getVirtualDisplay() {
- if (isInitialized()) {
- return mVirtualDisplay;
- }
- return null;
- }
-
- /**
- * Check if container is ready to launch and create {@link ActivityOptions} to target the
- * virtual display.
- * @param options The existing options to amend, or null if the caller wants new options to be
- * created
- */
- @Override
- protected ActivityOptions prepareActivityOptions(ActivityOptions options) {
- options = super.prepareActivityOptions(options);
- options.setLaunchDisplayId(getDisplayId());
- return options;
- }
-
- /**
- * Set forwarded insets on the virtual display.
- *
- * @see IWindowManager#setForwardedInsets
- */
- @Override
- public void setForwardedInsets(Insets insets) {
- mForwardedInsets = insets;
- if (!isInitialized()) {
- return;
- }
- try {
- final IWindowManager wm = WindowManagerGlobal.getWindowManagerService();
- wm.setForwardedInsets(getDisplayId(), mForwardedInsets);
- } catch (RemoteException e) {
- e.rethrowAsRuntimeException();
- }
- }
-
- /**
- * Updates position and bounds information needed by WM and IME to manage window
- * focus and touch events properly.
- * <p>
- * This should be called whenever the position or size of the surface changes
- * or if touchable areas above the surface are added or removed.
- */
- @Override
- protected void updateLocationAndTapExcludeRegion() {
- super.updateLocationAndTapExcludeRegion();
- if (!isInitialized() || mHost.getWindow() == null) {
- return;
- }
- reportLocation(mHost.getScreenToTaskMatrix(), mHost.getPositionInWindow());
- }
-
- /**
- * Call to update the position and transform matrix for the embedded surface.
- * <p>
- * This should not normally be called directly, but through
- * {@link #updateLocationAndTapExcludeRegion()}. This method
- * is provided as an optimization when managing multiple TaskSurfaces within a view.
- *
- * @param screenToViewMatrix the matrix/transform from screen space to view space
- * @param positionInWindow the window-relative position of the surface
- *
- * @see InputMethodManager#reportActivityView(int, Matrix)
- */
- private void reportLocation(Matrix screenToViewMatrix, Point positionInWindow) {
- try {
- final int displayId = getDisplayId();
- mContext.getSystemService(InputMethodManager.class)
- .reportActivityView(displayId, screenToViewMatrix);
- IWindowSession session = WindowManagerGlobal.getWindowSession();
- session.updateDisplayContentLocation(mHost.getWindow(), positionInWindow.x,
- positionInWindow.y, displayId);
- } catch (RemoteException e) {
- e.rethrowAsRuntimeException();
- }
- }
-
- /**
- * @see InputMethodManager#reportActivityView(int, Matrix)
- */
- private void clearActivityViewGeometryForIme() {
- final int displayId = getDisplayId();
- mContext.getSystemService(InputMethodManager.class).reportActivityView(displayId, null);
- }
-
- private static KeyEvent createKeyEvent(int action, int code, int displayId) {
- long when = SystemClock.uptimeMillis();
- final KeyEvent ev = new KeyEvent(when, when, action, code, 0 /* repeat */,
- 0 /* metaState */, KeyCharacterMap.VIRTUAL_KEYBOARD, 0 /* scancode */,
- KeyEvent.FLAG_FROM_SYSTEM | KeyEvent.FLAG_VIRTUAL_HARD_KEY,
- InputDevice.SOURCE_KEYBOARD);
- ev.setDisplayId(displayId);
- return ev;
- }
-
- /** Get density of the hosting display. */
- private int getBaseDisplayDensity() {
- return mContext.getResources().getConfiguration().densityDpi;
- }
-
- /**
- * A task change listener that detects background color change of the topmost stack on our
- * virtual display and updates the background of the surface view. This background will be shown
- * when surface view is resized, but the app hasn't drawn its content in new size yet.
- * It also calls StateCallback.onTaskMovedToFront to notify interested parties that the stack
- * associated with the {@link ActivityView} has had a Task moved to the front. This is useful
- * when needing to also bring the host Activity to the foreground at the same time.
- */
- private class TaskStackListenerImpl extends TaskStackListener {
-
- @Override
- public void onTaskDescriptionChanged(ActivityManager.RunningTaskInfo runningTaskInfo)
- throws RemoteException {
- if (!isInitialized()) {
- return;
- }
- if (runningTaskInfo.displayId != getDisplayId()) {
- return;
- }
- RootTaskInfo taskInfo = getTopMostRootTaskInfo();
- if (taskInfo == null) {
- return;
- }
- // Found the topmost stack on target display. Now check if the topmost task's
- // description changed.
- if (runningTaskInfo.taskId == taskInfo.childTaskIds[taskInfo.childTaskIds.length - 1]) {
- mHost.post(()-> mHost.onTaskBackgroundColorChanged(VirtualDisplayTaskEmbedder.this,
- runningTaskInfo.taskDescription.getBackgroundColor()));
- }
- }
-
- @Override
- public void onTaskMovedToFront(ActivityManager.RunningTaskInfo runningTaskInfo)
- throws RemoteException {
- if (!isInitialized() || mListener == null
- || runningTaskInfo.displayId != getDisplayId()) {
- return;
- }
-
- RootTaskInfo taskInfo = getTopMostRootTaskInfo();
- // if TaskInfo was null or unrelated to the "move to front" then there's no use
- // notifying the callback
- if (taskInfo != null && runningTaskInfo.taskId == taskInfo.childTaskIds[
- taskInfo.childTaskIds.length - 1]) {
- mListener.onTaskMovedToFront(runningTaskInfo.taskId);
- }
- }
-
- @Override
- public void onTaskCreated(int taskId, ComponentName componentName) throws RemoteException {
- if (mListener == null || !isInitialized()) {
- return;
- }
-
- RootTaskInfo taskInfo = getTopMostRootTaskInfo();
- // if TaskInfo was null or unrelated to the task creation then there's no use
- // notifying the callback
- if (taskInfo != null
- && taskId == taskInfo.childTaskIds[taskInfo.childTaskIds.length - 1]) {
- mListener.onTaskCreated(taskId, componentName);
- }
- }
-
- @Override
- public void onTaskRemovalStarted(ActivityManager.RunningTaskInfo taskInfo)
- throws RemoteException {
- if (mListener == null || !isInitialized()
- || taskInfo.displayId != getDisplayId()) {
- return;
- }
-
- mListener.onTaskRemovalStarted(taskInfo.taskId);
- }
-
- private RootTaskInfo getTopMostRootTaskInfo() throws RemoteException {
- // Find the topmost task on our virtual display - it will define the background
- // color of the surface view during resizing.
- final int displayId = getDisplayId();
- final List<RootTaskInfo> taskInfoList =
- mActivityTaskManager.getAllRootTaskInfosOnDisplay(displayId);
- if (taskInfoList.isEmpty()) {
- return null;
- }
- return taskInfoList.get(0);
- }
- }
-}