| package com.android.systemui.qs; |
| |
| import android.content.Context; |
| import android.content.res.Resources; |
| import android.util.AttributeSet; |
| import android.view.View; |
| import android.view.ViewGroup; |
| |
| import com.android.systemui.R; |
| import com.android.systemui.qs.QSPanel.QSTileLayout; |
| import com.android.systemui.qs.QSPanel.TileRecord; |
| |
| import java.util.ArrayList; |
| |
| public class TileLayout extends ViewGroup implements QSTileLayout { |
| |
| private static final float TILE_ASPECT = 1.2f; |
| |
| private static final String TAG = "TileLayout"; |
| |
| protected int mColumns; |
| protected int mCellWidth; |
| protected int mCellHeight; |
| protected int mCellMargin; |
| |
| protected final ArrayList<TileRecord> mRecords = new ArrayList<>(); |
| private int mCellMarginTop; |
| private boolean mListening; |
| |
| public TileLayout(Context context) { |
| this(context, null); |
| } |
| |
| public TileLayout(Context context, AttributeSet attrs) { |
| super(context, attrs); |
| setFocusableInTouchMode(true); |
| updateResources(); |
| } |
| |
| @Override |
| public int getOffsetTop(TileRecord tile) { |
| return getTop(); |
| } |
| |
| @Override |
| public void setListening(boolean listening) { |
| if (mListening == listening) return; |
| mListening = listening; |
| for (TileRecord record : mRecords) { |
| record.tile.setListening(this, mListening); |
| } |
| } |
| |
| public void addTile(TileRecord tile) { |
| mRecords.add(tile); |
| tile.tile.setListening(this, mListening); |
| addView(tile.tileView); |
| } |
| |
| @Override |
| public void removeTile(TileRecord tile) { |
| mRecords.remove(tile); |
| tile.tile.setListening(this, false); |
| removeView(tile.tileView); |
| } |
| |
| public void removeAllViews() { |
| for (TileRecord record : mRecords) { |
| record.tile.setListening(this, false); |
| } |
| mRecords.clear(); |
| super.removeAllViews(); |
| } |
| |
| public boolean updateResources() { |
| final Resources res = mContext.getResources(); |
| final int columns = Math.max(1, res.getInteger(R.integer.quick_settings_num_columns)); |
| mCellHeight = mContext.getResources().getDimensionPixelSize(R.dimen.qs_tile_height); |
| mCellMargin = res.getDimensionPixelSize(R.dimen.qs_tile_margin); |
| mCellMarginTop = res.getDimensionPixelSize(R.dimen.qs_tile_margin_top); |
| if (mColumns != columns) { |
| mColumns = columns; |
| requestLayout(); |
| return true; |
| } |
| return false; |
| } |
| |
| @Override |
| protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { |
| final int numTiles = mRecords.size(); |
| final int width = MeasureSpec.getSize(widthMeasureSpec); |
| final int rows = (numTiles + mColumns - 1) / mColumns; |
| mCellWidth = (width - (mCellMargin * (mColumns + 1))) / mColumns; |
| |
| View previousView = this; |
| for (TileRecord record : mRecords) { |
| if (record.tileView.getVisibility() == GONE) continue; |
| record.tileView.measure(exactly(mCellWidth), exactly(mCellHeight)); |
| previousView = record.tileView.updateAccessibilityOrder(previousView); |
| } |
| setMeasuredDimension(width, |
| (mCellHeight + mCellMargin) * rows + (mCellMarginTop - mCellMargin)); |
| } |
| |
| private static int exactly(int size) { |
| return MeasureSpec.makeMeasureSpec(size, MeasureSpec.EXACTLY); |
| } |
| |
| @Override |
| protected void onLayout(boolean changed, int l, int t, int r, int b) { |
| final int w = getWidth(); |
| boolean isRtl = getLayoutDirection() == LAYOUT_DIRECTION_RTL; |
| int row = 0; |
| int column = 0; |
| for (int i = 0; i < mRecords.size(); i++, column++) { |
| if (column == mColumns) { |
| row++; |
| column -= mColumns; |
| } |
| TileRecord record = mRecords.get(i); |
| int left = getColumnStart(column); |
| final int top = getRowTop(row); |
| int right; |
| if (isRtl) { |
| right = w - left; |
| left = right - mCellWidth; |
| } else { |
| right = left + mCellWidth; |
| } |
| record.tileView.layout(left, top, right, top + record.tileView.getMeasuredHeight()); |
| } |
| } |
| |
| private int getRowTop(int row) { |
| return row * (mCellHeight + mCellMargin) + mCellMarginTop; |
| } |
| |
| private int getColumnStart(int column) { |
| return column * (mCellWidth + mCellMargin) + mCellMargin; |
| } |
| } |