Loading src/com/android/launcher3/model/FirstScreenBroadcast.java +22 −1 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading Loading @@ -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 Loading @@ -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<>(); Loading @@ -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)) { Loading Loading @@ -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(); } } } Loading
src/com/android/launcher3/model/FirstScreenBroadcast.java +22 −1 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading Loading @@ -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 Loading @@ -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<>(); Loading @@ -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)) { Loading Loading @@ -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(); } } }