summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author TreeHugger Robot <treehugger-gerrit@google.com> 2017-03-02 21:01:50 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2017-03-02 21:01:53 +0000
commitc231d5fd7266a2c92c87fb1bf77c68c07728bb3b (patch)
treec4a72a8ccb198be3956b454a4c7aef2a049d981c
parente9f0fe9274cce675e09a117e3593601b9424ea51 (diff)
parent8996b94e575b6561fb5be507aecfadf2492bd321 (diff)
Merge "Fix emergency only edge case"
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java89
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerSignalTest.java16
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())