From 8996b94e575b6561fb5be507aecfadf2492bd321 Mon Sep 17 00:00:00 2001 From: Jason Monk Date: Thu, 2 Mar 2017 13:58:19 -0500 Subject: [PATCH] Fix emergency only edge case When the default sub id doesn't exist and there is only one other sub id currently, assume that is meant to be the default and use that to pull emergency state. Also switch to SparseArray for performance and betterness. Change-Id: I976de6abb58c46bce0c56793442c0377a39a7071 Fixes: 34119642 Test: runtest systemui --- .../statusbar/policy/NetworkControllerImpl.java | 89 +++++++++++++++------- .../policy/NetworkControllerSignalTest.java | 16 +++- 2 files changed, 72 insertions(+), 33 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java index 51d931e28720..bc3eec9795f7 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java @@ -39,6 +39,7 @@ import android.telephony.TelephonyManager; import android.text.TextUtils; import android.util.Log; import android.util.MathUtils; +import android.util.SparseArray; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.telephony.PhoneConstants; @@ -78,6 +79,7 @@ public class NetworkControllerImpl extends BroadcastReceiver private static final int EMERGENCY_FIRST_CONTROLLER = 100; private static final int EMERGENCY_VOICE_CONTROLLER = 200; private static final int EMERGENCY_NO_SUB = 300; + private static final int EMERGENCY_ASSUMED_VOICE_CONTROLLER = 400; private final Context mContext; private final TelephonyManager mPhone; @@ -99,8 +101,7 @@ public class NetworkControllerImpl extends BroadcastReceiver final EthernetSignalController mEthernetSignalController; @VisibleForTesting - final Map mMobileSignalControllers = - new HashMap(); + final SparseArray mMobileSignalControllers = new SparseArray<>(); // When no SIMs are around at setup, and one is added later, it seems to default to the first // SIM for most actions. This may be null if there aren't any SIMs around. private MobileSignalController mDefaultSignalController; @@ -232,7 +233,8 @@ public class NetworkControllerImpl extends BroadcastReceiver } private void registerListeners() { - for (MobileSignalController mobileSignalController : mMobileSignalControllers.values()) { + for (int i = 0; i < mMobileSignalControllers.size(); i++) { + MobileSignalController mobileSignalController = mMobileSignalControllers.valueAt(i); mobileSignalController.registerListener(); } if (mSubscriptionListener == null) { @@ -261,7 +263,8 @@ public class NetworkControllerImpl extends BroadcastReceiver private void unregisterListeners() { mListening = false; - for (MobileSignalController mobileSignalController : mMobileSignalControllers.values()) { + for (int i = 0; i < mMobileSignalControllers.size(); i++) { + MobileSignalController mobileSignalController = mMobileSignalControllers.valueAt(i); mobileSignalController.unregisterListener(); } mSubscriptionManager.removeOnSubscriptionsChangedListener(mSubscriptionListener); @@ -305,7 +308,7 @@ public class NetworkControllerImpl extends BroadcastReceiver if (DEBUG) Log.e(TAG, "No data sim selected"); return mDefaultSignalController; } - if (mMobileSignalControllers.containsKey(dataSubId)) { + if (mMobileSignalControllers.indexOfKey(dataSubId) >= 0) { return mMobileSignalControllers.get(dataSubId); } if (DEBUG) Log.e(TAG, "Cannot find controller for data sub: " + dataSubId); @@ -326,8 +329,8 @@ public class NetworkControllerImpl extends BroadcastReceiver } int voiceSubId = mSubDefaults.getDefaultVoiceSubId(); if (!SubscriptionManager.isValidSubscriptionId(voiceSubId)) { - for (MobileSignalController mobileSignalController : - mMobileSignalControllers.values()) { + for (int i = 0; i < mMobileSignalControllers.size(); i++) { + MobileSignalController mobileSignalController = mMobileSignalControllers.valueAt(i); if (!mobileSignalController.getState().isEmergency) { mEmergencySource = EMERGENCY_FIRST_CONTROLLER + mobileSignalController.mSubscriptionInfo.getSubscriptionId(); @@ -336,11 +339,20 @@ public class NetworkControllerImpl extends BroadcastReceiver } } } - if (mMobileSignalControllers.containsKey(voiceSubId)) { + if (mMobileSignalControllers.indexOfKey(voiceSubId) >= 0) { mEmergencySource = EMERGENCY_VOICE_CONTROLLER + voiceSubId; if (DEBUG) Log.d(TAG, "Getting emergency from " + voiceSubId); return mMobileSignalControllers.get(voiceSubId).getState().isEmergency; } + // If we have the wrong subId but there is only one sim anyway, assume it should be the + // default. + if (mMobileSignalControllers.size() == 1) { + mEmergencySource = EMERGENCY_ASSUMED_VOICE_CONTROLLER + + mMobileSignalControllers.keyAt(0); + if (DEBUG) Log.d(TAG, "Getting assumed emergency from " + + mMobileSignalControllers.keyAt(0)); + return mMobileSignalControllers.valueAt(0).getState().isEmergency; + } if (DEBUG) Log.e(TAG, "Cannot find controller for voice sub: " + voiceSubId); mEmergencySource = EMERGENCY_NO_SUB + voiceSubId; // Something is wrong, better assume we can't make calls... @@ -363,7 +375,8 @@ public class NetworkControllerImpl extends BroadcastReceiver cb.setNoSims(mHasNoSims); mWifiSignalController.notifyListeners(cb); mEthernetSignalController.notifyListeners(cb); - for (MobileSignalController mobileSignalController : mMobileSignalControllers.values()) { + for (int i = 0; i < mMobileSignalControllers.size(); i++) { + MobileSignalController mobileSignalController = mMobileSignalControllers.valueAt(i); mobileSignalController.notifyListeners(cb); } mCallbackHandler.setListening(cb, true); @@ -416,7 +429,8 @@ public class NetworkControllerImpl extends BroadcastReceiver } else if (action.equals(TelephonyIntents.ACTION_DEFAULT_DATA_SUBSCRIPTION_CHANGED)) { // Notify every MobileSignalController so they can know whether they are the // data sim or not. - for (MobileSignalController controller : mMobileSignalControllers.values()) { + for (int i = 0; i < mMobileSignalControllers.size(); i++) { + MobileSignalController controller = mMobileSignalControllers.valueAt(i); controller.handleBroadcast(intent); } } else if (action.equals(TelephonyIntents.ACTION_SIM_STATE_CHANGED)) { @@ -433,7 +447,7 @@ public class NetworkControllerImpl extends BroadcastReceiver int subId = intent.getIntExtra(PhoneConstants.SUBSCRIPTION_KEY, SubscriptionManager.INVALID_SUBSCRIPTION_ID); if (SubscriptionManager.isValidSubscriptionId(subId)) { - if (mMobileSignalControllers.containsKey(subId)) { + if (mMobileSignalControllers.indexOfKey(subId) >= 0) { mMobileSignalControllers.get(subId).handleBroadcast(intent); } else { // Can't find this subscription... We must be out of date. @@ -458,8 +472,9 @@ public class NetworkControllerImpl extends BroadcastReceiver @VisibleForTesting void handleConfigurationChanged() { - for (MobileSignalController mobileSignalController : mMobileSignalControllers.values()) { - mobileSignalController.setConfiguration(mConfig); + for (int i = 0; i < mMobileSignalControllers.size(); i++) { + MobileSignalController controller = mMobileSignalControllers.valueAt(i); + controller.setConfiguration(mConfig); } refreshLocale(); } @@ -511,15 +526,20 @@ public class NetworkControllerImpl extends BroadcastReceiver }); mCurrentSubscriptions = subscriptions; - HashMap cachedControllers = - new HashMap(mMobileSignalControllers); + SparseArray cachedControllers = + new SparseArray(); + for (int i = 0; i < mMobileSignalControllers.size(); i++) { + cachedControllers.put(mMobileSignalControllers.keyAt(i), + mMobileSignalControllers.valueAt(i)); + } mMobileSignalControllers.clear(); final int num = subscriptions.size(); for (int i = 0; i < num; i++) { int subId = subscriptions.get(i).getSubscriptionId(); // If we have a copy of this controller already reuse it, otherwise make a new one. - if (cachedControllers.containsKey(subId)) { - mMobileSignalControllers.put(subId, cachedControllers.remove(subId)); + if (cachedControllers.indexOfKey(subId) >= 0) { + mMobileSignalControllers.put(subId, cachedControllers.get(subId)); + cachedControllers.remove(subId); } else { MobileSignalController controller = new MobileSignalController(mContext, mConfig, mHasMobileDataFeature, mPhone, mCallbackHandler, @@ -535,7 +555,8 @@ public class NetworkControllerImpl extends BroadcastReceiver } } if (mListening) { - for (Integer key : cachedControllers.keySet()) { + for (int i = 0; i < cachedControllers.size(); i++) { + int key = cachedControllers.keyAt(i); if (cachedControllers.get(key) == mDefaultSignalController) { mDefaultSignalController = null; } @@ -557,7 +578,8 @@ public class NetworkControllerImpl extends BroadcastReceiver private void handleSetUserSetupComplete(boolean userSetup) { mUserSetup = userSetup; - for (MobileSignalController controller : mMobileSignalControllers.values()) { + for (int i = 0; i < mMobileSignalControllers.size(); i++) { + MobileSignalController controller = mMobileSignalControllers.valueAt(i); controller.setUserSetupComplete(mUserSetup); } } @@ -568,7 +590,7 @@ public class NetworkControllerImpl extends BroadcastReceiver return false; } for (SubscriptionInfo info : allSubscriptions) { - if (!mMobileSignalControllers.containsKey(info.getSubscriptionId())) { + if (mMobileSignalControllers.indexOfKey(info.getSubscriptionId()) < 0) { return false; } } @@ -580,7 +602,8 @@ public class NetworkControllerImpl extends BroadcastReceiver Settings.Global.AIRPLANE_MODE_ON, 0) == 1); if (airplaneMode != mAirplaneMode || force) { mAirplaneMode = airplaneMode; - for (MobileSignalController mobileSignalController : mMobileSignalControllers.values()) { + for (int i = 0; i < mMobileSignalControllers.size(); i++) { + MobileSignalController mobileSignalController = mMobileSignalControllers.valueAt(i); mobileSignalController.setAirplaneMode(mAirplaneMode); } notifyListeners(); @@ -601,7 +624,8 @@ public class NetworkControllerImpl extends BroadcastReceiver */ private void notifyAllListeners() { notifyListeners(); - for (MobileSignalController mobileSignalController : mMobileSignalControllers.values()) { + for (int i = 0; i < mMobileSignalControllers.size(); i++) { + MobileSignalController mobileSignalController = mMobileSignalControllers.valueAt(i); mobileSignalController.notifyListeners(); } mWifiSignalController.notifyListeners(); @@ -650,7 +674,8 @@ public class NetworkControllerImpl extends BroadcastReceiver */ private void pushConnectivityToSignals() { // We want to update all the icons, all at once, for any condition change - for (MobileSignalController mobileSignalController : mMobileSignalControllers.values()) { + for (int i = 0; i < mMobileSignalControllers.size(); i++) { + MobileSignalController mobileSignalController = mMobileSignalControllers.valueAt(i); mobileSignalController.updateConnectivity(mConnectedTransports, mValidatedTransports); } mWifiSignalController.updateConnectivity(mConnectedTransports, mValidatedTransports); @@ -682,7 +707,8 @@ public class NetworkControllerImpl extends BroadcastReceiver pw.print(" mEmergencySource="); pw.println(emergencyToString(mEmergencySource)); - for (MobileSignalController mobileSignalController : mMobileSignalControllers.values()) { + for (int i = 0; i < mMobileSignalControllers.size(); i++) { + MobileSignalController mobileSignalController = mMobileSignalControllers.valueAt(i); mobileSignalController.dump(pw); } mWifiSignalController.dump(pw); @@ -694,6 +720,9 @@ public class NetworkControllerImpl extends BroadcastReceiver private static final String emergencyToString(int emergencySource) { if (emergencySource > EMERGENCY_NO_SUB) { + return "ASSUMED_VOICE_CONTROLLER(" + (emergencySource - EMERGENCY_VOICE_CONTROLLER) + + ")"; + } else if (emergencySource > EMERGENCY_NO_SUB) { return "NO_SUB(" + (emergencySource - EMERGENCY_NO_SUB) + ")"; } else if (emergencySource > EMERGENCY_VOICE_CONTROLLER) { return "VOICE_CONTROLLER(" + (emergencySource - EMERGENCY_VOICE_CONTROLLER) + ")"; @@ -724,7 +753,8 @@ public class NetworkControllerImpl extends BroadcastReceiver // Update what MobileSignalControllers, because they may change // to set the number of sim slots. updateMobileControllers(); - for (MobileSignalController controller : mMobileSignalControllers.values()) { + for (int i = 0; i < mMobileSignalControllers.size(); i++) { + MobileSignalController controller = mMobileSignalControllers.valueAt(i); controller.resetLastState(); } mWifiSignalController.resetLastState(); @@ -747,7 +777,8 @@ public class NetworkControllerImpl extends BroadcastReceiver connected.set(mWifiSignalController.mTransportType); } mWifiSignalController.updateConnectivity(connected, connected); - for (MobileSignalController controller : mMobileSignalControllers.values()) { + for (int i = 0; i < mMobileSignalControllers.size(); i++) { + MobileSignalController controller = mMobileSignalControllers.valueAt(i); if (mDemoInetCondition) { connected.set(controller.mTransportType); } @@ -820,8 +851,7 @@ public class NetworkControllerImpl extends BroadcastReceiver mCallbackHandler.setSubs(subs); } // Hack to index linearly for easy use. - MobileSignalController controller = mMobileSignalControllers - .values().toArray(new MobileSignalController[0])[slot]; + MobileSignalController controller = mMobileSignalControllers.valueAt(slot); controller.getState().dataSim = datatype != null; controller.getState().isDefault = datatype != null; controller.getState().dataConnected = datatype != null; @@ -875,7 +905,8 @@ public class NetworkControllerImpl extends BroadcastReceiver String carrierNetworkChange = args.getString("carriernetworkchange"); if (carrierNetworkChange != null) { boolean show = carrierNetworkChange.equals("show"); - for (MobileSignalController controller : mMobileSignalControllers.values()) { + for (int i = 0; i < mMobileSignalControllers.size(); i++) { + MobileSignalController controller = mMobileSignalControllers.valueAt(i); controller.setCarrierNetworkChangeMode(show); } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerSignalTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerSignalTest.java index 2c0f9c93d353..1555856c1875 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerSignalTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerSignalTest.java @@ -94,6 +94,14 @@ public class NetworkControllerSignalTest extends NetworkControllerBaseTest { } @Test + public void testNoEmergencyOnlyWrongSubscription() { + setupDefaultSignal(); + setDefaultSubId(42); + mNetworkController.recalculateEmergency(); + verifyEmergencyOnly(false); + } + + @Test public void testNoEmengencyNoSubscriptions() { setupDefaultSignal(); setSubscriptions(); @@ -286,12 +294,12 @@ public class NetworkControllerSignalTest extends NetworkControllerBaseTest { for (int i = 0; i < testSubscriptions.length; i++) { if (i == indexToSkipController) { // Make sure a controller was created despite us not adding one. - assertTrue(mNetworkController.mMobileSignalControllers.containsKey( - testSubscriptions[i])); + assertTrue(mNetworkController.mMobileSignalControllers.indexOfKey( + testSubscriptions[i]) >= 0); } else if (i == indexToSkipSubscription) { // Make sure the controller that did exist was removed - assertFalse(mNetworkController.mMobileSignalControllers.containsKey( - testSubscriptions[i])); + assertFalse(mNetworkController.mMobileSignalControllers.indexOfKey( + testSubscriptions[i]) >= 0); } else { // If a MobileSignalController is around it needs to not be unregistered. Mockito.verify(mobileSignalControllers[i], Mockito.never()) -- 2.11.0