blob: 59a394ff30f07abfed75f6d3fc2ff74661da8aa9 [file] [log] [blame]
Jason Monk520ea062015-08-18 14:53:06 -04001package com.android.systemui.qs;
2
3import android.content.Context;
4import android.content.res.Resources;
Jason Monkcaf37622015-08-18 12:33:50 -04005import android.util.AttributeSet;
Jason Monk520ea062015-08-18 14:53:06 -04006import android.view.View;
7import android.view.ViewGroup;
Jason Monk520ea062015-08-18 14:53:06 -04008import com.android.systemui.R;
Jason Monkcaf37622015-08-18 12:33:50 -04009import com.android.systemui.qs.QSPanel.QSTileLayout;
Jason Monk520ea062015-08-18 14:53:06 -040010import com.android.systemui.qs.QSPanel.TileRecord;
11
12import java.util.ArrayList;
13
Jason Monkcaf37622015-08-18 12:33:50 -040014public class TileLayout extends ViewGroup implements QSTileLayout {
Jason Monk520ea062015-08-18 14:53:06 -040015
16 private static final float TILE_ASPECT = 1.2f;
17
18 private static final String TAG = "TileLayout";
19
Jason Monkcaf37622015-08-18 12:33:50 -040020 protected int mColumns;
Jason Monk520ea062015-08-18 14:53:06 -040021 private int mCellWidth;
22 private int mCellHeight;
Jason Monk9d02a432016-01-20 16:33:46 -050023 private int mCellMargin;
Jason Monk520ea062015-08-18 14:53:06 -040024
Jason Monkcaf37622015-08-18 12:33:50 -040025 protected final ArrayList<TileRecord> mRecords = new ArrayList<>();
26
27 public TileLayout(Context context) {
28 this(context, null);
29 }
30
31 public TileLayout(Context context, AttributeSet attrs) {
32 super(context, attrs);
Jason Monk520ea062015-08-18 14:53:06 -040033 updateResources();
34 }
35
Jason Monkcaf37622015-08-18 12:33:50 -040036 @Override
37 public int getOffsetTop(TileRecord tile) {
38 return getTop();
39 }
40
41 public void addTile(TileRecord tile) {
42 mRecords.add(tile);
43 addView(tile.tileView);
44 }
45
46 @Override
47 public void removeTile(TileRecord tile) {
48 mRecords.remove(tile);
49 removeView(tile.tileView);
50 }
51
Jason Monkbd6dbb02015-09-03 15:46:25 -040052 public void removeAllViews() {
53 mRecords.clear();
54 super.removeAllViews();
55 }
56
Jason Monk9d02a432016-01-20 16:33:46 -050057 public boolean updateResources() {
Jason Monk520ea062015-08-18 14:53:06 -040058 final Resources res = mContext.getResources();
59 final int columns = Math.max(1, res.getInteger(R.integer.quick_settings_num_columns));
Jason Monk9d02a432016-01-20 16:33:46 -050060 mCellHeight = mContext.getResources().getDimensionPixelSize(R.dimen.qs_tile_height);
61 mCellMargin = res.getDimensionPixelSize(R.dimen.qs_tile_margin);
Jason Monk520ea062015-08-18 14:53:06 -040062 if (mColumns != columns) {
63 mColumns = columns;
64 postInvalidate();
Jason Monk9d02a432016-01-20 16:33:46 -050065 return true;
Jason Monk520ea062015-08-18 14:53:06 -040066 }
Jason Monk9d02a432016-01-20 16:33:46 -050067 return false;
Jason Monk94a1bf62015-10-20 08:43:36 -070068 }
69
Jason Monk520ea062015-08-18 14:53:06 -040070 @Override
71 protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
Jason Monk9d02a432016-01-20 16:33:46 -050072 final int numTiles = mRecords.size();
Jason Monk520ea062015-08-18 14:53:06 -040073 final int width = MeasureSpec.getSize(widthMeasureSpec);
Jason Monk9d02a432016-01-20 16:33:46 -050074 final int rows = (numTiles + mColumns - 1) / mColumns;
75 mCellWidth = (width - (mCellMargin * (mColumns + 1))) / mColumns;
Jason Monk520ea062015-08-18 14:53:06 -040076
77 View previousView = this;
78 for (TileRecord record : mRecords) {
Jason Monk520ea062015-08-18 14:53:06 -040079 if (record.tileView.getVisibility() == GONE) continue;
Jason Monk9d02a432016-01-20 16:33:46 -050080 record.tileView.measure(exactly(mCellWidth), exactly(mCellHeight));
Jason Monk520ea062015-08-18 14:53:06 -040081 previousView = record.tileView.updateAccessibilityOrder(previousView);
82 }
Jason Monk9d02a432016-01-20 16:33:46 -050083 setMeasuredDimension(width, (mCellHeight + mCellMargin) * rows + mCellMargin);
Jason Monk520ea062015-08-18 14:53:06 -040084 }
85
86 private static int exactly(int size) {
87 return MeasureSpec.makeMeasureSpec(size, MeasureSpec.EXACTLY);
88 }
89
90 @Override
91 protected void onLayout(boolean changed, int l, int t, int r, int b) {
92 final int w = getWidth();
93 boolean isRtl = getLayoutDirection() == LAYOUT_DIRECTION_RTL;
Jason Monk9d02a432016-01-20 16:33:46 -050094 int row = 0;
95 int column = 0;
96 for (int i = 0; i < mRecords.size(); i++, column++) {
97 if (column == mColumns) {
98 row++;
99 column -= mColumns;
100 }
101 TileRecord record = mRecords.get(i);
102 int left = getColumnStart(column);
103 final int top = getRowTop(row);
Jason Monk520ea062015-08-18 14:53:06 -0400104 int right;
Jason Monk520ea062015-08-18 14:53:06 -0400105 if (isRtl) {
106 right = w - left;
Jason Monk9d02a432016-01-20 16:33:46 -0500107 left = right - mCellWidth;
Jason Monk520ea062015-08-18 14:53:06 -0400108 } else {
Jason Monk9d02a432016-01-20 16:33:46 -0500109 right = left + mCellWidth;
Jason Monk520ea062015-08-18 14:53:06 -0400110 }
111 record.tileView.layout(left, top, right, top + record.tileView.getMeasuredHeight());
112 }
113 }
114
115 private int getRowTop(int row) {
Jason Monk9d02a432016-01-20 16:33:46 -0500116 return row * (mCellHeight + mCellMargin) + mCellMargin;
Jason Monk520ea062015-08-18 14:53:06 -0400117 }
118
Jason Monk9d02a432016-01-20 16:33:46 -0500119 private int getColumnStart(int column) {
120 return column * (mCellWidth + mCellMargin) + mCellMargin;
Jason Monk520ea062015-08-18 14:53:06 -0400121 }
Jason Monk520ea062015-08-18 14:53:06 -0400122}