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

Commit 9cd63c97 authored by Pinyao Ting's avatar Pinyao Ting
Browse files

Prevents a ConcurrentModificationException in Widget

InvariantDeviceProfile.supportedProfiles can be modified in respect to
configuration changes. This CL ensures the list was cloned before access
to prevent ConcurrentModificationException

Bug: 191231591
Test: manual
Change-Id: I123458dcfe99af4babca2cf73733e3d2af0fad3c
parent f89c4280
Loading
Loading
Loading
Loading
+7 −2
Original line number Diff line number Diff line
@@ -36,6 +36,10 @@ import org.mockito.MockitoAnnotations;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

@RunWith(RobolectricTestRunner.class)
public final class LauncherAppWidgetProviderInfoTest {

@@ -234,10 +238,11 @@ public final class LauncherAppWidgetProviderInfoTest {
        Mockito.when(profile.getCellSize()).thenReturn(new Point(CELL_SIZE, CELL_SIZE));

        InvariantDeviceProfile idp = new InvariantDeviceProfile();
        idp.supportedProfiles.add(profile);
        List<DeviceProfile> supportedProfiles = new ArrayList<>(idp.supportedProfiles);
        supportedProfiles.add(profile);
        idp.supportedProfiles = Collections.unmodifiableList(supportedProfiles);
        idp.numColumns = NUM_OF_COLS;
        idp.numRows = NUM_OF_ROWS;
        return idp;
    }

}
+7 −3
Original line number Diff line number Diff line
@@ -140,7 +140,10 @@ public class InvariantDeviceProfile {
    public int defaultLayoutId;
    int demoModeLayoutId;

    public final List<DeviceProfile> supportedProfiles = new ArrayList<>();
    /**
     * An immutable list of supported profiles.
     */
    public List<DeviceProfile> supportedProfiles = Collections.EMPTY_LIST;

    @Nullable public DevicePaddings devicePaddings;

@@ -322,10 +325,10 @@ public class InvariantDeviceProfile {
        // Supported overrides: numRows, numColumns, iconSize
        applyPartnerDeviceProfileOverrides(context, metrics);

        supportedProfiles.clear();
        final List<DeviceProfile> localSupportedProfiles = new ArrayList<>();
        defaultWallpaperSize = new Point(displayInfo.currentSize);
        for (WindowBounds bounds : displayInfo.supportedBounds) {
            supportedProfiles.add(new DeviceProfile.Builder(context, this, displayInfo)
            localSupportedProfiles.add(new DeviceProfile.Builder(context, this, displayInfo)
                    .setUseTwoPanels(isSplitDisplay)
                    .setWindowBounds(bounds).build());

@@ -343,6 +346,7 @@ public class InvariantDeviceProfile {
            defaultWallpaperSize.x =
                    Math.max(defaultWallpaperSize.x, Math.round(parallaxFactor * displayWidth));
        }
        supportedProfiles = Collections.unmodifiableList(localSupportedProfiles);

        ComponentName cn = new ComponentName(context.getPackageName(), getClass().getName());
        defaultWidgetPadding = AppWidgetHostView.getDefaultPaddingForWidget(context, cn, null);