summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTodd Kennedy <toddke@google.com>2015-01-16 16:05:14 -0800
committerTodd Kennedy <toddke@google.com>2015-01-20 10:51:49 -0800
commit4900bf9d82c4905fadc43d8e2dd9a7f896da2d81 (patch)
treed6758555e1a054e6a6e46276919166bd44f9db14
parentdf8e59abe5b0803cddee243e2c98d06afb66f5a9 (diff)
downloadframeworks_base-4900bf9d82c4905fadc43d8e2dd9a7f896da2d81.zip
frameworks_base-4900bf9d82c4905fadc43d8e2dd9a7f896da2d81.tar.gz
frameworks_base-4900bf9d82c4905fadc43d8e2dd9a7f896da2d81.tar.bz2
Expose new binder call createStackOnDisplay()
Creates a new, empty ActivityStack on a display. Use the binder call to launch an activity on said stack. Bug: 19001243 Change-Id: I0f04e8f2703bcc706f58e75333869fb35f6b1ee9
-rw-r--r--cmds/am/src/com/android/commands/am/Am.java9
-rw-r--r--core/java/android/app/ActivityManagerNative.java33
-rw-r--r--core/java/android/app/IActivityManager.java3
-rw-r--r--services/core/java/com/android/server/am/ActivityManagerService.java14
-rw-r--r--services/core/java/com/android/server/am/ActivityStackSupervisor.java13
5 files changed, 60 insertions, 12 deletions
diff --git a/cmds/am/src/com/android/commands/am/Am.java b/cmds/am/src/com/android/commands/am/Am.java
index 507770c..2a0ed90 100644
--- a/cmds/am/src/com/android/commands/am/Am.java
+++ b/cmds/am/src/com/android/commands/am/Am.java
@@ -1694,11 +1694,10 @@ public class Am extends BaseCommand {
Intent intent = makeIntent(UserHandle.USER_CURRENT);
try {
- IBinder homeActivityToken = mAm.getHomeActivityToken();
- IActivityContainer container =
- mAm.createVirtualActivityContainer(homeActivityToken, null);
- container.attachToDisplay(displayId);
- container.startActivity(intent);
+ IActivityContainer container = mAm.createStackOnDisplay(displayId);
+ if (container != null) {
+ container.startActivity(intent);
+ }
} catch (RemoteException e) {
}
}
diff --git a/core/java/android/app/ActivityManagerNative.java b/core/java/android/app/ActivityManagerNative.java
index 5ecf9ee..88dbbd9 100644
--- a/core/java/android/app/ActivityManagerNative.java
+++ b/core/java/android/app/ActivityManagerNative.java
@@ -2202,6 +2202,20 @@ public abstract class ActivityManagerNative extends Binder implements IActivityM
return true;
}
+ case CREATE_STACK_ON_DISPLAY: {
+ data.enforceInterface(IActivityManager.descriptor);
+ int displayId = data.readInt();
+ IActivityContainer activityContainer = createStackOnDisplay(displayId);
+ reply.writeNoException();
+ if (activityContainer != null) {
+ reply.writeInt(1);
+ reply.writeStrongBinder(activityContainer.asBinder());
+ } else {
+ reply.writeInt(0);
+ }
+ return true;
+ }
+
case GET_ACTIVITY_CONTAINER_TRANSACTION: {
data.enforceInterface(IActivityManager.descriptor);
IBinder activityToken = data.readStrongBinder();
@@ -5231,6 +5245,25 @@ class ActivityManagerProxy implements IActivityManager
reply.recycle();
}
+ public IActivityContainer createStackOnDisplay(int displayId) throws RemoteException {
+ Parcel data = Parcel.obtain();
+ Parcel reply = Parcel.obtain();
+ data.writeInterfaceToken(IActivityManager.descriptor);
+ data.writeInt(displayId);
+ mRemote.transact(CREATE_STACK_ON_DISPLAY, data, reply, 0);
+ reply.readException();
+ final int result = reply.readInt();
+ final IActivityContainer res;
+ if (result == 1) {
+ res = IActivityContainer.Stub.asInterface(reply.readStrongBinder());
+ } else {
+ res = null;
+ }
+ data.recycle();
+ reply.recycle();
+ return res;
+ }
+
public IActivityContainer getEnclosingActivityContainer(IBinder activityToken)
throws RemoteException {
Parcel data = Parcel.obtain();
diff --git a/core/java/android/app/IActivityManager.java b/core/java/android/app/IActivityManager.java
index adedbcc..f152c6f 100644
--- a/core/java/android/app/IActivityManager.java
+++ b/core/java/android/app/IActivityManager.java
@@ -436,6 +436,8 @@ public interface IActivityManager extends IInterface {
public IActivityContainer createVirtualActivityContainer(IBinder parentActivityToken,
IActivityContainerCallback callback) throws RemoteException;
+ public IActivityContainer createStackOnDisplay(int displayId) throws RemoteException;
+
public void deleteActivityContainer(IActivityContainer container) throws RemoteException;
public IActivityContainer getEnclosingActivityContainer(IBinder activityToken)
@@ -797,4 +799,5 @@ public interface IActivityManager extends IInterface {
// Start of M transactions
int NOTIFY_CLEARTEXT_NETWORK_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+280;
+ int CREATE_STACK_ON_DISPLAY = IBinder.FIRST_CALL_TRANSACTION+281;
}
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index b1b2421..a2f5c15 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -8114,6 +8114,20 @@ public final class ActivityManagerService extends ActivityManagerNative
}
@Override
+ public IActivityContainer createStackOnDisplay(int displayId) throws RemoteException {
+ enforceCallingPermission(android.Manifest.permission.MANAGE_ACTIVITY_STACKS,
+ "createStackOnDisplay()");
+ synchronized (this) {
+ final int stackId = mStackSupervisor.getNextStackId();
+ final ActivityStack stack = mStackSupervisor.createStackOnDisplay(stackId, displayId);
+ if (stack == null) {
+ return null;
+ }
+ return stack.mActivityContainer;
+ }
+ }
+
+ @Override
public IActivityContainer getEnclosingActivityContainer(IBinder activityToken)
throws RemoteException {
synchronized (this) {
diff --git a/services/core/java/com/android/server/am/ActivityStackSupervisor.java b/services/core/java/com/android/server/am/ActivityStackSupervisor.java
index 27f8312..ba2f449 100644
--- a/services/core/java/com/android/server/am/ActivityStackSupervisor.java
+++ b/services/core/java/com/android/server/am/ActivityStackSupervisor.java
@@ -1569,10 +1569,9 @@ public final class ActivityStackSupervisor implements DisplayListener {
}
// Need to create an app stack for this user.
- int stackId = createStackOnDisplay(getNextStackId(), Display.DEFAULT_DISPLAY);
+ mFocusedStack = createStackOnDisplay(getNextStackId(), Display.DEFAULT_DISPLAY);
if (DEBUG_FOCUS || DEBUG_STACK) Slog.d(TAG, "adjustStackFocus: New stack r=" + r +
- " stackId=" + stackId);
- mFocusedStack = getStack(stackId);
+ " stackId=" + mFocusedStack.mStackId);
return mFocusedStack;
}
return mHomeStack;
@@ -2592,16 +2591,16 @@ public final class ActivityStackSupervisor implements DisplayListener {
}
}
- private int createStackOnDisplay(int stackId, int displayId) {
+ ActivityStack createStackOnDisplay(int stackId, int displayId) {
ActivityDisplay activityDisplay = mActivityDisplays.get(displayId);
if (activityDisplay == null) {
- return -1;
+ return null;
}
ActivityContainer activityContainer = new ActivityContainer(stackId);
mActivityContainers.put(stackId, activityContainer);
activityContainer.attachToDisplayLocked(activityDisplay);
- return stackId;
+ return activityContainer.mStack;
}
int getNextStackId() {
@@ -2638,7 +2637,7 @@ public final class ActivityStackSupervisor implements DisplayListener {
// We couldn't find a stack to restore the task to. Possible if are restoring recents
// before an application stack is created...Go ahead and create one on the default
// display.
- stack = getStack(createStackOnDisplay(getNextStackId(), Display.DEFAULT_DISPLAY));
+ stack = createStackOnDisplay(getNextStackId(), Display.DEFAULT_DISPLAY);
// Restore home stack to top.
moveHomeStack(true);
if (DEBUG_RECENTS)