QuickQSPanel.java revision db50de807304bcda6fa0028aaced667cf9ae9cf5
1/*
2 * Copyright (C) 2015 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.systemui.qs;
18
19import android.content.Context;
20import android.content.res.ColorStateList;
21import android.util.AttributeSet;
22import android.view.Gravity;
23import android.view.View;
24import android.widget.ImageView;
25import android.widget.LinearLayout;
26import android.widget.Space;
27import com.android.systemui.R;
28
29import java.util.ArrayList;
30import java.util.Collection;
31
32/**
33 * Version of QSPanel that only shows N Quick Tiles in the QS Header.
34 */
35public class QuickQSPanel extends QSPanel {
36
37    private int mMaxTiles;
38    private QSPanel mFullPanel;
39    private View mHeader;
40
41    public QuickQSPanel(Context context, AttributeSet attrs) {
42        super(context, attrs);
43        if (mTileLayout != null) {
44            for (int i = 0; i < mRecords.size(); i++) {
45                mTileLayout.removeTile(mRecords.get(i));
46            }
47            mQsContainer.removeView((View) mTileLayout);
48        }
49        mTileLayout = new HeaderTileLayout(context);
50        mQsContainer.addView((View) mTileLayout, 1 /* Between brightness and footer */);
51    }
52
53    @Override
54    protected void createCustomizePanel() {
55        // No customizing from the header.
56    }
57
58    public void setQSPanelAndHeader(QSPanel fullPanel, View header) {
59        mFullPanel = fullPanel;
60        mHeader = header;
61    }
62
63    @Override
64    protected void showDetail(boolean show, Record r) {
65        // Do nothing, will be handled by the QSPanel.
66    }
67
68    @Override
69    protected QSTileBaseView createTileView(QSTile<?> tile) {
70        return new QSTileBaseView(mContext, tile.createTileView(mContext));
71    }
72
73    public void setMaxTiles(int maxTiles) {
74        mMaxTiles = maxTiles;
75    }
76
77    @Override
78    protected void onTileClick(QSTile<?> tile) {
79        tile.secondaryClick();
80    }
81
82    @Override
83    public void onTuningChanged(String key, String newValue) {
84        // No tunings for you.
85        if (key.equals(QS_SHOW_BRIGHTNESS)) {
86            // No Brightness for you.
87            super.onTuningChanged(key, "0");
88        }
89    }
90
91    @Override
92    public void setTiles(Collection<QSTile<?>> tiles) {
93        ArrayList<QSTile<?>> quickTiles = new ArrayList<>();
94        for (QSTile<?> tile : tiles) {
95            quickTiles.add(tile);
96            if (quickTiles.size() == mMaxTiles) {
97                break;
98            }
99        }
100        super.setTiles(quickTiles);
101    }
102
103    private static class HeaderTileLayout extends LinearLayout implements QSTileLayout {
104
105        public HeaderTileLayout(Context context) {
106            super(context);
107            setClipChildren(false);
108            setClipToPadding(false);
109            setGravity(Gravity.CENTER_VERTICAL);
110            setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
111
112            int padding =
113                    mContext.getResources().getDimensionPixelSize(R.dimen.qs_quick_tile_padding);
114            ImageView downArrow = new ImageView(context);
115            downArrow.setImageResource(R.drawable.ic_expand_more);
116            downArrow.setImageTintList(ColorStateList.valueOf(context.getResources().getColor(
117                    android.R.color.white, null)));
118            downArrow.setLayoutParams(generateLayoutParams());
119            downArrow.setPadding(padding, padding, padding, padding);
120            addView(downArrow);
121            setOrientation(LinearLayout.HORIZONTAL);
122        }
123
124        @Override
125        public void addTile(TileRecord tile) {
126            addView(tile.tileView, getChildCount() - 1 /* Leave icon at end */,
127                    generateLayoutParams());
128            // Add a spacer.
129            addView(new Space(mContext), getChildCount() - 1 /* Leave icon at end */,
130                    generateSpaceParams());
131        }
132
133        private LayoutParams generateSpaceParams() {
134            int size = mContext.getResources().getDimensionPixelSize(R.dimen.qs_quick_tile_size);
135            LayoutParams lp = new LayoutParams(0, size);
136            lp.weight = 1;
137            lp.gravity = Gravity.CENTER;
138            return lp;
139        }
140
141        private LayoutParams generateLayoutParams() {
142            int size = mContext.getResources().getDimensionPixelSize(R.dimen.qs_quick_tile_size);
143            LayoutParams lp = new LayoutParams(size, size);
144            lp.gravity = Gravity.CENTER;
145            return lp;
146        }
147
148        @Override
149        public void removeTile(TileRecord tile) {
150            int childIndex = getChildIndex(tile.tileView);
151            // Remove the tile.
152            removeViewAt(childIndex);
153            // Remove its spacer as well.
154            removeViewAt(childIndex);
155        }
156
157        private int getChildIndex(QSTileBaseView tileView) {
158            final int N = getChildCount();
159            for (int i = 0; i < N; i++) {
160                if (getChildAt(i) == tileView) {
161                    return i;
162                }
163            }
164            return -1;
165        }
166
167        @Override
168        public int getOffsetTop(TileRecord tile) {
169            return 0;
170        }
171
172        @Override
173        public boolean updateResources() {
174            // No resources here.
175            return false;
176        }
177    }
178}
179