diff options
| author | 2017-03-02 21:01:50 +0000 | |
|---|---|---|
| committer | 2017-03-02 21:01:53 +0000 | |
| commit | c231d5fd7266a2c92c87fb1bf77c68c07728bb3b (patch) | |
| tree | c4a72a8ccb198be3956b454a4c7aef2a049d981c | |
| parent | e9f0fe9274cce675e09a117e3593601b9424ea51 (diff) | |
| parent | 8996b94e575b6561fb5be507aecfadf2492bd321 (diff) | |
Merge "Fix emergency only edge case"
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<Integer, MobileSignalController> mMobileSignalControllers = - new HashMap<Integer, MobileSignalController>(); + final SparseArray<MobileSignalController> 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<Integer, MobileSignalController> cachedControllers = - new HashMap<Integer, MobileSignalController>(mMobileSignalControllers); + SparseArray<MobileSignalController> cachedControllers = + new SparseArray<MobileSignalController>(); + 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()) |