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

Commit b58121c3 authored by Craig Mautner's avatar Craig Mautner Committed by Android (Google) Code Review
Browse files

Merge "Add tap detector for switching stack focus."

parents ab18ec8e cf910b0c
Loading
Loading
Loading
Loading
+21 −1
Original line number Diff line number Diff line
@@ -647,6 +647,14 @@ public abstract class ActivityManagerNative extends Binder implements IActivityM
            return true;
        }

        case SET_FOCUSED_STACK_TRANSACTION: {
            data.enforceInterface(IActivityManager.descriptor);
            int stackId = data.readInt();
            setFocusedStack(stackId);
            reply.writeNoException();
            return true;
        }

        case GET_TASK_FOR_ACTIVITY_TRANSACTION: {
            data.enforceInterface(IActivityManager.descriptor);
            IBinder token = data.readStrongBinder();
@@ -2634,7 +2642,7 @@ class ActivityManagerProxy implements IActivityManager
        data.writeInterfaceToken(IActivityManager.descriptor);
        data.writeInt(stackId);
        data.writeFloat(weight);
        mRemote.transact(RESIZE_STACK_TRANSACTION, data, reply, 0);
        mRemote.transact(RESIZE_STACK_TRANSACTION, data, reply, IBinder.FLAG_ONEWAY);
        reply.readException();
        data.recycle();
        reply.recycle();
@@ -2653,6 +2661,18 @@ class ActivityManagerProxy implements IActivityManager
        reply.recycle();
        return list;
    }
    @Override
    public void setFocusedStack(int stackId) throws RemoteException
    {
        Parcel data = Parcel.obtain();
        Parcel reply = Parcel.obtain();
        data.writeInterfaceToken(IActivityManager.descriptor);
        data.writeInt(stackId);
        mRemote.transact(SET_FOCUSED_STACK_TRANSACTION, data, reply, IBinder.FLAG_ONEWAY);
        reply.readException();
        data.recycle();
        reply.recycle();
    }
    public int getTaskForActivity(IBinder token, boolean onlyRoot) throws RemoteException
    {
        Parcel data = Parcel.obtain();
+16 −6
Original line number Diff line number Diff line
@@ -120,6 +120,7 @@ public interface IActivityManager extends IInterface {
    public void moveTaskToStack(int taskId, int stackId, boolean toTop) throws RemoteException;
    public void resizeStack(int stackId, float weight) throws RemoteException;
    public List<StackInfo> getStacks() throws RemoteException;
    public void setFocusedStack(int stackId) throws RemoteException;
    public int getTaskForActivity(IBinder token, boolean onlyRoot) throws RemoteException;
    /* oneway */
    public void reportThumbnail(IBinder token,
@@ -401,10 +402,12 @@ public interface IActivityManager extends IInterface {
            info = _info;
        }

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

        @Override
        public void writeToParcel(Parcel dest, int flags) {
            info.writeToParcel(dest, 0);
            if (provider != null) {
@@ -418,10 +421,12 @@ public interface IActivityManager extends IInterface {

        public static final Parcelable.Creator<ContentProviderHolder> CREATOR
                = new Parcelable.Creator<ContentProviderHolder>() {
            @Override
            public ContentProviderHolder createFromParcel(Parcel source) {
                return new ContentProviderHolder(source);
            }

            @Override
            public ContentProviderHolder[] newArray(int size) {
                return new ContentProviderHolder[size];
            }
@@ -447,10 +452,12 @@ public interface IActivityManager extends IInterface {
        public WaitResult() {
        }

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

        @Override
        public void writeToParcel(Parcel dest, int flags) {
            dest.writeInt(result);
            dest.writeInt(timeout ? 1 : 0);
@@ -461,10 +468,12 @@ public interface IActivityManager extends IInterface {

        public static final Parcelable.Creator<WaitResult> CREATOR
                = new Parcelable.Creator<WaitResult>() {
            @Override
            public WaitResult createFromParcel(Parcel source) {
                return new WaitResult(source);
            }

            @Override
            public WaitResult[] newArray(int size) {
                return new WaitResult[size];
            }
@@ -650,4 +659,5 @@ public interface IActivityManager extends IInterface {
    int RESIZE_STACK_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+167;
    int SET_USER_IS_MONKEY_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+168;
    int GET_STACKS_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+169;
    int SET_FOCUSED_STACK_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+170;
}
+24 −3
Original line number Diff line number Diff line
@@ -958,6 +958,7 @@ public final class ActivityManagerService extends ActivityManagerNative
    static final int USER_SWITCH_TIMEOUT_MSG = 36;
    static final int IMMERSIVE_MODE_LOCK_MSG = 37;
    static final int PERSIST_URI_GRANTS = 38;
    static final int SET_FOCUSED_STACK = 39;
    static final int FIRST_ACTIVITY_STACK_MSG = 100;
    static final int FIRST_BROADCAST_QUEUE_MSG = 200;
@@ -1446,6 +1447,18 @@ public final class ActivityManagerService extends ActivityManagerNative
                writeGrantedUriPermissions();
                break;
            }
            case SET_FOCUSED_STACK: {
                synchronized (ActivityManagerService.this) {
                    ActivityStack stack = mStackSupervisor.getStack(msg.arg1);
                    if (stack != null) {
                        ActivityRecord r = stack.topRunningActivityLocked(null);
                        if (r != null) {
                            setFocusedActivityLocked(r);
                        }
                    }
                }
                break;
            }
            }
        }
    };
@@ -1935,6 +1948,11 @@ public final class ActivityManagerService extends ActivityManagerNative
        }
    }
    @Override
    public void setFocusedStack(int stackId) {
        mHandler.obtainMessage(SET_FOCUSED_STACK, stackId, 0).sendToTarget();
    }
    final void applyUpdateLockStateLocked(ActivityRecord r) {
        // Modifications to the UpdateLock state are done on our handler, outside
        // the activity manager's locks.  The new state is determined based on the
@@ -4915,6 +4933,7 @@ public final class ActivityManagerService extends ActivityManagerNative
        return false;
    }
    @Override
    public Intent getIntentForIntentSender(IIntentSender pendingResult) {
        if (!(pendingResult instanceof PendingIntentRecord)) {
            return null;
@@ -4927,6 +4946,7 @@ public final class ActivityManagerService extends ActivityManagerNative
        return null;
    }
    @Override
    public void setProcessLimit(int max) {
        enforceCallingPermission(android.Manifest.permission.SET_PROCESS_LIMIT,
                "setProcessLimit()");
@@ -4937,6 +4957,7 @@ public final class ActivityManagerService extends ActivityManagerNative
        trimApplications();
    }
    @Override
    public int getProcessLimit() {
        synchronized (this) {
            return mProcessLimitOverride;
+15 −6
Original line number Diff line number Diff line
@@ -761,7 +761,7 @@ final class ActivityStack {
        return null;
    }

    private final void startPausingLocked(boolean userLeaving, boolean uiSleeping) {
    final void startPausingLocked(boolean userLeaving, boolean uiSleeping) {
        if (mPausingActivity != null) {
            Slog.e(TAG, "Trying to pause when pause is already pending for "
                  + mPausingActivity, new RuntimeException("here").fillInStackTrace());
@@ -1206,6 +1206,7 @@ final class ActivityStack {
            // There are no more activities!  Let's just start up the
            // Launcher...
            ActivityOptions.abort(options);
            if (DEBUG_STACK) mStackSupervisor.validateTopActivitiesLocked();
            return mStackSupervisor.resumeHomeActivity(prev);
        }

@@ -1219,11 +1220,13 @@ final class ActivityStack {
            mWindowManager.executeAppTransition();
            mNoAnimActivities.clear();
            ActivityOptions.abort(options);
            if (DEBUG_STACK) mStackSupervisor.validateTopActivitiesLocked();
            return false;
        }

        if (prev != null && prev.mLaunchHomeTaskNext && prev.finishing &&
                prev.task.getTopActivity() == null) {
            if (DEBUG_STACK)  mStackSupervisor.validateTopActivitiesLocked();
            return mStackSupervisor.resumeHomeActivity(prev);
        }

@@ -1237,6 +1240,7 @@ final class ActivityStack {
            mWindowManager.executeAppTransition();
            mNoAnimActivities.clear();
            ActivityOptions.abort(options);
            if (DEBUG_STACK) mStackSupervisor.validateTopActivitiesLocked();
            return false;
        }

@@ -1246,6 +1250,7 @@ final class ActivityStack {
        if (mService.mStartedUsers.get(next.userId) == null) {
            Slog.w(TAG, "Skipping resume of top activity " + next
                    + ": user " + next.userId + " is stopped");
            if (DEBUG_STACK) mStackSupervisor.validateTopActivitiesLocked();
            return false;
        }

@@ -1264,6 +1269,7 @@ final class ActivityStack {
        // until that is done.
        if (!mStackSupervisor.allPausedActivitiesComplete()) {
            if (DEBUG_SWITCH || DEBUG_PAUSE) Slog.v(TAG, "Skip resume: some activity pausing");
            if (DEBUG_STACK) mStackSupervisor.validateTopActivitiesLocked();
            return false;
        }

@@ -1298,10 +1304,7 @@ final class ActivityStack {

        // We need to start pausing the current activity so the top one
        // can be resumed...
        final ActivityStack lastStack = mStackSupervisor.getLastStack();
        if (lastStack != null && (isHomeStack() ^ lastStack.isHomeStack()) &&
                lastStack.mResumedActivity != null) {
            // TODO: Don't pause when launching to the sibling task.
        if (mStackSupervisor.pauseBackStacks(userLeaving)) {
            if (DEBUG_SWITCH) Slog.v(TAG, "Skip resume: need to start pausing");
            // At this point we want to put the upcoming activity's process
            // at the top of the LRU list, since we know we will be needing it
@@ -1312,7 +1315,7 @@ final class ActivityStack {
                // happen whenever it needs to later.
                mService.updateLruProcessLocked(next.app, false);
            }
            lastStack.startPausingLocked(userLeaving, false);
            if (DEBUG_STACK) mStackSupervisor.validateTopActivitiesLocked();
            return true;
        }

@@ -1420,6 +1423,7 @@ final class ActivityStack {
            next.clearOptionsLocked();
        }

        ActivityStack lastStack = mStackSupervisor.getLastStack();
        if (next.app != null && next.app.thread != null) {
            if (DEBUG_SWITCH) Slog.v(TAG, "Resume running: " + next);

@@ -1472,8 +1476,10 @@ final class ActivityStack {
                }
                if (mStackSupervisor.reportResumedActivityLocked(next)) {
                    mNoAnimActivities.clear();
                    if (DEBUG_STACK) mStackSupervisor.validateTopActivitiesLocked();
                    return true;
                }
                if (DEBUG_STACK) mStackSupervisor.validateTopActivitiesLocked();
                return false;
            }

@@ -1526,6 +1532,7 @@ final class ActivityStack {
                            null, true);
                }
                mStackSupervisor.startSpecificActivityLocked(next, true, false);
                if (DEBUG_STACK) mStackSupervisor.validateTopActivitiesLocked();
                return true;
            }

@@ -1540,6 +1547,7 @@ final class ActivityStack {
                Slog.w(TAG, "Exception thrown during resume of " + next, e);
                requestFinishActivityLocked(next.appToken, Activity.RESULT_CANCELED, null,
                        "resume-exception", true);
                if (DEBUG_STACK) mStackSupervisor.validateTopActivitiesLocked();
                return true;
            }
            next.stopped = false;
@@ -1563,6 +1571,7 @@ final class ActivityStack {
            mStackSupervisor.startSpecificActivityLocked(next, true, true);
        }

        if (DEBUG_STACK) mStackSupervisor.validateTopActivitiesLocked();
        return true;
    }

+44 −4
Original line number Diff line number Diff line
@@ -216,10 +216,6 @@ public class ActivityStackSupervisor {
        return !(stack.isHomeStack() ^ getFocusedStack().isHomeStack());
    }

    boolean homeIsInFront() {
        return isFrontStack(mHomeStack);
    }

    void moveHomeStack(boolean toFront) {
        final boolean homeInFront = isFrontStack(mHomeStack);
        if (homeInFront ^ toFront) {
@@ -390,6 +386,18 @@ public class ActivityStackSupervisor {
        return true;
    }

    boolean pauseBackStacks(boolean userLeaving) {
        boolean someActivityPaused = false;
        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
            final ActivityStack stack = mStacks.get(stackNdx);
            if (!isFrontStack(stack) && stack.mResumedActivity != null) {
                stack.startPausingLocked(userLeaving, false);
                someActivityPaused = true;
            }
        }
        return someActivityPaused;
    }

    boolean allPausedActivitiesComplete() {
        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
            final ActivityStack stack = mStacks.get(stackNdx);
@@ -1983,6 +1991,38 @@ public class ActivityStackSupervisor {
        return stops;
    }

    void validateTopActivitiesLocked() {
        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
            final ActivityStack stack = mStacks.get(stackNdx);
            final ActivityRecord r = stack.topRunningActivityLocked(null);
            if (isFrontStack(stack)) {
                if (r == null) {
                    Slog.e(TAG, "validateTop...: null top activity, stack=" + stack);
                } else {
                    if (stack.mPausingActivity != null) {
                        Slog.e(TAG, "validateTop...: top stack has pausing activity r=" + r +
                            " state=" + r.state);
                    }
                    if (r.state != ActivityState.INITIALIZING &&
                            r.state != ActivityState.RESUMED) {
                        Slog.e(TAG, "validateTop...: activity in front not resumed r=" + r +
                                " state=" + r.state);
                    }
                }
            } else {
                if (stack.mResumedActivity != null) {
                    Slog.e(TAG, "validateTop...: back stack has resumed activity r=" + r +
                        " state=" + r.state);
                }
                if (r != null && (r.state == ActivityState.INITIALIZING
                        || r.state == ActivityState.RESUMED)) {
                    Slog.e(TAG, "validateTop...: activity in back resumed r=" + r +
                            " state=" + r.state);
                }
            }
        }
    }

    public void dump(PrintWriter pw, String prefix) {
        pw.print(prefix); pw.print("mDismissKeyguardOnNextActivity:");
                pw.println(mDismissKeyguardOnNextActivity);
Loading