Merge "Remove getLeash from WindowContainerToken" into rvc-dev am: 5a4a5682a2 am: e00fbbe6c4 am: ecccd3de1e
Change-Id: Id798ce4c940d6a4c100b745c3ed4ae8b9c7806d8
This commit is contained in:
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -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();
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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...
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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());
|
||||||
|
|||||||
@@ -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());
|
||||||
|
|||||||
@@ -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));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user