1af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock/*
2af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock * Copyright (C) 2014 The Android Open Source Project
3af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock *
4af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock * Licensed under the Apache License, Version 2.0 (the "License");
5af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock * you may not use this file except in compliance with the License.
6af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock * You may obtain a copy of the License at
7af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock *
8af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock *      http://www.apache.org/licenses/LICENSE-2.0
9af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock *
10af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock * Unless required by applicable law or agreed to in writing, software
11af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock * distributed under the License is distributed on an "AS IS" BASIS,
12af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock * See the License for the specific language governing permissions and
14af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock * limitations under the License.
15af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock */
16af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
17af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlockpackage com.android.systemui.qs;
18af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
19af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlockimport android.content.Context;
20e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggiimport android.content.res.Configuration;
21af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlockimport android.content.res.Resources;
22e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggiimport android.util.MathUtils;
23af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlockimport android.view.Gravity;
241c7cda8bbfb848961536a4adbf2c81c5ffddae16Sudheer Shankaimport android.view.LayoutInflater;
25af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlockimport android.view.View;
261c7cda8bbfb848961536a4adbf2c81c5ffddae16Sudheer Shankaimport android.widget.ImageView;
27af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlockimport android.widget.TextView;
28c0d7058b14c24cd07912f5629c26b39b7b4673d5Winson
29e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggiimport com.android.systemui.FontSizeUtils;
30af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlockimport com.android.systemui.R;
3174351554328e56fdd02eb09d93a98aaf97ccce04Jason Monkimport libcore.util.Objects;
322d695813b44690ca146f95939acb00f0c14dac29John Spurlock
33af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock/** View that represents a standard quick settings tile. **/
34c133d26b3897811e9f567d787bff8eafb364f3e3Jason Monkpublic class QSTileView extends QSTileBaseView {
35af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    protected final Context mContext;
3692d9b19e1bc5f93ef31c4e6eb3395eaf78a5c84eJohn Spurlock    private final int mTileSpacingPx;
37e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggi    private int mTilePaddingTopPx;
38af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
390b349adcd8ad85621fd2bd7fc9fc6f878a4b92d8Jason Monk    protected TextView mLabel;
401c7cda8bbfb848961536a4adbf2c81c5ffddae16Sudheer Shanka    private ImageView mPadLock;
41caf3762ae67fe804eb66b280b6f7c5371b280573Jason Monk
42dc35dcb14a8b6c4f221fccafffa5ca603894dbaaJason Monk    public QSTileView(Context context, QSIconView icon) {
4320aef8a2914478a85aa679ec31bf739c7818eb3cJulia Reynolds        this(context, icon, false);
4420aef8a2914478a85aa679ec31bf739c7818eb3cJulia Reynolds    }
4520aef8a2914478a85aa679ec31bf739c7818eb3cJulia Reynolds
4620aef8a2914478a85aa679ec31bf739c7818eb3cJulia Reynolds    public QSTileView(Context context, QSIconView icon, boolean collapsedView) {
4720aef8a2914478a85aa679ec31bf739c7818eb3cJulia Reynolds        super(context, icon, collapsedView);
48af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
49af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        mContext = context;
50af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        final Resources res = context.getResources();
5192d9b19e1bc5f93ef31c4e6eb3395eaf78a5c84eJohn Spurlock        mTileSpacingPx = res.getDimensionPixelSize(R.dimen.qs_tile_spacing);
521c7cda8bbfb848961536a4adbf2c81c5ffddae16Sudheer Shanka
53af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        setClipChildren(false);
54af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
55af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        setClickable(true);
56e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggi        updateTopPadding();
574949c75f1e891e165b63db17c487cf2383bcfcd4Selim Cinek        setId(View.generateViewId());
58dc35dcb14a8b6c4f221fccafffa5ca603894dbaaJason Monk        createLabel();
59dc35dcb14a8b6c4f221fccafffa5ca603894dbaaJason Monk        setOrientation(VERTICAL);
60dc35dcb14a8b6c4f221fccafffa5ca603894dbaaJason Monk        setGravity(Gravity.CENTER);
61e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggi    }
62e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggi
63162011ebe8015f44d4d9ced519297a7cfb087af2Jason Monk    TextView getLabel() {
64162011ebe8015f44d4d9ced519297a7cfb087af2Jason Monk        return mLabel;
65162011ebe8015f44d4d9ced519297a7cfb087af2Jason Monk    }
66162011ebe8015f44d4d9ced519297a7cfb087af2Jason Monk
67e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggi    private void updateTopPadding() {
68e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggi        Resources res = getResources();
69e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggi        int padding = res.getDimensionPixelSize(R.dimen.qs_tile_padding_top);
70e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggi        int largePadding = res.getDimensionPixelSize(R.dimen.qs_tile_padding_top_large_text);
71e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggi        float largeFactor = (MathUtils.constrain(getResources().getConfiguration().fontScale,
72e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggi                1.0f, FontSizeUtils.LARGE_TEXT_SCALE) - 1f) / (FontSizeUtils.LARGE_TEXT_SCALE - 1f);
73e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggi        mTilePaddingTopPx = Math.round((1 - largeFactor) * padding + largeFactor * largePadding);
74dc35dcb14a8b6c4f221fccafffa5ca603894dbaaJason Monk        setPadding(mTileSpacingPx, mTilePaddingTopPx + mTileSpacingPx, mTileSpacingPx,
75dc35dcb14a8b6c4f221fccafffa5ca603894dbaaJason Monk                mTileSpacingPx);
76e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggi        requestLayout();
77e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggi    }
78e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggi
79e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggi    @Override
80e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggi    protected void onConfigurationChanged(Configuration newConfig) {
81e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggi        super.onConfigurationChanged(newConfig);
82e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggi        updateTopPadding();
83e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggi        FontSizeUtils.updateFontSize(mLabel, R.dimen.qs_tile_text_size);
84af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    }
85af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
860b349adcd8ad85621fd2bd7fc9fc6f878a4b92d8Jason Monk    protected void createLabel() {
871c7cda8bbfb848961536a4adbf2c81c5ffddae16Sudheer Shanka        View view = LayoutInflater.from(mContext).inflate(R.layout.qs_tile_label, null);
881c7cda8bbfb848961536a4adbf2c81c5ffddae16Sudheer Shanka        mLabel = (TextView) view.findViewById(R.id.tile_label);
891c7cda8bbfb848961536a4adbf2c81c5ffddae16Sudheer Shanka        mPadLock = (ImageView) view.findViewById(R.id.restricted_padlock);
901c7cda8bbfb848961536a4adbf2c81c5ffddae16Sudheer Shanka        addView(view);
91e32010ac6120278fea41e49b9832af79b1b5463eSelim Cinek    }
92e32010ac6120278fea41e49b9832af79b1b5463eSelim Cinek
932f3551b04d5a5d05ba1eb7401f19c034708a9d00Xiaohui Chen    @Override
94af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    protected void handleStateChanged(QSTile.State state) {
95dc35dcb14a8b6c4f221fccafffa5ca603894dbaaJason Monk        super.handleStateChanged(state);
9674351554328e56fdd02eb09d93a98aaf97ccce04Jason Monk        if (!Objects.equal(mLabel.getText(), state.label)) {
9774351554328e56fdd02eb09d93a98aaf97ccce04Jason Monk            mLabel.setText(state.label);
9874351554328e56fdd02eb09d93a98aaf97ccce04Jason Monk        }
991c7cda8bbfb848961536a4adbf2c81c5ffddae16Sudheer Shanka        mLabel.setEnabled(!state.disabledByPolicy);
1001c7cda8bbfb848961536a4adbf2c81c5ffddae16Sudheer Shanka        mPadLock.setVisibility(state.disabledByPolicy ? View.VISIBLE : View.GONE);
1014949c75f1e891e165b63db17c487cf2383bcfcd4Selim Cinek    }
102ece4a834e8ae6d7e7cf09cd3134a2acd8f8427bdSelim Cinek}
103