Merge "Fix emergency only edge case"
This commit is contained in:
committed by
Android (Google) Code Review
commit
c231d5fd72
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -93,6 +93,14 @@ public class NetworkControllerSignalTest extends NetworkControllerBaseTest {
|
||||
verifyEmergencyOnly(true);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testNoEmergencyOnlyWrongSubscription() {
|
||||
setupDefaultSignal();
|
||||
setDefaultSubId(42);
|
||||
mNetworkController.recalculateEmergency();
|
||||
verifyEmergencyOnly(false);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testNoEmengencyNoSubscriptions() {
|
||||
setupDefaultSignal();
|
||||
@@ -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())
|
||||
|
||||
Reference in New Issue
Block a user