Implement stack splitting and task movement.

Split stacks and move tasks between them. Layout the windows
according to the new stack split.

After layout content rectangles are known split the available area
between all stack boxes. Then use those values for future layout.

Provide stack contents to ActivityManager.

Change-Id: I9746e6185445633810d506be514d0b7b540a7f99
diff --git a/core/java/android/app/ActivityManagerNative.java b/core/java/android/app/ActivityManagerNative.java
index f35584b..b089e2a 100644
--- a/core/java/android/app/ActivityManagerNative.java
+++ b/core/java/android/app/ActivityManagerNative.java
@@ -639,6 +639,14 @@
             return true;
         }
 
+        case GET_STACKS_TRANSACTION: {
+            data.enforceInterface(IActivityManager.descriptor);
+            List<ActivityManager.StackInfo> list = getStacks();
+            reply.writeNoException();
+            reply.writeTypedList(list);
+            return true;
+        }
+
         case GET_TASK_FOR_ACTIVITY_TRANSACTION: {
             data.enforceInterface(IActivityManager.descriptor);
             IBinder token = data.readStrongBinder();
@@ -2591,6 +2599,7 @@
     {
         Parcel data = Parcel.obtain();
         Parcel reply = Parcel.obtain();
+        data.writeInterfaceToken(IActivityManager.descriptor);
         data.writeInt(position);
         data.writeInt(relativeStackId);
         data.writeFloat(weight);
@@ -2606,6 +2615,7 @@
     {
         Parcel data = Parcel.obtain();
         Parcel reply = Parcel.obtain();
+        data.writeInterfaceToken(IActivityManager.descriptor);
         data.writeInt(taskId);
         data.writeInt(stackId);
         data.writeInt(toTop ? 1 : 0);
@@ -2619,6 +2629,7 @@
     {
         Parcel data = Parcel.obtain();
         Parcel reply = Parcel.obtain();
+        data.writeInterfaceToken(IActivityManager.descriptor);
         data.writeInt(stackId);
         data.writeFloat(weight);
         mRemote.transact(RESIZE_STACK_TRANSACTION, data, reply, 0);
@@ -2626,6 +2637,20 @@
         data.recycle();
         reply.recycle();
     }
+    @Override
+    public List<ActivityManager.StackInfo> getStacks() throws RemoteException
+    {
+        Parcel data = Parcel.obtain();
+        Parcel reply = Parcel.obtain();
+        data.writeInterfaceToken(IActivityManager.descriptor);
+        mRemote.transact(GET_STACKS_TRANSACTION, data, reply, 0);
+        reply.readException();
+        ArrayList<ActivityManager.StackInfo> list
+                = reply.createTypedArrayList(ActivityManager.StackInfo.CREATOR);
+        data.recycle();
+        reply.recycle();
+        return list;
+    }
     public int getTaskForActivity(IBinder token, boolean onlyRoot) throws RemoteException
     {
         Parcel data = Parcel.obtain();