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

Commit a38666bc authored by Philip P. Moltmann's avatar Philip P. Moltmann
Browse files

Safeguard against uncommon scenarios when pruning

E.g. more than one session by activity token

Also
- use cheaper datastructure to store sessions temporarily.
- Fix dumping when there are not responses

Fixes: 38203308
Test: Created two sessions, put them in background. Killed the apps, killed the tasks.
      Waited 30 second and started new sessions -> Saw sessions pruned.
Change-Id: I8fe94773a3381617779e5bdded317f3744c831e5
parent a22a5d83
Loading
Loading
Loading
Loading
+8 −6
Original line number Diff line number Diff line
@@ -621,16 +621,17 @@ final class AutofillManagerServiceImpl {
        @Override
        protected Void doInBackground(Void... ignored) {
            int numSessionsToRemove;
            ArrayMap<IBinder, Integer> sessionsToRemove;

            SparseArray<IBinder> sessionsToRemove;

            synchronized (mLock) {
                numSessionsToRemove = mSessions.size();
                sessionsToRemove = new ArrayMap<>(numSessionsToRemove);
                sessionsToRemove = new SparseArray<>(numSessionsToRemove);

                for (int i = 0; i < numSessionsToRemove; i++) {
                    Session session = mSessions.valueAt(i);

                    sessionsToRemove.put(session.getActivityTokenLocked(), session.id);
                    sessionsToRemove.put(session.id, session.getActivityTokenLocked());
                }
            }

@@ -640,7 +641,7 @@ final class AutofillManagerServiceImpl {
            for (int i = 0; i < numSessionsToRemove; i++) {
                try {
                    // The activity manager cannot resolve activities that have been removed
                    if (am.getActivityClassForToken(sessionsToRemove.keyAt(i)) != null) {
                    if (am.getActivityClassForToken(sessionsToRemove.valueAt(i)) != null) {
                        sessionsToRemove.removeAt(i);
                        i--;
                        numSessionsToRemove--;
@@ -652,9 +653,10 @@ final class AutofillManagerServiceImpl {

            synchronized (mLock) {
                for (int i = 0; i < numSessionsToRemove; i++) {
                    Session sessionToRemove = mSessions.get(sessionsToRemove.valueAt(i));
                    Session sessionToRemove = mSessions.get(sessionsToRemove.keyAt(i));

                    if (sessionToRemove != null) {
                    if (sessionToRemove != null && sessionsToRemove.valueAt(i)
                            == sessionToRemove.getActivityTokenLocked()) {
                        if (sessionToRemove.isSavingLocked()) {
                            if (sVerbose) {
                                Slog.v(TAG, "Session " + sessionToRemove.id + " is saving");
+9 −4
Original line number Diff line number Diff line
@@ -1369,10 +1369,15 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
        pw.print(prefix); pw.print("id: "); pw.println(id);
        pw.print(prefix); pw.print("uid: "); pw.println(uid);
        pw.print(prefix); pw.print("mActivityToken: "); pw.println(mActivityToken);
        pw.print(prefix); pw.print("mResponses: "); pw.println(mResponses.size());
        pw.print(prefix); pw.print("mResponses: ");
        if (mResponses == null) {
            pw.println("null");
        } else {
            pw.println(mResponses.size());
            for (int i = 0; i < mResponses.size(); i++) {
            pw.print(prefix2); pw.print('#'); pw.print(i); pw.print(' ');
                pw.println(mResponses.valueAt(i));
                pw.print(prefix2); pw.print('#'); pw.print(i);
                pw.print(' '); pw.println(mResponses.valueAt(i));
            }
        }
        pw.print(prefix); pw.print("mCurrentViewId: "); pw.println(mCurrentViewId);
        pw.print(prefix); pw.print("mViewStates size: "); pw.println(mViewStates.size());