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

Commit af2fb660 authored by shubang's avatar shubang Committed by Shubang Lu
Browse files

Fix ConcurrentModificationException in TvInputManagerService

Bug: 116538734
Test: m
Change-Id: Ieb715b2a7b9ff54f543d79881dc0c910a310a26c
(cherry picked from commit 0854b7d6807e39d99804944e2ad824b023a1f31d)
parent 122c0879
Loading
Loading
Loading
Loading
+17 −5
Original line number Diff line number Diff line
@@ -626,7 +626,7 @@ public final class TvInputManagerService extends SystemService {
        updateServiceConnectionLocked(serviceState.component, userId);
    }

    private void createSessionInternalLocked(ITvInputService service, IBinder sessionToken,
    private boolean createSessionInternalLocked(ITvInputService service, IBinder sessionToken,
            int userId) {
        UserState userState = getOrCreateUserStateLocked(userId);
        SessionState sessionState = userState.sessionStateMap.get(sessionToken);
@@ -638,6 +638,7 @@ public final class TvInputManagerService extends SystemService {
        // Set up a callback to send the session token.
        ITvInputSessionCallback callback = new SessionCallback(sessionState, channels);

        boolean created = true;
        // Create a session. When failed, send a null token immediately.
        try {
            if (sessionState.isRecordingSession) {
@@ -647,11 +648,12 @@ public final class TvInputManagerService extends SystemService {
            }
        } catch (RemoteException e) {
            Slog.e(TAG, "error in createSession", e);
            removeSessionStateLocked(sessionToken, userId);
            sendSessionTokenToClientLocked(sessionState.client, sessionState.inputId, null,
                    null, sessionState.seq);
            created = false;
        }
        channels[1].dispose();
        return created;
    }

    private void sendSessionTokenToClientLocked(ITvInputClient client, String inputId,
@@ -1193,8 +1195,10 @@ public final class TvInputManagerService extends SystemService {
                    serviceState.sessionTokens.add(sessionToken);

                    if (serviceState.service != null) {
                        createSessionInternalLocked(serviceState.service, sessionToken,
                                resolvedUserId);
                        if (!createSessionInternalLocked(serviceState.service, sessionToken,
                                resolvedUserId)) {
                            removeSessionStateLocked(sessionToken, resolvedUserId);
                        }
                    } else {
                        updateServiceConnectionLocked(info.getComponent(), resolvedUserId);
                    }
@@ -2282,9 +2286,17 @@ public final class TvInputManagerService extends SystemService {
                    }
                }

                List<IBinder> tokensToBeRemoved = new ArrayList<>();

                // And create sessions, if any.
                for (IBinder sessionToken : serviceState.sessionTokens) {
                    createSessionInternalLocked(serviceState.service, sessionToken, mUserId);
                    if (!createSessionInternalLocked(serviceState.service, sessionToken, mUserId)) {
                        tokensToBeRemoved.add(sessionToken);
                    }
                }

                for (IBinder sessionToken : tokensToBeRemoved) {
                    removeSessionStateLocked(sessionToken, mUserId);
                }

                for (TvInputState inputState : userState.inputMap.values()) {