Merge "Remove getLeash from WindowContainerToken" into rvc-dev am: 5a4a5682a2 am: e00fbbe6c4 am: ecccd3de1e

Change-Id: Id798ce4c940d6a4c100b745c3ed4ae8b9c7806d8
This commit is contained in:
Chavi Weingarten
2020-04-30 00:36:40 +00:00
committed by Automerger Merge Worker
19 changed files with 120 additions and 125 deletions

View File

@@ -5289,7 +5289,7 @@ package android.window {
public class DisplayAreaOrganizer extends android.window.WindowOrganizer { public class DisplayAreaOrganizer extends android.window.WindowOrganizer {
ctor public DisplayAreaOrganizer(); ctor public DisplayAreaOrganizer();
method public void onDisplayAreaAppeared(@NonNull android.window.DisplayAreaInfo); method public void onDisplayAreaAppeared(@NonNull android.window.DisplayAreaInfo, @NonNull android.view.SurfaceControl);
method public void onDisplayAreaVanished(@NonNull android.window.DisplayAreaInfo); method public void onDisplayAreaVanished(@NonNull android.window.DisplayAreaInfo);
method @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_STACKS) public void registerOrganizer(int); method @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_STACKS) public void registerOrganizer(int);
field public static final int FEATURE_DEFAULT_TASK_CONTAINER = 1; // 0x1 field public static final int FEATURE_DEFAULT_TASK_CONTAINER = 1; // 0x1
@@ -5309,7 +5309,7 @@ package android.window {
method @Nullable @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_STACKS) public static android.window.WindowContainerToken getImeTarget(int); method @Nullable @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_STACKS) public static android.window.WindowContainerToken getImeTarget(int);
method @Nullable @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_STACKS) public static java.util.List<android.app.ActivityManager.RunningTaskInfo> getRootTasks(int, @NonNull int[]); method @Nullable @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_STACKS) public static java.util.List<android.app.ActivityManager.RunningTaskInfo> getRootTasks(int, @NonNull int[]);
method @BinderThread public void onBackPressedOnTaskRoot(@NonNull android.app.ActivityManager.RunningTaskInfo); method @BinderThread public void onBackPressedOnTaskRoot(@NonNull android.app.ActivityManager.RunningTaskInfo);
method @BinderThread public void onTaskAppeared(@NonNull android.app.ActivityManager.RunningTaskInfo); method @BinderThread public void onTaskAppeared(@NonNull android.app.ActivityManager.RunningTaskInfo, @NonNull android.view.SurfaceControl);
method @BinderThread public void onTaskInfoChanged(@NonNull android.app.ActivityManager.RunningTaskInfo); method @BinderThread public void onTaskInfoChanged(@NonNull android.app.ActivityManager.RunningTaskInfo);
method @BinderThread public void onTaskVanished(@NonNull android.app.ActivityManager.RunningTaskInfo); method @BinderThread public void onTaskVanished(@NonNull android.app.ActivityManager.RunningTaskInfo);
method @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_STACKS) public final void registerOrganizer(int); method @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_STACKS) public final void registerOrganizer(int);
@@ -5320,7 +5320,6 @@ package android.window {
public final class WindowContainerToken implements android.os.Parcelable { public final class WindowContainerToken implements android.os.Parcelable {
method public int describeContents(); method public int describeContents();
method @Nullable public android.view.SurfaceControl getLeash();
method public void writeToParcel(@NonNull android.os.Parcel, int); method public void writeToParcel(@NonNull android.os.Parcel, int);
field @NonNull public static final android.os.Parcelable.Creator<android.window.WindowContainerToken> CREATOR; field @NonNull public static final android.os.Parcelable.Creator<android.window.WindowContainerToken> CREATOR;
} }

View File

@@ -21,6 +21,7 @@ import android.annotation.RequiresPermission;
import android.annotation.TestApi; import android.annotation.TestApi;
import android.os.RemoteException; import android.os.RemoteException;
import android.util.Singleton; import android.util.Singleton;
import android.view.SurfaceControl;
/** /**
* Interface for WindowManager to delegate control of display areas. * Interface for WindowManager to delegate control of display areas.
@@ -64,7 +65,8 @@ public class DisplayAreaOrganizer extends WindowOrganizer {
} }
} }
public void onDisplayAreaAppeared(@NonNull DisplayAreaInfo displayAreaInfo) {} public void onDisplayAreaAppeared(@NonNull DisplayAreaInfo displayAreaInfo,
@NonNull SurfaceControl leash) {}
public void onDisplayAreaVanished(@NonNull DisplayAreaInfo displayAreaInfo) {} public void onDisplayAreaVanished(@NonNull DisplayAreaInfo displayAreaInfo) {}
@@ -76,8 +78,9 @@ public class DisplayAreaOrganizer extends WindowOrganizer {
private final IDisplayAreaOrganizer mInterface = new IDisplayAreaOrganizer.Stub() { private final IDisplayAreaOrganizer mInterface = new IDisplayAreaOrganizer.Stub() {
@Override @Override
public void onDisplayAreaAppeared(@NonNull DisplayAreaInfo displayAreaInfo) { public void onDisplayAreaAppeared(@NonNull DisplayAreaInfo displayAreaInfo,
DisplayAreaOrganizer.this.onDisplayAreaAppeared(displayAreaInfo); @NonNull SurfaceControl leash) {
DisplayAreaOrganizer.this.onDisplayAreaAppeared(displayAreaInfo, leash);
} }
@Override @Override

View File

@@ -17,13 +17,14 @@
package android.window; package android.window;
import android.window.DisplayAreaInfo; import android.window.DisplayAreaInfo;
import android.view.SurfaceControl;
/** /**
* Interface for WindowManager to delegate control of display areas. * Interface for WindowManager to delegate control of display areas.
* {@hide} * {@hide}
*/ */
oneway interface IDisplayAreaOrganizer { oneway interface IDisplayAreaOrganizer {
void onDisplayAreaAppeared(in DisplayAreaInfo displayAreaInfo); void onDisplayAreaAppeared(in DisplayAreaInfo displayAreaInfo, in SurfaceControl leash);
void onDisplayAreaVanished(in DisplayAreaInfo displayAreaInfo); void onDisplayAreaVanished(in DisplayAreaInfo displayAreaInfo);
void onDisplayAreaInfoChanged(in DisplayAreaInfo displayAreaInfo); void onDisplayAreaInfoChanged(in DisplayAreaInfo displayAreaInfo);
} }

View File

@@ -25,7 +25,14 @@ import android.window.WindowContainerToken;
* {@hide} * {@hide}
*/ */
oneway interface ITaskOrganizer { oneway interface ITaskOrganizer {
void onTaskAppeared(in ActivityManager.RunningTaskInfo taskInfo); /**
* A callback when the Task is available for the registered organizer. The client is responsible
* for releasing the SurfaceControl in the callback.
*
* @param taskInfo The information about the Task that's available
* @param leash A persistent leash for this Task.
*/
void onTaskAppeared(in ActivityManager.RunningTaskInfo taskInfo, in SurfaceControl leash);
void onTaskVanished(in ActivityManager.RunningTaskInfo taskInfo); void onTaskVanished(in ActivityManager.RunningTaskInfo taskInfo);
/** /**

View File

@@ -24,9 +24,4 @@ import android.view.SurfaceControl;
* @hide * @hide
*/ */
interface IWindowContainerToken { interface IWindowContainerToken {
/**
* Gets a persistent leash for this container or {@code null}.
*/
SurfaceControl getLeash();
} }

View File

@@ -24,6 +24,7 @@ import android.annotation.TestApi;
import android.app.ActivityManager; import android.app.ActivityManager;
import android.os.RemoteException; import android.os.RemoteException;
import android.util.Singleton; import android.util.Singleton;
import android.view.SurfaceControl;
import java.util.List; import java.util.List;
@@ -59,7 +60,8 @@ public class TaskOrganizer extends WindowOrganizer {
} }
@BinderThread @BinderThread
public void onTaskAppeared(@NonNull ActivityManager.RunningTaskInfo taskInfo) {} public void onTaskAppeared(@NonNull ActivityManager.RunningTaskInfo taskInfo,
@NonNull SurfaceControl leash) {}
@BinderThread @BinderThread
public void onTaskVanished(@NonNull ActivityManager.RunningTaskInfo taskInfo) {} public void onTaskVanished(@NonNull ActivityManager.RunningTaskInfo taskInfo) {}
@@ -155,8 +157,8 @@ public class TaskOrganizer extends WindowOrganizer {
private final ITaskOrganizer mInterface = new ITaskOrganizer.Stub() { private final ITaskOrganizer mInterface = new ITaskOrganizer.Stub() {
@Override @Override
public void onTaskAppeared(ActivityManager.RunningTaskInfo taskInfo) { public void onTaskAppeared(ActivityManager.RunningTaskInfo taskInfo, SurfaceControl leash) {
TaskOrganizer.this.onTaskAppeared(taskInfo); TaskOrganizer.this.onTaskAppeared(taskInfo, leash);
} }
@Override @Override

View File

@@ -21,7 +21,6 @@ import static android.app.WindowConfiguration.WINDOWING_MODE_MULTI_WINDOW;
import android.app.ActivityManager; import android.app.ActivityManager;
import android.app.ActivityOptions; import android.app.ActivityOptions;
import android.app.TaskStackListener;
import android.content.Context; import android.content.Context;
import android.graphics.Rect; import android.graphics.Rect;
import android.util.Log; import android.util.Log;
@@ -215,14 +214,14 @@ public class TaskOrganizerTaskEmbedder extends TaskEmbedder {
private class TaskOrganizerImpl extends TaskOrganizer { private class TaskOrganizerImpl extends TaskOrganizer {
@Override @Override
public void onTaskAppeared(ActivityManager.RunningTaskInfo taskInfo) { public void onTaskAppeared(ActivityManager.RunningTaskInfo taskInfo, SurfaceControl leash) {
if (DEBUG) { if (DEBUG) {
log("taskAppeared: " + taskInfo.taskId); log("taskAppeared: " + taskInfo.taskId);
} }
mTaskInfo = taskInfo; mTaskInfo = taskInfo;
mTaskToken = taskInfo.token; mTaskToken = taskInfo.token;
mTaskLeash = mTaskToken.getLeash(); mTaskLeash = leash;
mTransaction.reparent(mTaskLeash, mSurfaceControl) mTransaction.reparent(mTaskLeash, mSurfaceControl)
.show(mTaskLeash) .show(mTaskLeash)
.show(mSurfaceControl) .show(mSurfaceControl)

View File

@@ -17,14 +17,10 @@
package android.window; package android.window;
import android.annotation.NonNull; import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.TestApi; import android.annotation.TestApi;
import android.os.IBinder; import android.os.IBinder;
import android.os.Parcel; import android.os.Parcel;
import android.os.Parcelable; import android.os.Parcelable;
import android.os.RemoteException;
import android.view.SurfaceControl;
import android.window.IWindowContainerToken;
/** /**
* Interface for a window container to communicate with the window manager. This also acts as a * Interface for a window container to communicate with the window manager. This also acts as a
@@ -45,15 +41,6 @@ public final class WindowContainerToken implements Parcelable {
mRealToken = IWindowContainerToken.Stub.asInterface(in.readStrongBinder()); mRealToken = IWindowContainerToken.Stub.asInterface(in.readStrongBinder());
} }
@Nullable
public SurfaceControl getLeash() {
try {
return mRealToken.getLeash();
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
}
/** @hide */ /** @hide */
public IBinder asBinder() { public IBinder asBinder() {
return mRealToken.asBinder(); return mRealToken.asBinder();

View File

@@ -250,7 +250,7 @@ public class PipTaskOrganizer extends TaskOrganizer {
} }
@Override @Override
public void onTaskAppeared(ActivityManager.RunningTaskInfo info) { public void onTaskAppeared(ActivityManager.RunningTaskInfo info, SurfaceControl leash) {
Objects.requireNonNull(info, "Requires RunningTaskInfo"); Objects.requireNonNull(info, "Requires RunningTaskInfo");
final Rect destinationBounds = mPipBoundsHandler.getDestinationBounds( final Rect destinationBounds = mPipBoundsHandler.getDestinationBounds(
info.topActivity, getAspectRatioOrDefault(info.pictureInPictureParams), info.topActivity, getAspectRatioOrDefault(info.pictureInPictureParams),
@@ -259,7 +259,7 @@ public class PipTaskOrganizer extends TaskOrganizer {
mTaskInfo = info; mTaskInfo = info;
mToken = mTaskInfo.token; mToken = mTaskInfo.token;
mInPip = true; mInPip = true;
mLeash = mToken.getLeash(); mLeash = leash;
final Rect currentBounds = mTaskInfo.configuration.windowConfiguration.getBounds(); final Rect currentBounds = mTaskInfo.configuration.windowConfiguration.getBounds();
mBoundsToRestore.put(mToken.asBinder(), currentBounds); mBoundsToRestore.put(mToken.asBinder(), currentBounds);

View File

@@ -83,7 +83,7 @@ class SplitScreenTaskOrganizer extends TaskOrganizer {
} }
@Override @Override
public void onTaskAppeared(RunningTaskInfo taskInfo) { public void onTaskAppeared(RunningTaskInfo taskInfo, SurfaceControl leash) {
synchronized (this) { synchronized (this) {
if (mPrimary == null || mSecondary == null) { if (mPrimary == null || mSecondary == null) {
Log.w(TAG, "Received onTaskAppeared before creating root tasks " + taskInfo); Log.w(TAG, "Received onTaskAppeared before creating root tasks " + taskInfo);
@@ -91,9 +91,9 @@ class SplitScreenTaskOrganizer extends TaskOrganizer {
} }
if (taskInfo.token.equals(mPrimary.token)) { if (taskInfo.token.equals(mPrimary.token)) {
mPrimarySurface = taskInfo.token.getLeash(); mPrimarySurface = leash;
} else if (taskInfo.token.equals(mSecondary.token)) { } else if (taskInfo.token.equals(mSecondary.token)) {
mSecondarySurface = taskInfo.token.getLeash(); mSecondarySurface = leash;
} }
if (!mSplitScreenSupported && mPrimarySurface != null && mSecondarySurface != null) { if (!mSplitScreenSupported && mPrimarySurface != null && mSecondarySurface != null) {

View File

@@ -21,6 +21,7 @@ import static android.Manifest.permission.MANAGE_ACTIVITY_STACKS;
import android.os.Binder; import android.os.Binder;
import android.os.IBinder; import android.os.IBinder;
import android.os.RemoteException; import android.os.RemoteException;
import android.view.SurfaceControl;
import android.window.IDisplayAreaOrganizer; import android.window.IDisplayAreaOrganizer;
import android.window.IDisplayAreaOrganizerController; import android.window.IDisplayAreaOrganizerController;
@@ -113,7 +114,8 @@ public class DisplayAreaOrganizerController extends IDisplayAreaOrganizerControl
void onDisplayAreaAppeared(IDisplayAreaOrganizer organizer, DisplayArea da) { void onDisplayAreaAppeared(IDisplayAreaOrganizer organizer, DisplayArea da) {
try { try {
organizer.onDisplayAreaAppeared(da.getDisplayAreaInfo()); SurfaceControl outSurfaceControl = new SurfaceControl(da.getSurfaceControl());
organizer.onDisplayAreaAppeared(da.getDisplayAreaInfo(), outSurfaceControl);
} catch (RemoteException e) { } catch (RemoteException e) {
// Oh well... // Oh well...
} }

View File

@@ -36,6 +36,7 @@ import android.os.IBinder;
import android.os.RemoteException; import android.os.RemoteException;
import android.util.Slog; import android.util.Slog;
import android.util.SparseArray; import android.util.SparseArray;
import android.view.SurfaceControl;
import android.window.ITaskOrganizer; import android.window.ITaskOrganizer;
import android.window.ITaskOrganizerController; import android.window.ITaskOrganizerController;
import android.window.WindowContainerToken; import android.window.WindowContainerToken;
@@ -112,7 +113,8 @@ class TaskOrganizerController extends ITaskOrganizerController.Stub {
final RunningTaskInfo taskInfo = task.getTaskInfo(); final RunningTaskInfo taskInfo = task.getTaskInfo();
mDeferTaskOrgCallbacksConsumer.accept(() -> { mDeferTaskOrgCallbacksConsumer.accept(() -> {
try { try {
mTaskOrganizer.onTaskAppeared(taskInfo); SurfaceControl outSurfaceControl = new SurfaceControl(task.getSurfaceControl());
mTaskOrganizer.onTaskAppeared(taskInfo, outSurfaceControl);
} catch (RemoteException e) { } catch (RemoteException e) {
Slog.e(TAG, "Exception sending onTaskAppeared callback", e); Slog.e(TAG, "Exception sending onTaskAppeared callback", e);
} }

View File

@@ -2557,16 +2557,6 @@ class WindowContainer<E extends WindowContainer> extends ConfigurationContainer<
return (RemoteToken) binder; return (RemoteToken) binder;
} }
@Override
public SurfaceControl getLeash() {
final WindowContainer wc = getContainer();
if (wc == null) return null;
// We need to copy the SurfaceControl instead of returning the original
// because the Parcel FLAGS PARCELABLE_WRITE_RETURN_VALUE cause SurfaceControls
// to release themselves.
return new SurfaceControl(wc.getSurfaceControl());
}
WindowContainerToken toWindowContainerToken() { WindowContainerToken toWindowContainerToken() {
if (mWindowContainerToken == null) { if (mWindowContainerToken == null) {
mWindowContainerToken = new WindowContainerToken(this); mWindowContainerToken = new WindowContainerToken(this);

View File

@@ -49,6 +49,7 @@ import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
import android.os.UserHandle; import android.os.UserHandle;
import android.service.voice.IVoiceInteractionSession; import android.service.voice.IVoiceInteractionSession;
import android.view.SurfaceControl;
import android.window.ITaskOrganizer; import android.window.ITaskOrganizer;
import android.window.WindowContainerToken; import android.window.WindowContainerToken;
@@ -552,7 +553,7 @@ class ActivityTestsBase extends SystemServiceTestsBase {
mMoveToSecondaryOnEnter = move; mMoveToSecondaryOnEnter = move;
} }
@Override @Override
public void onTaskAppeared(ActivityManager.RunningTaskInfo info) { public void onTaskAppeared(ActivityManager.RunningTaskInfo info, SurfaceControl leash) {
} }
@Override @Override
public void onTaskVanished(ActivityManager.RunningTaskInfo info) { public void onTaskVanished(ActivityManager.RunningTaskInfo info) {

View File

@@ -27,6 +27,8 @@ import android.graphics.Rect;
import android.os.Binder; import android.os.Binder;
import android.os.RemoteException; import android.os.RemoteException;
import android.platform.test.annotations.Presubmit; import android.platform.test.annotations.Presubmit;
import android.view.SurfaceControl;
import android.window.DisplayAreaInfo;
import android.window.IDisplayAreaOrganizer; import android.window.IDisplayAreaOrganizer;
import androidx.test.filters.SmallTest; import androidx.test.filters.SmallTest;
@@ -74,7 +76,8 @@ public class DisplayAreaOrganizerTest extends WindowTestsBase {
@Test @Test
public void testAppearedVanished() throws RemoteException { public void testAppearedVanished() throws RemoteException {
IDisplayAreaOrganizer organizer = registerMockOrganizer(FEATURE_VENDOR_FIRST); IDisplayAreaOrganizer organizer = registerMockOrganizer(FEATURE_VENDOR_FIRST);
verify(organizer).onDisplayAreaAppeared(any()); verify(organizer)
.onDisplayAreaAppeared(any(DisplayAreaInfo.class), any(SurfaceControl.class));
unregisterMockOrganizer(organizer); unregisterMockOrganizer(organizer);
verify(organizer).onDisplayAreaVanished(any()); verify(organizer).onDisplayAreaVanished(any());
@@ -83,7 +86,8 @@ public class DisplayAreaOrganizerTest extends WindowTestsBase {
@Test @Test
public void testChanged() throws RemoteException { public void testChanged() throws RemoteException {
IDisplayAreaOrganizer organizer = registerMockOrganizer(FEATURE_VENDOR_FIRST); IDisplayAreaOrganizer organizer = registerMockOrganizer(FEATURE_VENDOR_FIRST);
verify(organizer).onDisplayAreaAppeared(any()); verify(organizer)
.onDisplayAreaAppeared(any(DisplayAreaInfo.class), any(SurfaceControl.class));
mDisplayContent.setBounds(new Rect(0, 0, 1000, 1000)); mDisplayContent.setBounds(new Rect(0, 0, 1000, 1000));
verify(organizer).onDisplayAreaInfoChanged(any()); verify(organizer).onDisplayAreaInfoChanged(any());

View File

@@ -65,6 +65,7 @@ import android.platform.test.annotations.Presubmit;
import android.util.ArrayMap; import android.util.ArrayMap;
import android.util.Rational; import android.util.Rational;
import android.view.Display; import android.view.Display;
import android.view.SurfaceControl;
import android.window.ITaskOrganizer; import android.window.ITaskOrganizer;
import android.window.WindowContainerTransaction; import android.window.WindowContainerTransaction;
@@ -133,7 +134,8 @@ public class WindowOrganizerTests extends WindowTestsBase {
final ITaskOrganizer organizer = registerMockOrganizer(); final ITaskOrganizer organizer = registerMockOrganizer();
task.setTaskOrganizer(organizer); task.setTaskOrganizer(organizer);
verify(organizer).onTaskAppeared(any()); verify(organizer).onTaskAppeared(any(RunningTaskInfo.class), any(SurfaceControl.class));
task.removeImmediately(); task.removeImmediately();
verify(organizer).onTaskVanished(any()); verify(organizer).onTaskVanished(any());
@@ -147,11 +149,12 @@ public class WindowOrganizerTests extends WindowTestsBase {
task.setTaskOrganizer(organizer); task.setTaskOrganizer(organizer);
verify(organizer, never()).onTaskAppeared(any()); verify(organizer, never())
.onTaskAppeared(any(RunningTaskInfo.class), any(SurfaceControl.class));
task.setHasBeenVisible(true); task.setHasBeenVisible(true);
assertTrue(stack.getHasBeenVisible()); assertTrue(stack.getHasBeenVisible());
verify(organizer).onTaskAppeared(any()); verify(organizer).onTaskAppeared(any(RunningTaskInfo.class), any(SurfaceControl.class));
task.removeImmediately(); task.removeImmediately();
verify(organizer).onTaskVanished(any()); verify(organizer).onTaskVanished(any());
@@ -167,7 +170,8 @@ public class WindowOrganizerTests extends WindowTestsBase {
// that even though a TaskOrganizer is set remove doesn't emit // that even though a TaskOrganizer is set remove doesn't emit
// a vanish callback, because we never emitted appear. // a vanish callback, because we never emitted appear.
task.setTaskOrganizer(organizer); task.setTaskOrganizer(organizer);
verify(organizer, never()).onTaskAppeared(any()); verify(organizer, never())
.onTaskAppeared(any(RunningTaskInfo.class), any(SurfaceControl.class));
task.removeImmediately(); task.removeImmediately();
verify(organizer, never()).onTaskVanished(any()); verify(organizer, never()).onTaskVanished(any());
} }
@@ -180,10 +184,10 @@ public class WindowOrganizerTests extends WindowTestsBase {
final ITaskOrganizer organizer2 = registerMockOrganizer(WINDOWING_MODE_PINNED); final ITaskOrganizer organizer2 = registerMockOrganizer(WINDOWING_MODE_PINNED);
task.setTaskOrganizer(organizer); task.setTaskOrganizer(organizer);
verify(organizer).onTaskAppeared(any()); verify(organizer).onTaskAppeared(any(RunningTaskInfo.class), any(SurfaceControl.class));
task.setTaskOrganizer(organizer2); task.setTaskOrganizer(organizer2);
verify(organizer).onTaskVanished(any()); verify(organizer).onTaskVanished(any());
verify(organizer2).onTaskAppeared(any()); verify(organizer2).onTaskAppeared(any(RunningTaskInfo.class), any(SurfaceControl.class));
} }
@Test @Test
@@ -194,10 +198,10 @@ public class WindowOrganizerTests extends WindowTestsBase {
final ITaskOrganizer organizer2 = registerMockOrganizer(WINDOWING_MODE_PINNED); final ITaskOrganizer organizer2 = registerMockOrganizer(WINDOWING_MODE_PINNED);
stack.setWindowingMode(WINDOWING_MODE_MULTI_WINDOW); stack.setWindowingMode(WINDOWING_MODE_MULTI_WINDOW);
verify(organizer).onTaskAppeared(any()); verify(organizer).onTaskAppeared(any(RunningTaskInfo.class), any(SurfaceControl.class));
stack.setWindowingMode(WINDOWING_MODE_PINNED); stack.setWindowingMode(WINDOWING_MODE_PINNED);
verify(organizer).onTaskVanished(any()); verify(organizer).onTaskVanished(any());
verify(organizer2).onTaskAppeared(any()); verify(organizer2).onTaskAppeared(any(RunningTaskInfo.class), any(SurfaceControl.class));
} }
@Test @Test
@@ -207,7 +211,8 @@ public class WindowOrganizerTests extends WindowTestsBase {
final ITaskOrganizer organizer = registerMockOrganizer(); final ITaskOrganizer organizer = registerMockOrganizer();
stack.setWindowingMode(WINDOWING_MODE_MULTI_WINDOW); stack.setWindowingMode(WINDOWING_MODE_MULTI_WINDOW);
verify(organizer, never()).onTaskAppeared(any()); verify(organizer, never())
.onTaskAppeared(any(RunningTaskInfo.class), any(SurfaceControl.class));
assertTrue(stack.isOrganized()); assertTrue(stack.isOrganized());
mWm.mAtmService.mTaskOrganizerController.unregisterTaskOrganizer(organizer); mWm.mAtmService.mTaskOrganizerController.unregisterTaskOrganizer(organizer);
@@ -222,7 +227,7 @@ public class WindowOrganizerTests extends WindowTestsBase {
final ITaskOrganizer organizer = registerMockOrganizer(); final ITaskOrganizer organizer = registerMockOrganizer();
stack.setTaskOrganizer(organizer); stack.setTaskOrganizer(organizer);
verify(organizer).onTaskAppeared(any()); verify(organizer).onTaskAppeared(any(RunningTaskInfo.class), any(SurfaceControl.class));
assertTrue(stack.isOrganized()); assertTrue(stack.isOrganized());
stack.setTaskOrganizer(null); stack.setTaskOrganizer(null);
@@ -237,7 +242,7 @@ public class WindowOrganizerTests extends WindowTestsBase {
final ITaskOrganizer organizer = registerMockOrganizer(); final ITaskOrganizer organizer = registerMockOrganizer();
stack.setWindowingMode(WINDOWING_MODE_MULTI_WINDOW); stack.setWindowingMode(WINDOWING_MODE_MULTI_WINDOW);
verify(organizer).onTaskAppeared(any()); verify(organizer).onTaskAppeared(any(RunningTaskInfo.class), any(SurfaceControl.class));
assertTrue(stack.isOrganized()); assertTrue(stack.isOrganized());
mWm.mAtmService.mTaskOrganizerController.unregisterTaskOrganizer(organizer); mWm.mAtmService.mTaskOrganizerController.unregisterTaskOrganizer(organizer);
@@ -257,7 +262,8 @@ public class WindowOrganizerTests extends WindowTestsBase {
// First organizer is registered, verify a task appears when changing windowing mode // First organizer is registered, verify a task appears when changing windowing mode
stack.setWindowingMode(WINDOWING_MODE_MULTI_WINDOW); stack.setWindowingMode(WINDOWING_MODE_MULTI_WINDOW);
verify(organizer, times(1)).onTaskAppeared(any()); verify(organizer, times(1))
.onTaskAppeared(any(RunningTaskInfo.class), any(SurfaceControl.class));
assertTrue(stack.isOrganized()); assertTrue(stack.isOrganized());
// Now we replace the registration and1 verify the new organizer receives tasks // Now we replace the registration and1 verify the new organizer receives tasks
@@ -265,7 +271,8 @@ public class WindowOrganizerTests extends WindowTestsBase {
final ITaskOrganizer organizer2 = registerMockOrganizer(WINDOWING_MODE_MULTI_WINDOW); final ITaskOrganizer organizer2 = registerMockOrganizer(WINDOWING_MODE_MULTI_WINDOW);
stack2.setWindowingMode(WINDOWING_MODE_MULTI_WINDOW); stack2.setWindowingMode(WINDOWING_MODE_MULTI_WINDOW);
// One each for task and task2 // One each for task and task2
verify(organizer2, times(2)).onTaskAppeared(any()); verify(organizer2, times(2))
.onTaskAppeared(any(RunningTaskInfo.class), any(SurfaceControl.class));
verify(organizer2, times(0)).onTaskVanished(any()); verify(organizer2, times(0)).onTaskVanished(any());
// One for task // One for task
verify(organizer).onTaskVanished(any()); verify(organizer).onTaskVanished(any());
@@ -274,11 +281,13 @@ public class WindowOrganizerTests extends WindowTestsBase {
// Now we unregister the second one, the first one should automatically be reregistered // Now we unregister the second one, the first one should automatically be reregistered
// so we verify that it's now seeing changes. // so we verify that it's now seeing changes.
mWm.mAtmService.mTaskOrganizerController.unregisterTaskOrganizer(organizer2); mWm.mAtmService.mTaskOrganizerController.unregisterTaskOrganizer(organizer2);
verify(organizer, times(3)).onTaskAppeared(any()); verify(organizer, times(3))
.onTaskAppeared(any(RunningTaskInfo.class), any(SurfaceControl.class));
verify(organizer2, times(2)).onTaskVanished(any()); verify(organizer2, times(2)).onTaskVanished(any());
stack3.setWindowingMode(WINDOWING_MODE_MULTI_WINDOW); stack3.setWindowingMode(WINDOWING_MODE_MULTI_WINDOW);
verify(organizer, times(4)).onTaskAppeared(any()); verify(organizer, times(4))
.onTaskAppeared(any(RunningTaskInfo.class), any(SurfaceControl.class));
verify(organizer2, times(2)).onTaskVanished(any()); verify(organizer2, times(2)).onTaskVanished(any());
assertTrue(stack3.isOrganized()); assertTrue(stack3.isOrganized());
} }
@@ -291,7 +300,8 @@ public class WindowOrganizerTests extends WindowTestsBase {
final Task task = createTask(stack); final Task task = createTask(stack);
final Task task2 = createTask(stack); final Task task2 = createTask(stack);
stack.setWindowingMode(WINDOWING_MODE_PINNED); stack.setWindowingMode(WINDOWING_MODE_PINNED);
verify(organizer, times(1)).onTaskAppeared(any()); verify(organizer, times(1))
.onTaskAppeared(any(RunningTaskInfo.class), any(SurfaceControl.class));
stack.setWindowingMode(WINDOWING_MODE_FULLSCREEN); stack.setWindowingMode(WINDOWING_MODE_FULLSCREEN);
verify(organizer, times(1)).onTaskVanished(any()); verify(organizer, times(1)).onTaskVanished(any());
@@ -304,7 +314,8 @@ public class WindowOrganizerTests extends WindowTestsBase {
stack.setWindowingMode(WINDOWING_MODE_PINNED); stack.setWindowingMode(WINDOWING_MODE_PINNED);
final ITaskOrganizer organizer = registerMockOrganizer(WINDOWING_MODE_PINNED); final ITaskOrganizer organizer = registerMockOrganizer(WINDOWING_MODE_PINNED);
verify(organizer, times(1)).onTaskAppeared(any()); verify(organizer, times(1))
.onTaskAppeared(any(RunningTaskInfo.class), any(SurfaceControl.class));
} }
@Test @Test
@@ -459,7 +470,7 @@ public class WindowOrganizerTests extends WindowTestsBase {
public void testTileAddRemoveChild() { public void testTileAddRemoveChild() {
ITaskOrganizer listener = new ITaskOrganizer.Stub() { ITaskOrganizer listener = new ITaskOrganizer.Stub() {
@Override @Override
public void onTaskAppeared(RunningTaskInfo taskInfo) { } public void onTaskAppeared(RunningTaskInfo taskInfo, SurfaceControl leash) { }
@Override @Override
public void onTaskVanished(RunningTaskInfo container) { } public void onTaskVanished(RunningTaskInfo container) { }
@@ -515,7 +526,7 @@ public class WindowOrganizerTests extends WindowTestsBase {
final boolean[] called = {false}; final boolean[] called = {false};
ITaskOrganizer listener = new ITaskOrganizer.Stub() { ITaskOrganizer listener = new ITaskOrganizer.Stub() {
@Override @Override
public void onTaskAppeared(RunningTaskInfo taskInfo) { } public void onTaskAppeared(RunningTaskInfo taskInfo, SurfaceControl leash) { }
@Override @Override
public void onTaskVanished(RunningTaskInfo container) { } public void onTaskVanished(RunningTaskInfo container) { }
@@ -577,7 +588,7 @@ public class WindowOrganizerTests extends WindowTestsBase {
final ArrayMap<IBinder, RunningTaskInfo> lastReportedTiles = new ArrayMap<>(); final ArrayMap<IBinder, RunningTaskInfo> lastReportedTiles = new ArrayMap<>();
ITaskOrganizer listener = new ITaskOrganizer.Stub() { ITaskOrganizer listener = new ITaskOrganizer.Stub() {
@Override @Override
public void onTaskAppeared(RunningTaskInfo taskInfo) { } public void onTaskAppeared(RunningTaskInfo taskInfo, SurfaceControl leash) { }
@Override @Override
public void onTaskVanished(RunningTaskInfo container) { } public void onTaskVanished(RunningTaskInfo container) { }
@@ -804,7 +815,7 @@ public class WindowOrganizerTests extends WindowTestsBase {
RunningTaskInfo mInfo; RunningTaskInfo mInfo;
@Override @Override
public void onTaskAppeared(RunningTaskInfo info) { public void onTaskAppeared(RunningTaskInfo info, SurfaceControl leash) {
mInfo = info; mInfo = info;
} }
@Override @Override
@@ -907,12 +918,14 @@ public class WindowOrganizerTests extends WindowTestsBase {
task.setTaskOrganizer(organizer); task.setTaskOrganizer(organizer);
// setHasBeenVisible was already called once by the set-up code. // setHasBeenVisible was already called once by the set-up code.
task.setHasBeenVisible(true); task.setHasBeenVisible(true);
verify(organizer, times(1)).onTaskAppeared(any()); verify(organizer, times(1))
.onTaskAppeared(any(RunningTaskInfo.class), any(SurfaceControl.class));
task.setTaskOrganizer(null); task.setTaskOrganizer(null);
verify(organizer, times(1)).onTaskVanished(any()); verify(organizer, times(1)).onTaskVanished(any());
task.setTaskOrganizer(organizer); task.setTaskOrganizer(organizer);
verify(organizer, times(2)).onTaskAppeared(any()); verify(organizer, times(2))
.onTaskAppeared(any(RunningTaskInfo.class), any(SurfaceControl.class));
task.removeImmediately(); task.removeImmediately();
verify(organizer, times(2)).onTaskVanished(any()); verify(organizer, times(2)).onTaskVanished(any());

View File

@@ -38,7 +38,7 @@ import android.window.WindowContainerTransaction;
import android.window.WindowContainerTransactionCallback; import android.window.WindowContainerTransactionCallback;
public class TaskOrganizerMultiWindowTest extends Activity { public class TaskOrganizerMultiWindowTest extends Activity {
class SplitLayout extends LinearLayout implements View.OnTouchListener { static class SplitLayout extends LinearLayout implements View.OnTouchListener {
View mView1; View mView1;
View mView2; View mView2;
View mDividerView; View mDividerView;
@@ -94,8 +94,8 @@ public class TaskOrganizerMultiWindowTest extends Activity {
class ResizingTaskView extends TaskView { class ResizingTaskView extends TaskView {
final Intent mIntent; final Intent mIntent;
boolean launched = false; boolean launched = false;
ResizingTaskView(Context c, TaskOrganizer o, int windowingMode, Intent i) { ResizingTaskView(Context c, Intent i) {
super(c, o, windowingMode); super(c);
mIntent = i; mIntent = i;
} }
@@ -120,9 +120,9 @@ public class TaskOrganizerMultiWindowTest extends Activity {
} }
} }
TaskView mTaskView1; private TaskView mTaskView1;
TaskView mTaskView2; private TaskView mTaskView2;
boolean gotFirstTask = false; private boolean mGotFirstTask = false;
class Organizer extends TaskOrganizer { class Organizer extends TaskOrganizer {
private int receivedTransactions = 0; private int receivedTransactions = 0;
@@ -141,17 +141,17 @@ public class TaskOrganizerMultiWindowTest extends Activity {
}; };
@Override @Override
public void onTaskAppeared(ActivityManager.RunningTaskInfo ti) { public void onTaskAppeared(ActivityManager.RunningTaskInfo ti, SurfaceControl leash) {
if (!gotFirstTask) { if (!mGotFirstTask) {
mTaskView1.reparentTask(ti.token); mTaskView1.reparentTask(ti.token, leash);
gotFirstTask = true; mGotFirstTask = true;
} else { } else {
mTaskView2.reparentTask(ti.token); mTaskView2.reparentTask(ti.token, leash);
} }
} }
} }
Organizer mOrganizer = new Organizer(); private Organizer mOrganizer = new Organizer();
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
@@ -159,10 +159,8 @@ public class TaskOrganizerMultiWindowTest extends Activity {
mOrganizer.registerOrganizer(WINDOWING_MODE_MULTI_WINDOW); mOrganizer.registerOrganizer(WINDOWING_MODE_MULTI_WINDOW);
mTaskView1 = new ResizingTaskView(this, mOrganizer, WINDOWING_MODE_MULTI_WINDOW, mTaskView1 = new ResizingTaskView(this, makeSettingsIntent());
makeSettingsIntent()); mTaskView2 = new ResizingTaskView(this, makeContactsIntent());
mTaskView2 = new ResizingTaskView(this, mOrganizer, WINDOWING_MODE_MULTI_WINDOW,
makeContactsIntent());
View splitView = new SplitLayout(this, mTaskView1, mTaskView2); View splitView = new SplitLayout(this, mTaskView1, mTaskView2);
setContentView(splitView); setContentView(splitView);
@@ -178,14 +176,14 @@ public class TaskOrganizerMultiWindowTest extends Activity {
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_NO_ANIMATION); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_NO_ANIMATION);
} }
Intent makeSettingsIntent() { private Intent makeSettingsIntent() {
Intent intent = new Intent(); Intent intent = new Intent();
intent.setAction(android.provider.Settings.ACTION_SETTINGS); intent.setAction(android.provider.Settings.ACTION_SETTINGS);
addFlags(intent); addFlags(intent);
return intent; return intent;
} }
Intent makeContactsIntent() { private Intent makeContactsIntent() {
Intent intent = new Intent(); Intent intent = new Intent();
intent.setAction(Intent.ACTION_MAIN); intent.setAction(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_APP_CONTACTS); intent.addCategory(Intent.CATEGORY_APP_CONTACTS);
@@ -193,14 +191,14 @@ public class TaskOrganizerMultiWindowTest extends Activity {
return intent; return intent;
} }
Bundle makeLaunchOptions(int width, int height) { private Bundle makeLaunchOptions(int width, int height) {
ActivityOptions o = ActivityOptions.makeBasic(); ActivityOptions o = ActivityOptions.makeBasic();
o.setLaunchWindowingMode(WINDOWING_MODE_MULTI_WINDOW); o.setLaunchWindowingMode(WINDOWING_MODE_MULTI_WINDOW);
o.setLaunchBounds(new Rect(0, 0, width, height)); o.setLaunchBounds(new Rect(0, 0, width, height));
return o.toBundle(); return o.toBundle();
} }
void launchOrganizedActivity(Intent i, int width, int height) { private void launchOrganizedActivity(Intent i, int width, int height) {
startActivity(i, makeLaunchOptions(width, height)); startActivity(i, makeLaunchOptions(width, height));
} }
} }

View File

@@ -23,6 +23,7 @@ import android.app.Service;
import android.content.Intent; import android.content.Intent;
import android.graphics.Rect; import android.graphics.Rect;
import android.os.IBinder; import android.os.IBinder;
import android.view.SurfaceControl;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.view.WindowManager; import android.view.WindowManager;
import android.widget.FrameLayout; import android.widget.FrameLayout;
@@ -30,14 +31,14 @@ import android.window.TaskOrganizer;
import android.window.WindowContainerTransaction; import android.window.WindowContainerTransaction;
public class TaskOrganizerPipTest extends Service { public class TaskOrganizerPipTest extends Service {
static final int PIP_WIDTH = 640; private static final int PIP_WIDTH = 640;
static final int PIP_HEIGHT = 360; private static final int PIP_HEIGHT = 360;
TaskView mTaskView; private TaskView mTaskView;
class Organizer extends TaskOrganizer { class Organizer extends TaskOrganizer {
public void onTaskAppeared(ActivityManager.RunningTaskInfo ti) { public void onTaskAppeared(ActivityManager.RunningTaskInfo ti, SurfaceControl leash) {
mTaskView.reparentTask(ti.token); mTaskView.reparentTask(ti.token, leash);
final WindowContainerTransaction wct = new WindowContainerTransaction(); final WindowContainerTransaction wct = new WindowContainerTransaction();
wct.scheduleFinishEnterPip(ti.token, new Rect(0, 0, PIP_WIDTH, PIP_HEIGHT)); wct.scheduleFinishEnterPip(ti.token, new Rect(0, 0, PIP_WIDTH, PIP_HEIGHT));
@@ -45,7 +46,7 @@ public class TaskOrganizerPipTest extends Service {
} }
} }
Organizer mOrganizer = new Organizer(); private Organizer mOrganizer = new Organizer();
@Override @Override
public IBinder onBind(Intent intent) { public IBinder onBind(Intent intent) {
@@ -66,7 +67,7 @@ public class TaskOrganizerPipTest extends Service {
FrameLayout layout = new FrameLayout(this); FrameLayout layout = new FrameLayout(this);
ViewGroup.LayoutParams lp = ViewGroup.LayoutParams lp =
new ViewGroup.LayoutParams(PIP_WIDTH, PIP_HEIGHT); new ViewGroup.LayoutParams(PIP_WIDTH, PIP_HEIGHT);
mTaskView = new TaskView(this, mOrganizer, WINDOWING_MODE_PINNED); mTaskView = new TaskView(this);
layout.addView(mTaskView, lp); layout.addView(mTaskView, lp);
WindowManager wm = getSystemService(WindowManager.class); WindowManager wm = getSystemService(WindowManager.class);

View File

@@ -16,34 +16,27 @@
package com.android.test.taskembed; package com.android.test.taskembed;
import android.app.ActivityTaskManager;
import android.content.Context; import android.content.Context;
import android.window.TaskOrganizer;
import android.window.WindowContainerToken;
import android.view.SurfaceControl; import android.view.SurfaceControl;
import android.view.SurfaceHolder; import android.view.SurfaceHolder;
import android.view.SurfaceView; import android.view.SurfaceView;
import android.window.ITaskOrganizer; import android.window.WindowContainerToken;
/** /**
* Simple SurfaceView wrapper which registers a TaskOrganizer * Simple SurfaceView wrapper which registers a TaskOrganizer
* after it's Surface is ready. * after it's Surface is ready.
*/ */
class TaskView extends SurfaceView implements SurfaceHolder.Callback { class TaskView extends SurfaceView implements SurfaceHolder.Callback {
final TaskOrganizer mTaskOrganizer;
final int mWindowingMode;
WindowContainerToken mWc; WindowContainerToken mWc;
private SurfaceControl mLeash;
boolean mSurfaceCreated = false; private boolean mSurfaceCreated = false;
boolean mNeedsReparent; private boolean mNeedsReparent;
TaskView(Context c, TaskOrganizer o, int windowingMode) { TaskView(Context c) {
super(c); super(c);
getHolder().addCallback(this); getHolder().addCallback(this);
setZOrderOnTop(true); setZOrderOnTop(true);
mTaskOrganizer = o;
mWindowingMode = windowingMode;
} }
@Override @Override
@@ -63,27 +56,25 @@ class TaskView extends SurfaceView implements SurfaceHolder.Callback {
public void surfaceDestroyed(SurfaceHolder holder) { public void surfaceDestroyed(SurfaceHolder holder) {
} }
void reparentTask(WindowContainerToken wc) { void reparentTask(WindowContainerToken wc, SurfaceControl leash) {
mWc = wc; mWc = wc;
if (mSurfaceCreated == false) { mLeash = leash;
if (!mSurfaceCreated) {
mNeedsReparent = true; mNeedsReparent = true;
} else { } else {
reparentLeash(); reparentLeash();
} }
} }
void reparentLeash() { private void reparentLeash() {
SurfaceControl.Transaction t = new SurfaceControl.Transaction(); SurfaceControl.Transaction t = new SurfaceControl.Transaction();
SurfaceControl leash = null; if (mLeash == null) {
try { return;
leash = mWc.getLeash();
} catch (Exception e) {
// System server died.. oh well
} }
t.reparent(leash, getSurfaceControl()) t.reparent(mLeash, getSurfaceControl())
.setPosition(leash, 0, 0) .setPosition(mLeash, 0, 0)
.show(leash) .show(mLeash)
.apply(); .apply();
} }
} }