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

Commit 425bfa32 authored by Sunny Goyal's avatar Sunny Goyal
Browse files

Fixing ConcurrentModificationException in FirstScreenBroadcast

Bug: 232333237
Test: Not sure, unable to reproduce
Change-Id: I3eeabf76c14651d2fb64c82955851efa883760ce
parent 29405655
Loading
Loading
Loading
Loading
+22 −1
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@ import static android.app.PendingIntent.FLAG_ONE_SHOT;
import static android.os.Process.myUserHandle;

import static com.android.launcher3.pm.InstallSessionHelper.getUserHandle;
import static com.android.launcher3.util.Executors.MAIN_EXECUTOR;

import static java.util.stream.Collectors.groupingBy;
import static java.util.stream.Collectors.mapping;
@@ -31,13 +32,18 @@ import android.content.pm.PackageInstaller.SessionInfo;
import android.os.UserHandle;
import android.util.Log;

import androidx.annotation.AnyThread;
import androidx.annotation.WorkerThread;

import com.android.launcher3.LauncherSettings;
import com.android.launcher3.model.data.FolderInfo;
import com.android.launcher3.model.data.ItemInfo;
import com.android.launcher3.model.data.LauncherAppWidgetInfo;
import com.android.launcher3.model.data.WorkspaceItemInfo;
import com.android.launcher3.util.PackageUserKey;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
@@ -78,6 +84,7 @@ public class FirstScreenBroadcast {
     * Sends a broadcast to all package installers that have items with active sessions on the users
     * first screen.
     */
    @WorkerThread
    public void sendBroadcasts(Context context, List<ItemInfo> firstScreenItems) {
        UserHandle myUser = myUserHandle();
        mSessionInfoForPackage
@@ -95,6 +102,7 @@ public class FirstScreenBroadcast {
     * @param packages List of packages with active sessions for this package installer.
     * @param firstScreenItems List of items on the first screen.
     */
    @WorkerThread
    private void sendBroadcastToInstaller(Context context, String installerPackageName,
            Set<String> packages, List<ItemInfo> firstScreenItems) {
        Set<String> folderItems = new HashSet<>();
@@ -106,7 +114,7 @@ public class FirstScreenBroadcast {
            if (info instanceof FolderInfo) {
                FolderInfo folderInfo = (FolderInfo) info;
                String folderItemInfoPackage;
                for (ItemInfo folderItemInfo : folderInfo.contents) {
                for (ItemInfo folderItemInfo : cloneOnMainThread(folderInfo.contents)) {
                    folderItemInfoPackage = getPackageName(folderItemInfo);
                    if (folderItemInfoPackage != null
                            && packages.contains(folderItemInfoPackage)) {
@@ -170,4 +178,17 @@ public class FirstScreenBroadcast {
            Log.d(TAG, packageInstaller + ":" + label + ":" + pkg);
        }
    }

    /**
     * Clone the provided list on UI thread. This is used for {@link FolderInfo#contents} which
     * is always modified on UI thread.
     */
    @AnyThread
    private static List<WorkspaceItemInfo> cloneOnMainThread(ArrayList<WorkspaceItemInfo> list) {
        try {
            return MAIN_EXECUTOR.submit(() -> new ArrayList(list)).get();
        } catch (Exception e) {
            return Collections.emptyList();
        }
    }
}