SignalClusterView.java revision 07b75fe65dcb5b8add8246654c65f95f1191933e
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;
21dd0107a0dbe3084af8f5da005a4d96f8657f58a1Jorim Jaggiimport android.graphics.Color;
22dd0107a0dbe3084af8f5da005a4d96f8657f58a1Jorim Jaggiimport android.graphics.PorterDuff;
23a478d70a68696380acbd4a9739dfaaebff61c728Andrew Flynnimport android.graphics.drawable.Animatable;
24a478d70a68696380acbd4a9739dfaaebff61c728Andrew Flynnimport android.graphics.drawable.Drawable;
25b574627ebc383d35cf8212ee241b191b26518a0dJason Monkimport android.telephony.SubscriptionInfo;
262e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertsonimport android.util.AttributeSet;
27cd686b5b6d4166b510df8e32138479a9559bc117John Spurlockimport android.util.Log;
28b574627ebc383d35cf8212ee241b191b26518a0dJason Monkimport android.view.LayoutInflater;
292e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertsonimport android.view.View;
302e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertsonimport android.view.ViewGroup;
312f7dfa7afdaada78c46bd6fd7e307656ba3dd66aJohn Spurlockimport android.view.accessibility.AccessibilityEvent;
322e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertsonimport android.widget.ImageView;
332e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertsonimport android.widget.LinearLayout;
342e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson
352e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertsonimport com.android.systemui.R;
3607b75fe65dcb5b8add8246654c65f95f1191933eJason Monkimport com.android.systemui.statusbar.policy.NetworkController.IconState;
37af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlockimport com.android.systemui.statusbar.policy.NetworkControllerImpl;
383128f12f216ef481b5d03892b35706cfeec26d7cJason Monkimport com.android.systemui.statusbar.policy.SecurityController;
392e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson
40b574627ebc383d35cf8212ee241b191b26518a0dJason Monkimport java.util.ArrayList;
41b574627ebc383d35cf8212ee241b191b26518a0dJason Monkimport java.util.List;
42b574627ebc383d35cf8212ee241b191b26518a0dJason Monk
435ccff81a642844138b144ad2cc339eba188812a0Daniel Sandler// Intimately tied to the design of res/layout/signal_cluster_view.xml
442e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertsonpublic class SignalClusterView
452f7dfa7afdaada78c46bd6fd7e307656ba3dd66aJohn Spurlock        extends LinearLayout
4607b75fe65dcb5b8add8246654c65f95f1191933eJason Monk        implements NetworkControllerImpl.SignalCallback,
473128f12f216ef481b5d03892b35706cfeec26d7cJason Monk        SecurityController.SecurityControllerCallback {
482e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson
4928f89d40ee7bab93cf7b783f92dbb18bdc43e473Daniel Sandler    static final String TAG = "SignalClusterView";
50b3eb89190c4bb4ebbe676328cd37830d50e6ed3eJohn Spurlock    static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
512f7dfa7afdaada78c46bd6fd7e307656ba3dd66aJohn Spurlock
52af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    NetworkControllerImpl mNC;
533128f12f216ef481b5d03892b35706cfeec26d7cJason Monk    SecurityController mSC;
542e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson
55b574627ebc383d35cf8212ee241b191b26518a0dJason Monk    private boolean mNoSimsVisible = false;
563128f12f216ef481b5d03892b35706cfeec26d7cJason Monk    private boolean mVpnVisible = false;
57d46bb58fa635110bf8c911107819e8bd8e8b06e2Lorenzo Colitti    private boolean mEthernetVisible = false;
58d46bb58fa635110bf8c911107819e8bd8e8b06e2Lorenzo Colitti    private int mEthernetIconId = 0;
5928f89d40ee7bab93cf7b783f92dbb18bdc43e473Daniel Sandler    private boolean mWifiVisible = false;
60fcc901c10bffdfb9c6b31e676dec36b47d949979John Spurlock    private int mWifiStrengthId = 0;
615ccff81a642844138b144ad2cc339eba188812a0Daniel Sandler    private boolean mIsAirplaneMode = false;
62061d43c2386dd8222448bb1bec017bf9a2367a4eAndrew Flynn    private int mAirplaneIconId = 0;
6307b75fe65dcb5b8add8246654c65f95f1191933eJason Monk    private String mAirplaneContentDescription;
64b574627ebc383d35cf8212ee241b191b26518a0dJason Monk    private String mWifiDescription;
65d46bb58fa635110bf8c911107819e8bd8e8b06e2Lorenzo Colitti    private String mEthernetDescription;
66b574627ebc383d35cf8212ee241b191b26518a0dJason Monk    private ArrayList<PhoneState> mPhoneStates = new ArrayList<PhoneState>();
67dd0107a0dbe3084af8f5da005a4d96f8657f58a1Jorim Jaggi    private int mIconTint = Color.WHITE;
685443cc563cf4581a8ea9ada3b27fac7107d72099Jorim Jaggi    private float mDarkIntensity;
6928f89d40ee7bab93cf7b783f92dbb18bdc43e473Daniel Sandler
70d46bb58fa635110bf8c911107819e8bd8e8b06e2Lorenzo Colitti    ViewGroup mEthernetGroup, mWifiGroup;
71d46bb58fa635110bf8c911107819e8bd8e8b06e2Lorenzo Colitti    ImageView mVpn, mEthernet, mWifi, mAirplane, mNoSims, mEthernetDark, mWifiDark, mNoSimsDark;
725172dc2f36f9c417befd0957ce2ae20f9d083a88Jorim Jaggi    View mWifiAirplaneSpacer;
73c737b9bd5a0bc60fd92150d55f8ddb530697b987Jorim Jaggi    View mWifiSignalSpacer;
74b574627ebc383d35cf8212ee241b191b26518a0dJason Monk    LinearLayout mMobileSignalGroup;
75c737b9bd5a0bc60fd92150d55f8ddb530697b987Jorim Jaggi
76c737b9bd5a0bc60fd92150d55f8ddb530697b987Jorim Jaggi    private int mWideTypeIconStartPadding;
77b574627ebc383d35cf8212ee241b191b26518a0dJason Monk    private int mSecondaryTelephonyPadding;
786d035f15d5c8c67d97a4d5b6ed44f8cca0772e1fJorim Jaggi    private int mEndPadding;
796d035f15d5c8c67d97a4d5b6ed44f8cca0772e1fJorim Jaggi    private int mEndPaddingNothingVisible;
802e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson
812e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson    public SignalClusterView(Context context) {
822e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson        this(context, null);
832e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson    }
842e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson
852e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson    public SignalClusterView(Context context, AttributeSet attrs) {
862e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson        this(context, attrs, 0);
872e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson    }
882e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson
892e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson    public SignalClusterView(Context context, AttributeSet attrs, int defStyle) {
902e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson        super(context, attrs, defStyle);
912e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson    }
922e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson
93af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    public void setNetworkController(NetworkControllerImpl nc) {
94cd686b5b6d4166b510df8e32138479a9559bc117John Spurlock        if (DEBUG) Log.d(TAG, "NetworkController=" + nc);
952e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson        mNC = nc;
962e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson    }
972e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson
983128f12f216ef481b5d03892b35706cfeec26d7cJason Monk    public void setSecurityController(SecurityController sc) {
993128f12f216ef481b5d03892b35706cfeec26d7cJason Monk        if (DEBUG) Log.d(TAG, "SecurityController=" + sc);
1003128f12f216ef481b5d03892b35706cfeec26d7cJason Monk        mSC = sc;
1013128f12f216ef481b5d03892b35706cfeec26d7cJason Monk        mSC.addCallback(this);
1023128f12f216ef481b5d03892b35706cfeec26d7cJason Monk        mVpnVisible = mSC.isVpnEnabled();
1033128f12f216ef481b5d03892b35706cfeec26d7cJason Monk    }
1043128f12f216ef481b5d03892b35706cfeec26d7cJason Monk
1052e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson    @Override
106c737b9bd5a0bc60fd92150d55f8ddb530697b987Jorim Jaggi    protected void onFinishInflate() {
107c737b9bd5a0bc60fd92150d55f8ddb530697b987Jorim Jaggi        super.onFinishInflate();
108c737b9bd5a0bc60fd92150d55f8ddb530697b987Jorim Jaggi        mWideTypeIconStartPadding = getContext().getResources().getDimensionPixelSize(
109c737b9bd5a0bc60fd92150d55f8ddb530697b987Jorim Jaggi                R.dimen.wide_type_icon_start_padding);
110b574627ebc383d35cf8212ee241b191b26518a0dJason Monk        mSecondaryTelephonyPadding = getContext().getResources().getDimensionPixelSize(
111b574627ebc383d35cf8212ee241b191b26518a0dJason Monk                R.dimen.secondary_telephony_padding);
1126d035f15d5c8c67d97a4d5b6ed44f8cca0772e1fJorim Jaggi        mEndPadding = getContext().getResources().getDimensionPixelSize(
1136d035f15d5c8c67d97a4d5b6ed44f8cca0772e1fJorim Jaggi                R.dimen.signal_cluster_battery_padding);
1146d035f15d5c8c67d97a4d5b6ed44f8cca0772e1fJorim Jaggi        mEndPaddingNothingVisible = getContext().getResources().getDimensionPixelSize(
1156d035f15d5c8c67d97a4d5b6ed44f8cca0772e1fJorim Jaggi                R.dimen.no_signal_cluster_battery_padding);
116c737b9bd5a0bc60fd92150d55f8ddb530697b987Jorim Jaggi    }
117c737b9bd5a0bc60fd92150d55f8ddb530697b987Jorim Jaggi
118c737b9bd5a0bc60fd92150d55f8ddb530697b987Jorim Jaggi    @Override
1192e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson    protected void onAttachedToWindow() {
1202e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson        super.onAttachedToWindow();
1212e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson
1223128f12f216ef481b5d03892b35706cfeec26d7cJason Monk        mVpn            = (ImageView) findViewById(R.id.vpn);
123d46bb58fa635110bf8c911107819e8bd8e8b06e2Lorenzo Colitti        mEthernetGroup  = (ViewGroup) findViewById(R.id.ethernet_combo);
124d46bb58fa635110bf8c911107819e8bd8e8b06e2Lorenzo Colitti        mEthernet       = (ImageView) findViewById(R.id.ethernet);
125d46bb58fa635110bf8c911107819e8bd8e8b06e2Lorenzo Colitti        mEthernetDark   = (ImageView) findViewById(R.id.ethernet_dark);
1262e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson        mWifiGroup      = (ViewGroup) findViewById(R.id.wifi_combo);
1272e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson        mWifi           = (ImageView) findViewById(R.id.wifi_signal);
1285443cc563cf4581a8ea9ada3b27fac7107d72099Jorim Jaggi        mWifiDark       = (ImageView) findViewById(R.id.wifi_signal_dark);
129061d43c2386dd8222448bb1bec017bf9a2367a4eAndrew Flynn        mAirplane       = (ImageView) findViewById(R.id.airplane);
130b574627ebc383d35cf8212ee241b191b26518a0dJason Monk        mNoSims         = (ImageView) findViewById(R.id.no_sims);
1315443cc563cf4581a8ea9ada3b27fac7107d72099Jorim Jaggi        mNoSimsDark     = (ImageView) findViewById(R.id.no_sims_dark);
1325172dc2f36f9c417befd0957ce2ae20f9d083a88Jorim Jaggi        mWifiAirplaneSpacer =         findViewById(R.id.wifi_airplane_spacer);
133c737b9bd5a0bc60fd92150d55f8ddb530697b987Jorim Jaggi        mWifiSignalSpacer =           findViewById(R.id.wifi_signal_spacer);
134b574627ebc383d35cf8212ee241b191b26518a0dJason Monk        mMobileSignalGroup = (LinearLayout) findViewById(R.id.mobile_signal_group);
135b574627ebc383d35cf8212ee241b191b26518a0dJason Monk        for (PhoneState state : mPhoneStates) {
136b574627ebc383d35cf8212ee241b191b26518a0dJason Monk            mMobileSignalGroup.addView(state.mMobileGroup);
137b574627ebc383d35cf8212ee241b191b26518a0dJason Monk        }
13828f89d40ee7bab93cf7b783f92dbb18bdc43e473Daniel Sandler
13928f89d40ee7bab93cf7b783f92dbb18bdc43e473Daniel Sandler        apply();
140dd0107a0dbe3084af8f5da005a4d96f8657f58a1Jorim Jaggi        applyIconTint();
1412e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson    }
1422e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson
1432e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson    @Override
1442e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson    protected void onDetachedFromWindow() {
1453128f12f216ef481b5d03892b35706cfeec26d7cJason Monk        mVpn            = null;
146d46bb58fa635110bf8c911107819e8bd8e8b06e2Lorenzo Colitti        mEthernetGroup  = null;
147d46bb58fa635110bf8c911107819e8bd8e8b06e2Lorenzo Colitti        mEthernet       = null;
14828f89d40ee7bab93cf7b783f92dbb18bdc43e473Daniel Sandler        mWifiGroup      = null;
14928f89d40ee7bab93cf7b783f92dbb18bdc43e473Daniel Sandler        mWifi           = null;
150061d43c2386dd8222448bb1bec017bf9a2367a4eAndrew Flynn        mAirplane       = null;
151b574627ebc383d35cf8212ee241b191b26518a0dJason Monk        mMobileSignalGroup.removeAllViews();
152b574627ebc383d35cf8212ee241b191b26518a0dJason Monk        mMobileSignalGroup = null;
15328f89d40ee7bab93cf7b783f92dbb18bdc43e473Daniel Sandler
1542e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson        super.onDetachedFromWindow();
1552e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson    }
1562e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson
1573128f12f216ef481b5d03892b35706cfeec26d7cJason Monk    // From SecurityController.
1583128f12f216ef481b5d03892b35706cfeec26d7cJason Monk    @Override
1593128f12f216ef481b5d03892b35706cfeec26d7cJason Monk    public void onStateChanged() {
1603128f12f216ef481b5d03892b35706cfeec26d7cJason Monk        post(new Runnable() {
1613128f12f216ef481b5d03892b35706cfeec26d7cJason Monk            @Override
1623128f12f216ef481b5d03892b35706cfeec26d7cJason Monk            public void run() {
1633128f12f216ef481b5d03892b35706cfeec26d7cJason Monk                mVpnVisible = mSC.isVpnEnabled();
1643128f12f216ef481b5d03892b35706cfeec26d7cJason Monk                apply();
1653128f12f216ef481b5d03892b35706cfeec26d7cJason Monk            }
1663128f12f216ef481b5d03892b35706cfeec26d7cJason Monk        });
1673128f12f216ef481b5d03892b35706cfeec26d7cJason Monk    }
1683128f12f216ef481b5d03892b35706cfeec26d7cJason Monk
169061d43c2386dd8222448bb1bec017bf9a2367a4eAndrew Flynn    @Override
17007b75fe65dcb5b8add8246654c65f95f1191933eJason Monk    public void setWifiIndicators(boolean enabled, IconState statusIcon, IconState qsIcon,
17107b75fe65dcb5b8add8246654c65f95f1191933eJason Monk            boolean activityIn, boolean activityOut, String description) {
17207b75fe65dcb5b8add8246654c65f95f1191933eJason Monk        mWifiVisible = statusIcon.visible;
17307b75fe65dcb5b8add8246654c65f95f1191933eJason Monk        mWifiStrengthId = statusIcon.icon;
17407b75fe65dcb5b8add8246654c65f95f1191933eJason Monk        mWifiDescription = statusIcon.contentDescription;
17528f89d40ee7bab93cf7b783f92dbb18bdc43e473Daniel Sandler
17628f89d40ee7bab93cf7b783f92dbb18bdc43e473Daniel Sandler        apply();
17728f89d40ee7bab93cf7b783f92dbb18bdc43e473Daniel Sandler    }
17828f89d40ee7bab93cf7b783f92dbb18bdc43e473Daniel Sandler
179061d43c2386dd8222448bb1bec017bf9a2367a4eAndrew Flynn    @Override
18007b75fe65dcb5b8add8246654c65f95f1191933eJason Monk    public void setMobileDataIndicators(IconState statusIcon, IconState qsIcon, int darkStatusIcon,
18107b75fe65dcb5b8add8246654c65f95f1191933eJason Monk            int statusType, int qsType, boolean activityIn, boolean activityOut,
18207b75fe65dcb5b8add8246654c65f95f1191933eJason Monk            String typeContentDescription, String description, boolean isWide, int subId) {
183b574627ebc383d35cf8212ee241b191b26518a0dJason Monk        PhoneState state = getOrInflateState(subId);
18407b75fe65dcb5b8add8246654c65f95f1191933eJason Monk        state.mMobileVisible = statusIcon.visible;
18507b75fe65dcb5b8add8246654c65f95f1191933eJason Monk        state.mMobileStrengthId = statusIcon.icon;
18607b75fe65dcb5b8add8246654c65f95f1191933eJason Monk        state.mMobileDarkStrengthId = darkStatusIcon;
18707b75fe65dcb5b8add8246654c65f95f1191933eJason Monk        state.mMobileTypeId = statusType;
18807b75fe65dcb5b8add8246654c65f95f1191933eJason Monk        state.mMobileDescription = statusIcon.contentDescription;
189b574627ebc383d35cf8212ee241b191b26518a0dJason Monk        state.mMobileTypeDescription = typeContentDescription;
19007b75fe65dcb5b8add8246654c65f95f1191933eJason Monk        state.mIsMobileTypeIconWide = statusType != 0 && isWide;
19128f89d40ee7bab93cf7b783f92dbb18bdc43e473Daniel Sandler
19228f89d40ee7bab93cf7b783f92dbb18bdc43e473Daniel Sandler        apply();
19328f89d40ee7bab93cf7b783f92dbb18bdc43e473Daniel Sandler    }
19428f89d40ee7bab93cf7b783f92dbb18bdc43e473Daniel Sandler
195061d43c2386dd8222448bb1bec017bf9a2367a4eAndrew Flynn    @Override
19607b75fe65dcb5b8add8246654c65f95f1191933eJason Monk    public void setEthernetIndicators(IconState state) {
19707b75fe65dcb5b8add8246654c65f95f1191933eJason Monk        mEthernetVisible = state.visible;
19807b75fe65dcb5b8add8246654c65f95f1191933eJason Monk        mEthernetIconId = state.icon;
19907b75fe65dcb5b8add8246654c65f95f1191933eJason Monk        mEthernetDescription = state.contentDescription;
200d46bb58fa635110bf8c911107819e8bd8e8b06e2Lorenzo Colitti
201d46bb58fa635110bf8c911107819e8bd8e8b06e2Lorenzo Colitti        apply();
202d46bb58fa635110bf8c911107819e8bd8e8b06e2Lorenzo Colitti    }
203d46bb58fa635110bf8c911107819e8bd8e8b06e2Lorenzo Colitti
204d46bb58fa635110bf8c911107819e8bd8e8b06e2Lorenzo Colitti    @Override
205b574627ebc383d35cf8212ee241b191b26518a0dJason Monk    public void setNoSims(boolean show) {
206b574627ebc383d35cf8212ee241b191b26518a0dJason Monk        mNoSimsVisible = show;
207b574627ebc383d35cf8212ee241b191b26518a0dJason Monk    }
208b574627ebc383d35cf8212ee241b191b26518a0dJason Monk
209b574627ebc383d35cf8212ee241b191b26518a0dJason Monk    @Override
210b574627ebc383d35cf8212ee241b191b26518a0dJason Monk    public void setSubs(List<SubscriptionInfo> subs) {
211b574627ebc383d35cf8212ee241b191b26518a0dJason Monk        // Clear out all old subIds.
212b574627ebc383d35cf8212ee241b191b26518a0dJason Monk        mPhoneStates.clear();
213b574627ebc383d35cf8212ee241b191b26518a0dJason Monk        if (mMobileSignalGroup != null) {
214b574627ebc383d35cf8212ee241b191b26518a0dJason Monk            mMobileSignalGroup.removeAllViews();
215b574627ebc383d35cf8212ee241b191b26518a0dJason Monk        }
216b574627ebc383d35cf8212ee241b191b26518a0dJason Monk        final int n = subs.size();
217b574627ebc383d35cf8212ee241b191b26518a0dJason Monk        for (int i = 0; i < n; i++) {
218b574627ebc383d35cf8212ee241b191b26518a0dJason Monk            inflatePhoneState(subs.get(i).getSubscriptionId());
219b574627ebc383d35cf8212ee241b191b26518a0dJason Monk        }
220dd0107a0dbe3084af8f5da005a4d96f8657f58a1Jorim Jaggi        if (isAttachedToWindow()) {
221dd0107a0dbe3084af8f5da005a4d96f8657f58a1Jorim Jaggi            applyIconTint();
222dd0107a0dbe3084af8f5da005a4d96f8657f58a1Jorim Jaggi        }
223b574627ebc383d35cf8212ee241b191b26518a0dJason Monk    }
224b574627ebc383d35cf8212ee241b191b26518a0dJason Monk
225b574627ebc383d35cf8212ee241b191b26518a0dJason Monk    private PhoneState getOrInflateState(int subId) {
226b574627ebc383d35cf8212ee241b191b26518a0dJason Monk        for (PhoneState state : mPhoneStates) {
227b574627ebc383d35cf8212ee241b191b26518a0dJason Monk            if (state.mSubId == subId) {
228b574627ebc383d35cf8212ee241b191b26518a0dJason Monk                return state;
229b574627ebc383d35cf8212ee241b191b26518a0dJason Monk            }
230b574627ebc383d35cf8212ee241b191b26518a0dJason Monk        }
231b574627ebc383d35cf8212ee241b191b26518a0dJason Monk        return inflatePhoneState(subId);
232b574627ebc383d35cf8212ee241b191b26518a0dJason Monk    }
233b574627ebc383d35cf8212ee241b191b26518a0dJason Monk
234b574627ebc383d35cf8212ee241b191b26518a0dJason Monk    private PhoneState inflatePhoneState(int subId) {
235b574627ebc383d35cf8212ee241b191b26518a0dJason Monk        PhoneState state = new PhoneState(subId, mContext);
236b574627ebc383d35cf8212ee241b191b26518a0dJason Monk        if (mMobileSignalGroup != null) {
237b574627ebc383d35cf8212ee241b191b26518a0dJason Monk            mMobileSignalGroup.addView(state.mMobileGroup);
238b574627ebc383d35cf8212ee241b191b26518a0dJason Monk        }
239b574627ebc383d35cf8212ee241b191b26518a0dJason Monk        mPhoneStates.add(state);
240b574627ebc383d35cf8212ee241b191b26518a0dJason Monk        return state;
241b574627ebc383d35cf8212ee241b191b26518a0dJason Monk    }
242b574627ebc383d35cf8212ee241b191b26518a0dJason Monk
243b574627ebc383d35cf8212ee241b191b26518a0dJason Monk    @Override
24407b75fe65dcb5b8add8246654c65f95f1191933eJason Monk    public void setIsAirplaneMode(IconState icon) {
24507b75fe65dcb5b8add8246654c65f95f1191933eJason Monk        mIsAirplaneMode = icon.visible;
24607b75fe65dcb5b8add8246654c65f95f1191933eJason Monk        mAirplaneIconId = icon.icon;
24707b75fe65dcb5b8add8246654c65f95f1191933eJason Monk        mAirplaneContentDescription = icon.contentDescription;
248061d43c2386dd8222448bb1bec017bf9a2367a4eAndrew Flynn
249061d43c2386dd8222448bb1bec017bf9a2367a4eAndrew Flynn        apply();
2505ccff81a642844138b144ad2cc339eba188812a0Daniel Sandler    }
2515ccff81a642844138b144ad2cc339eba188812a0Daniel Sandler
2522f7dfa7afdaada78c46bd6fd7e307656ba3dd66aJohn Spurlock    @Override
25307b75fe65dcb5b8add8246654c65f95f1191933eJason Monk    public void setMobileDataEnabled(boolean enabled) {
25407b75fe65dcb5b8add8246654c65f95f1191933eJason Monk        // Don't care.
25507b75fe65dcb5b8add8246654c65f95f1191933eJason Monk    }
25607b75fe65dcb5b8add8246654c65f95f1191933eJason Monk
25707b75fe65dcb5b8add8246654c65f95f1191933eJason Monk    @Override
258a54956a0bc611b1e9b3914edc7a604b59688f6b7Alan Viverette    public boolean dispatchPopulateAccessibilityEventInternal(AccessibilityEvent event) {
2592f7dfa7afdaada78c46bd6fd7e307656ba3dd66aJohn Spurlock        // Standard group layout onPopulateAccessibilityEvent() implementations
2602f7dfa7afdaada78c46bd6fd7e307656ba3dd66aJohn Spurlock        // ignore content description, so populate manually
261d46bb58fa635110bf8c911107819e8bd8e8b06e2Lorenzo Colitti        if (mEthernetVisible && mEthernetGroup != null &&
262d46bb58fa635110bf8c911107819e8bd8e8b06e2Lorenzo Colitti                mEthernetGroup.getContentDescription() != null)
263d46bb58fa635110bf8c911107819e8bd8e8b06e2Lorenzo Colitti            event.getText().add(mEthernetGroup.getContentDescription());
26424e028e0ec533cb7304296118a73bdc03870d10dDaniel Sandler        if (mWifiVisible && mWifiGroup != null && mWifiGroup.getContentDescription() != null)
2652f7dfa7afdaada78c46bd6fd7e307656ba3dd66aJohn Spurlock            event.getText().add(mWifiGroup.getContentDescription());
266b574627ebc383d35cf8212ee241b191b26518a0dJason Monk        for (PhoneState state : mPhoneStates) {
267b574627ebc383d35cf8212ee241b191b26518a0dJason Monk            state.populateAccessibilityEvent(event);
268b574627ebc383d35cf8212ee241b191b26518a0dJason Monk        }
269a54956a0bc611b1e9b3914edc7a604b59688f6b7Alan Viverette        return super.dispatchPopulateAccessibilityEventInternal(event);
2702f7dfa7afdaada78c46bd6fd7e307656ba3dd66aJohn Spurlock    }
2712f7dfa7afdaada78c46bd6fd7e307656ba3dd66aJohn Spurlock
2724662611f3757bd9210f252c095f2bef278fa2043Fabrice Di Meglio    @Override
2734662611f3757bd9210f252c095f2bef278fa2043Fabrice Di Meglio    public void onRtlPropertiesChanged(int layoutDirection) {
2744662611f3757bd9210f252c095f2bef278fa2043Fabrice Di Meglio        super.onRtlPropertiesChanged(layoutDirection);
2754662611f3757bd9210f252c095f2bef278fa2043Fabrice Di Meglio
276d46bb58fa635110bf8c911107819e8bd8e8b06e2Lorenzo Colitti        if (mEthernet != null) {
277d46bb58fa635110bf8c911107819e8bd8e8b06e2Lorenzo Colitti            mEthernet.setImageDrawable(null);
278d46bb58fa635110bf8c911107819e8bd8e8b06e2Lorenzo Colitti        }
279d46bb58fa635110bf8c911107819e8bd8e8b06e2Lorenzo Colitti
2804662611f3757bd9210f252c095f2bef278fa2043Fabrice Di Meglio        if (mWifi != null) {
2814662611f3757bd9210f252c095f2bef278fa2043Fabrice Di Meglio            mWifi.setImageDrawable(null);
2824662611f3757bd9210f252c095f2bef278fa2043Fabrice Di Meglio        }
2834662611f3757bd9210f252c095f2bef278fa2043Fabrice Di Meglio
284b574627ebc383d35cf8212ee241b191b26518a0dJason Monk        for (PhoneState state : mPhoneStates) {
285b574627ebc383d35cf8212ee241b191b26518a0dJason Monk            if (state.mMobile != null) {
286b574627ebc383d35cf8212ee241b191b26518a0dJason Monk                state.mMobile.setImageDrawable(null);
287b574627ebc383d35cf8212ee241b191b26518a0dJason Monk            }
288b574627ebc383d35cf8212ee241b191b26518a0dJason Monk            if (state.mMobileType != null) {
289b574627ebc383d35cf8212ee241b191b26518a0dJason Monk                state.mMobileType.setImageDrawable(null);
290b574627ebc383d35cf8212ee241b191b26518a0dJason Monk            }
2914662611f3757bd9210f252c095f2bef278fa2043Fabrice Di Meglio        }
2924662611f3757bd9210f252c095f2bef278fa2043Fabrice Di Meglio
2934662611f3757bd9210f252c095f2bef278fa2043Fabrice Di Meglio        if(mAirplane != null) {
2944662611f3757bd9210f252c095f2bef278fa2043Fabrice Di Meglio            mAirplane.setImageDrawable(null);
2954662611f3757bd9210f252c095f2bef278fa2043Fabrice Di Meglio        }
2964662611f3757bd9210f252c095f2bef278fa2043Fabrice Di Meglio
2974662611f3757bd9210f252c095f2bef278fa2043Fabrice Di Meglio        apply();
2984662611f3757bd9210f252c095f2bef278fa2043Fabrice Di Meglio    }
2994662611f3757bd9210f252c095f2bef278fa2043Fabrice Di Meglio
3000d266899da8f612194a8393ec69c4fd870f2f45cJorim Jaggi    @Override
3010d266899da8f612194a8393ec69c4fd870f2f45cJorim Jaggi    public boolean hasOverlappingRendering() {
3020d266899da8f612194a8393ec69c4fd870f2f45cJorim Jaggi        return false;
3030d266899da8f612194a8393ec69c4fd870f2f45cJorim Jaggi    }
3040d266899da8f612194a8393ec69c4fd870f2f45cJorim Jaggi
30528f89d40ee7bab93cf7b783f92dbb18bdc43e473Daniel Sandler    // Run after each indicator change.
30628f89d40ee7bab93cf7b783f92dbb18bdc43e473Daniel Sandler    private void apply() {
3072e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson        if (mWifiGroup == null) return;
3082e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson
3093128f12f216ef481b5d03892b35706cfeec26d7cJason Monk        mVpn.setVisibility(mVpnVisible ? View.VISIBLE : View.GONE);
3103128f12f216ef481b5d03892b35706cfeec26d7cJason Monk        if (DEBUG) Log.d(TAG, String.format("vpn: %s", mVpnVisible ? "VISIBLE" : "GONE"));
311d46bb58fa635110bf8c911107819e8bd8e8b06e2Lorenzo Colitti
312d46bb58fa635110bf8c911107819e8bd8e8b06e2Lorenzo Colitti        if (mEthernetVisible) {
313d46bb58fa635110bf8c911107819e8bd8e8b06e2Lorenzo Colitti            mEthernet.setImageResource(mEthernetIconId);
314d46bb58fa635110bf8c911107819e8bd8e8b06e2Lorenzo Colitti            mEthernetDark.setImageResource(mEthernetIconId);
315d46bb58fa635110bf8c911107819e8bd8e8b06e2Lorenzo Colitti            mEthernetGroup.setContentDescription(mEthernetDescription);
316d46bb58fa635110bf8c911107819e8bd8e8b06e2Lorenzo Colitti            mEthernetGroup.setVisibility(View.VISIBLE);
317d46bb58fa635110bf8c911107819e8bd8e8b06e2Lorenzo Colitti        } else {
318d46bb58fa635110bf8c911107819e8bd8e8b06e2Lorenzo Colitti            mEthernetGroup.setVisibility(View.GONE);
319d46bb58fa635110bf8c911107819e8bd8e8b06e2Lorenzo Colitti        }
320d46bb58fa635110bf8c911107819e8bd8e8b06e2Lorenzo Colitti
321d46bb58fa635110bf8c911107819e8bd8e8b06e2Lorenzo Colitti        if (DEBUG) Log.d(TAG,
322d46bb58fa635110bf8c911107819e8bd8e8b06e2Lorenzo Colitti                String.format("ethernet: %s",
323d46bb58fa635110bf8c911107819e8bd8e8b06e2Lorenzo Colitti                    (mEthernetVisible ? "VISIBLE" : "GONE")));
324d46bb58fa635110bf8c911107819e8bd8e8b06e2Lorenzo Colitti
325d46bb58fa635110bf8c911107819e8bd8e8b06e2Lorenzo Colitti
32628f89d40ee7bab93cf7b783f92dbb18bdc43e473Daniel Sandler        if (mWifiVisible) {
32728f89d40ee7bab93cf7b783f92dbb18bdc43e473Daniel Sandler            mWifi.setImageResource(mWifiStrengthId);
3285443cc563cf4581a8ea9ada3b27fac7107d72099Jorim Jaggi            mWifiDark.setImageResource(mWifiStrengthId);
329bcf6ef0b82c1daea43e03b8ad5af319ed324242aDaniel Sandler            mWifiGroup.setContentDescription(mWifiDescription);
330cda096ebf3fac67daf36e775547c2a337374927bFabrice Di Meglio            mWifiGroup.setVisibility(View.VISIBLE);
3312e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson        } else {
3322e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson            mWifiGroup.setVisibility(View.GONE);
3332e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson        }
3342e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson
335cd686b5b6d4166b510df8e32138479a9559bc117John Spurlock        if (DEBUG) Log.d(TAG,
336fcc901c10bffdfb9c6b31e676dec36b47d949979John Spurlock                String.format("wifi: %s sig=%d",
33728f89d40ee7bab93cf7b783f92dbb18bdc43e473Daniel Sandler                    (mWifiVisible ? "VISIBLE" : "GONE"),
338fcc901c10bffdfb9c6b31e676dec36b47d949979John Spurlock                    mWifiStrengthId));
3392e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson
340b574627ebc383d35cf8212ee241b191b26518a0dJason Monk        boolean anyMobileVisible = false;
341e912c9cc39807f95815400981ed27d121e8b293aDan Sandler        int firstMobileTypeId = 0;
342b574627ebc383d35cf8212ee241b191b26518a0dJason Monk        for (PhoneState state : mPhoneStates) {
343b574627ebc383d35cf8212ee241b191b26518a0dJason Monk            if (state.apply(anyMobileVisible)) {
344e912c9cc39807f95815400981ed27d121e8b293aDan Sandler                if (!anyMobileVisible) {
345e912c9cc39807f95815400981ed27d121e8b293aDan Sandler                    firstMobileTypeId = state.mMobileTypeId;
346e912c9cc39807f95815400981ed27d121e8b293aDan Sandler                    anyMobileVisible = true;
347e912c9cc39807f95815400981ed27d121e8b293aDan Sandler                }
348b574627ebc383d35cf8212ee241b191b26518a0dJason Monk            }
3492e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson        }
35028f89d40ee7bab93cf7b783f92dbb18bdc43e473Daniel Sandler
351061d43c2386dd8222448bb1bec017bf9a2367a4eAndrew Flynn        if (mIsAirplaneMode) {
352061d43c2386dd8222448bb1bec017bf9a2367a4eAndrew Flynn            mAirplane.setImageResource(mAirplaneIconId);
35307b75fe65dcb5b8add8246654c65f95f1191933eJason Monk            mAirplane.setContentDescription(mAirplaneContentDescription);
3548afcd149970c79054a3a16377834aa0aec35eee0Fabrice Di Meglio            mAirplane.setVisibility(View.VISIBLE);
355061d43c2386dd8222448bb1bec017bf9a2367a4eAndrew Flynn        } else {
356061d43c2386dd8222448bb1bec017bf9a2367a4eAndrew Flynn            mAirplane.setVisibility(View.GONE);
357061d43c2386dd8222448bb1bec017bf9a2367a4eAndrew Flynn        }
358061d43c2386dd8222448bb1bec017bf9a2367a4eAndrew Flynn
3595172dc2f36f9c417befd0957ce2ae20f9d083a88Jorim Jaggi        if (mIsAirplaneMode && mWifiVisible) {
3605172dc2f36f9c417befd0957ce2ae20f9d083a88Jorim Jaggi            mWifiAirplaneSpacer.setVisibility(View.VISIBLE);
3615ccff81a642844138b144ad2cc339eba188812a0Daniel Sandler        } else {
3625172dc2f36f9c417befd0957ce2ae20f9d083a88Jorim Jaggi            mWifiAirplaneSpacer.setVisibility(View.GONE);
3635ccff81a642844138b144ad2cc339eba188812a0Daniel Sandler        }
3645ccff81a642844138b144ad2cc339eba188812a0Daniel Sandler
365e912c9cc39807f95815400981ed27d121e8b293aDan Sandler        if (((anyMobileVisible && firstMobileTypeId != 0) || mNoSimsVisible) && mWifiVisible) {
366c737b9bd5a0bc60fd92150d55f8ddb530697b987Jorim Jaggi            mWifiSignalSpacer.setVisibility(View.VISIBLE);
367c737b9bd5a0bc60fd92150d55f8ddb530697b987Jorim Jaggi        } else {
368c737b9bd5a0bc60fd92150d55f8ddb530697b987Jorim Jaggi            mWifiSignalSpacer.setVisibility(View.GONE);
369c737b9bd5a0bc60fd92150d55f8ddb530697b987Jorim Jaggi        }
370c737b9bd5a0bc60fd92150d55f8ddb530697b987Jorim Jaggi
371b574627ebc383d35cf8212ee241b191b26518a0dJason Monk        mNoSims.setVisibility(mNoSimsVisible ? View.VISIBLE : View.GONE);
3725443cc563cf4581a8ea9ada3b27fac7107d72099Jorim Jaggi        mNoSimsDark.setVisibility(mNoSimsVisible ? View.VISIBLE : View.GONE);
373c737b9bd5a0bc60fd92150d55f8ddb530697b987Jorim Jaggi
374b574627ebc383d35cf8212ee241b191b26518a0dJason Monk        boolean anythingVisible = mNoSimsVisible || mWifiVisible || mIsAirplaneMode
375d46bb58fa635110bf8c911107819e8bd8e8b06e2Lorenzo Colitti                || anyMobileVisible || mVpnVisible || mEthernetVisible;
376b574627ebc383d35cf8212ee241b191b26518a0dJason Monk        setPaddingRelative(0, 0, anythingVisible ? mEndPadding : mEndPaddingNothingVisible, 0);
377b574627ebc383d35cf8212ee241b191b26518a0dJason Monk    }
37828f89d40ee7bab93cf7b783f92dbb18bdc43e473Daniel Sandler
3795443cc563cf4581a8ea9ada3b27fac7107d72099Jorim Jaggi    public void setIconTint(int tint, float darkIntensity) {
3805443cc563cf4581a8ea9ada3b27fac7107d72099Jorim Jaggi        boolean changed = tint != mIconTint || darkIntensity != mDarkIntensity;
381dd0107a0dbe3084af8f5da005a4d96f8657f58a1Jorim Jaggi        mIconTint = tint;
3825443cc563cf4581a8ea9ada3b27fac7107d72099Jorim Jaggi        mDarkIntensity = darkIntensity;
383dd0107a0dbe3084af8f5da005a4d96f8657f58a1Jorim Jaggi        if (changed && isAttachedToWindow()) {
384dd0107a0dbe3084af8f5da005a4d96f8657f58a1Jorim Jaggi            applyIconTint();
385dd0107a0dbe3084af8f5da005a4d96f8657f58a1Jorim Jaggi        }
386dd0107a0dbe3084af8f5da005a4d96f8657f58a1Jorim Jaggi    }
387dd0107a0dbe3084af8f5da005a4d96f8657f58a1Jorim Jaggi
388dd0107a0dbe3084af8f5da005a4d96f8657f58a1Jorim Jaggi    private void applyIconTint() {
389dd0107a0dbe3084af8f5da005a4d96f8657f58a1Jorim Jaggi        setTint(mVpn, mIconTint);
390dd0107a0dbe3084af8f5da005a4d96f8657f58a1Jorim Jaggi        setTint(mAirplane, mIconTint);
3915443cc563cf4581a8ea9ada3b27fac7107d72099Jorim Jaggi        applyDarkIntensity(mDarkIntensity, mNoSims, mNoSimsDark);
3925443cc563cf4581a8ea9ada3b27fac7107d72099Jorim Jaggi        applyDarkIntensity(mDarkIntensity, mWifi, mWifiDark);
393d46bb58fa635110bf8c911107819e8bd8e8b06e2Lorenzo Colitti        applyDarkIntensity(mDarkIntensity, mEthernet, mEthernetDark);
394dd0107a0dbe3084af8f5da005a4d96f8657f58a1Jorim Jaggi        for (int i = 0; i < mPhoneStates.size(); i++) {
3955443cc563cf4581a8ea9ada3b27fac7107d72099Jorim Jaggi            mPhoneStates.get(i).setIconTint(mIconTint, mDarkIntensity);
396dd0107a0dbe3084af8f5da005a4d96f8657f58a1Jorim Jaggi        }
397dd0107a0dbe3084af8f5da005a4d96f8657f58a1Jorim Jaggi    }
398dd0107a0dbe3084af8f5da005a4d96f8657f58a1Jorim Jaggi
3995443cc563cf4581a8ea9ada3b27fac7107d72099Jorim Jaggi    private void applyDarkIntensity(float darkIntensity, View lightIcon, View darkIcon) {
4005443cc563cf4581a8ea9ada3b27fac7107d72099Jorim Jaggi        lightIcon.setAlpha(1 - darkIntensity);
4015443cc563cf4581a8ea9ada3b27fac7107d72099Jorim Jaggi        darkIcon.setAlpha(darkIntensity);
4025443cc563cf4581a8ea9ada3b27fac7107d72099Jorim Jaggi    }
4035443cc563cf4581a8ea9ada3b27fac7107d72099Jorim Jaggi
404dd0107a0dbe3084af8f5da005a4d96f8657f58a1Jorim Jaggi    private void setTint(ImageView v, int tint) {
405dd0107a0dbe3084af8f5da005a4d96f8657f58a1Jorim Jaggi        v.setImageTintMode(PorterDuff.Mode.SRC_ATOP);
406dd0107a0dbe3084af8f5da005a4d96f8657f58a1Jorim Jaggi        v.setImageTintList(ColorStateList.valueOf(tint));
407dd0107a0dbe3084af8f5da005a4d96f8657f58a1Jorim Jaggi    }
408dd0107a0dbe3084af8f5da005a4d96f8657f58a1Jorim Jaggi
409b574627ebc383d35cf8212ee241b191b26518a0dJason Monk    private class PhoneState {
410b574627ebc383d35cf8212ee241b191b26518a0dJason Monk        private final int mSubId;
411b574627ebc383d35cf8212ee241b191b26518a0dJason Monk        private boolean mMobileVisible = false;
412a478d70a68696380acbd4a9739dfaaebff61c728Andrew Flynn        private int mMobileStrengthId = 0, mMobileDarkStrengthId = 0, mMobileTypeId = 0;
413b574627ebc383d35cf8212ee241b191b26518a0dJason Monk        private boolean mIsMobileTypeIconWide;
414b574627ebc383d35cf8212ee241b191b26518a0dJason Monk        private String mMobileDescription, mMobileTypeDescription;
415b574627ebc383d35cf8212ee241b191b26518a0dJason Monk
416b574627ebc383d35cf8212ee241b191b26518a0dJason Monk        private ViewGroup mMobileGroup;
4175443cc563cf4581a8ea9ada3b27fac7107d72099Jorim Jaggi        private ImageView mMobile, mMobileDark, mMobileType;
418b574627ebc383d35cf8212ee241b191b26518a0dJason Monk
419b574627ebc383d35cf8212ee241b191b26518a0dJason Monk        public PhoneState(int subId, Context context) {
420b574627ebc383d35cf8212ee241b191b26518a0dJason Monk            ViewGroup root = (ViewGroup) LayoutInflater.from(context)
421b574627ebc383d35cf8212ee241b191b26518a0dJason Monk                    .inflate(R.layout.mobile_signal_group, null);
422b574627ebc383d35cf8212ee241b191b26518a0dJason Monk            setViews(root);
423b574627ebc383d35cf8212ee241b191b26518a0dJason Monk            mSubId = subId;
424b574627ebc383d35cf8212ee241b191b26518a0dJason Monk        }
4256d035f15d5c8c67d97a4d5b6ed44f8cca0772e1fJorim Jaggi
426b574627ebc383d35cf8212ee241b191b26518a0dJason Monk        public void setViews(ViewGroup root) {
427b574627ebc383d35cf8212ee241b191b26518a0dJason Monk            mMobileGroup    = root;
428b574627ebc383d35cf8212ee241b191b26518a0dJason Monk            mMobile         = (ImageView) root.findViewById(R.id.mobile_signal);
4295443cc563cf4581a8ea9ada3b27fac7107d72099Jorim Jaggi            mMobileDark     = (ImageView) root.findViewById(R.id.mobile_signal_dark);
430b574627ebc383d35cf8212ee241b191b26518a0dJason Monk            mMobileType     = (ImageView) root.findViewById(R.id.mobile_type);
431b574627ebc383d35cf8212ee241b191b26518a0dJason Monk        }
432b574627ebc383d35cf8212ee241b191b26518a0dJason Monk
433b574627ebc383d35cf8212ee241b191b26518a0dJason Monk        public boolean apply(boolean isSecondaryIcon) {
434b574627ebc383d35cf8212ee241b191b26518a0dJason Monk            if (mMobileVisible && !mIsAirplaneMode) {
435b574627ebc383d35cf8212ee241b191b26518a0dJason Monk                mMobile.setImageResource(mMobileStrengthId);
436a478d70a68696380acbd4a9739dfaaebff61c728Andrew Flynn                Drawable mobileDrawable = mMobile.getDrawable();
437a478d70a68696380acbd4a9739dfaaebff61c728Andrew Flynn                if (mobileDrawable instanceof Animatable) {
438a478d70a68696380acbd4a9739dfaaebff61c728Andrew Flynn                    Animatable ad = (Animatable) mobileDrawable;
439a478d70a68696380acbd4a9739dfaaebff61c728Andrew Flynn                    if (!ad.isRunning()) {
440a478d70a68696380acbd4a9739dfaaebff61c728Andrew Flynn                        ad.start();
441a478d70a68696380acbd4a9739dfaaebff61c728Andrew Flynn                    }
442a478d70a68696380acbd4a9739dfaaebff61c728Andrew Flynn                }
443a478d70a68696380acbd4a9739dfaaebff61c728Andrew Flynn
4445443cc563cf4581a8ea9ada3b27fac7107d72099Jorim Jaggi                mMobileDark.setImageResource(mMobileStrengthId);
445a478d70a68696380acbd4a9739dfaaebff61c728Andrew Flynn                Drawable mobileDarkDrawable = mMobileDark.getDrawable();
446a478d70a68696380acbd4a9739dfaaebff61c728Andrew Flynn                if (mobileDarkDrawable instanceof Animatable) {
447a478d70a68696380acbd4a9739dfaaebff61c728Andrew Flynn                    Animatable ad = (Animatable) mobileDarkDrawable;
448a478d70a68696380acbd4a9739dfaaebff61c728Andrew Flynn                    if (!ad.isRunning()) {
449a478d70a68696380acbd4a9739dfaaebff61c728Andrew Flynn                        ad.start();
450a478d70a68696380acbd4a9739dfaaebff61c728Andrew Flynn                    }
451a478d70a68696380acbd4a9739dfaaebff61c728Andrew Flynn                }
452a478d70a68696380acbd4a9739dfaaebff61c728Andrew Flynn
453b574627ebc383d35cf8212ee241b191b26518a0dJason Monk                mMobileType.setImageResource(mMobileTypeId);
454b574627ebc383d35cf8212ee241b191b26518a0dJason Monk                mMobileGroup.setContentDescription(mMobileTypeDescription
455b574627ebc383d35cf8212ee241b191b26518a0dJason Monk                        + " " + mMobileDescription);
456b574627ebc383d35cf8212ee241b191b26518a0dJason Monk                mMobileGroup.setVisibility(View.VISIBLE);
457b574627ebc383d35cf8212ee241b191b26518a0dJason Monk            } else {
458b574627ebc383d35cf8212ee241b191b26518a0dJason Monk                mMobileGroup.setVisibility(View.GONE);
459b574627ebc383d35cf8212ee241b191b26518a0dJason Monk            }
460b574627ebc383d35cf8212ee241b191b26518a0dJason Monk
461b574627ebc383d35cf8212ee241b191b26518a0dJason Monk            // When this isn't next to wifi, give it some extra padding between the signals.
462b574627ebc383d35cf8212ee241b191b26518a0dJason Monk            mMobileGroup.setPaddingRelative(isSecondaryIcon ? mSecondaryTelephonyPadding : 0,
463b574627ebc383d35cf8212ee241b191b26518a0dJason Monk                    0, 0, 0);
464b574627ebc383d35cf8212ee241b191b26518a0dJason Monk            mMobile.setPaddingRelative(mIsMobileTypeIconWide ? mWideTypeIconStartPadding : 0,
465b574627ebc383d35cf8212ee241b191b26518a0dJason Monk                    0, 0, 0);
4665443cc563cf4581a8ea9ada3b27fac7107d72099Jorim Jaggi            mMobileDark.setPaddingRelative(mIsMobileTypeIconWide ? mWideTypeIconStartPadding : 0,
4675443cc563cf4581a8ea9ada3b27fac7107d72099Jorim Jaggi                    0, 0, 0);
468b574627ebc383d35cf8212ee241b191b26518a0dJason Monk
469a478d70a68696380acbd4a9739dfaaebff61c728Andrew Flynn            if (DEBUG) Log.d(TAG, String.format("mobile: %s sig=%d dark=%d typ=%d",
470a478d70a68696380acbd4a9739dfaaebff61c728Andrew Flynn                        (mMobileVisible ? "VISIBLE" : "GONE"), mMobileStrengthId,
471a478d70a68696380acbd4a9739dfaaebff61c728Andrew Flynn                        mMobileDarkStrengthId, mMobileTypeId));
472b574627ebc383d35cf8212ee241b191b26518a0dJason Monk
473b574627ebc383d35cf8212ee241b191b26518a0dJason Monk            mMobileType.setVisibility(mMobileTypeId != 0 ? View.VISIBLE : View.GONE);
474b574627ebc383d35cf8212ee241b191b26518a0dJason Monk
475b574627ebc383d35cf8212ee241b191b26518a0dJason Monk            return mMobileVisible;
476b574627ebc383d35cf8212ee241b191b26518a0dJason Monk        }
477b574627ebc383d35cf8212ee241b191b26518a0dJason Monk
478b574627ebc383d35cf8212ee241b191b26518a0dJason Monk        public void populateAccessibilityEvent(AccessibilityEvent event) {
479b574627ebc383d35cf8212ee241b191b26518a0dJason Monk            if (mMobileVisible && mMobileGroup != null
480b574627ebc383d35cf8212ee241b191b26518a0dJason Monk                    && mMobileGroup.getContentDescription() != null) {
481b574627ebc383d35cf8212ee241b191b26518a0dJason Monk                event.getText().add(mMobileGroup.getContentDescription());
482b574627ebc383d35cf8212ee241b191b26518a0dJason Monk            }
483b574627ebc383d35cf8212ee241b191b26518a0dJason Monk        }
484dd0107a0dbe3084af8f5da005a4d96f8657f58a1Jorim Jaggi
4855443cc563cf4581a8ea9ada3b27fac7107d72099Jorim Jaggi        public void setIconTint(int tint, float darkIntensity) {
4865443cc563cf4581a8ea9ada3b27fac7107d72099Jorim Jaggi            applyDarkIntensity(darkIntensity, mMobile, mMobileDark);
487dd0107a0dbe3084af8f5da005a4d96f8657f58a1Jorim Jaggi            setTint(mMobileType, tint);
488dd0107a0dbe3084af8f5da005a4d96f8657f58a1Jorim Jaggi        }
4892e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson    }
4902e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson}
4912e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson
492