TileLayout.java revision 20aef8a2914478a85aa679ec31bf739c7818eb3c
1package com.android.systemui.qs;
2
3import android.content.Context;
4import android.content.res.Resources;
5import android.util.AttributeSet;
6import android.view.View;
7import android.view.ViewGroup;
8
9import com.android.systemui.R;
10import com.android.systemui.qs.QSPanel.QSTileLayout;
11import com.android.systemui.qs.QSPanel.TileRecord;
12
13import java.util.ArrayList;
14
15public class TileLayout extends ViewGroup implements QSTileLayout {
16
17    private static final float TILE_ASPECT = 1.2f;
18
19    private static final String TAG = "TileLayout";
20
21    protected int mColumns;
22    protected int mCellWidth;
23    protected int mCellHeight;
24    protected int mCellMargin;
25
26    protected final ArrayList<TileRecord> mRecords = new ArrayList<>();
27    private int mCellMarginTop;
28
29    public TileLayout(Context context) {
30        this(context, null);
31    }
32
33    public TileLayout(Context context, AttributeSet attrs) {
34        super(context, attrs);
35        setFocusableInTouchMode(true);
36        updateResources();
37    }
38
39    @Override
40    public int getOffsetTop(TileRecord tile) {
41        return getTop();
42    }
43
44    public void addTile(TileRecord tile) {
45        mRecords.add(tile);
46        addView(tile.tileView);
47    }
48
49    @Override
50    public void removeTile(TileRecord tile) {
51        mRecords.remove(tile);
52        removeView(tile.tileView);
53    }
54
55    public void removeAllViews() {
56        mRecords.clear();
57        super.removeAllViews();
58    }
59
60    public boolean updateResources() {
61        final Resources res = mContext.getResources();
62        final int columns = Math.max(1, res.getInteger(R.integer.quick_settings_num_columns));
63        mCellHeight = mContext.getResources().getDimensionPixelSize(R.dimen.qs_tile_height);
64        mCellMargin = res.getDimensionPixelSize(R.dimen.qs_tile_margin);
65        mCellMarginTop = res.getDimensionPixelSize(R.dimen.qs_tile_margin_top);
66        if (mColumns != columns) {
67            mColumns = columns;
68            requestLayout();
69            return true;
70        }
71        return false;
72    }
73
74    @Override
75    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
76        final int numTiles = mRecords.size();
77        final int width = MeasureSpec.getSize(widthMeasureSpec);
78        final int rows = (numTiles + mColumns - 1) / mColumns;
79        mCellWidth = (width - (mCellMargin * (mColumns + 1))) / mColumns;
80
81        View previousView = this;
82        for (TileRecord record : mRecords) {
83            if (record.tileView.getVisibility() == GONE) continue;
84            record.tileView.measure(exactly(mCellWidth), exactly(mCellHeight));
85            previousView = record.tileView.updateAccessibilityOrder(previousView);
86        }
87        setMeasuredDimension(width,
88                (mCellHeight + mCellMargin) * rows + (mCellMarginTop - mCellMargin));
89    }
90
91    private static int exactly(int size) {
92        return MeasureSpec.makeMeasureSpec(size, MeasureSpec.EXACTLY);
93    }
94
95    @Override
96    protected void onLayout(boolean changed, int l, int t, int r, int b) {
97        final int w = getWidth();
98        boolean isRtl = getLayoutDirection() == LAYOUT_DIRECTION_RTL;
99        int row = 0;
100        int column = 0;
101        for (int i = 0; i < mRecords.size(); i++, column++) {
102            if (column == mColumns) {
103                row++;
104                column -= mColumns;
105            }
106            TileRecord record = mRecords.get(i);
107            int left = getColumnStart(column);
108            final int top = getRowTop(row);
109            int right;
110            if (isRtl) {
111                right = w - left;
112                left = right - mCellWidth;
113            } else {
114                right = left + mCellWidth;
115            }
116            record.tileView.layout(left, top, right, top + record.tileView.getMeasuredHeight());
117        }
118    }
119
120    private int getRowTop(int row) {
121        return row * (mCellHeight + mCellMargin) + mCellMarginTop;
122    }
123
124    private int getColumnStart(int column) {
125        return column * (mCellWidth + mCellMargin) + mCellMargin;
126    }
127}
128