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

Commit cf910b0c authored by Craig Mautner's avatar Craig Mautner
Browse files

Add tap detector for switching stack focus.

- New InputEventReceiver for detecting taps outside of focused stack
boundaries.
- Fixed bug that wasn't pausing the non-focused window when returning
home.

Change-Id: Ia51d312a7c029abc01eb5df1102814cc29d33b47
parent f3333277
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