SignalClusterView.java revision 3b230077dc53c1f83aa6e9b70585148d8193dd82
12e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson/*
22e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson * Copyright (C) 2011 The Android Open Source Project
32e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson *
42e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson * Licensed under the Apache License, Version 2.0 (the "License");
52e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson * you may not use this file except in compliance with the License.
62e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson * You may obtain a copy of the License at
72e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson *
82e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson *      http://www.apache.org/licenses/LICENSE-2.0
92e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson *
102e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson * Unless required by applicable law or agreed to in writing, software
112e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson * distributed under the License is distributed on an "AS IS" BASIS,
122e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
132e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson * See the License for the specific language governing permissions and
142e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson * limitations under the License.
152e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson */
162e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson
172e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertsonpackage com.android.systemui.statusbar;
182e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson
192e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertsonimport android.content.Context;
20dd0107a0dbe3084af8f5da005a4d96f8657f58a1Jorim Jaggiimport android.content.res.ColorStateList;
213b230077dc53c1f83aa6e9b70585148d8193dd82Jason Monkimport android.database.ContentObserver;
22dd0107a0dbe3084af8f5da005a4d96f8657f58a1Jorim Jaggiimport android.graphics.Color;
23dd0107a0dbe3084af8f5da005a4d96f8657f58a1Jorim Jaggiimport android.graphics.PorterDuff;
24a478d70a68696380acbd4a9739dfaaebff61c728Andrew Flynnimport android.graphics.drawable.Animatable;
25a478d70a68696380acbd4a9739dfaaebff61c728Andrew Flynnimport android.graphics.drawable.Drawable;
263b230077dc53c1f83aa6e9b70585148d8193dd82Jason Monkimport android.os.Handler;
273b230077dc53c1f83aa6e9b70585148d8193dd82Jason Monkimport android.provider.Settings;
28b574627ebc383d35cf8212ee241b191b26518a0dJason Monkimport android.telephony.SubscriptionInfo;
292e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertsonimport android.util.AttributeSet;
30cd686b5b6d4166b510df8e32138479a9559bc117John Spurlockimport android.util.Log;
31b574627ebc383d35cf8212ee241b191b26518a0dJason Monkimport android.view.LayoutInflater;
322e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertsonimport android.view.View;
332e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertsonimport android.view.ViewGroup;
342f7dfa7afdaada78c46bd6fd7e307656ba3dd66aJohn Spurlockimport android.view.accessibility.AccessibilityEvent;
352e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertsonimport android.widget.ImageView;
362e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertsonimport android.widget.LinearLayout;
372e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson
382e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertsonimport com.android.systemui.R;
393b230077dc53c1f83aa6e9b70585148d8193dd82Jason Monkimport com.android.systemui.statusbar.phone.StatusBarIconController;
4007b75fe65dcb5b8add8246654c65f95f1191933eJason Monkimport com.android.systemui.statusbar.policy.NetworkController.IconState;
41af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlockimport com.android.systemui.statusbar.policy.NetworkControllerImpl;
423128f12f216ef481b5d03892b35706cfeec26d7cJason Monkimport com.android.systemui.statusbar.policy.SecurityController;
432e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson
44b574627ebc383d35cf8212ee241b191b26518a0dJason Monkimport java.util.ArrayList;
45b574627ebc383d35cf8212ee241b191b26518a0dJason Monkimport java.util.List;
46b574627ebc383d35cf8212ee241b191b26518a0dJason Monk
475ccff81a642844138b144ad2cc339eba188812a0Daniel Sandler// Intimately tied to the design of res/layout/signal_cluster_view.xml
482e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertsonpublic class SignalClusterView
492f7dfa7afdaada78c46bd6fd7e307656ba3dd66aJohn Spurlock        extends LinearLayout
5007b75fe65dcb5b8add8246654c65f95f1191933eJason Monk        implements NetworkControllerImpl.SignalCallback,
513128f12f216ef481b5d03892b35706cfeec26d7cJason Monk        SecurityController.SecurityControllerCallback {
522e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson
5328f89d40ee7bab93cf7b783f92dbb18bdc43e473Daniel Sandler    static final String TAG = "SignalClusterView";
54b3eb89190c4bb4ebbe676328cd37830d50e6ed3eJohn Spurlock    static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
552f7dfa7afdaada78c46bd6fd7e307656ba3dd66aJohn Spurlock
563b230077dc53c1f83aa6e9b70585148d8193dd82Jason Monk    private static final String SLOT_AIRPLANE = "airplane";
573b230077dc53c1f83aa6e9b70585148d8193dd82Jason Monk    private static final String SLOT_MOBILE = "mobile";
583b230077dc53c1f83aa6e9b70585148d8193dd82Jason Monk    private static final String SLOT_WIFI = "wifi";
593b230077dc53c1f83aa6e9b70585148d8193dd82Jason Monk    private static final String SLOT_ETHERNET = "ethernet";
603b230077dc53c1f83aa6e9b70585148d8193dd82Jason Monk
61af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    NetworkControllerImpl mNC;
623128f12f216ef481b5d03892b35706cfeec26d7cJason Monk    SecurityController mSC;
632e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson
64b574627ebc383d35cf8212ee241b191b26518a0dJason Monk    private boolean mNoSimsVisible = false;
653128f12f216ef481b5d03892b35706cfeec26d7cJason Monk    private boolean mVpnVisible = false;
66d46bb58fa635110bf8c911107819e8bd8e8b06e2Lorenzo Colitti    private boolean mEthernetVisible = false;
67d46bb58fa635110bf8c911107819e8bd8e8b06e2Lorenzo Colitti    private int mEthernetIconId = 0;
6806302c22969b6cf63239f990eb90e72f83d0c98eJorim Jaggi    private int mLastEthernetIconId = -1;
6928f89d40ee7bab93cf7b783f92dbb18bdc43e473Daniel Sandler    private boolean mWifiVisible = false;
70fcc901c10bffdfb9c6b31e676dec36b47d949979John Spurlock    private int mWifiStrengthId = 0;
7106302c22969b6cf63239f990eb90e72f83d0c98eJorim Jaggi    private int mLastWifiStrengthId = -1;
725ccff81a642844138b144ad2cc339eba188812a0Daniel Sandler    private boolean mIsAirplaneMode = false;
73061d43c2386dd8222448bb1bec017bf9a2367a4eAndrew Flynn    private int mAirplaneIconId = 0;
7406302c22969b6cf63239f990eb90e72f83d0c98eJorim Jaggi    private int mLastAirplaneIconId = -1;
7507b75fe65dcb5b8add8246654c65f95f1191933eJason Monk    private String mAirplaneContentDescription;
76b574627ebc383d35cf8212ee241b191b26518a0dJason Monk    private String mWifiDescription;
77d46bb58fa635110bf8c911107819e8bd8e8b06e2Lorenzo Colitti    private String mEthernetDescription;
78b574627ebc383d35cf8212ee241b191b26518a0dJason Monk    private ArrayList<PhoneState> mPhoneStates = new ArrayList<PhoneState>();
79dd0107a0dbe3084af8f5da005a4d96f8657f58a1Jorim Jaggi    private int mIconTint = Color.WHITE;
805443cc563cf4581a8ea9ada3b27fac7107d72099Jorim Jaggi    private float mDarkIntensity;
8128f89d40ee7bab93cf7b783f92dbb18bdc43e473Daniel Sandler
82d46bb58fa635110bf8c911107819e8bd8e8b06e2Lorenzo Colitti    ViewGroup mEthernetGroup, mWifiGroup;
83d46bb58fa635110bf8c911107819e8bd8e8b06e2Lorenzo Colitti    ImageView mVpn, mEthernet, mWifi, mAirplane, mNoSims, mEthernetDark, mWifiDark, mNoSimsDark;
845172dc2f36f9c417befd0957ce2ae20f9d083a88Jorim Jaggi    View mWifiAirplaneSpacer;
85c737b9bd5a0bc60fd92150d55f8ddb530697b987Jorim Jaggi    View mWifiSignalSpacer;
86b574627ebc383d35cf8212ee241b191b26518a0dJason Monk    LinearLayout mMobileSignalGroup;
87c737b9bd5a0bc60fd92150d55f8ddb530697b987Jorim Jaggi
88c737b9bd5a0bc60fd92150d55f8ddb530697b987Jorim Jaggi    private int mWideTypeIconStartPadding;
89b574627ebc383d35cf8212ee241b191b26518a0dJason Monk    private int mSecondaryTelephonyPadding;
906d035f15d5c8c67d97a4d5b6ed44f8cca0772e1fJorim Jaggi    private int mEndPadding;
916d035f15d5c8c67d97a4d5b6ed44f8cca0772e1fJorim Jaggi    private int mEndPaddingNothingVisible;
922e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson
933b230077dc53c1f83aa6e9b70585148d8193dd82Jason Monk    private boolean mBlockAirplane;
943b230077dc53c1f83aa6e9b70585148d8193dd82Jason Monk    private boolean mBlockMobile;
953b230077dc53c1f83aa6e9b70585148d8193dd82Jason Monk    private boolean mBlockWifi;
963b230077dc53c1f83aa6e9b70585148d8193dd82Jason Monk    private boolean mBlockEthernet;
973b230077dc53c1f83aa6e9b70585148d8193dd82Jason Monk
982e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson    public SignalClusterView(Context context) {
992e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson        this(context, null);
1002e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson    }
1012e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson
1022e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson    public SignalClusterView(Context context, AttributeSet attrs) {
1032e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson        this(context, attrs, 0);
1042e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson    }
1052e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson
1062e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson    public SignalClusterView(Context context, AttributeSet attrs, int defStyle) {
1072e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson        super(context, attrs, defStyle);
1083b230077dc53c1f83aa6e9b70585148d8193dd82Jason Monk        readBlacklist();
1093b230077dc53c1f83aa6e9b70585148d8193dd82Jason Monk    }
1103b230077dc53c1f83aa6e9b70585148d8193dd82Jason Monk
1113b230077dc53c1f83aa6e9b70585148d8193dd82Jason Monk    private void readBlacklist() {
1123b230077dc53c1f83aa6e9b70585148d8193dd82Jason Monk        mBlockAirplane = StatusBarIconController.isBlocked(getContext(), SLOT_AIRPLANE);
1133b230077dc53c1f83aa6e9b70585148d8193dd82Jason Monk        mBlockMobile = StatusBarIconController.isBlocked(getContext(), SLOT_MOBILE);
1143b230077dc53c1f83aa6e9b70585148d8193dd82Jason Monk        mBlockWifi = StatusBarIconController.isBlocked(getContext(), SLOT_WIFI);
1153b230077dc53c1f83aa6e9b70585148d8193dd82Jason Monk        mBlockEthernet = StatusBarIconController.isBlocked(getContext(), SLOT_ETHERNET);
1162e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson    }
1172e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson
118af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    public void setNetworkController(NetworkControllerImpl nc) {
119cd686b5b6d4166b510df8e32138479a9559bc117John Spurlock        if (DEBUG) Log.d(TAG, "NetworkController=" + nc);
1202e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson        mNC = nc;
1212e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson    }
1222e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson
1233128f12f216ef481b5d03892b35706cfeec26d7cJason Monk    public void setSecurityController(SecurityController sc) {
1243128f12f216ef481b5d03892b35706cfeec26d7cJason Monk        if (DEBUG) Log.d(TAG, "SecurityController=" + sc);
1253128f12f216ef481b5d03892b35706cfeec26d7cJason Monk        mSC = sc;
1263128f12f216ef481b5d03892b35706cfeec26d7cJason Monk        mSC.addCallback(this);
1273128f12f216ef481b5d03892b35706cfeec26d7cJason Monk        mVpnVisible = mSC.isVpnEnabled();
1283128f12f216ef481b5d03892b35706cfeec26d7cJason Monk    }
1293128f12f216ef481b5d03892b35706cfeec26d7cJason Monk
1302e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson    @Override
131c737b9bd5a0bc60fd92150d55f8ddb530697b987Jorim Jaggi    protected void onFinishInflate() {
132c737b9bd5a0bc60fd92150d55f8ddb530697b987Jorim Jaggi        super.onFinishInflate();
133c737b9bd5a0bc60fd92150d55f8ddb530697b987Jorim Jaggi        mWideTypeIconStartPadding = getContext().getResources().getDimensionPixelSize(
134c737b9bd5a0bc60fd92150d55f8ddb530697b987Jorim Jaggi                R.dimen.wide_type_icon_start_padding);
135b574627ebc383d35cf8212ee241b191b26518a0dJason Monk        mSecondaryTelephonyPadding = getContext().getResources().getDimensionPixelSize(
136b574627ebc383d35cf8212ee241b191b26518a0dJason Monk                R.dimen.secondary_telephony_padding);
1376d035f15d5c8c67d97a4d5b6ed44f8cca0772e1fJorim Jaggi        mEndPadding = getContext().getResources().getDimensionPixelSize(
1386d035f15d5c8c67d97a4d5b6ed44f8cca0772e1fJorim Jaggi                R.dimen.signal_cluster_battery_padding);
1396d035f15d5c8c67d97a4d5b6ed44f8cca0772e1fJorim Jaggi        mEndPaddingNothingVisible = getContext().getResources().getDimensionPixelSize(
1406d035f15d5c8c67d97a4d5b6ed44f8cca0772e1fJorim Jaggi                R.dimen.no_signal_cluster_battery_padding);
141c737b9bd5a0bc60fd92150d55f8ddb530697b987Jorim Jaggi    }
142c737b9bd5a0bc60fd92150d55f8ddb530697b987Jorim Jaggi
143c737b9bd5a0bc60fd92150d55f8ddb530697b987Jorim Jaggi    @Override
1442e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson    protected void onAttachedToWindow() {
1452e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson        super.onAttachedToWindow();
1462e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson
1473128f12f216ef481b5d03892b35706cfeec26d7cJason Monk        mVpn            = (ImageView) findViewById(R.id.vpn);
148d46bb58fa635110bf8c911107819e8bd8e8b06e2Lorenzo Colitti        mEthernetGroup  = (ViewGroup) findViewById(R.id.ethernet_combo);
149d46bb58fa635110bf8c911107819e8bd8e8b06e2Lorenzo Colitti        mEthernet       = (ImageView) findViewById(R.id.ethernet);
150d46bb58fa635110bf8c911107819e8bd8e8b06e2Lorenzo Colitti        mEthernetDark   = (ImageView) findViewById(R.id.ethernet_dark);
1512e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson        mWifiGroup      = (ViewGroup) findViewById(R.id.wifi_combo);
1522e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson        mWifi           = (ImageView) findViewById(R.id.wifi_signal);
1535443cc563cf4581a8ea9ada3b27fac7107d72099Jorim Jaggi        mWifiDark       = (ImageView) findViewById(R.id.wifi_signal_dark);
154061d43c2386dd8222448bb1bec017bf9a2367a4eAndrew Flynn        mAirplane       = (ImageView) findViewById(R.id.airplane);
155b574627ebc383d35cf8212ee241b191b26518a0dJason Monk        mNoSims         = (ImageView) findViewById(R.id.no_sims);
1565443cc563cf4581a8ea9ada3b27fac7107d72099Jorim Jaggi        mNoSimsDark     = (ImageView) findViewById(R.id.no_sims_dark);
1575172dc2f36f9c417befd0957ce2ae20f9d083a88Jorim Jaggi        mWifiAirplaneSpacer =         findViewById(R.id.wifi_airplane_spacer);
158c737b9bd5a0bc60fd92150d55f8ddb530697b987Jorim Jaggi        mWifiSignalSpacer =           findViewById(R.id.wifi_signal_spacer);
159b574627ebc383d35cf8212ee241b191b26518a0dJason Monk        mMobileSignalGroup = (LinearLayout) findViewById(R.id.mobile_signal_group);
160b574627ebc383d35cf8212ee241b191b26518a0dJason Monk        for (PhoneState state : mPhoneStates) {
161b574627ebc383d35cf8212ee241b191b26518a0dJason Monk            mMobileSignalGroup.addView(state.mMobileGroup);
162b574627ebc383d35cf8212ee241b191b26518a0dJason Monk        }
16328f89d40ee7bab93cf7b783f92dbb18bdc43e473Daniel Sandler
16428f89d40ee7bab93cf7b783f92dbb18bdc43e473Daniel Sandler        apply();
165dd0107a0dbe3084af8f5da005a4d96f8657f58a1Jorim Jaggi        applyIconTint();
1663b230077dc53c1f83aa6e9b70585148d8193dd82Jason Monk        getContext().getContentResolver().registerContentObserver(
1673b230077dc53c1f83aa6e9b70585148d8193dd82Jason Monk                Settings.Secure.getUriFor(StatusBarIconController.ICON_BLACKLIST), false,
1683b230077dc53c1f83aa6e9b70585148d8193dd82Jason Monk                mBlacklistObserver);
1692e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson    }
1702e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson
1712e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson    @Override
1722e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson    protected void onDetachedFromWindow() {
1733128f12f216ef481b5d03892b35706cfeec26d7cJason Monk        mVpn            = null;
174d46bb58fa635110bf8c911107819e8bd8e8b06e2Lorenzo Colitti        mEthernetGroup  = null;
175d46bb58fa635110bf8c911107819e8bd8e8b06e2Lorenzo Colitti        mEthernet       = null;
17628f89d40ee7bab93cf7b783f92dbb18bdc43e473Daniel Sandler        mWifiGroup      = null;
17728f89d40ee7bab93cf7b783f92dbb18bdc43e473Daniel Sandler        mWifi           = null;
178061d43c2386dd8222448bb1bec017bf9a2367a4eAndrew Flynn        mAirplane       = null;
179b574627ebc383d35cf8212ee241b191b26518a0dJason Monk        mMobileSignalGroup.removeAllViews();
180b574627ebc383d35cf8212ee241b191b26518a0dJason Monk        mMobileSignalGroup = null;
1813b230077dc53c1f83aa6e9b70585148d8193dd82Jason Monk        getContext().getContentResolver().unregisterContentObserver(mBlacklistObserver);
18228f89d40ee7bab93cf7b783f92dbb18bdc43e473Daniel Sandler
1832e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson        super.onDetachedFromWindow();
1842e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson    }
1852e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson
1863128f12f216ef481b5d03892b35706cfeec26d7cJason Monk    // From SecurityController.
1873128f12f216ef481b5d03892b35706cfeec26d7cJason Monk    @Override
1883128f12f216ef481b5d03892b35706cfeec26d7cJason Monk    public void onStateChanged() {
1893128f12f216ef481b5d03892b35706cfeec26d7cJason Monk        post(new Runnable() {
1903128f12f216ef481b5d03892b35706cfeec26d7cJason Monk            @Override
1913128f12f216ef481b5d03892b35706cfeec26d7cJason Monk            public void run() {
1923128f12f216ef481b5d03892b35706cfeec26d7cJason Monk                mVpnVisible = mSC.isVpnEnabled();
1933128f12f216ef481b5d03892b35706cfeec26d7cJason Monk                apply();
1943128f12f216ef481b5d03892b35706cfeec26d7cJason Monk            }
1953128f12f216ef481b5d03892b35706cfeec26d7cJason Monk        });
1963128f12f216ef481b5d03892b35706cfeec26d7cJason Monk    }
1973128f12f216ef481b5d03892b35706cfeec26d7cJason Monk
198061d43c2386dd8222448bb1bec017bf9a2367a4eAndrew Flynn    @Override
19907b75fe65dcb5b8add8246654c65f95f1191933eJason Monk    public void setWifiIndicators(boolean enabled, IconState statusIcon, IconState qsIcon,
20007b75fe65dcb5b8add8246654c65f95f1191933eJason Monk            boolean activityIn, boolean activityOut, String description) {
2013b230077dc53c1f83aa6e9b70585148d8193dd82Jason Monk        mWifiVisible = statusIcon.visible && !mBlockWifi;
20207b75fe65dcb5b8add8246654c65f95f1191933eJason Monk        mWifiStrengthId = statusIcon.icon;
20307b75fe65dcb5b8add8246654c65f95f1191933eJason Monk        mWifiDescription = statusIcon.contentDescription;
20428f89d40ee7bab93cf7b783f92dbb18bdc43e473Daniel Sandler
20528f89d40ee7bab93cf7b783f92dbb18bdc43e473Daniel Sandler        apply();
20628f89d40ee7bab93cf7b783f92dbb18bdc43e473Daniel Sandler    }
20728f89d40ee7bab93cf7b783f92dbb18bdc43e473Daniel Sandler
208061d43c2386dd8222448bb1bec017bf9a2367a4eAndrew Flynn    @Override
2092fdbe128209f02725c645f29bff941efe865da56Andrew Flynn    public void setMobileDataIndicators(IconState statusIcon, IconState qsIcon, int statusType,
2102fdbe128209f02725c645f29bff941efe865da56Andrew Flynn            int qsType, boolean activityIn, boolean activityOut, String typeContentDescription,
2112fdbe128209f02725c645f29bff941efe865da56Andrew Flynn            String description, boolean isWide, int subId) {
212b574627ebc383d35cf8212ee241b191b26518a0dJason Monk        PhoneState state = getOrInflateState(subId);
2133b230077dc53c1f83aa6e9b70585148d8193dd82Jason Monk        state.mMobileVisible = statusIcon.visible && !mBlockMobile;
21407b75fe65dcb5b8add8246654c65f95f1191933eJason Monk        state.mMobileStrengthId = statusIcon.icon;
21507b75fe65dcb5b8add8246654c65f95f1191933eJason Monk        state.mMobileTypeId = statusType;
21607b75fe65dcb5b8add8246654c65f95f1191933eJason Monk        state.mMobileDescription = statusIcon.contentDescription;
217b574627ebc383d35cf8212ee241b191b26518a0dJason Monk        state.mMobileTypeDescription = typeContentDescription;
21807b75fe65dcb5b8add8246654c65f95f1191933eJason Monk        state.mIsMobileTypeIconWide = statusType != 0 && isWide;
21928f89d40ee7bab93cf7b783f92dbb18bdc43e473Daniel Sandler
22028f89d40ee7bab93cf7b783f92dbb18bdc43e473Daniel Sandler        apply();
22128f89d40ee7bab93cf7b783f92dbb18bdc43e473Daniel Sandler    }
22228f89d40ee7bab93cf7b783f92dbb18bdc43e473Daniel Sandler
223061d43c2386dd8222448bb1bec017bf9a2367a4eAndrew Flynn    @Override
22407b75fe65dcb5b8add8246654c65f95f1191933eJason Monk    public void setEthernetIndicators(IconState state) {
2253b230077dc53c1f83aa6e9b70585148d8193dd82Jason Monk        mEthernetVisible = state.visible && !mBlockEthernet;
22607b75fe65dcb5b8add8246654c65f95f1191933eJason Monk        mEthernetIconId = state.icon;
22707b75fe65dcb5b8add8246654c65f95f1191933eJason Monk        mEthernetDescription = state.contentDescription;
228d46bb58fa635110bf8c911107819e8bd8e8b06e2Lorenzo Colitti
229d46bb58fa635110bf8c911107819e8bd8e8b06e2Lorenzo Colitti        apply();
230d46bb58fa635110bf8c911107819e8bd8e8b06e2Lorenzo Colitti    }
231d46bb58fa635110bf8c911107819e8bd8e8b06e2Lorenzo Colitti
232d46bb58fa635110bf8c911107819e8bd8e8b06e2Lorenzo Colitti    @Override
233b574627ebc383d35cf8212ee241b191b26518a0dJason Monk    public void setNoSims(boolean show) {
2343b230077dc53c1f83aa6e9b70585148d8193dd82Jason Monk        mNoSimsVisible = show && !mBlockMobile;
235b574627ebc383d35cf8212ee241b191b26518a0dJason Monk    }
236b574627ebc383d35cf8212ee241b191b26518a0dJason Monk
237b574627ebc383d35cf8212ee241b191b26518a0dJason Monk    @Override
238b574627ebc383d35cf8212ee241b191b26518a0dJason Monk    public void setSubs(List<SubscriptionInfo> subs) {
239b574627ebc383d35cf8212ee241b191b26518a0dJason Monk        // Clear out all old subIds.
240b574627ebc383d35cf8212ee241b191b26518a0dJason Monk        mPhoneStates.clear();
241b574627ebc383d35cf8212ee241b191b26518a0dJason Monk        if (mMobileSignalGroup != null) {
242b574627ebc383d35cf8212ee241b191b26518a0dJason Monk            mMobileSignalGroup.removeAllViews();
243b574627ebc383d35cf8212ee241b191b26518a0dJason Monk        }
244b574627ebc383d35cf8212ee241b191b26518a0dJason Monk        final int n = subs.size();
245b574627ebc383d35cf8212ee241b191b26518a0dJason Monk        for (int i = 0; i < n; i++) {
246b574627ebc383d35cf8212ee241b191b26518a0dJason Monk            inflatePhoneState(subs.get(i).getSubscriptionId());
247b574627ebc383d35cf8212ee241b191b26518a0dJason Monk        }
248dd0107a0dbe3084af8f5da005a4d96f8657f58a1Jorim Jaggi        if (isAttachedToWindow()) {
249dd0107a0dbe3084af8f5da005a4d96f8657f58a1Jorim Jaggi            applyIconTint();
250dd0107a0dbe3084af8f5da005a4d96f8657f58a1Jorim Jaggi        }
251b574627ebc383d35cf8212ee241b191b26518a0dJason Monk    }
252b574627ebc383d35cf8212ee241b191b26518a0dJason Monk
253b574627ebc383d35cf8212ee241b191b26518a0dJason Monk    private PhoneState getOrInflateState(int subId) {
254b574627ebc383d35cf8212ee241b191b26518a0dJason Monk        for (PhoneState state : mPhoneStates) {
255b574627ebc383d35cf8212ee241b191b26518a0dJason Monk            if (state.mSubId == subId) {
256b574627ebc383d35cf8212ee241b191b26518a0dJason Monk                return state;
257b574627ebc383d35cf8212ee241b191b26518a0dJason Monk            }
258b574627ebc383d35cf8212ee241b191b26518a0dJason Monk        }
259b574627ebc383d35cf8212ee241b191b26518a0dJason Monk        return inflatePhoneState(subId);
260b574627ebc383d35cf8212ee241b191b26518a0dJason Monk    }
261b574627ebc383d35cf8212ee241b191b26518a0dJason Monk
262b574627ebc383d35cf8212ee241b191b26518a0dJason Monk    private PhoneState inflatePhoneState(int subId) {
263b574627ebc383d35cf8212ee241b191b26518a0dJason Monk        PhoneState state = new PhoneState(subId, mContext);
264b574627ebc383d35cf8212ee241b191b26518a0dJason Monk        if (mMobileSignalGroup != null) {
265b574627ebc383d35cf8212ee241b191b26518a0dJason Monk            mMobileSignalGroup.addView(state.mMobileGroup);
266b574627ebc383d35cf8212ee241b191b26518a0dJason Monk        }
267b574627ebc383d35cf8212ee241b191b26518a0dJason Monk        mPhoneStates.add(state);
268b574627ebc383d35cf8212ee241b191b26518a0dJason Monk        return state;
269b574627ebc383d35cf8212ee241b191b26518a0dJason Monk    }
270b574627ebc383d35cf8212ee241b191b26518a0dJason Monk
271b574627ebc383d35cf8212ee241b191b26518a0dJason Monk    @Override
27207b75fe65dcb5b8add8246654c65f95f1191933eJason Monk    public void setIsAirplaneMode(IconState icon) {
2733b230077dc53c1f83aa6e9b70585148d8193dd82Jason Monk        mIsAirplaneMode = icon.visible && !mBlockAirplane;
27407b75fe65dcb5b8add8246654c65f95f1191933eJason Monk        mAirplaneIconId = icon.icon;
27507b75fe65dcb5b8add8246654c65f95f1191933eJason Monk        mAirplaneContentDescription = icon.contentDescription;
276061d43c2386dd8222448bb1bec017bf9a2367a4eAndrew Flynn
277061d43c2386dd8222448bb1bec017bf9a2367a4eAndrew Flynn        apply();
2785ccff81a642844138b144ad2cc339eba188812a0Daniel Sandler    }
2795ccff81a642844138b144ad2cc339eba188812a0Daniel Sandler
2802f7dfa7afdaada78c46bd6fd7e307656ba3dd66aJohn Spurlock    @Override
28107b75fe65dcb5b8add8246654c65f95f1191933eJason Monk    public void setMobileDataEnabled(boolean enabled) {
28207b75fe65dcb5b8add8246654c65f95f1191933eJason Monk        // Don't care.
28307b75fe65dcb5b8add8246654c65f95f1191933eJason Monk    }
28407b75fe65dcb5b8add8246654c65f95f1191933eJason Monk
28507b75fe65dcb5b8add8246654c65f95f1191933eJason Monk    @Override
286a54956a0bc611b1e9b3914edc7a604b59688f6b7Alan Viverette    public boolean dispatchPopulateAccessibilityEventInternal(AccessibilityEvent event) {
2872f7dfa7afdaada78c46bd6fd7e307656ba3dd66aJohn Spurlock        // Standard group layout onPopulateAccessibilityEvent() implementations
2882f7dfa7afdaada78c46bd6fd7e307656ba3dd66aJohn Spurlock        // ignore content description, so populate manually
289d46bb58fa635110bf8c911107819e8bd8e8b06e2Lorenzo Colitti        if (mEthernetVisible && mEthernetGroup != null &&
290d46bb58fa635110bf8c911107819e8bd8e8b06e2Lorenzo Colitti                mEthernetGroup.getContentDescription() != null)
291d46bb58fa635110bf8c911107819e8bd8e8b06e2Lorenzo Colitti            event.getText().add(mEthernetGroup.getContentDescription());
29224e028e0ec533cb7304296118a73bdc03870d10dDaniel Sandler        if (mWifiVisible && mWifiGroup != null && mWifiGroup.getContentDescription() != null)
2932f7dfa7afdaada78c46bd6fd7e307656ba3dd66aJohn Spurlock            event.getText().add(mWifiGroup.getContentDescription());
294b574627ebc383d35cf8212ee241b191b26518a0dJason Monk        for (PhoneState state : mPhoneStates) {
295b574627ebc383d35cf8212ee241b191b26518a0dJason Monk            state.populateAccessibilityEvent(event);
296b574627ebc383d35cf8212ee241b191b26518a0dJason Monk        }
297a54956a0bc611b1e9b3914edc7a604b59688f6b7Alan Viverette        return super.dispatchPopulateAccessibilityEventInternal(event);
2982f7dfa7afdaada78c46bd6fd7e307656ba3dd66aJohn Spurlock    }
2992f7dfa7afdaada78c46bd6fd7e307656ba3dd66aJohn Spurlock
3004662611f3757bd9210f252c095f2bef278fa2043Fabrice Di Meglio    @Override
3014662611f3757bd9210f252c095f2bef278fa2043Fabrice Di Meglio    public void onRtlPropertiesChanged(int layoutDirection) {
3024662611f3757bd9210f252c095f2bef278fa2043Fabrice Di Meglio        super.onRtlPropertiesChanged(layoutDirection);
3034662611f3757bd9210f252c095f2bef278fa2043Fabrice Di Meglio
304d46bb58fa635110bf8c911107819e8bd8e8b06e2Lorenzo Colitti        if (mEthernet != null) {
305d46bb58fa635110bf8c911107819e8bd8e8b06e2Lorenzo Colitti            mEthernet.setImageDrawable(null);
30606302c22969b6cf63239f990eb90e72f83d0c98eJorim Jaggi            mEthernetDark.setImageDrawable(null);
30706302c22969b6cf63239f990eb90e72f83d0c98eJorim Jaggi            mLastEthernetIconId = -1;
308d46bb58fa635110bf8c911107819e8bd8e8b06e2Lorenzo Colitti        }
309d46bb58fa635110bf8c911107819e8bd8e8b06e2Lorenzo Colitti
3104662611f3757bd9210f252c095f2bef278fa2043Fabrice Di Meglio        if (mWifi != null) {
3114662611f3757bd9210f252c095f2bef278fa2043Fabrice Di Meglio            mWifi.setImageDrawable(null);
31206302c22969b6cf63239f990eb90e72f83d0c98eJorim Jaggi            mWifiDark.setImageDrawable(null);
31306302c22969b6cf63239f990eb90e72f83d0c98eJorim Jaggi            mLastWifiStrengthId = -1;
3144662611f3757bd9210f252c095f2bef278fa2043Fabrice Di Meglio        }
3154662611f3757bd9210f252c095f2bef278fa2043Fabrice Di Meglio
316b574627ebc383d35cf8212ee241b191b26518a0dJason Monk        for (PhoneState state : mPhoneStates) {
317b574627ebc383d35cf8212ee241b191b26518a0dJason Monk            if (state.mMobile != null) {
318b574627ebc383d35cf8212ee241b191b26518a0dJason Monk                state.mMobile.setImageDrawable(null);
319b574627ebc383d35cf8212ee241b191b26518a0dJason Monk            }
320b574627ebc383d35cf8212ee241b191b26518a0dJason Monk            if (state.mMobileType != null) {
321b574627ebc383d35cf8212ee241b191b26518a0dJason Monk                state.mMobileType.setImageDrawable(null);
322b574627ebc383d35cf8212ee241b191b26518a0dJason Monk            }
3234662611f3757bd9210f252c095f2bef278fa2043Fabrice Di Meglio        }
3244662611f3757bd9210f252c095f2bef278fa2043Fabrice Di Meglio
32506302c22969b6cf63239f990eb90e72f83d0c98eJorim Jaggi        if (mAirplane != null) {
3264662611f3757bd9210f252c095f2bef278fa2043Fabrice Di Meglio            mAirplane.setImageDrawable(null);
32706302c22969b6cf63239f990eb90e72f83d0c98eJorim Jaggi            mLastAirplaneIconId = -1;
3284662611f3757bd9210f252c095f2bef278fa2043Fabrice Di Meglio        }
3294662611f3757bd9210f252c095f2bef278fa2043Fabrice Di Meglio
3304662611f3757bd9210f252c095f2bef278fa2043Fabrice Di Meglio        apply();
3314662611f3757bd9210f252c095f2bef278fa2043Fabrice Di Meglio    }
3324662611f3757bd9210f252c095f2bef278fa2043Fabrice Di Meglio
3330d266899da8f612194a8393ec69c4fd870f2f45cJorim Jaggi    @Override
3340d266899da8f612194a8393ec69c4fd870f2f45cJorim Jaggi    public boolean hasOverlappingRendering() {
3350d266899da8f612194a8393ec69c4fd870f2f45cJorim Jaggi        return false;
3360d266899da8f612194a8393ec69c4fd870f2f45cJorim Jaggi    }
3370d266899da8f612194a8393ec69c4fd870f2f45cJorim Jaggi
33828f89d40ee7bab93cf7b783f92dbb18bdc43e473Daniel Sandler    // Run after each indicator change.
33928f89d40ee7bab93cf7b783f92dbb18bdc43e473Daniel Sandler    private void apply() {
3402e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson        if (mWifiGroup == null) return;
3412e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson
3423128f12f216ef481b5d03892b35706cfeec26d7cJason Monk        mVpn.setVisibility(mVpnVisible ? View.VISIBLE : View.GONE);
3433128f12f216ef481b5d03892b35706cfeec26d7cJason Monk        if (DEBUG) Log.d(TAG, String.format("vpn: %s", mVpnVisible ? "VISIBLE" : "GONE"));
344d46bb58fa635110bf8c911107819e8bd8e8b06e2Lorenzo Colitti
345d46bb58fa635110bf8c911107819e8bd8e8b06e2Lorenzo Colitti        if (mEthernetVisible) {
34606302c22969b6cf63239f990eb90e72f83d0c98eJorim Jaggi            if (mLastEthernetIconId != mEthernetIconId) {
34706302c22969b6cf63239f990eb90e72f83d0c98eJorim Jaggi                mEthernet.setImageResource(mEthernetIconId);
34806302c22969b6cf63239f990eb90e72f83d0c98eJorim Jaggi                mEthernetDark.setImageResource(mEthernetIconId);
34906302c22969b6cf63239f990eb90e72f83d0c98eJorim Jaggi                mLastEthernetIconId = mEthernetIconId;
35006302c22969b6cf63239f990eb90e72f83d0c98eJorim Jaggi            }
351d46bb58fa635110bf8c911107819e8bd8e8b06e2Lorenzo Colitti            mEthernetGroup.setContentDescription(mEthernetDescription);
352d46bb58fa635110bf8c911107819e8bd8e8b06e2Lorenzo Colitti            mEthernetGroup.setVisibility(View.VISIBLE);
353d46bb58fa635110bf8c911107819e8bd8e8b06e2Lorenzo Colitti        } else {
354d46bb58fa635110bf8c911107819e8bd8e8b06e2Lorenzo Colitti            mEthernetGroup.setVisibility(View.GONE);
355d46bb58fa635110bf8c911107819e8bd8e8b06e2Lorenzo Colitti        }
356d46bb58fa635110bf8c911107819e8bd8e8b06e2Lorenzo Colitti
357d46bb58fa635110bf8c911107819e8bd8e8b06e2Lorenzo Colitti        if (DEBUG) Log.d(TAG,
358d46bb58fa635110bf8c911107819e8bd8e8b06e2Lorenzo Colitti                String.format("ethernet: %s",
359d46bb58fa635110bf8c911107819e8bd8e8b06e2Lorenzo Colitti                    (mEthernetVisible ? "VISIBLE" : "GONE")));
360d46bb58fa635110bf8c911107819e8bd8e8b06e2Lorenzo Colitti
361d46bb58fa635110bf8c911107819e8bd8e8b06e2Lorenzo Colitti
36228f89d40ee7bab93cf7b783f92dbb18bdc43e473Daniel Sandler        if (mWifiVisible) {
36306302c22969b6cf63239f990eb90e72f83d0c98eJorim Jaggi            if (mWifiStrengthId != mLastWifiStrengthId) {
36406302c22969b6cf63239f990eb90e72f83d0c98eJorim Jaggi                mWifi.setImageResource(mWifiStrengthId);
36506302c22969b6cf63239f990eb90e72f83d0c98eJorim Jaggi                mWifiDark.setImageResource(mWifiStrengthId);
36606302c22969b6cf63239f990eb90e72f83d0c98eJorim Jaggi                mLastWifiStrengthId = mWifiStrengthId;
36706302c22969b6cf63239f990eb90e72f83d0c98eJorim Jaggi            }
368bcf6ef0b82c1daea43e03b8ad5af319ed324242aDaniel Sandler            mWifiGroup.setContentDescription(mWifiDescription);
369cda096ebf3fac67daf36e775547c2a337374927bFabrice Di Meglio            mWifiGroup.setVisibility(View.VISIBLE);
3702e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson        } else {
3712e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson            mWifiGroup.setVisibility(View.GONE);
3722e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson        }
3732e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson
374cd686b5b6d4166b510df8e32138479a9559bc117John Spurlock        if (DEBUG) Log.d(TAG,
375fcc901c10bffdfb9c6b31e676dec36b47d949979John Spurlock                String.format("wifi: %s sig=%d",
37628f89d40ee7bab93cf7b783f92dbb18bdc43e473Daniel Sandler                    (mWifiVisible ? "VISIBLE" : "GONE"),
377fcc901c10bffdfb9c6b31e676dec36b47d949979John Spurlock                    mWifiStrengthId));
3782e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson
379b574627ebc383d35cf8212ee241b191b26518a0dJason Monk        boolean anyMobileVisible = false;
380e912c9cc39807f95815400981ed27d121e8b293aDan Sandler        int firstMobileTypeId = 0;
381b574627ebc383d35cf8212ee241b191b26518a0dJason Monk        for (PhoneState state : mPhoneStates) {
382b574627ebc383d35cf8212ee241b191b26518a0dJason Monk            if (state.apply(anyMobileVisible)) {
383e912c9cc39807f95815400981ed27d121e8b293aDan Sandler                if (!anyMobileVisible) {
384e912c9cc39807f95815400981ed27d121e8b293aDan Sandler                    firstMobileTypeId = state.mMobileTypeId;
385e912c9cc39807f95815400981ed27d121e8b293aDan Sandler                    anyMobileVisible = true;
386e912c9cc39807f95815400981ed27d121e8b293aDan Sandler                }
387b574627ebc383d35cf8212ee241b191b26518a0dJason Monk            }
3882e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson        }
38928f89d40ee7bab93cf7b783f92dbb18bdc43e473Daniel Sandler
390061d43c2386dd8222448bb1bec017bf9a2367a4eAndrew Flynn        if (mIsAirplaneMode) {
39106302c22969b6cf63239f990eb90e72f83d0c98eJorim Jaggi            if (mLastAirplaneIconId != mAirplaneIconId) {
39206302c22969b6cf63239f990eb90e72f83d0c98eJorim Jaggi                mAirplane.setImageResource(mAirplaneIconId);
39306302c22969b6cf63239f990eb90e72f83d0c98eJorim Jaggi                mLastAirplaneIconId = mAirplaneIconId;
39406302c22969b6cf63239f990eb90e72f83d0c98eJorim Jaggi            }
39507b75fe65dcb5b8add8246654c65f95f1191933eJason Monk            mAirplane.setContentDescription(mAirplaneContentDescription);
3968afcd149970c79054a3a16377834aa0aec35eee0Fabrice Di Meglio            mAirplane.setVisibility(View.VISIBLE);
397061d43c2386dd8222448bb1bec017bf9a2367a4eAndrew Flynn        } else {
398061d43c2386dd8222448bb1bec017bf9a2367a4eAndrew Flynn            mAirplane.setVisibility(View.GONE);
399061d43c2386dd8222448bb1bec017bf9a2367a4eAndrew Flynn        }
400061d43c2386dd8222448bb1bec017bf9a2367a4eAndrew Flynn
4015172dc2f36f9c417befd0957ce2ae20f9d083a88Jorim Jaggi        if (mIsAirplaneMode && mWifiVisible) {
4025172dc2f36f9c417befd0957ce2ae20f9d083a88Jorim Jaggi            mWifiAirplaneSpacer.setVisibility(View.VISIBLE);
4035ccff81a642844138b144ad2cc339eba188812a0Daniel Sandler        } else {
4045172dc2f36f9c417befd0957ce2ae20f9d083a88Jorim Jaggi            mWifiAirplaneSpacer.setVisibility(View.GONE);
4055ccff81a642844138b144ad2cc339eba188812a0Daniel Sandler        }
4065ccff81a642844138b144ad2cc339eba188812a0Daniel Sandler
407e912c9cc39807f95815400981ed27d121e8b293aDan Sandler        if (((anyMobileVisible && firstMobileTypeId != 0) || mNoSimsVisible) && mWifiVisible) {
408c737b9bd5a0bc60fd92150d55f8ddb530697b987Jorim Jaggi            mWifiSignalSpacer.setVisibility(View.VISIBLE);
409c737b9bd5a0bc60fd92150d55f8ddb530697b987Jorim Jaggi        } else {
410c737b9bd5a0bc60fd92150d55f8ddb530697b987Jorim Jaggi            mWifiSignalSpacer.setVisibility(View.GONE);
411c737b9bd5a0bc60fd92150d55f8ddb530697b987Jorim Jaggi        }
412c737b9bd5a0bc60fd92150d55f8ddb530697b987Jorim Jaggi
413b574627ebc383d35cf8212ee241b191b26518a0dJason Monk        mNoSims.setVisibility(mNoSimsVisible ? View.VISIBLE : View.GONE);
4145443cc563cf4581a8ea9ada3b27fac7107d72099Jorim Jaggi        mNoSimsDark.setVisibility(mNoSimsVisible ? View.VISIBLE : View.GONE);
415c737b9bd5a0bc60fd92150d55f8ddb530697b987Jorim Jaggi
416b574627ebc383d35cf8212ee241b191b26518a0dJason Monk        boolean anythingVisible = mNoSimsVisible || mWifiVisible || mIsAirplaneMode
417d46bb58fa635110bf8c911107819e8bd8e8b06e2Lorenzo Colitti                || anyMobileVisible || mVpnVisible || mEthernetVisible;
418b574627ebc383d35cf8212ee241b191b26518a0dJason Monk        setPaddingRelative(0, 0, anythingVisible ? mEndPadding : mEndPaddingNothingVisible, 0);
419b574627ebc383d35cf8212ee241b191b26518a0dJason Monk    }
42028f89d40ee7bab93cf7b783f92dbb18bdc43e473Daniel Sandler
4215443cc563cf4581a8ea9ada3b27fac7107d72099Jorim Jaggi    public void setIconTint(int tint, float darkIntensity) {
4225443cc563cf4581a8ea9ada3b27fac7107d72099Jorim Jaggi        boolean changed = tint != mIconTint || darkIntensity != mDarkIntensity;
423dd0107a0dbe3084af8f5da005a4d96f8657f58a1Jorim Jaggi        mIconTint = tint;
4245443cc563cf4581a8ea9ada3b27fac7107d72099Jorim Jaggi        mDarkIntensity = darkIntensity;
425dd0107a0dbe3084af8f5da005a4d96f8657f58a1Jorim Jaggi        if (changed && isAttachedToWindow()) {
426dd0107a0dbe3084af8f5da005a4d96f8657f58a1Jorim Jaggi            applyIconTint();
427dd0107a0dbe3084af8f5da005a4d96f8657f58a1Jorim Jaggi        }
428dd0107a0dbe3084af8f5da005a4d96f8657f58a1Jorim Jaggi    }
429dd0107a0dbe3084af8f5da005a4d96f8657f58a1Jorim Jaggi
430dd0107a0dbe3084af8f5da005a4d96f8657f58a1Jorim Jaggi    private void applyIconTint() {
431dd0107a0dbe3084af8f5da005a4d96f8657f58a1Jorim Jaggi        setTint(mVpn, mIconTint);
432dd0107a0dbe3084af8f5da005a4d96f8657f58a1Jorim Jaggi        setTint(mAirplane, mIconTint);
4335443cc563cf4581a8ea9ada3b27fac7107d72099Jorim Jaggi        applyDarkIntensity(mDarkIntensity, mNoSims, mNoSimsDark);
4345443cc563cf4581a8ea9ada3b27fac7107d72099Jorim Jaggi        applyDarkIntensity(mDarkIntensity, mWifi, mWifiDark);
435d46bb58fa635110bf8c911107819e8bd8e8b06e2Lorenzo Colitti        applyDarkIntensity(mDarkIntensity, mEthernet, mEthernetDark);
436dd0107a0dbe3084af8f5da005a4d96f8657f58a1Jorim Jaggi        for (int i = 0; i < mPhoneStates.size(); i++) {
4375443cc563cf4581a8ea9ada3b27fac7107d72099Jorim Jaggi            mPhoneStates.get(i).setIconTint(mIconTint, mDarkIntensity);
438dd0107a0dbe3084af8f5da005a4d96f8657f58a1Jorim Jaggi        }
439dd0107a0dbe3084af8f5da005a4d96f8657f58a1Jorim Jaggi    }
440dd0107a0dbe3084af8f5da005a4d96f8657f58a1Jorim Jaggi
4415443cc563cf4581a8ea9ada3b27fac7107d72099Jorim Jaggi    private void applyDarkIntensity(float darkIntensity, View lightIcon, View darkIcon) {
4425443cc563cf4581a8ea9ada3b27fac7107d72099Jorim Jaggi        lightIcon.setAlpha(1 - darkIntensity);
4435443cc563cf4581a8ea9ada3b27fac7107d72099Jorim Jaggi        darkIcon.setAlpha(darkIntensity);
4445443cc563cf4581a8ea9ada3b27fac7107d72099Jorim Jaggi    }
4455443cc563cf4581a8ea9ada3b27fac7107d72099Jorim Jaggi
446dd0107a0dbe3084af8f5da005a4d96f8657f58a1Jorim Jaggi    private void setTint(ImageView v, int tint) {
447dd0107a0dbe3084af8f5da005a4d96f8657f58a1Jorim Jaggi        v.setImageTintMode(PorterDuff.Mode.SRC_ATOP);
448dd0107a0dbe3084af8f5da005a4d96f8657f58a1Jorim Jaggi        v.setImageTintList(ColorStateList.valueOf(tint));
449dd0107a0dbe3084af8f5da005a4d96f8657f58a1Jorim Jaggi    }
450dd0107a0dbe3084af8f5da005a4d96f8657f58a1Jorim Jaggi
451b574627ebc383d35cf8212ee241b191b26518a0dJason Monk    private class PhoneState {
452b574627ebc383d35cf8212ee241b191b26518a0dJason Monk        private final int mSubId;
453b574627ebc383d35cf8212ee241b191b26518a0dJason Monk        private boolean mMobileVisible = false;
4542fdbe128209f02725c645f29bff941efe865da56Andrew Flynn        private int mMobileStrengthId = 0, mMobileTypeId = 0;
455b574627ebc383d35cf8212ee241b191b26518a0dJason Monk        private boolean mIsMobileTypeIconWide;
456b574627ebc383d35cf8212ee241b191b26518a0dJason Monk        private String mMobileDescription, mMobileTypeDescription;
457b574627ebc383d35cf8212ee241b191b26518a0dJason Monk
458b574627ebc383d35cf8212ee241b191b26518a0dJason Monk        private ViewGroup mMobileGroup;
4595443cc563cf4581a8ea9ada3b27fac7107d72099Jorim Jaggi        private ImageView mMobile, mMobileDark, mMobileType;
460b574627ebc383d35cf8212ee241b191b26518a0dJason Monk
461b574627ebc383d35cf8212ee241b191b26518a0dJason Monk        public PhoneState(int subId, Context context) {
462b574627ebc383d35cf8212ee241b191b26518a0dJason Monk            ViewGroup root = (ViewGroup) LayoutInflater.from(context)
463b574627ebc383d35cf8212ee241b191b26518a0dJason Monk                    .inflate(R.layout.mobile_signal_group, null);
464b574627ebc383d35cf8212ee241b191b26518a0dJason Monk            setViews(root);
465b574627ebc383d35cf8212ee241b191b26518a0dJason Monk            mSubId = subId;
466b574627ebc383d35cf8212ee241b191b26518a0dJason Monk        }
4676d035f15d5c8c67d97a4d5b6ed44f8cca0772e1fJorim Jaggi
468b574627ebc383d35cf8212ee241b191b26518a0dJason Monk        public void setViews(ViewGroup root) {
469b574627ebc383d35cf8212ee241b191b26518a0dJason Monk            mMobileGroup    = root;
470b574627ebc383d35cf8212ee241b191b26518a0dJason Monk            mMobile         = (ImageView) root.findViewById(R.id.mobile_signal);
4715443cc563cf4581a8ea9ada3b27fac7107d72099Jorim Jaggi            mMobileDark     = (ImageView) root.findViewById(R.id.mobile_signal_dark);
472b574627ebc383d35cf8212ee241b191b26518a0dJason Monk            mMobileType     = (ImageView) root.findViewById(R.id.mobile_type);
473b574627ebc383d35cf8212ee241b191b26518a0dJason Monk        }
474b574627ebc383d35cf8212ee241b191b26518a0dJason Monk
475b574627ebc383d35cf8212ee241b191b26518a0dJason Monk        public boolean apply(boolean isSecondaryIcon) {
476b574627ebc383d35cf8212ee241b191b26518a0dJason Monk            if (mMobileVisible && !mIsAirplaneMode) {
477b574627ebc383d35cf8212ee241b191b26518a0dJason Monk                mMobile.setImageResource(mMobileStrengthId);
478a478d70a68696380acbd4a9739dfaaebff61c728Andrew Flynn                Drawable mobileDrawable = mMobile.getDrawable();
479a478d70a68696380acbd4a9739dfaaebff61c728Andrew Flynn                if (mobileDrawable instanceof Animatable) {
480a478d70a68696380acbd4a9739dfaaebff61c728Andrew Flynn                    Animatable ad = (Animatable) mobileDrawable;
481a478d70a68696380acbd4a9739dfaaebff61c728Andrew Flynn                    if (!ad.isRunning()) {
482a478d70a68696380acbd4a9739dfaaebff61c728Andrew Flynn                        ad.start();
483a478d70a68696380acbd4a9739dfaaebff61c728Andrew Flynn                    }
484a478d70a68696380acbd4a9739dfaaebff61c728Andrew Flynn                }
485a478d70a68696380acbd4a9739dfaaebff61c728Andrew Flynn
4865443cc563cf4581a8ea9ada3b27fac7107d72099Jorim Jaggi                mMobileDark.setImageResource(mMobileStrengthId);
487a478d70a68696380acbd4a9739dfaaebff61c728Andrew Flynn                Drawable mobileDarkDrawable = mMobileDark.getDrawable();
488a478d70a68696380acbd4a9739dfaaebff61c728Andrew Flynn                if (mobileDarkDrawable instanceof Animatable) {
489a478d70a68696380acbd4a9739dfaaebff61c728Andrew Flynn                    Animatable ad = (Animatable) mobileDarkDrawable;
490a478d70a68696380acbd4a9739dfaaebff61c728Andrew Flynn                    if (!ad.isRunning()) {
491a478d70a68696380acbd4a9739dfaaebff61c728Andrew Flynn                        ad.start();
492a478d70a68696380acbd4a9739dfaaebff61c728Andrew Flynn                    }
493a478d70a68696380acbd4a9739dfaaebff61c728Andrew Flynn                }
494a478d70a68696380acbd4a9739dfaaebff61c728Andrew Flynn
495b574627ebc383d35cf8212ee241b191b26518a0dJason Monk                mMobileType.setImageResource(mMobileTypeId);
496b574627ebc383d35cf8212ee241b191b26518a0dJason Monk                mMobileGroup.setContentDescription(mMobileTypeDescription
497b574627ebc383d35cf8212ee241b191b26518a0dJason Monk                        + " " + mMobileDescription);
498b574627ebc383d35cf8212ee241b191b26518a0dJason Monk                mMobileGroup.setVisibility(View.VISIBLE);
499b574627ebc383d35cf8212ee241b191b26518a0dJason Monk            } else {
500b574627ebc383d35cf8212ee241b191b26518a0dJason Monk                mMobileGroup.setVisibility(View.GONE);
501b574627ebc383d35cf8212ee241b191b26518a0dJason Monk            }
502b574627ebc383d35cf8212ee241b191b26518a0dJason Monk
503b574627ebc383d35cf8212ee241b191b26518a0dJason Monk            // When this isn't next to wifi, give it some extra padding between the signals.
504b574627ebc383d35cf8212ee241b191b26518a0dJason Monk            mMobileGroup.setPaddingRelative(isSecondaryIcon ? mSecondaryTelephonyPadding : 0,
505b574627ebc383d35cf8212ee241b191b26518a0dJason Monk                    0, 0, 0);
506b574627ebc383d35cf8212ee241b191b26518a0dJason Monk            mMobile.setPaddingRelative(mIsMobileTypeIconWide ? mWideTypeIconStartPadding : 0,
507b574627ebc383d35cf8212ee241b191b26518a0dJason Monk                    0, 0, 0);
5085443cc563cf4581a8ea9ada3b27fac7107d72099Jorim Jaggi            mMobileDark.setPaddingRelative(mIsMobileTypeIconWide ? mWideTypeIconStartPadding : 0,
5095443cc563cf4581a8ea9ada3b27fac7107d72099Jorim Jaggi                    0, 0, 0);
510b574627ebc383d35cf8212ee241b191b26518a0dJason Monk
5112fdbe128209f02725c645f29bff941efe865da56Andrew Flynn            if (DEBUG) Log.d(TAG, String.format("mobile: %s sig=%d typ=%d",
5122fdbe128209f02725c645f29bff941efe865da56Andrew Flynn                        (mMobileVisible ? "VISIBLE" : "GONE"), mMobileStrengthId, mMobileTypeId));
513b574627ebc383d35cf8212ee241b191b26518a0dJason Monk
514b574627ebc383d35cf8212ee241b191b26518a0dJason Monk            mMobileType.setVisibility(mMobileTypeId != 0 ? View.VISIBLE : View.GONE);
515b574627ebc383d35cf8212ee241b191b26518a0dJason Monk
516b574627ebc383d35cf8212ee241b191b26518a0dJason Monk            return mMobileVisible;
517b574627ebc383d35cf8212ee241b191b26518a0dJason Monk        }
518b574627ebc383d35cf8212ee241b191b26518a0dJason Monk
519b574627ebc383d35cf8212ee241b191b26518a0dJason Monk        public void populateAccessibilityEvent(AccessibilityEvent event) {
520b574627ebc383d35cf8212ee241b191b26518a0dJason Monk            if (mMobileVisible && mMobileGroup != null
521b574627ebc383d35cf8212ee241b191b26518a0dJason Monk                    && mMobileGroup.getContentDescription() != null) {
522b574627ebc383d35cf8212ee241b191b26518a0dJason Monk                event.getText().add(mMobileGroup.getContentDescription());
523b574627ebc383d35cf8212ee241b191b26518a0dJason Monk            }
524b574627ebc383d35cf8212ee241b191b26518a0dJason Monk        }
525dd0107a0dbe3084af8f5da005a4d96f8657f58a1Jorim Jaggi
5265443cc563cf4581a8ea9ada3b27fac7107d72099Jorim Jaggi        public void setIconTint(int tint, float darkIntensity) {
5275443cc563cf4581a8ea9ada3b27fac7107d72099Jorim Jaggi            applyDarkIntensity(darkIntensity, mMobile, mMobileDark);
528dd0107a0dbe3084af8f5da005a4d96f8657f58a1Jorim Jaggi            setTint(mMobileType, tint);
529dd0107a0dbe3084af8f5da005a4d96f8657f58a1Jorim Jaggi        }
5302e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson    }
5313b230077dc53c1f83aa6e9b70585148d8193dd82Jason Monk
5323b230077dc53c1f83aa6e9b70585148d8193dd82Jason Monk    private final ContentObserver mBlacklistObserver = new ContentObserver(new Handler()) {
5333b230077dc53c1f83aa6e9b70585148d8193dd82Jason Monk        public void onChange(boolean selfChange) {
5343b230077dc53c1f83aa6e9b70585148d8193dd82Jason Monk            readBlacklist();
5353b230077dc53c1f83aa6e9b70585148d8193dd82Jason Monk            // Re-register to get new callbacks.
5363b230077dc53c1f83aa6e9b70585148d8193dd82Jason Monk            mNC.removeSignalCallback(SignalClusterView.this);
5373b230077dc53c1f83aa6e9b70585148d8193dd82Jason Monk            mNC.addSignalCallback(SignalClusterView.this);
5383b230077dc53c1f83aa6e9b70585148d8193dd82Jason Monk        };
5393b230077dc53c1f83aa6e9b70585148d8193dd82Jason Monk    };
5402e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson}
5412e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson
542