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

Commit cd7fba66 authored by Shubang Lu's avatar Shubang Lu Committed by Android (Google) Code Review
Browse files

Merge "Fix ConcurrentModificationException in TvInputManagerService"

parents e8f76a36 af2fb660
Loading
Loading
Loading
Loading
+17 −5
Original line number Original line Diff line number Diff line
@@ -626,7 +626,7 @@ public final class TvInputManagerService extends SystemService {
        updateServiceConnectionLocked(serviceState.component, userId);
        updateServiceConnectionLocked(serviceState.component, userId);
    }
    }


    private void createSessionInternalLocked(ITvInputService service, IBinder sessionToken,
    private boolean createSessionInternalLocked(ITvInputService service, IBinder sessionToken,
            int userId) {
            int userId) {
        UserState userState = getOrCreateUserStateLocked(userId);
        UserState userState = getOrCreateUserStateLocked(userId);
        SessionState sessionState = userState.sessionStateMap.get(sessionToken);
        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.
        // Set up a callback to send the session token.
        ITvInputSessionCallback callback = new SessionCallback(sessionState, channels);
        ITvInputSessionCallback callback = new SessionCallback(sessionState, channels);


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


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


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


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

                // And create sessions, if any.
                // And create sessions, if any.
                for (IBinder sessionToken : serviceState.sessionTokens) {
                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()) {
                for (TvInputState inputState : userState.inputMap.values()) {