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

Commit 40d0dcd9 authored by Hui Yu's avatar Hui Yu
Browse files

Fix a outer loop iterates on item that is removed by inner loop problem.

updateForegroundApps() has the outer loop that iterate on mActiveForegroundApps,
but inside the loop stopAllForegroundServicesLocked() calls setServiceForegroundInnerLocked()
which calls decActiveForegroundAppLocked() to remove item from
mActiveForegroundApps, the end result is an ArrayIndexOutOfBoundsException.

Bug: 243841000
Test: build and run
Change-Id: Ia64816799fb7d36c481f382496c035e2ab85c2a3
(cherry picked from commit 7cfc1c2d)
parent e3d78002
Loading
Loading
Loading
Loading
+6 −1
Original line number Diff line number Diff line
@@ -522,6 +522,7 @@ public final class ActiveServices {
        final ArrayList<ServiceRecord> mStartingBackground = new ArrayList<>();

        final ArrayMap<String, ActiveForegroundApp> mActiveForegroundApps = new ArrayMap<>();
        final ArrayList<String> mPendingRemoveForegroundApps = new ArrayList<>();

        boolean mActiveForegroundAppsChanged;

@@ -1687,13 +1688,14 @@ public final class ActiveServices {
            if (smap != null) {
                if (DEBUG_FOREGROUND_SERVICE) Slog.d(TAG, "Updating foreground apps for user "
                        + smap.mUserId);
                smap.mPendingRemoveForegroundApps.clear();
                for (int i = smap.mActiveForegroundApps.size()-1; i >= 0; i--) {
                    ActiveForegroundApp aa = smap.mActiveForegroundApps.valueAt(i);
                    if (aa.mEndTime != 0) {
                        boolean canRemove = foregroundAppShownEnoughLocked(aa, now);
                        if (canRemove) {
                            // This was up for longer than the timeout, so just remove immediately.
                            smap.mActiveForegroundApps.removeAt(i);
                            smap.mPendingRemoveForegroundApps.add(smap.mActiveForegroundApps.keyAt(i));
                            smap.mActiveForegroundAppsChanged = true;
                            continue;
                        }
@@ -1718,6 +1720,9 @@ public final class ActiveServices {
                        }
                    }
                }
                for(int i = smap.mPendingRemoveForegroundApps.size() - 1; i >= 0; i--) {
                    smap.mActiveForegroundApps.remove(smap.mPendingRemoveForegroundApps.get(i));
                }
                smap.removeMessages(ServiceMap.MSG_UPDATE_FOREGROUND_APPS);
                if (nextUpdateTime < Long.MAX_VALUE) {
                    if (DEBUG_FOREGROUND_SERVICE) Slog.d(TAG, "Next update time in: "