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

Commit c7a735cc authored by Danesh M's avatar Danesh M
Browse files

QSDragPanel : Fix loading of tiles

Ensure index out of bounds don't occur due to incorrect
broadcast tile assumptions and validity of tiles found in
default config

Change-Id: I82253380861bdf75d905d635629d5378ae8becb6
parent a119231e
Loading
Loading
Loading
Loading
+25 −29
Original line number Diff line number Diff line
@@ -77,6 +77,7 @@ public class QSDragPanel extends QSPanel implements View.OnDragListener, View.On

    public static final boolean DEBUG_DRAG = false;
    private static final int INITIAL_OFFSCREEN_PAGE_LIMIT = 3;
    private static final String BROADCAST_TILE_SPEC_PLACEHOLDER = "broadcast_placeholder";

    protected final ArrayList<QSPage> mPages = new ArrayList<>();

@@ -1542,44 +1543,39 @@ public class QSDragPanel extends QSPanel implements View.OnDragListener, View.On

    // todo implement proper add tile ui
    protected void showAddDialog() {
        List<String> tiles = mHost.getTileSpecs();
        int numBroadcast = 0;
        for (int i = 0; i < tiles.size(); i++) {
            if (tiles.get(i).startsWith(IntentTile.PREFIX)) {
                numBroadcast++;
            }
        }
        List<String> defaults = QSUtils.getAvailableTiles(getContext());
        int availableSize = defaults.size() + 1 - (tiles.size() - numBroadcast);
        if (availableSize < 1) {
            availableSize = 1;
        }
        final String[] available = new String[availableSize];
        final String[] availableTiles = new String[availableSize];
        int index = 0;
        for (int i = 0; i < defaults.size(); i++) {
            if (tiles.contains(defaults.get(i))) {
                continue;
            }
            int resource = mHost.getLabelResource(defaults.get(i));
        List<String> currentTileSpec = mHost.getTileSpecs();
        final List<String> availableTilesSpec = QSUtils.getAvailableTiles(getContext());

        // Remove tiles already used
        availableTilesSpec.removeAll(currentTileSpec);

        // Populate labels
        List<String> availableTilesLabel = new ArrayList<String>();
        for (String tileSpec : availableTilesSpec) {
            int resource = QSTileHost.getLabelResource(tileSpec);
            if (resource != 0) {
                availableTiles[index] = defaults.get(i);
                available[index++] = getContext().getString(resource);
                availableTilesLabel.add(getContext().getString(resource));
            } else {
                availableTiles[index] = defaults.get(i);
                available[index++] = defaults.get(i);
                availableTilesLabel.add(tileSpec);
            }
        }
        available[index++] = getContext().getString(R.string.broadcast_tile);

        // Add broadcast tile
        availableTilesLabel.add(getContext().getString(R.string.broadcast_tile));
        availableTilesSpec.add(BROADCAST_TILE_SPEC_PLACEHOLDER);

        String[] items = new String[availableTilesLabel.size()];
        availableTilesLabel.toArray(items);

        final AlertDialog d = new AlertDialog.Builder(getContext(), R.style.Theme_SystemUI_Dialog)
                .setTitle(R.string.add_tile)
                .setItems(available, new DialogInterface.OnClickListener() {
                .setItems(items, new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) {
                        if (which < available.length - 1) {
                            add(availableTiles[which]);
                        } else {
                        String tileSpec = availableTilesSpec.get(which);
                        if (tileSpec.equals(BROADCAST_TILE_SPEC_PLACEHOLDER)) {
                            showBroadcastTileDialog();
                        } else {
                            add(tileSpec);
                        }
                    }
                }).create();