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

Commit db8579ff authored by Weilin Xu's avatar Weilin Xu
Browse files

Fix purge bug for program list update

Fix the bug that using keySet and removing items of mPrograms at
the same time during program list update

Bug: 238199883
Test: atest android.hardware.radio.tests.functional
Test: atest com.android.server.broadcastradio.hal2
Change-Id: Ie958b3686780de8c6f3b9912c71dcfe7c07befd0
Merged-In: Ie958b3686780de8c6f3b9912c71dcfe7c07befd0
(cherry picked from commit 92a2339b)
parent 45b54016
Loading
Loading
Loading
Loading
+11 −4
Original line number Original line Diff line number Diff line
@@ -22,10 +22,11 @@ import android.annotation.Nullable;
import android.annotation.SystemApi;
import android.annotation.SystemApi;
import android.os.Parcel;
import android.os.Parcel;
import android.os.Parcelable;
import android.os.Parcelable;
import android.util.ArrayMap;


import java.util.ArrayList;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.List;
import java.util.Map;
import java.util.Map;
import java.util.Objects;
import java.util.Objects;
@@ -41,7 +42,7 @@ public final class ProgramList implements AutoCloseable {


    private final Object mLock = new Object();
    private final Object mLock = new Object();
    private final Map<ProgramSelector.Identifier, RadioManager.ProgramInfo> mPrograms =
    private final Map<ProgramSelector.Identifier, RadioManager.ProgramInfo> mPrograms =
            new HashMap<>();
            new ArrayMap<>();


    private final List<ListCallback> mListCallbacks = new ArrayList<>();
    private final List<ListCallback> mListCallbacks = new ArrayList<>();
    private final List<OnCompleteListener> mOnCompleteListeners = new ArrayList<>();
    private final List<OnCompleteListener> mOnCompleteListeners = new ArrayList<>();
@@ -184,8 +185,14 @@ public final class ProgramList implements AutoCloseable {
            listCallbacksCopied = new ArrayList<>(mListCallbacks);
            listCallbacksCopied = new ArrayList<>(mListCallbacks);


            if (chunk.isPurge()) {
            if (chunk.isPurge()) {
                for (ProgramSelector.Identifier id : mPrograms.keySet()) {
                Iterator<Map.Entry<ProgramSelector.Identifier, RadioManager.ProgramInfo>>
                    removeLocked(id, removedList);
                        programsIterator = mPrograms.entrySet().iterator();
                while (programsIterator.hasNext()) {
                    RadioManager.ProgramInfo removed = programsIterator.next().getValue();
                    if (removed != null) {
                        removedList.add(removed.getSelector().getPrimaryId());
                    }
                    programsIterator.remove();
                }
                }
            }
            }