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; 20b574627ebc383d35cf8212ee241b191b26518a0dJason Monkimport android.telephony.SubscriptionInfo; 212e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertsonimport android.util.AttributeSet; 22cd686b5b6d4166b510df8e32138479a9559bc117John Spurlockimport android.util.Log; 23b574627ebc383d35cf8212ee241b191b26518a0dJason Monkimport android.view.LayoutInflater; 242e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertsonimport android.view.View; 252e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertsonimport android.view.ViewGroup; 262f7dfa7afdaada78c46bd6fd7e307656ba3dd66aJohn Spurlockimport android.view.accessibility.AccessibilityEvent; 272e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertsonimport android.widget.ImageView; 282e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertsonimport android.widget.LinearLayout; 292e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson 302e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertsonimport com.android.systemui.R; 31af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlockimport com.android.systemui.statusbar.policy.NetworkControllerImpl; 323128f12f216ef481b5d03892b35706cfeec26d7cJason Monkimport com.android.systemui.statusbar.policy.SecurityController; 332e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson 34b574627ebc383d35cf8212ee241b191b26518a0dJason Monkimport java.util.ArrayList; 35b574627ebc383d35cf8212ee241b191b26518a0dJason Monkimport java.util.List; 36b574627ebc383d35cf8212ee241b191b26518a0dJason Monk 375ccff81a642844138b144ad2cc339eba188812a0Daniel Sandler// Intimately tied to the design of res/layout/signal_cluster_view.xml 382e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertsonpublic class SignalClusterView 392f7dfa7afdaada78c46bd6fd7e307656ba3dd66aJohn Spurlock extends LinearLayout 403128f12f216ef481b5d03892b35706cfeec26d7cJason Monk implements NetworkControllerImpl.SignalCluster, 413128f12f216ef481b5d03892b35706cfeec26d7cJason Monk SecurityController.SecurityControllerCallback { 422e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson 4328f89d40ee7bab93cf7b783f92dbb18bdc43e473Daniel Sandler static final String TAG = "SignalClusterView"; 44b3eb89190c4bb4ebbe676328cd37830d50e6ed3eJohn Spurlock static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG); 452f7dfa7afdaada78c46bd6fd7e307656ba3dd66aJohn Spurlock 46af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock NetworkControllerImpl mNC; 473128f12f216ef481b5d03892b35706cfeec26d7cJason Monk SecurityController mSC; 482e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson 49b574627ebc383d35cf8212ee241b191b26518a0dJason Monk private boolean mNoSimsVisible = false; 503128f12f216ef481b5d03892b35706cfeec26d7cJason Monk private boolean mVpnVisible = false; 5128f89d40ee7bab93cf7b783f92dbb18bdc43e473Daniel Sandler private boolean mWifiVisible = false; 52fcc901c10bffdfb9c6b31e676dec36b47d949979John Spurlock private int mWifiStrengthId = 0; 535ccff81a642844138b144ad2cc339eba188812a0Daniel Sandler private boolean mIsAirplaneMode = false; 54061d43c2386dd8222448bb1bec017bf9a2367a4eAndrew Flynn private int mAirplaneIconId = 0; 55d2263cd9db36d5f74a124c5ffaf8594ef702408fJason Monk private int mAirplaneContentDescription; 56b574627ebc383d35cf8212ee241b191b26518a0dJason Monk private String mWifiDescription; 57b574627ebc383d35cf8212ee241b191b26518a0dJason Monk private ArrayList<PhoneState> mPhoneStates = new ArrayList<PhoneState>(); 5828f89d40ee7bab93cf7b783f92dbb18bdc43e473Daniel Sandler 59b574627ebc383d35cf8212ee241b191b26518a0dJason Monk ViewGroup mWifiGroup; 60b574627ebc383d35cf8212ee241b191b26518a0dJason Monk ImageView mVpn, mWifi, mAirplane, mNoSims; 615172dc2f36f9c417befd0957ce2ae20f9d083a88Jorim Jaggi View mWifiAirplaneSpacer; 62c737b9bd5a0bc60fd92150d55f8ddb530697b987Jorim Jaggi View mWifiSignalSpacer; 63b574627ebc383d35cf8212ee241b191b26518a0dJason Monk LinearLayout mMobileSignalGroup; 64c737b9bd5a0bc60fd92150d55f8ddb530697b987Jorim Jaggi 65c737b9bd5a0bc60fd92150d55f8ddb530697b987Jorim Jaggi private int mWideTypeIconStartPadding; 66b574627ebc383d35cf8212ee241b191b26518a0dJason Monk private int mSecondaryTelephonyPadding; 676d035f15d5c8c67d97a4d5b6ed44f8cca0772e1fJorim Jaggi private int mEndPadding; 686d035f15d5c8c67d97a4d5b6ed44f8cca0772e1fJorim Jaggi private int mEndPaddingNothingVisible; 692e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson 702e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson public SignalClusterView(Context context) { 712e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson this(context, null); 722e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson } 732e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson 742e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson public SignalClusterView(Context context, AttributeSet attrs) { 752e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson this(context, attrs, 0); 762e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson } 772e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson 782e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson public SignalClusterView(Context context, AttributeSet attrs, int defStyle) { 792e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson super(context, attrs, defStyle); 802e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson } 812e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson 82af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock public void setNetworkController(NetworkControllerImpl nc) { 83cd686b5b6d4166b510df8e32138479a9559bc117John Spurlock if (DEBUG) Log.d(TAG, "NetworkController=" + nc); 842e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson mNC = nc; 852e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson } 862e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson 873128f12f216ef481b5d03892b35706cfeec26d7cJason Monk public void setSecurityController(SecurityController sc) { 883128f12f216ef481b5d03892b35706cfeec26d7cJason Monk if (DEBUG) Log.d(TAG, "SecurityController=" + sc); 893128f12f216ef481b5d03892b35706cfeec26d7cJason Monk mSC = sc; 903128f12f216ef481b5d03892b35706cfeec26d7cJason Monk mSC.addCallback(this); 913128f12f216ef481b5d03892b35706cfeec26d7cJason Monk mVpnVisible = mSC.isVpnEnabled(); 923128f12f216ef481b5d03892b35706cfeec26d7cJason Monk } 933128f12f216ef481b5d03892b35706cfeec26d7cJason Monk 942e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson @Override 95c737b9bd5a0bc60fd92150d55f8ddb530697b987Jorim Jaggi protected void onFinishInflate() { 96c737b9bd5a0bc60fd92150d55f8ddb530697b987Jorim Jaggi super.onFinishInflate(); 97c737b9bd5a0bc60fd92150d55f8ddb530697b987Jorim Jaggi mWideTypeIconStartPadding = getContext().getResources().getDimensionPixelSize( 98c737b9bd5a0bc60fd92150d55f8ddb530697b987Jorim Jaggi R.dimen.wide_type_icon_start_padding); 99b574627ebc383d35cf8212ee241b191b26518a0dJason Monk mSecondaryTelephonyPadding = getContext().getResources().getDimensionPixelSize( 100b574627ebc383d35cf8212ee241b191b26518a0dJason Monk R.dimen.secondary_telephony_padding); 1016d035f15d5c8c67d97a4d5b6ed44f8cca0772e1fJorim Jaggi mEndPadding = getContext().getResources().getDimensionPixelSize( 1026d035f15d5c8c67d97a4d5b6ed44f8cca0772e1fJorim Jaggi R.dimen.signal_cluster_battery_padding); 1036d035f15d5c8c67d97a4d5b6ed44f8cca0772e1fJorim Jaggi mEndPaddingNothingVisible = getContext().getResources().getDimensionPixelSize( 1046d035f15d5c8c67d97a4d5b6ed44f8cca0772e1fJorim Jaggi R.dimen.no_signal_cluster_battery_padding); 105c737b9bd5a0bc60fd92150d55f8ddb530697b987Jorim Jaggi } 106c737b9bd5a0bc60fd92150d55f8ddb530697b987Jorim Jaggi 107c737b9bd5a0bc60fd92150d55f8ddb530697b987Jorim Jaggi @Override 1082e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson protected void onAttachedToWindow() { 1092e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson super.onAttachedToWindow(); 1102e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson 1113128f12f216ef481b5d03892b35706cfeec26d7cJason Monk mVpn = (ImageView) findViewById(R.id.vpn); 1122e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson mWifiGroup = (ViewGroup) findViewById(R.id.wifi_combo); 1132e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson mWifi = (ImageView) findViewById(R.id.wifi_signal); 114061d43c2386dd8222448bb1bec017bf9a2367a4eAndrew Flynn mAirplane = (ImageView) findViewById(R.id.airplane); 115b574627ebc383d35cf8212ee241b191b26518a0dJason Monk mNoSims = (ImageView) findViewById(R.id.no_sims); 1165172dc2f36f9c417befd0957ce2ae20f9d083a88Jorim Jaggi mWifiAirplaneSpacer = findViewById(R.id.wifi_airplane_spacer); 117c737b9bd5a0bc60fd92150d55f8ddb530697b987Jorim Jaggi mWifiSignalSpacer = findViewById(R.id.wifi_signal_spacer); 118b574627ebc383d35cf8212ee241b191b26518a0dJason Monk mMobileSignalGroup = (LinearLayout) findViewById(R.id.mobile_signal_group); 119b574627ebc383d35cf8212ee241b191b26518a0dJason Monk for (PhoneState state : mPhoneStates) { 120b574627ebc383d35cf8212ee241b191b26518a0dJason Monk mMobileSignalGroup.addView(state.mMobileGroup); 121b574627ebc383d35cf8212ee241b191b26518a0dJason Monk } 12228f89d40ee7bab93cf7b783f92dbb18bdc43e473Daniel Sandler 12328f89d40ee7bab93cf7b783f92dbb18bdc43e473Daniel Sandler apply(); 1242e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson } 1252e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson 1262e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson @Override 1272e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson protected void onDetachedFromWindow() { 1283128f12f216ef481b5d03892b35706cfeec26d7cJason Monk mVpn = null; 12928f89d40ee7bab93cf7b783f92dbb18bdc43e473Daniel Sandler mWifiGroup = null; 13028f89d40ee7bab93cf7b783f92dbb18bdc43e473Daniel Sandler mWifi = null; 131061d43c2386dd8222448bb1bec017bf9a2367a4eAndrew Flynn mAirplane = null; 132b574627ebc383d35cf8212ee241b191b26518a0dJason Monk mMobileSignalGroup.removeAllViews(); 133b574627ebc383d35cf8212ee241b191b26518a0dJason Monk mMobileSignalGroup = null; 13428f89d40ee7bab93cf7b783f92dbb18bdc43e473Daniel Sandler 1352e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson super.onDetachedFromWindow(); 1362e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson } 1372e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson 1383128f12f216ef481b5d03892b35706cfeec26d7cJason Monk // From SecurityController. 1393128f12f216ef481b5d03892b35706cfeec26d7cJason Monk @Override 1403128f12f216ef481b5d03892b35706cfeec26d7cJason Monk public void onStateChanged() { 1413128f12f216ef481b5d03892b35706cfeec26d7cJason Monk post(new Runnable() { 1423128f12f216ef481b5d03892b35706cfeec26d7cJason Monk @Override 1433128f12f216ef481b5d03892b35706cfeec26d7cJason Monk public void run() { 1443128f12f216ef481b5d03892b35706cfeec26d7cJason Monk mVpnVisible = mSC.isVpnEnabled(); 1453128f12f216ef481b5d03892b35706cfeec26d7cJason Monk apply(); 1463128f12f216ef481b5d03892b35706cfeec26d7cJason Monk } 1473128f12f216ef481b5d03892b35706cfeec26d7cJason Monk }); 1483128f12f216ef481b5d03892b35706cfeec26d7cJason Monk } 1493128f12f216ef481b5d03892b35706cfeec26d7cJason Monk 150061d43c2386dd8222448bb1bec017bf9a2367a4eAndrew Flynn @Override 151b3eb89190c4bb4ebbe676328cd37830d50e6ed3eJohn Spurlock public void setWifiIndicators(boolean visible, int strengthIcon, String contentDescription) { 15228f89d40ee7bab93cf7b783f92dbb18bdc43e473Daniel Sandler mWifiVisible = visible; 15328f89d40ee7bab93cf7b783f92dbb18bdc43e473Daniel Sandler mWifiStrengthId = strengthIcon; 154bcf6ef0b82c1daea43e03b8ad5af319ed324242aDaniel Sandler mWifiDescription = contentDescription; 15528f89d40ee7bab93cf7b783f92dbb18bdc43e473Daniel Sandler 15628f89d40ee7bab93cf7b783f92dbb18bdc43e473Daniel Sandler apply(); 15728f89d40ee7bab93cf7b783f92dbb18bdc43e473Daniel Sandler } 15828f89d40ee7bab93cf7b783f92dbb18bdc43e473Daniel Sandler 159061d43c2386dd8222448bb1bec017bf9a2367a4eAndrew Flynn @Override 160b3eb89190c4bb4ebbe676328cd37830d50e6ed3eJohn Spurlock public void setMobileDataIndicators(boolean visible, int strengthIcon, int typeIcon, 161b574627ebc383d35cf8212ee241b191b26518a0dJason Monk String contentDescription, String typeContentDescription, boolean isTypeIconWide, 162b574627ebc383d35cf8212ee241b191b26518a0dJason Monk int subId) { 163b574627ebc383d35cf8212ee241b191b26518a0dJason Monk PhoneState state = getOrInflateState(subId); 164b574627ebc383d35cf8212ee241b191b26518a0dJason Monk state.mMobileVisible = visible; 165b574627ebc383d35cf8212ee241b191b26518a0dJason Monk state.mMobileStrengthId = strengthIcon; 166b574627ebc383d35cf8212ee241b191b26518a0dJason Monk state.mMobileTypeId = typeIcon; 167b574627ebc383d35cf8212ee241b191b26518a0dJason Monk state.mMobileDescription = contentDescription; 168b574627ebc383d35cf8212ee241b191b26518a0dJason Monk state.mMobileTypeDescription = typeContentDescription; 169b574627ebc383d35cf8212ee241b191b26518a0dJason Monk state.mIsMobileTypeIconWide = isTypeIconWide; 17028f89d40ee7bab93cf7b783f92dbb18bdc43e473Daniel Sandler 17128f89d40ee7bab93cf7b783f92dbb18bdc43e473Daniel Sandler apply(); 17228f89d40ee7bab93cf7b783f92dbb18bdc43e473Daniel Sandler } 17328f89d40ee7bab93cf7b783f92dbb18bdc43e473Daniel Sandler 174061d43c2386dd8222448bb1bec017bf9a2367a4eAndrew Flynn @Override 175b574627ebc383d35cf8212ee241b191b26518a0dJason Monk public void setNoSims(boolean show) { 176b574627ebc383d35cf8212ee241b191b26518a0dJason Monk mNoSimsVisible = show; 177b574627ebc383d35cf8212ee241b191b26518a0dJason Monk } 178b574627ebc383d35cf8212ee241b191b26518a0dJason Monk 179b574627ebc383d35cf8212ee241b191b26518a0dJason Monk @Override 180b574627ebc383d35cf8212ee241b191b26518a0dJason Monk public void setSubs(List<SubscriptionInfo> subs) { 181b574627ebc383d35cf8212ee241b191b26518a0dJason Monk // Clear out all old subIds. 182b574627ebc383d35cf8212ee241b191b26518a0dJason Monk mPhoneStates.clear(); 183b574627ebc383d35cf8212ee241b191b26518a0dJason Monk if (mMobileSignalGroup != null) { 184b574627ebc383d35cf8212ee241b191b26518a0dJason Monk mMobileSignalGroup.removeAllViews(); 185b574627ebc383d35cf8212ee241b191b26518a0dJason Monk } 186b574627ebc383d35cf8212ee241b191b26518a0dJason Monk final int n = subs.size(); 187b574627ebc383d35cf8212ee241b191b26518a0dJason Monk for (int i = 0; i < n; i++) { 188b574627ebc383d35cf8212ee241b191b26518a0dJason Monk inflatePhoneState(subs.get(i).getSubscriptionId()); 189b574627ebc383d35cf8212ee241b191b26518a0dJason Monk } 190b574627ebc383d35cf8212ee241b191b26518a0dJason Monk } 191b574627ebc383d35cf8212ee241b191b26518a0dJason Monk 192b574627ebc383d35cf8212ee241b191b26518a0dJason Monk private PhoneState getOrInflateState(int subId) { 193b574627ebc383d35cf8212ee241b191b26518a0dJason Monk for (PhoneState state : mPhoneStates) { 194b574627ebc383d35cf8212ee241b191b26518a0dJason Monk if (state.mSubId == subId) { 195b574627ebc383d35cf8212ee241b191b26518a0dJason Monk return state; 196b574627ebc383d35cf8212ee241b191b26518a0dJason Monk } 197b574627ebc383d35cf8212ee241b191b26518a0dJason Monk } 198b574627ebc383d35cf8212ee241b191b26518a0dJason Monk return inflatePhoneState(subId); 199b574627ebc383d35cf8212ee241b191b26518a0dJason Monk } 200b574627ebc383d35cf8212ee241b191b26518a0dJason Monk 201b574627ebc383d35cf8212ee241b191b26518a0dJason Monk private PhoneState inflatePhoneState(int subId) { 202b574627ebc383d35cf8212ee241b191b26518a0dJason Monk PhoneState state = new PhoneState(subId, mContext); 203b574627ebc383d35cf8212ee241b191b26518a0dJason Monk if (mMobileSignalGroup != null) { 204b574627ebc383d35cf8212ee241b191b26518a0dJason Monk mMobileSignalGroup.addView(state.mMobileGroup); 205b574627ebc383d35cf8212ee241b191b26518a0dJason Monk } 206b574627ebc383d35cf8212ee241b191b26518a0dJason Monk mPhoneStates.add(state); 207b574627ebc383d35cf8212ee241b191b26518a0dJason Monk return state; 208b574627ebc383d35cf8212ee241b191b26518a0dJason Monk } 209b574627ebc383d35cf8212ee241b191b26518a0dJason Monk 210b574627ebc383d35cf8212ee241b191b26518a0dJason Monk @Override 211d2263cd9db36d5f74a124c5ffaf8594ef702408fJason Monk public void setIsAirplaneMode(boolean is, int airplaneIconId, int contentDescription) { 2125ccff81a642844138b144ad2cc339eba188812a0Daniel Sandler mIsAirplaneMode = is; 213061d43c2386dd8222448bb1bec017bf9a2367a4eAndrew Flynn mAirplaneIconId = airplaneIconId; 214d2263cd9db36d5f74a124c5ffaf8594ef702408fJason Monk mAirplaneContentDescription = contentDescription; 215061d43c2386dd8222448bb1bec017bf9a2367a4eAndrew Flynn 216061d43c2386dd8222448bb1bec017bf9a2367a4eAndrew Flynn apply(); 2175ccff81a642844138b144ad2cc339eba188812a0Daniel Sandler } 2185ccff81a642844138b144ad2cc339eba188812a0Daniel Sandler 2192f7dfa7afdaada78c46bd6fd7e307656ba3dd66aJohn Spurlock @Override 2202f7dfa7afdaada78c46bd6fd7e307656ba3dd66aJohn Spurlock public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) { 2212f7dfa7afdaada78c46bd6fd7e307656ba3dd66aJohn Spurlock // Standard group layout onPopulateAccessibilityEvent() implementations 2222f7dfa7afdaada78c46bd6fd7e307656ba3dd66aJohn Spurlock // ignore content description, so populate manually 22324e028e0ec533cb7304296118a73bdc03870d10dDaniel Sandler if (mWifiVisible && mWifiGroup != null && mWifiGroup.getContentDescription() != null) 2242f7dfa7afdaada78c46bd6fd7e307656ba3dd66aJohn Spurlock event.getText().add(mWifiGroup.getContentDescription()); 225b574627ebc383d35cf8212ee241b191b26518a0dJason Monk for (PhoneState state : mPhoneStates) { 226b574627ebc383d35cf8212ee241b191b26518a0dJason Monk state.populateAccessibilityEvent(event); 227b574627ebc383d35cf8212ee241b191b26518a0dJason Monk } 2282f7dfa7afdaada78c46bd6fd7e307656ba3dd66aJohn Spurlock return super.dispatchPopulateAccessibilityEvent(event); 2292f7dfa7afdaada78c46bd6fd7e307656ba3dd66aJohn Spurlock } 2302f7dfa7afdaada78c46bd6fd7e307656ba3dd66aJohn Spurlock 2314662611f3757bd9210f252c095f2bef278fa2043Fabrice Di Meglio @Override 2324662611f3757bd9210f252c095f2bef278fa2043Fabrice Di Meglio public void onRtlPropertiesChanged(int layoutDirection) { 2334662611f3757bd9210f252c095f2bef278fa2043Fabrice Di Meglio super.onRtlPropertiesChanged(layoutDirection); 2344662611f3757bd9210f252c095f2bef278fa2043Fabrice Di Meglio 2354662611f3757bd9210f252c095f2bef278fa2043Fabrice Di Meglio if (mWifi != null) { 2364662611f3757bd9210f252c095f2bef278fa2043Fabrice Di Meglio mWifi.setImageDrawable(null); 2374662611f3757bd9210f252c095f2bef278fa2043Fabrice Di Meglio } 2384662611f3757bd9210f252c095f2bef278fa2043Fabrice Di Meglio 239b574627ebc383d35cf8212ee241b191b26518a0dJason Monk for (PhoneState state : mPhoneStates) { 240b574627ebc383d35cf8212ee241b191b26518a0dJason Monk if (state.mMobile != null) { 241b574627ebc383d35cf8212ee241b191b26518a0dJason Monk state.mMobile.setImageDrawable(null); 242b574627ebc383d35cf8212ee241b191b26518a0dJason Monk } 243b574627ebc383d35cf8212ee241b191b26518a0dJason Monk if (state.mMobileType != null) { 244b574627ebc383d35cf8212ee241b191b26518a0dJason Monk state.mMobileType.setImageDrawable(null); 245b574627ebc383d35cf8212ee241b191b26518a0dJason Monk } 2464662611f3757bd9210f252c095f2bef278fa2043Fabrice Di Meglio } 2474662611f3757bd9210f252c095f2bef278fa2043Fabrice Di Meglio 2484662611f3757bd9210f252c095f2bef278fa2043Fabrice Di Meglio if(mAirplane != null) { 2494662611f3757bd9210f252c095f2bef278fa2043Fabrice Di Meglio mAirplane.setImageDrawable(null); 2504662611f3757bd9210f252c095f2bef278fa2043Fabrice Di Meglio } 2514662611f3757bd9210f252c095f2bef278fa2043Fabrice Di Meglio 2524662611f3757bd9210f252c095f2bef278fa2043Fabrice Di Meglio apply(); 2534662611f3757bd9210f252c095f2bef278fa2043Fabrice Di Meglio } 2544662611f3757bd9210f252c095f2bef278fa2043Fabrice Di Meglio 2550d266899da8f612194a8393ec69c4fd870f2f45cJorim Jaggi @Override 2560d266899da8f612194a8393ec69c4fd870f2f45cJorim Jaggi public boolean hasOverlappingRendering() { 2570d266899da8f612194a8393ec69c4fd870f2f45cJorim Jaggi return false; 2580d266899da8f612194a8393ec69c4fd870f2f45cJorim Jaggi } 2590d266899da8f612194a8393ec69c4fd870f2f45cJorim Jaggi 26028f89d40ee7bab93cf7b783f92dbb18bdc43e473Daniel Sandler // Run after each indicator change. 26128f89d40ee7bab93cf7b783f92dbb18bdc43e473Daniel Sandler private void apply() { 2622e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson if (mWifiGroup == null) return; 2632e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson 2643128f12f216ef481b5d03892b35706cfeec26d7cJason Monk mVpn.setVisibility(mVpnVisible ? View.VISIBLE : View.GONE); 2653128f12f216ef481b5d03892b35706cfeec26d7cJason Monk if (DEBUG) Log.d(TAG, String.format("vpn: %s", mVpnVisible ? "VISIBLE" : "GONE")); 26628f89d40ee7bab93cf7b783f92dbb18bdc43e473Daniel Sandler if (mWifiVisible) { 26728f89d40ee7bab93cf7b783f92dbb18bdc43e473Daniel Sandler mWifi.setImageResource(mWifiStrengthId); 268bcf6ef0b82c1daea43e03b8ad5af319ed324242aDaniel Sandler mWifiGroup.setContentDescription(mWifiDescription); 269cda096ebf3fac67daf36e775547c2a337374927bFabrice Di Meglio mWifiGroup.setVisibility(View.VISIBLE); 2702e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson } else { 2712e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson mWifiGroup.setVisibility(View.GONE); 2722e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson } 2732e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson 274cd686b5b6d4166b510df8e32138479a9559bc117John Spurlock if (DEBUG) Log.d(TAG, 275fcc901c10bffdfb9c6b31e676dec36b47d949979John Spurlock String.format("wifi: %s sig=%d", 27628f89d40ee7bab93cf7b783f92dbb18bdc43e473Daniel Sandler (mWifiVisible ? "VISIBLE" : "GONE"), 277fcc901c10bffdfb9c6b31e676dec36b47d949979John Spurlock mWifiStrengthId)); 2782e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson 279b574627ebc383d35cf8212ee241b191b26518a0dJason Monk boolean anyMobileVisible = false; 280e912c9cc39807f95815400981ed27d121e8b293aDan Sandler int firstMobileTypeId = 0; 281b574627ebc383d35cf8212ee241b191b26518a0dJason Monk for (PhoneState state : mPhoneStates) { 282b574627ebc383d35cf8212ee241b191b26518a0dJason Monk if (state.apply(anyMobileVisible)) { 283e912c9cc39807f95815400981ed27d121e8b293aDan Sandler if (!anyMobileVisible) { 284e912c9cc39807f95815400981ed27d121e8b293aDan Sandler firstMobileTypeId = state.mMobileTypeId; 285e912c9cc39807f95815400981ed27d121e8b293aDan Sandler anyMobileVisible = true; 286e912c9cc39807f95815400981ed27d121e8b293aDan Sandler } 287b574627ebc383d35cf8212ee241b191b26518a0dJason Monk } 2882e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson } 28928f89d40ee7bab93cf7b783f92dbb18bdc43e473Daniel Sandler 290061d43c2386dd8222448bb1bec017bf9a2367a4eAndrew Flynn if (mIsAirplaneMode) { 291061d43c2386dd8222448bb1bec017bf9a2367a4eAndrew Flynn mAirplane.setImageResource(mAirplaneIconId); 292d2263cd9db36d5f74a124c5ffaf8594ef702408fJason Monk mAirplane.setContentDescription(mAirplaneContentDescription != 0 ? 293b574627ebc383d35cf8212ee241b191b26518a0dJason Monk mContext.getString(mAirplaneContentDescription) : null); 2948afcd149970c79054a3a16377834aa0aec35eee0Fabrice Di Meglio mAirplane.setVisibility(View.VISIBLE); 295061d43c2386dd8222448bb1bec017bf9a2367a4eAndrew Flynn } else { 296061d43c2386dd8222448bb1bec017bf9a2367a4eAndrew Flynn mAirplane.setVisibility(View.GONE); 297061d43c2386dd8222448bb1bec017bf9a2367a4eAndrew Flynn } 298061d43c2386dd8222448bb1bec017bf9a2367a4eAndrew Flynn 2995172dc2f36f9c417befd0957ce2ae20f9d083a88Jorim Jaggi if (mIsAirplaneMode && mWifiVisible) { 3005172dc2f36f9c417befd0957ce2ae20f9d083a88Jorim Jaggi mWifiAirplaneSpacer.setVisibility(View.VISIBLE); 3015ccff81a642844138b144ad2cc339eba188812a0Daniel Sandler } else { 3025172dc2f36f9c417befd0957ce2ae20f9d083a88Jorim Jaggi mWifiAirplaneSpacer.setVisibility(View.GONE); 3035ccff81a642844138b144ad2cc339eba188812a0Daniel Sandler } 3045ccff81a642844138b144ad2cc339eba188812a0Daniel Sandler 305e912c9cc39807f95815400981ed27d121e8b293aDan Sandler if (((anyMobileVisible && firstMobileTypeId != 0) || mNoSimsVisible) && mWifiVisible) { 306c737b9bd5a0bc60fd92150d55f8ddb530697b987Jorim Jaggi mWifiSignalSpacer.setVisibility(View.VISIBLE); 307c737b9bd5a0bc60fd92150d55f8ddb530697b987Jorim Jaggi } else { 308c737b9bd5a0bc60fd92150d55f8ddb530697b987Jorim Jaggi mWifiSignalSpacer.setVisibility(View.GONE); 309c737b9bd5a0bc60fd92150d55f8ddb530697b987Jorim Jaggi } 310c737b9bd5a0bc60fd92150d55f8ddb530697b987Jorim Jaggi 311b574627ebc383d35cf8212ee241b191b26518a0dJason Monk mNoSims.setVisibility(mNoSimsVisible ? View.VISIBLE : View.GONE); 312c737b9bd5a0bc60fd92150d55f8ddb530697b987Jorim Jaggi 313b574627ebc383d35cf8212ee241b191b26518a0dJason Monk boolean anythingVisible = mNoSimsVisible || mWifiVisible || mIsAirplaneMode 314b574627ebc383d35cf8212ee241b191b26518a0dJason Monk || anyMobileVisible || mVpnVisible; 315b574627ebc383d35cf8212ee241b191b26518a0dJason Monk setPaddingRelative(0, 0, anythingVisible ? mEndPadding : mEndPaddingNothingVisible, 0); 316b574627ebc383d35cf8212ee241b191b26518a0dJason Monk } 31728f89d40ee7bab93cf7b783f92dbb18bdc43e473Daniel Sandler 318b574627ebc383d35cf8212ee241b191b26518a0dJason Monk private class PhoneState { 319b574627ebc383d35cf8212ee241b191b26518a0dJason Monk private final int mSubId; 320b574627ebc383d35cf8212ee241b191b26518a0dJason Monk private boolean mMobileVisible = false; 321b574627ebc383d35cf8212ee241b191b26518a0dJason Monk private int mMobileStrengthId = 0, mMobileTypeId = 0; 322b574627ebc383d35cf8212ee241b191b26518a0dJason Monk private boolean mIsMobileTypeIconWide; 323b574627ebc383d35cf8212ee241b191b26518a0dJason Monk private String mMobileDescription, mMobileTypeDescription; 324b574627ebc383d35cf8212ee241b191b26518a0dJason Monk 325b574627ebc383d35cf8212ee241b191b26518a0dJason Monk private ViewGroup mMobileGroup; 326b574627ebc383d35cf8212ee241b191b26518a0dJason Monk private ImageView mMobile, mMobileType; 327b574627ebc383d35cf8212ee241b191b26518a0dJason Monk 328b574627ebc383d35cf8212ee241b191b26518a0dJason Monk public PhoneState(int subId, Context context) { 329b574627ebc383d35cf8212ee241b191b26518a0dJason Monk ViewGroup root = (ViewGroup) LayoutInflater.from(context) 330b574627ebc383d35cf8212ee241b191b26518a0dJason Monk .inflate(R.layout.mobile_signal_group, null); 331b574627ebc383d35cf8212ee241b191b26518a0dJason Monk setViews(root); 332b574627ebc383d35cf8212ee241b191b26518a0dJason Monk mSubId = subId; 333b574627ebc383d35cf8212ee241b191b26518a0dJason Monk } 3346d035f15d5c8c67d97a4d5b6ed44f8cca0772e1fJorim Jaggi 335b574627ebc383d35cf8212ee241b191b26518a0dJason Monk public void setViews(ViewGroup root) { 336b574627ebc383d35cf8212ee241b191b26518a0dJason Monk mMobileGroup = root; 337b574627ebc383d35cf8212ee241b191b26518a0dJason Monk mMobile = (ImageView) root.findViewById(R.id.mobile_signal); 338b574627ebc383d35cf8212ee241b191b26518a0dJason Monk mMobileType = (ImageView) root.findViewById(R.id.mobile_type); 339b574627ebc383d35cf8212ee241b191b26518a0dJason Monk } 340b574627ebc383d35cf8212ee241b191b26518a0dJason Monk 341b574627ebc383d35cf8212ee241b191b26518a0dJason Monk public boolean apply(boolean isSecondaryIcon) { 342b574627ebc383d35cf8212ee241b191b26518a0dJason Monk if (mMobileVisible && !mIsAirplaneMode) { 343b574627ebc383d35cf8212ee241b191b26518a0dJason Monk mMobile.setImageResource(mMobileStrengthId); 344b574627ebc383d35cf8212ee241b191b26518a0dJason Monk mMobileType.setImageResource(mMobileTypeId); 345b574627ebc383d35cf8212ee241b191b26518a0dJason Monk mMobileGroup.setContentDescription(mMobileTypeDescription 346b574627ebc383d35cf8212ee241b191b26518a0dJason Monk + " " + mMobileDescription); 347b574627ebc383d35cf8212ee241b191b26518a0dJason Monk mMobileGroup.setVisibility(View.VISIBLE); 348b574627ebc383d35cf8212ee241b191b26518a0dJason Monk } else { 349b574627ebc383d35cf8212ee241b191b26518a0dJason Monk mMobileGroup.setVisibility(View.GONE); 350b574627ebc383d35cf8212ee241b191b26518a0dJason Monk } 351b574627ebc383d35cf8212ee241b191b26518a0dJason Monk 352b574627ebc383d35cf8212ee241b191b26518a0dJason Monk // When this isn't next to wifi, give it some extra padding between the signals. 353b574627ebc383d35cf8212ee241b191b26518a0dJason Monk mMobileGroup.setPaddingRelative(isSecondaryIcon ? mSecondaryTelephonyPadding : 0, 354b574627ebc383d35cf8212ee241b191b26518a0dJason Monk 0, 0, 0); 355b574627ebc383d35cf8212ee241b191b26518a0dJason Monk mMobile.setPaddingRelative(mIsMobileTypeIconWide ? mWideTypeIconStartPadding : 0, 356b574627ebc383d35cf8212ee241b191b26518a0dJason Monk 0, 0, 0); 357b574627ebc383d35cf8212ee241b191b26518a0dJason Monk 358b574627ebc383d35cf8212ee241b191b26518a0dJason Monk if (DEBUG) Log.d(TAG, String.format("mobile: %s sig=%d typ=%d", 359b574627ebc383d35cf8212ee241b191b26518a0dJason Monk (mMobileVisible ? "VISIBLE" : "GONE"), mMobileStrengthId, mMobileTypeId)); 360b574627ebc383d35cf8212ee241b191b26518a0dJason Monk 361b574627ebc383d35cf8212ee241b191b26518a0dJason Monk mMobileType.setVisibility(mMobileTypeId != 0 ? View.VISIBLE : View.GONE); 362b574627ebc383d35cf8212ee241b191b26518a0dJason Monk 363b574627ebc383d35cf8212ee241b191b26518a0dJason Monk return mMobileVisible; 364b574627ebc383d35cf8212ee241b191b26518a0dJason Monk } 365b574627ebc383d35cf8212ee241b191b26518a0dJason Monk 366b574627ebc383d35cf8212ee241b191b26518a0dJason Monk public void populateAccessibilityEvent(AccessibilityEvent event) { 367b574627ebc383d35cf8212ee241b191b26518a0dJason Monk if (mMobileVisible && mMobileGroup != null 368b574627ebc383d35cf8212ee241b191b26518a0dJason Monk && mMobileGroup.getContentDescription() != null) { 369b574627ebc383d35cf8212ee241b191b26518a0dJason Monk event.getText().add(mMobileGroup.getContentDescription()); 370b574627ebc383d35cf8212ee241b191b26518a0dJason Monk } 371b574627ebc383d35cf8212ee241b191b26518a0dJason Monk } 3722e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson } 3732e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson} 3742e347429dfcd03b0827c7506ba6305ab0d1f4951Christian Robertson 375