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