Fix ConcurrentModificationExceptions during binding.

The same lists of extra items stored in BgModelData are also stored in
UI components. This is causing ConcurrentModificationExceptions. The
solution is to clone these lists or mark them as immutable before storing
them in their respective components.

Bug: 206918543
Test: Verified that crash no longer occurs after fix.
Change-Id: I571a2c451af58137aa7513b372b6a8ecf9bd3ff6
This commit is contained in:
Stefan Andonian
2022-11-17 18:56:09 +00:00
parent 698239e16a
commit a04de842d1
6 changed files with 17 additions and 28 deletions

View File

@@ -34,8 +34,10 @@ import com.android.launcher3.Utilities;
import com.android.launcher3.model.BgDataModel.FixedContainerItems;
import com.android.launcher3.model.QuickstepModelDelegate.PredictorState;
import com.android.launcher3.model.data.AppInfo;
import com.android.launcher3.model.data.ItemInfo;
import com.android.launcher3.model.data.WorkspaceItemInfo;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
@@ -68,7 +70,7 @@ public class PredictionUpdateTask extends BaseModelUpdateTask {
.map(info -> info.user)
.collect(Collectors.toSet());
FixedContainerItems fci = new FixedContainerItems(mPredictorState.containerId);
List<ItemInfo> items = new ArrayList<>(mTargets.size());
for (AppTarget target : mTargets) {
WorkspaceItemInfo itemInfo;
ShortcutInfo si = target.getShortcutInfo();
@@ -107,10 +109,11 @@ public class PredictionUpdateTask extends BaseModelUpdateTask {
}
}
itemInfo.container = fci.containerId;
fci.items.add(itemInfo);
itemInfo.container = mPredictorState.containerId;
items.add(itemInfo);
}
FixedContainerItems fci = new FixedContainerItems(mPredictorState.containerId, items);
dataModel.extraItems.put(fci.containerId, fci);
bindExtraContainerItems(fci);
usersForChangedShortcuts.forEach(