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

Commit 03b821a8 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Automerger Merge Worker
Browse files

Merge "Fixing ConcurrentModificationException in FirstScreenBroadcast" into...

Merge "Fixing ConcurrentModificationException in FirstScreenBroadcast" into tm-dev am: 69149d07 am: 0210441e

Original change: https://googleplex-android-review.googlesource.com/c/platform/packages/apps/Launcher3/+/18580078



Change-Id: Ia134caf82253fa4d00e5dba1d7a6ff4488c5f467
Signed-off-by: default avatarAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
parents 1fa184c7 0210441e
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();
        }
    }
}