Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5ff12101 authored by Craig Mautner's avatar Craig Mautner
Browse files

Add retrieval of StackBox info for more flexibility

First step in permitting StackBoxes to be manipulated by user.
Necessary for Configuration changes coming down.

Change-Id: I4029926a35e4fdc59a5759fd9e4bae10bb308413
parent 6d90fed0
Loading
Loading
Loading
Loading
+10 −10
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@
package com.android.commands.am;

import android.app.ActivityManager;
import android.app.ActivityManager.StackBoxInfo;
import android.app.ActivityManagerNative;
import android.app.IActivityController;
import android.app.IActivityManager;
@@ -105,7 +106,7 @@ public class Am extends BaseCommand {
                "       am stack create <TASK_ID> <RELATIVE_STACK_ID> <POSITION> <WEIGHT>\n" +
                "       am stack movetask <STACK_ID> <TASK_ID> [true|false]\n" +
                "       am stack resize <STACK_ID> <WEIGHT>\n" +
                "       am stack dump\n" +
                "       am stack boxes\n" +
                "\n" +
                "am start: start an Activity.  Options are:\n" +
                "    -D: enable debugging\n" +
@@ -202,7 +203,7 @@ public class Am extends BaseCommand {
                "\n" +
                "am stack resize: change <STACK_ID> relative size to new <WEIGHT>.\n" +
                "\n" +
                "am stack dump: list the hierarchy of stacks.\n" +
                "am stack boxes: list the hierarchy of stack boxes and their contents.\n" +
                "\n" +
                "<INTENT> specifications include these flags and arguments:\n" +
                "    [-a <ACTION>] [-d <DATA_URI>] [-t <MIME_TYPE>]\n" +
@@ -1120,8 +1121,7 @@ public class Am extends BaseCommand {
        }

        @Override
        public int systemNotResponding(String message)
                throws RemoteException {
        public int systemNotResponding(String message) {
            synchronized (this) {
                System.out.println("** ERROR: PROCESS NOT RESPONDING");
                System.out.println("message: " + message);
@@ -1486,8 +1486,8 @@ public class Am extends BaseCommand {
            runStackMoveTask();
        } else if (op.equals("resize")) {
            runStackResize();
        } else if (op.equals("dump")) {
            runStackDump();
        } else if (op.equals("boxes")) {
            runStackBoxes();
        } else {
            showError("Error: unknown command '" + op + "'");
            return;
@@ -1545,11 +1545,11 @@ public class Am extends BaseCommand {
        }
    }

    private void runStackDump() throws Exception {
    private void runStackBoxes() throws Exception {
        try {
            List<ActivityManager.StackInfo> stacks = mAm.getStacks();
            for (ActivityManager.StackInfo stack : stacks) {
                System.out.println(stack);
            List<StackBoxInfo> stackBoxes = mAm.getStackBoxes();
            for (StackBoxInfo info : stackBoxes) {
                System.out.println(info);
            }
        } catch (RemoteException e) {
        }
+105 −8
Original line number Diff line number Diff line
@@ -1238,6 +1238,97 @@ public class ActivityManager {
        }
    }

    /**
     * Information you can retrieve about the WindowManager StackBox hierarchy.
     * @hide
     */
    public static class StackBoxInfo implements Parcelable {
        public int stackBoxId;
        public float weight;
        public boolean vertical;
        public Rect bounds;
        public StackBoxInfo[] children;
        public int stackId;
        public StackInfo stack;

        @Override
        public int describeContents() {
            return 0;
        }

        @Override
        public void writeToParcel(Parcel dest, int flags) {
            dest.writeInt(stackBoxId);
            dest.writeFloat(weight);
            dest.writeInt(vertical ? 1 : 0);
            bounds.writeToParcel(dest, flags);
            dest.writeInt(stackId);
            if (children != null) {
                children[0].writeToParcel(dest, flags);
                children[1].writeToParcel(dest, flags);
            } else {
                stack.writeToParcel(dest, flags);
            }
        }

        public void readFromParcel(Parcel source) {
            stackBoxId = source.readInt();
            weight = source.readFloat();
            vertical = source.readInt() == 1;
            bounds = Rect.CREATOR.createFromParcel(source);
            stackId = source.readInt();
            if (stackId == -1) {
                children = new StackBoxInfo[2];
                children[0] = StackBoxInfo.CREATOR.createFromParcel(source);
                children[1] = StackBoxInfo.CREATOR.createFromParcel(source);
            } else {
                stack = StackInfo.CREATOR.createFromParcel(source);
            }
        }

        public static final Creator<StackBoxInfo> CREATOR =
                new Creator<ActivityManager.StackBoxInfo>() {

            @Override
            public StackBoxInfo createFromParcel(Parcel source) {
                return new StackBoxInfo(source);
            }

            @Override
            public StackBoxInfo[] newArray(int size) {
                return new StackBoxInfo[size];
            }
        };

        public StackBoxInfo() {
        }

        public StackBoxInfo(Parcel source) {
            readFromParcel(source);
        }

        public String toString(String prefix) {
            StringBuilder sb = new StringBuilder(256);
            sb.append(prefix); sb.append("Box id=" + stackBoxId); sb.append(" weight=" + weight);
            sb.append(" vertical=" + vertical); sb.append(" bounds=" + bounds.toShortString());
            sb.append("\n");
            if (children != null) {
                sb.append(prefix); sb.append("First child=\n");
                sb.append(children[0].toString(prefix + "  "));
                sb.append(prefix); sb.append("Second child=\n");
                sb.append(children[1].toString(prefix + "  "));
            } else {
                sb.append(prefix); sb.append("Stack=\n");
                sb.append(stack.toString(prefix + "  "));
            }
            return sb.toString();
        }

        @Override
        public String toString() {
            return toString("");
        }
    }

    /**
     * Information you can retrieve about an ActivityStack in the system.
@@ -1249,9 +1340,6 @@ public class ActivityManager {
        public int[] taskIds;
        public String[] taskNames;

        public StackInfo() {
        }

        @Override
        public int describeContents() {
            return 0;
@@ -1287,22 +1375,29 @@ public class ActivityManager {
            }
        };

        public StackInfo() {
        }

        private StackInfo(Parcel source) {
            readFromParcel(source);
        }

        @Override
        public String toString() {
        public String toString(String prefix) {
            StringBuilder sb = new StringBuilder(256);
            sb.append("Stack id="); sb.append(stackId);
            sb.append(prefix); sb.append("Stack id="); sb.append(stackId);
                    sb.append(" bounds="); sb.append(bounds.toShortString()); sb.append("\n");
            final String prefix = "  ";
            prefix = prefix + "  ";
            for (int i = 0; i < taskIds.length; ++i) {
                sb.append(prefix); sb.append("taskId="); sb.append(taskIds[i]);
                        sb.append(": "); sb.append(taskNames[i]); sb.append("\n");
            }
            return sb.toString();
        }

        @Override
        public String toString() {
            return toString("");
        }
    }

    /**
@@ -1378,10 +1473,12 @@ public class ActivityManager {
        public ProcessErrorStateInfo() {
        }

        @Override
        public int describeContents() {
            return 0;
        }

        @Override
        public void writeToParcel(Parcel dest, int flags) {
            dest.writeInt(condition);
            dest.writeString(processName);
+25 −3
Original line number Diff line number Diff line
@@ -16,6 +16,8 @@

package android.app;

import android.app.ActivityManager.StackBoxInfo;
import android.app.ActivityManager.StackInfo;
import android.content.ComponentName;
import android.content.IIntentReceiver;
import android.content.IIntentSender;
@@ -647,6 +649,14 @@ public abstract class ActivityManagerNative extends Binder implements IActivityM
            return true;
        }

        case GET_STACK_BOXES_TRANSACTION: {
            data.enforceInterface(IActivityManager.descriptor);
            List<StackBoxInfo> list = getStackBoxes();
            reply.writeNoException();
            reply.writeTypedList(list);
            return true;
        }

        case SET_FOCUSED_STACK_TRANSACTION: {
            data.enforceInterface(IActivityManager.descriptor);
            int stackId = data.readInt();
@@ -2657,15 +2667,27 @@ class ActivityManagerProxy implements IActivityManager
        reply.recycle();
    }
    @Override
    public List<ActivityManager.StackInfo> getStacks() throws RemoteException
    public List<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);
        ArrayList<StackInfo> list = reply.createTypedArrayList(StackInfo.CREATOR);
        data.recycle();
        reply.recycle();
        return list;
    }
    @Override
    public List<StackBoxInfo> getStackBoxes() throws RemoteException
    {
        Parcel data = Parcel.obtain();
        Parcel reply = Parcel.obtain();
        data.writeInterfaceToken(IActivityManager.descriptor);
        mRemote.transact(GET_STACK_BOXES_TRANSACTION, data, reply, 0);
        reply.readException();
        ArrayList<StackBoxInfo> list = reply.createTypedArrayList(StackBoxInfo.CREATOR);
        data.recycle();
        reply.recycle();
        return list;
+3 −0
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@ package android.app;

import android.app.ActivityManager.RunningTaskInfo;
import android.app.ActivityManager.RunningServiceInfo;
import android.app.ActivityManager.StackBoxInfo;
import android.app.ActivityManager.StackInfo;
import android.content.ComponentName;
import android.content.ContentProviderNative;
@@ -119,6 +120,7 @@ public interface IActivityManager extends IInterface {
            throws RemoteException;
    public void moveTaskToStack(int taskId, int stackId, boolean toTop) throws RemoteException;
    public void resizeStack(int stackId, float weight) throws RemoteException;
    public List<StackBoxInfo> getStackBoxes() throws RemoteException;
    public List<StackInfo> getStacks() throws RemoteException;
    public void setFocusedStack(int stackId) throws RemoteException;
    public int getTaskForActivity(IBinder token, boolean onlyRoot) throws RemoteException;
@@ -663,4 +665,5 @@ public interface IActivityManager extends IInterface {
    int RESIZE_STACK_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+169;
    int GET_STACKS_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+170;
    int SET_FOCUSED_STACK_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+171;
    int GET_STACK_BOXES_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+172;
}
+31 −1
Original line number Diff line number Diff line
@@ -58,6 +58,8 @@ import org.xmlpull.v1.XmlSerializer;
import android.app.Activity;
import android.app.ActivityManager;
import android.app.ActivityManager.RunningTaskInfo;
import android.app.ActivityManager.StackBoxInfo;
import android.app.ActivityManager.StackInfo;
import android.app.ActivityManagerNative;
import android.app.ActivityOptions;
import android.app.ActivityThread;
@@ -6352,7 +6354,7 @@ public final class ActivityManagerService extends ActivityManagerNative
    }
    @Override
    public List<ActivityManager.StackInfo> getStacks() {
    public List<StackInfo> getStacks() {
        synchronized (this) {
            ArrayList<ActivityManager.StackInfo> list = new ArrayList<ActivityManager.StackInfo>();
            ArrayList<ActivityStack> stacks = mStackSupervisor.getStacks();
@@ -6381,6 +6383,34 @@ public final class ActivityManagerService extends ActivityManagerNative
        }
    }
    private void addStackInfoToStackBoxInfo(StackBoxInfo stackBoxInfo, List<StackInfo> stackInfos) {
        final int stackId = stackBoxInfo.stackId;
        if (stackId >= 0) {
            for (StackInfo stackInfo : stackInfos) {
                if (stackId == stackInfo.stackId) {
                    stackBoxInfo.stack = stackInfo;
                    stackInfos.remove(stackInfo);
                    return;
                }
            }
        } else {
            addStackInfoToStackBoxInfo(stackBoxInfo.children[0], stackInfos);
            addStackInfoToStackBoxInfo(stackBoxInfo.children[1], stackInfos);
        }
    }
    @Override
    public List<StackBoxInfo> getStackBoxes() {
        List<StackBoxInfo> stackBoxInfos = mWindowManager.getStackBoxInfos();
        synchronized (this) {
            List<StackInfo> stackInfos = getStacks();
            for (StackBoxInfo stackBoxInfo : stackBoxInfos) {
                addStackInfoToStackBoxInfo(stackBoxInfo, stackInfos);
            }
        }
        return stackBoxInfos;
    }
    @Override
    public int getTaskForActivity(IBinder token, boolean onlyRoot) {
        synchronized(this) {
Loading