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

Commit 09e9a3be authored by Fabian Kozynski's avatar Fabian Kozynski
Browse files

Fix margins around tiles in QSCustomizer

When tiles are moved, only those that are marked as modified will be
forced to update the item offsets, with the others maybe never getting
the chance. Given that moving may make tiles change columns and
therefore their margin, this is not good.

Instead, have the LayoutManager always poll the MarginItemDecoration for
the correct margins for elements that are not TextView (tiles), then set
that as the margin.

Also, fix margins for RTL.

Test: manual
Bug: 188640649
Change-Id: I4aaef4887a6f50e5070c764048b67792dec3a35c
parent 598a1595
Loading
Loading
Loading
Loading
+16 −0
Original line number Diff line number Diff line
@@ -20,9 +20,11 @@ import static com.android.systemui.qs.customize.QSCustomizer.EXTRA_QS_CUSTOMIZIN
import static com.android.systemui.qs.customize.QSCustomizer.MENU_RESET;

import android.content.res.Configuration;
import android.graphics.Rect;
import android.os.Bundle;
import android.view.MenuItem;
import android.view.View;
import android.widget.TextView;
import android.widget.Toolbar;
import android.widget.Toolbar.OnMenuItemClickListener;

@@ -139,6 +141,20 @@ public class QSCustomizerController extends ViewController<QSCustomizer> {
                    RecyclerView.State state, View host, AccessibilityNodeInfoCompat info) {
                // Do not read row and column every time it changes.
            }

            public void calculateItemDecorationsForChild(View child, Rect outRect) {
                // There's only a single item decoration that cares about the itemOffsets, so
                // we just call it manually so they are never cached. This way, it's updated as the
                // tiles are moved around.
                // It only sets the left and right margin and only cares about tiles (not TextView).
                if (!(child instanceof TextView)) {
                    outRect.setEmpty();
                    mTileAdapter.getMarginItemDecoration().getItemOffsets(outRect, child,
                            recyclerView, new RecyclerView.State());
                    ((LayoutParams) child.getLayoutParams()).leftMargin = outRect.left;
                    ((LayoutParams) child.getLayoutParams()).rightMargin = outRect.right;
                }
            }
        };
        layout.setSpanSizeLookup(mTileAdapter.getSizeLookup());
        recyclerView.setLayoutManager(layout);
+24 −10
Original line number Diff line number Diff line
@@ -690,9 +690,7 @@ public class TileAdapter extends RecyclerView.Adapter<Holder> implements TileSta
            if (parent.getLayoutManager() == null) return;

            GridLayoutManager lm = ((GridLayoutManager) parent.getLayoutManager());
            SpanSizeLookup span = lm.getSpanSizeLookup();
            ViewHolder holder = parent.getChildViewHolder(view);
            int column = span.getSpanIndex(holder.getBindingAdapterPosition(), lm.getSpanCount());
            int column = ((GridLayoutManager.LayoutParams) view.getLayoutParams()).getSpanIndex();

            if (view instanceof TextView) {
                super.getItemOffsets(outRect, view, parent, state);
@@ -702,14 +700,30 @@ public class TileAdapter extends RecyclerView.Adapter<Holder> implements TileSta
                    // columns).
                    outRect.left = mHalfMargin;
                    outRect.right = mHalfMargin;
                } else if (column == 0) {
                    // Leftmost column when not using side margins. Should only have margin on the
                    // right.
                } else {
                    // Leftmost or rightmost column
                    if (parent.isLayoutRtl()) {
                        if (column == 0) {
                            // Rightmost column
                            outRect.left = mHalfMargin;
                            outRect.right = 0;
                        } else {
                            // Leftmost column
                            outRect.left = 0;
                            outRect.right = mHalfMargin;
                        }
                    } else {
                        // Non RTL
                        if (column == 0) {
                            // Leftmost column
                            outRect.left = 0;
                            outRect.right = mHalfMargin;
                        } else {
                    // Rightmost column when not using side margins. Should only have margin on the
                    // left.
                            // Rightmost column
                            outRect.left = mHalfMargin;
                            outRect.right = 0;
                        }
                    }
                }
            }
        }