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