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