1c133d26b3897811e9f567d787bff8eafb364f3e3Jason Monk/*
2702e2ebf9fbfb715c1d9b716683c9e4d182b575eJason Monk * Copyright (C) 2017 The Android Open Source Project
3c133d26b3897811e9f567d787bff8eafb364f3e3Jason Monk *
4702e2ebf9fbfb715c1d9b716683c9e4d182b575eJason Monk * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
5702e2ebf9fbfb715c1d9b716683c9e4d182b575eJason Monk * except in compliance with the License. You may obtain a copy of the License at
6c133d26b3897811e9f567d787bff8eafb364f3e3Jason Monk *
7c133d26b3897811e9f567d787bff8eafb364f3e3Jason Monk *      http://www.apache.org/licenses/LICENSE-2.0
8c133d26b3897811e9f567d787bff8eafb364f3e3Jason Monk *
9702e2ebf9fbfb715c1d9b716683c9e4d182b575eJason Monk * Unless required by applicable law or agreed to in writing, software distributed under the
10702e2ebf9fbfb715c1d9b716683c9e4d182b575eJason Monk * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
11702e2ebf9fbfb715c1d9b716683c9e4d182b575eJason Monk * KIND, either express or implied. See the License for the specific language governing
12702e2ebf9fbfb715c1d9b716683c9e4d182b575eJason Monk * permissions and limitations under the License.
13c133d26b3897811e9f567d787bff8eafb364f3e3Jason Monk */
14702e2ebf9fbfb715c1d9b716683c9e4d182b575eJason Monkpackage com.android.systemui.qs.tileimpl;
15c133d26b3897811e9f567d787bff8eafb364f3e3Jason Monk
16cb2307cb5cefa7666340552d62eb953c39af5a86Jason Monkimport static com.android.systemui.qs.tileimpl.QSIconViewImpl.QS_ANIM_LENGTH;
17cb2307cb5cefa7666340552d62eb953c39af5a86Jason Monk
18cb2307cb5cefa7666340552d62eb953c39af5a86Jason Monkimport android.animation.ValueAnimator;
19c133d26b3897811e9f567d787bff8eafb364f3e3Jason Monkimport android.content.Context;
20cb2307cb5cefa7666340552d62eb953c39af5a86Jason Monkimport android.content.res.ColorStateList;
21dc35dcb14a8b6c4f221fccafffa5ca603894dbaaJason Monkimport android.content.res.TypedArray;
22dc35dcb14a8b6c4f221fccafffa5ca603894dbaaJason Monkimport android.graphics.drawable.Drawable;
23dc35dcb14a8b6c4f221fccafffa5ca603894dbaaJason Monkimport android.graphics.drawable.RippleDrawable;
24c133d26b3897811e9f567d787bff8eafb364f3e3Jason Monkimport android.os.Handler;
25c133d26b3897811e9f567d787bff8eafb364f3e3Jason Monkimport android.os.Looper;
26c133d26b3897811e9f567d787bff8eafb364f3e3Jason Monkimport android.os.Message;
27e2f05d23b119a34a1b1b32fdab0e5fbcca1c98e9Jason Monkimport android.service.quicksettings.Tile;
2820aef8a2914478a85aa679ec31bf739c7818eb3cJulia Reynoldsimport android.text.TextUtils;
29cb2307cb5cefa7666340552d62eb953c39af5a86Jason Monkimport android.util.Log;
303250885c9feb9b42d60058a823c57a027c0dcf58Jason Monkimport android.view.Gravity;
31c133d26b3897811e9f567d787bff8eafb364f3e3Jason Monkimport android.view.View;
323250885c9feb9b42d60058a823c57a027c0dcf58Jason Monkimport android.view.ViewGroup;
3320aef8a2914478a85aa679ec31bf739c7818eb3cJulia Reynoldsimport android.view.accessibility.AccessibilityEvent;
3420aef8a2914478a85aa679ec31bf739c7818eb3cJulia Reynoldsimport android.view.accessibility.AccessibilityNodeInfo;
353250885c9feb9b42d60058a823c57a027c0dcf58Jason Monkimport android.widget.FrameLayout;
36cb2307cb5cefa7666340552d62eb953c39af5a86Jason Monkimport android.widget.ImageView;
37cb2307cb5cefa7666340552d62eb953c39af5a86Jason Monkimport android.widget.ImageView.ScaleType;
3820aef8a2914478a85aa679ec31bf739c7818eb3cJulia Reynoldsimport android.widget.Switch;
39c0d7058b14c24cd07912f5629c26b39b7b4673d5Winson
40cb2307cb5cefa7666340552d62eb953c39af5a86Jason Monkimport com.android.settingslib.Utils;
41dc35dcb14a8b6c4f221fccafffa5ca603894dbaaJason Monkimport com.android.systemui.R;
42cb2307cb5cefa7666340552d62eb953c39af5a86Jason Monkimport com.android.systemui.plugins.qs.QSIconView;
43cb2307cb5cefa7666340552d62eb953c39af5a86Jason Monkimport com.android.systemui.plugins.qs.QSTile;
4490950d998cffa25ba0c01e503c9dc6616230dabdJason Monkimport com.android.systemui.plugins.qs.QSTile.BooleanState;
45c133d26b3897811e9f567d787bff8eafb364f3e3Jason Monk
46702e2ebf9fbfb715c1d9b716683c9e4d182b575eJason Monkpublic class QSTileBaseView extends com.android.systemui.plugins.qs.QSTileView {
47c133d26b3897811e9f567d787bff8eafb364f3e3Jason Monk
483250885c9feb9b42d60058a823c57a027c0dcf58Jason Monk    private static final String TAG = "QSTileBaseView";
49c133d26b3897811e9f567d787bff8eafb364f3e3Jason Monk    private final H mHandler = new H();
50f13413e2f33599be61718125e17102191b9f617aJason Monk    private final FrameLayout mIconFrame;
51074ae4696061f7e981160c4bcc94377b53a58203Jiaquan He    protected QSIconView mIcon;
52074ae4696061f7e981160c4bcc94377b53a58203Jiaquan He    protected RippleDrawable mRipple;
53dc35dcb14a8b6c4f221fccafffa5ca603894dbaaJason Monk    private Drawable mTileBackground;
5420aef8a2914478a85aa679ec31bf739c7818eb3cJulia Reynolds    private String mAccessibilityClass;
5520aef8a2914478a85aa679ec31bf739c7818eb3cJulia Reynolds    private boolean mTileState;
5620aef8a2914478a85aa679ec31bf739c7818eb3cJulia Reynolds    private boolean mCollapsedView;
5790950d998cffa25ba0c01e503c9dc6616230dabdJason Monk    private boolean mClicked;
58c133d26b3897811e9f567d787bff8eafb364f3e3Jason Monk
59cb2307cb5cefa7666340552d62eb953c39af5a86Jason Monk    private final ImageView mBg;
60cb2307cb5cefa7666340552d62eb953c39af5a86Jason Monk    private final int mColorActive;
61cb2307cb5cefa7666340552d62eb953c39af5a86Jason Monk    private final int mColorInactive;
62cb2307cb5cefa7666340552d62eb953c39af5a86Jason Monk    private final int mColorDisabled;
63cb2307cb5cefa7666340552d62eb953c39af5a86Jason Monk    private int mCircleColor;
64cb2307cb5cefa7666340552d62eb953c39af5a86Jason Monk
65dc35dcb14a8b6c4f221fccafffa5ca603894dbaaJason Monk    public QSTileBaseView(Context context, QSIconView icon) {
6620aef8a2914478a85aa679ec31bf739c7818eb3cJulia Reynolds        this(context, icon, false);
6720aef8a2914478a85aa679ec31bf739c7818eb3cJulia Reynolds    }
6820aef8a2914478a85aa679ec31bf739c7818eb3cJulia Reynolds
6920aef8a2914478a85aa679ec31bf739c7818eb3cJulia Reynolds    public QSTileBaseView(Context context, QSIconView icon, boolean collapsedView) {
70c133d26b3897811e9f567d787bff8eafb364f3e3Jason Monk        super(context);
713250885c9feb9b42d60058a823c57a027c0dcf58Jason Monk        // Default to Quick Tile padding, and QSTileView will specify its own padding.
723250885c9feb9b42d60058a823c57a027c0dcf58Jason Monk        int padding = context.getResources().getDimensionPixelSize(R.dimen.qs_quick_tile_padding);
733250885c9feb9b42d60058a823c57a027c0dcf58Jason Monk
74f13413e2f33599be61718125e17102191b9f617aJason Monk        mIconFrame = new FrameLayout(context);
75f13413e2f33599be61718125e17102191b9f617aJason Monk        mIconFrame.setForegroundGravity(Gravity.CENTER);
763250885c9feb9b42d60058a823c57a027c0dcf58Jason Monk        int size = context.getResources().getDimensionPixelSize(R.dimen.qs_quick_tile_size);
77f13413e2f33599be61718125e17102191b9f617aJason Monk        addView(mIconFrame, new LayoutParams(size, size));
78cb2307cb5cefa7666340552d62eb953c39af5a86Jason Monk        mBg = new ImageView(getContext());
79cb2307cb5cefa7666340552d62eb953c39af5a86Jason Monk        mBg.setScaleType(ScaleType.FIT_CENTER);
80cb2307cb5cefa7666340552d62eb953c39af5a86Jason Monk        mBg.setImageResource(R.drawable.ic_qs_circle);
81cb2307cb5cefa7666340552d62eb953c39af5a86Jason Monk        mIconFrame.addView(mBg);
82dc35dcb14a8b6c4f221fccafffa5ca603894dbaaJason Monk        mIcon = icon;
833250885c9feb9b42d60058a823c57a027c0dcf58Jason Monk        FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(
843250885c9feb9b42d60058a823c57a027c0dcf58Jason Monk                ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
853250885c9feb9b42d60058a823c57a027c0dcf58Jason Monk        params.setMargins(0, padding, 0, padding);
86f13413e2f33599be61718125e17102191b9f617aJason Monk        mIconFrame.addView(mIcon, params);
8728191fc42cb47e848def0c80fbff122990af38deRohan Shah        mIconFrame.setClipChildren(false);
8828191fc42cb47e848def0c80fbff122990af38deRohan Shah        mIconFrame.setClipToPadding(false);
89dc35dcb14a8b6c4f221fccafffa5ca603894dbaaJason Monk
90dc35dcb14a8b6c4f221fccafffa5ca603894dbaaJason Monk        mTileBackground = newTileBackground();
91dc35dcb14a8b6c4f221fccafffa5ca603894dbaaJason Monk        if (mTileBackground instanceof RippleDrawable) {
92dc35dcb14a8b6c4f221fccafffa5ca603894dbaaJason Monk            setRipple((RippleDrawable) mTileBackground);
93dc35dcb14a8b6c4f221fccafffa5ca603894dbaaJason Monk        }
94dc35dcb14a8b6c4f221fccafffa5ca603894dbaaJason Monk        setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_YES);
95dc35dcb14a8b6c4f221fccafffa5ca603894dbaaJason Monk        setBackground(mTileBackground);
96dc35dcb14a8b6c4f221fccafffa5ca603894dbaaJason Monk
97cb2307cb5cefa7666340552d62eb953c39af5a86Jason Monk        mColorActive = Utils.getColorAttr(context, android.R.attr.colorAccent);
98cb2307cb5cefa7666340552d62eb953c39af5a86Jason Monk        mColorDisabled = Utils.getDisabled(context,
99cb2307cb5cefa7666340552d62eb953c39af5a86Jason Monk                Utils.getColorAttr(context, android.R.attr.textColorTertiary));
100cb2307cb5cefa7666340552d62eb953c39af5a86Jason Monk        mColorInactive = Utils.getColorAttr(context, android.R.attr.textColorSecondary);
101cb2307cb5cefa7666340552d62eb953c39af5a86Jason Monk
1023250885c9feb9b42d60058a823c57a027c0dcf58Jason Monk        setPadding(0, 0, 0, 0);
103162011ebe8015f44d4d9ced519297a7cfb087af2Jason Monk        setClipChildren(false);
104162011ebe8015f44d4d9ced519297a7cfb087af2Jason Monk        setClipToPadding(false);
10520aef8a2914478a85aa679ec31bf739c7818eb3cJulia Reynolds        mCollapsedView = collapsedView;
106f07f1700e234a106c011becc305a15f4dba7e38aMin Yun        setFocusable(true);
107c133d26b3897811e9f567d787bff8eafb364f3e3Jason Monk    }
108c133d26b3897811e9f567d787bff8eafb364f3e3Jason Monk
109cb2307cb5cefa7666340552d62eb953c39af5a86Jason Monk    public View getBgCicle() {
110cb2307cb5cefa7666340552d62eb953c39af5a86Jason Monk        return mBg;
111cb2307cb5cefa7666340552d62eb953c39af5a86Jason Monk    }
112cb2307cb5cefa7666340552d62eb953c39af5a86Jason Monk
113074ae4696061f7e981160c4bcc94377b53a58203Jiaquan He    protected Drawable newTileBackground() {
1143250885c9feb9b42d60058a823c57a027c0dcf58Jason Monk        final int[] attrs = new int[]{android.R.attr.selectableItemBackgroundBorderless};
1153250885c9feb9b42d60058a823c57a027c0dcf58Jason Monk        final TypedArray ta = getContext().obtainStyledAttributes(attrs);
116dc35dcb14a8b6c4f221fccafffa5ca603894dbaaJason Monk        final Drawable d = ta.getDrawable(0);
117dc35dcb14a8b6c4f221fccafffa5ca603894dbaaJason Monk        ta.recycle();
118dc35dcb14a8b6c4f221fccafffa5ca603894dbaaJason Monk        return d;
119c133d26b3897811e9f567d787bff8eafb364f3e3Jason Monk    }
120c133d26b3897811e9f567d787bff8eafb364f3e3Jason Monk
121dc35dcb14a8b6c4f221fccafffa5ca603894dbaaJason Monk    private void setRipple(RippleDrawable tileBackground) {
122dc35dcb14a8b6c4f221fccafffa5ca603894dbaaJason Monk        mRipple = tileBackground;
123dc35dcb14a8b6c4f221fccafffa5ca603894dbaaJason Monk        if (getWidth() != 0) {
1243033099f81e5ab89207b4e29c36a6976b0dbb276Amin Shaikh            updateRippleSize();
125dc35dcb14a8b6c4f221fccafffa5ca603894dbaaJason Monk        }
126dc35dcb14a8b6c4f221fccafffa5ca603894dbaaJason Monk    }
127c133d26b3897811e9f567d787bff8eafb364f3e3Jason Monk
1283033099f81e5ab89207b4e29c36a6976b0dbb276Amin Shaikh    private void updateRippleSize() {
129dc35dcb14a8b6c4f221fccafffa5ca603894dbaaJason Monk        // center the touch feedback on the center of the icon, and dial it down a bit
1303033099f81e5ab89207b4e29c36a6976b0dbb276Amin Shaikh        final int cx = mIconFrame.getMeasuredWidth() / 2 + mIconFrame.getLeft();
1313033099f81e5ab89207b4e29c36a6976b0dbb276Amin Shaikh        final int cy = mIconFrame.getMeasuredHeight() / 2 + mIconFrame.getTop();
1323250885c9feb9b42d60058a823c57a027c0dcf58Jason Monk        final int rad = (int) (mIcon.getHeight() * .85f);
133dc35dcb14a8b6c4f221fccafffa5ca603894dbaaJason Monk        mRipple.setHotspotBounds(cx - rad, cy - rad, cx + rad, cy + rad);
134c133d26b3897811e9f567d787bff8eafb364f3e3Jason Monk    }
135c133d26b3897811e9f567d787bff8eafb364f3e3Jason Monk
136702e2ebf9fbfb715c1d9b716683c9e4d182b575eJason Monk    @Override
137702e2ebf9fbfb715c1d9b716683c9e4d182b575eJason Monk    public void init(QSTile tile) {
138702e2ebf9fbfb715c1d9b716683c9e4d182b575eJason Monk        init(v -> tile.click(), v -> tile.secondaryClick(), view -> {
139702e2ebf9fbfb715c1d9b716683c9e4d182b575eJason Monk            tile.longClick();
140702e2ebf9fbfb715c1d9b716683c9e4d182b575eJason Monk            return true;
141702e2ebf9fbfb715c1d9b716683c9e4d182b575eJason Monk        });
142702e2ebf9fbfb715c1d9b716683c9e4d182b575eJason Monk    }
143702e2ebf9fbfb715c1d9b716683c9e4d182b575eJason Monk
1443250885c9feb9b42d60058a823c57a027c0dcf58Jason Monk    public void init(OnClickListener click, OnClickListener secondaryClick,
1453250885c9feb9b42d60058a823c57a027c0dcf58Jason Monk            OnLongClickListener longClick) {
146dc35dcb14a8b6c4f221fccafffa5ca603894dbaaJason Monk        setOnClickListener(click);
14776c67aa361f65dfb2f5e03d06cc1ccebce9cecd9Jason Monk        setOnLongClickListener(longClick);
148dc35dcb14a8b6c4f221fccafffa5ca603894dbaaJason Monk    }
149dc35dcb14a8b6c4f221fccafffa5ca603894dbaaJason Monk
150dc35dcb14a8b6c4f221fccafffa5ca603894dbaaJason Monk    @Override
151dc35dcb14a8b6c4f221fccafffa5ca603894dbaaJason Monk    protected void onLayout(boolean changed, int l, int t, int r, int b) {
152dc35dcb14a8b6c4f221fccafffa5ca603894dbaaJason Monk        super.onLayout(changed, l, t, r, b);
153dc35dcb14a8b6c4f221fccafffa5ca603894dbaaJason Monk        if (mRipple != null) {
1543033099f81e5ab89207b4e29c36a6976b0dbb276Amin Shaikh            updateRippleSize();
155dc35dcb14a8b6c4f221fccafffa5ca603894dbaaJason Monk        }
156dc35dcb14a8b6c4f221fccafffa5ca603894dbaaJason Monk    }
157c133d26b3897811e9f567d787bff8eafb364f3e3Jason Monk
158c3081179d8961a291c47c05f52b63c134284cd4dJorim Jaggi    @Override
159c3081179d8961a291c47c05f52b63c134284cd4dJorim Jaggi    public boolean hasOverlappingRendering() {
160c3081179d8961a291c47c05f52b63c134284cd4dJorim Jaggi        // Avoid layers for this layout - we don't need them.
161c3081179d8961a291c47c05f52b63c134284cd4dJorim Jaggi        return false;
162c3081179d8961a291c47c05f52b63c134284cd4dJorim Jaggi    }
163c3081179d8961a291c47c05f52b63c134284cd4dJorim Jaggi
164dc35dcb14a8b6c4f221fccafffa5ca603894dbaaJason Monk    /**
165dc35dcb14a8b6c4f221fccafffa5ca603894dbaaJason Monk     * Update the accessibility order for this view.
166dc35dcb14a8b6c4f221fccafffa5ca603894dbaaJason Monk     *
167dc35dcb14a8b6c4f221fccafffa5ca603894dbaaJason Monk     * @param previousView the view which should be before this one
168dc35dcb14a8b6c4f221fccafffa5ca603894dbaaJason Monk     * @return the last view in this view which is accessible
169dc35dcb14a8b6c4f221fccafffa5ca603894dbaaJason Monk     */
170dc35dcb14a8b6c4f221fccafffa5ca603894dbaaJason Monk    public View updateAccessibilityOrder(View previousView) {
171dc35dcb14a8b6c4f221fccafffa5ca603894dbaaJason Monk        setAccessibilityTraversalAfter(previousView.getId());
172dc35dcb14a8b6c4f221fccafffa5ca603894dbaaJason Monk        return this;
173dc35dcb14a8b6c4f221fccafffa5ca603894dbaaJason Monk    }
174c133d26b3897811e9f567d787bff8eafb364f3e3Jason Monk
175dc35dcb14a8b6c4f221fccafffa5ca603894dbaaJason Monk    public void onStateChanged(QSTile.State state) {
176dc35dcb14a8b6c4f221fccafffa5ca603894dbaaJason Monk        mHandler.obtainMessage(H.STATE_CHANGED, state).sendToTarget();
177c133d26b3897811e9f567d787bff8eafb364f3e3Jason Monk    }
178c133d26b3897811e9f567d787bff8eafb364f3e3Jason Monk
179dc35dcb14a8b6c4f221fccafffa5ca603894dbaaJason Monk    protected void handleStateChanged(QSTile.State state) {
180cb2307cb5cefa7666340552d62eb953c39af5a86Jason Monk        int circleColor = getCircleColor(state.state);
181cb2307cb5cefa7666340552d62eb953c39af5a86Jason Monk        if (circleColor != mCircleColor) {
1825df1a75ec83fc5ffd0265421c711822194df0ce0Amin Shaikh            if (mBg.isShown() && animationsEnabled()) {
183cb2307cb5cefa7666340552d62eb953c39af5a86Jason Monk                ValueAnimator animator = ValueAnimator.ofArgb(mCircleColor, circleColor)
184cb2307cb5cefa7666340552d62eb953c39af5a86Jason Monk                        .setDuration(QS_ANIM_LENGTH);
185cb2307cb5cefa7666340552d62eb953c39af5a86Jason Monk                animator.addUpdateListener(animation -> mBg.setImageTintList(ColorStateList.valueOf(
186cb2307cb5cefa7666340552d62eb953c39af5a86Jason Monk                        (Integer) animation.getAnimatedValue())));
187cb2307cb5cefa7666340552d62eb953c39af5a86Jason Monk                animator.start();
188cb2307cb5cefa7666340552d62eb953c39af5a86Jason Monk            } else {
189cb2307cb5cefa7666340552d62eb953c39af5a86Jason Monk                QSIconViewImpl.setTint(mBg, circleColor);
190cb2307cb5cefa7666340552d62eb953c39af5a86Jason Monk            }
191cb2307cb5cefa7666340552d62eb953c39af5a86Jason Monk            mCircleColor = circleColor;
192cb2307cb5cefa7666340552d62eb953c39af5a86Jason Monk        }
193cb2307cb5cefa7666340552d62eb953c39af5a86Jason Monk
194e2f05d23b119a34a1b1b32fdab0e5fbcca1c98e9Jason Monk        setClickable(state.state != Tile.STATE_UNAVAILABLE);
195dc35dcb14a8b6c4f221fccafffa5ca603894dbaaJason Monk        mIcon.setIcon(state);
196702e2ebf9fbfb715c1d9b716683c9e4d182b575eJason Monk        setContentDescription(state.contentDescription);
197185f66166334bd5439ca978c494f72c55dca7f05Rohan Shah
198702e2ebf9fbfb715c1d9b716683c9e4d182b575eJason Monk        mAccessibilityClass = state.expandedAccessibilityClassName;
19920aef8a2914478a85aa679ec31bf739c7818eb3cJulia Reynolds        if (state instanceof QSTile.BooleanState) {
20090950d998cffa25ba0c01e503c9dc6616230dabdJason Monk            boolean newState = ((BooleanState) state).value;
20190950d998cffa25ba0c01e503c9dc6616230dabdJason Monk            if (mTileState != newState) {
20290950d998cffa25ba0c01e503c9dc6616230dabdJason Monk                mClicked = false;
20390950d998cffa25ba0c01e503c9dc6616230dabdJason Monk                mTileState = newState;
20490950d998cffa25ba0c01e503c9dc6616230dabdJason Monk            }
20520aef8a2914478a85aa679ec31bf739c7818eb3cJulia Reynolds        }
206c133d26b3897811e9f567d787bff8eafb364f3e3Jason Monk    }
207c133d26b3897811e9f567d787bff8eafb364f3e3Jason Monk
2085df1a75ec83fc5ffd0265421c711822194df0ce0Amin Shaikh    protected boolean animationsEnabled() {
2095df1a75ec83fc5ffd0265421c711822194df0ce0Amin Shaikh        return true;
2105df1a75ec83fc5ffd0265421c711822194df0ce0Amin Shaikh    }
2115df1a75ec83fc5ffd0265421c711822194df0ce0Amin Shaikh
212cb2307cb5cefa7666340552d62eb953c39af5a86Jason Monk    private int getCircleColor(int state) {
213cb2307cb5cefa7666340552d62eb953c39af5a86Jason Monk        switch (state) {
214cb2307cb5cefa7666340552d62eb953c39af5a86Jason Monk            case Tile.STATE_ACTIVE:
215cb2307cb5cefa7666340552d62eb953c39af5a86Jason Monk                return mColorActive;
216cb2307cb5cefa7666340552d62eb953c39af5a86Jason Monk            case Tile.STATE_INACTIVE:
217cb2307cb5cefa7666340552d62eb953c39af5a86Jason Monk            case Tile.STATE_UNAVAILABLE:
218cb2307cb5cefa7666340552d62eb953c39af5a86Jason Monk                return mColorDisabled;
219cb2307cb5cefa7666340552d62eb953c39af5a86Jason Monk            default:
220cb2307cb5cefa7666340552d62eb953c39af5a86Jason Monk                Log.e(TAG, "Invalid state " + state);
221cb2307cb5cefa7666340552d62eb953c39af5a86Jason Monk                return 0;
222cb2307cb5cefa7666340552d62eb953c39af5a86Jason Monk        }
223cb2307cb5cefa7666340552d62eb953c39af5a86Jason Monk    }
224cb2307cb5cefa7666340552d62eb953c39af5a86Jason Monk
225702e2ebf9fbfb715c1d9b716683c9e4d182b575eJason Monk    @Override
226e2f05d23b119a34a1b1b32fdab0e5fbcca1c98e9Jason Monk    public void setClickable(boolean clickable) {
227e2f05d23b119a34a1b1b32fdab0e5fbcca1c98e9Jason Monk        super.setClickable(clickable);
228e2f05d23b119a34a1b1b32fdab0e5fbcca1c98e9Jason Monk        setBackground(clickable ? mRipple : null);
229e2f05d23b119a34a1b1b32fdab0e5fbcca1c98e9Jason Monk    }
230e2f05d23b119a34a1b1b32fdab0e5fbcca1c98e9Jason Monk
231e2f05d23b119a34a1b1b32fdab0e5fbcca1c98e9Jason Monk    @Override
232702e2ebf9fbfb715c1d9b716683c9e4d182b575eJason Monk    public int getDetailY() {
233702e2ebf9fbfb715c1d9b716683c9e4d182b575eJason Monk        return getTop() + getHeight() / 2;
234702e2ebf9fbfb715c1d9b716683c9e4d182b575eJason Monk    }
235702e2ebf9fbfb715c1d9b716683c9e4d182b575eJason Monk
2361aec93f1819369bda9e6cb0bd282419808c304c3Jason Monk    public QSIconView getIcon() {
237162011ebe8015f44d4d9ced519297a7cfb087af2Jason Monk        return mIcon;
238162011ebe8015f44d4d9ced519297a7cfb087af2Jason Monk    }
239162011ebe8015f44d4d9ced519297a7cfb087af2Jason Monk
240a840199853836d04a07a3d49b79bdb908d70a8feRohan Shah    public View getIconWithBackground() {
241a840199853836d04a07a3d49b79bdb908d70a8feRohan Shah        return mIconFrame;
242a840199853836d04a07a3d49b79bdb908d70a8feRohan Shah    }
243a840199853836d04a07a3d49b79bdb908d70a8feRohan Shah
24420aef8a2914478a85aa679ec31bf739c7818eb3cJulia Reynolds    @Override
24590950d998cffa25ba0c01e503c9dc6616230dabdJason Monk    public boolean performClick() {
24690950d998cffa25ba0c01e503c9dc6616230dabdJason Monk        mClicked = true;
24790950d998cffa25ba0c01e503c9dc6616230dabdJason Monk        return super.performClick();
24890950d998cffa25ba0c01e503c9dc6616230dabdJason Monk    }
24990950d998cffa25ba0c01e503c9dc6616230dabdJason Monk
25090950d998cffa25ba0c01e503c9dc6616230dabdJason Monk    @Override
25120aef8a2914478a85aa679ec31bf739c7818eb3cJulia Reynolds    public void onInitializeAccessibilityEvent(AccessibilityEvent event) {
25220aef8a2914478a85aa679ec31bf739c7818eb3cJulia Reynolds        super.onInitializeAccessibilityEvent(event);
25320aef8a2914478a85aa679ec31bf739c7818eb3cJulia Reynolds        if (!TextUtils.isEmpty(mAccessibilityClass)) {
25420aef8a2914478a85aa679ec31bf739c7818eb3cJulia Reynolds            event.setClassName(mAccessibilityClass);
25520aef8a2914478a85aa679ec31bf739c7818eb3cJulia Reynolds            if (Switch.class.getName().equals(mAccessibilityClass)) {
25690950d998cffa25ba0c01e503c9dc6616230dabdJason Monk                boolean b = mClicked ? !mTileState : mTileState;
25720aef8a2914478a85aa679ec31bf739c7818eb3cJulia Reynolds                String label = getResources()
25890950d998cffa25ba0c01e503c9dc6616230dabdJason Monk                        .getString(b ? R.string.switch_bar_on : R.string.switch_bar_off);
25920aef8a2914478a85aa679ec31bf739c7818eb3cJulia Reynolds                event.setContentDescription(label);
26090950d998cffa25ba0c01e503c9dc6616230dabdJason Monk                event.setChecked(b);
26120aef8a2914478a85aa679ec31bf739c7818eb3cJulia Reynolds            }
26220aef8a2914478a85aa679ec31bf739c7818eb3cJulia Reynolds        }
26320aef8a2914478a85aa679ec31bf739c7818eb3cJulia Reynolds    }
26420aef8a2914478a85aa679ec31bf739c7818eb3cJulia Reynolds
26520aef8a2914478a85aa679ec31bf739c7818eb3cJulia Reynolds    @Override
26620aef8a2914478a85aa679ec31bf739c7818eb3cJulia Reynolds    public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
26720aef8a2914478a85aa679ec31bf739c7818eb3cJulia Reynolds        super.onInitializeAccessibilityNodeInfo(info);
26820aef8a2914478a85aa679ec31bf739c7818eb3cJulia Reynolds        if (!TextUtils.isEmpty(mAccessibilityClass)) {
26920aef8a2914478a85aa679ec31bf739c7818eb3cJulia Reynolds            info.setClassName(mAccessibilityClass);
27020aef8a2914478a85aa679ec31bf739c7818eb3cJulia Reynolds            if (Switch.class.getName().equals(mAccessibilityClass)) {
27190950d998cffa25ba0c01e503c9dc6616230dabdJason Monk                boolean b = mClicked ? !mTileState : mTileState;
27220aef8a2914478a85aa679ec31bf739c7818eb3cJulia Reynolds                String label = getResources()
27390950d998cffa25ba0c01e503c9dc6616230dabdJason Monk                        .getString(b ? R.string.switch_bar_on : R.string.switch_bar_off);
27420aef8a2914478a85aa679ec31bf739c7818eb3cJulia Reynolds                info.setText(label);
27590950d998cffa25ba0c01e503c9dc6616230dabdJason Monk                info.setChecked(b);
27620aef8a2914478a85aa679ec31bf739c7818eb3cJulia Reynolds                info.setCheckable(true);
277185f66166334bd5439ca978c494f72c55dca7f05Rohan Shah                info.addAction(
278185f66166334bd5439ca978c494f72c55dca7f05Rohan Shah                        new AccessibilityNodeInfo.AccessibilityAction(
279185f66166334bd5439ca978c494f72c55dca7f05Rohan Shah                                AccessibilityNodeInfo.AccessibilityAction.ACTION_LONG_CLICK.getId(),
280185f66166334bd5439ca978c494f72c55dca7f05Rohan Shah                                getResources().getString(R.string.accessibility_long_click_tile)));
28120aef8a2914478a85aa679ec31bf739c7818eb3cJulia Reynolds            }
28220aef8a2914478a85aa679ec31bf739c7818eb3cJulia Reynolds        }
28320aef8a2914478a85aa679ec31bf739c7818eb3cJulia Reynolds    }
28420aef8a2914478a85aa679ec31bf739c7818eb3cJulia Reynolds
285c133d26b3897811e9f567d787bff8eafb364f3e3Jason Monk    private class H extends Handler {
286c133d26b3897811e9f567d787bff8eafb364f3e3Jason Monk        private static final int STATE_CHANGED = 1;
287c133d26b3897811e9f567d787bff8eafb364f3e3Jason Monk        public H() {
288c133d26b3897811e9f567d787bff8eafb364f3e3Jason Monk            super(Looper.getMainLooper());
289c133d26b3897811e9f567d787bff8eafb364f3e3Jason Monk        }
290c133d26b3897811e9f567d787bff8eafb364f3e3Jason Monk
291c133d26b3897811e9f567d787bff8eafb364f3e3Jason Monk        @Override
292c133d26b3897811e9f567d787bff8eafb364f3e3Jason Monk        public void handleMessage(Message msg) {
293c133d26b3897811e9f567d787bff8eafb364f3e3Jason Monk            if (msg.what == STATE_CHANGED) {
294c133d26b3897811e9f567d787bff8eafb364f3e3Jason Monk                handleStateChanged((QSTile.State) msg.obj);
295c133d26b3897811e9f567d787bff8eafb364f3e3Jason Monk            }
296c133d26b3897811e9f567d787bff8eafb364f3e3Jason Monk        }
297c133d26b3897811e9f567d787bff8eafb364f3e3Jason Monk    }
298c133d26b3897811e9f567d787bff8eafb364f3e3Jason Monk}
299