Loading src/java/com/android/internal/telephony/PhoneConfigurationModels.java +1 −1 Original line number Diff line number Diff line Loading @@ -40,7 +40,7 @@ class PhoneConfigurationModels { List<ModemInfo> logicalModemList = new ArrayList<>(); logicalModemList.add(modemInfo1); logicalModemList.add(modemInfo2); DSDS_CAPABILITY = new PhoneCapability(1, 2, 0, logicalModemList, false); DSDS_CAPABILITY = new PhoneCapability(1, 2, 0, logicalModemList, true); logicalModemList = new ArrayList<>(); logicalModemList.add(modemInfo1); Loading src/java/com/android/internal/telephony/PhoneSwitcher.java +70 −23 Original line number Diff line number Diff line Loading @@ -22,6 +22,9 @@ import static android.telephony.PhoneStateListener.LISTEN_PRECISE_CALL_STATE; import static android.telephony.SubscriptionManager.DEFAULT_SUBSCRIPTION_ID; import static android.telephony.SubscriptionManager.INVALID_PHONE_INDEX; import static android.telephony.SubscriptionManager.INVALID_SUBSCRIPTION_ID; import static android.telephony.TelephonyManager.SET_OPPORTUNISTIC_SUB_INVALID_PARAMETER; import static android.telephony.TelephonyManager.SET_OPPORTUNISTIC_SUB_SUCCESS; import static android.telephony.TelephonyManager.SET_OPPORTUNISTIC_SUB_VALIDATION_FAILED; import android.content.BroadcastReceiver; import android.content.Context; Loading Loading @@ -113,13 +116,15 @@ public class PhoneSwitcher extends Handler { private int mPhoneIdInCall = SubscriptionManager.INVALID_PHONE_INDEX; private ISetOpportunisticDataCallback mSetOpptSubCallback; private static final int EVENT_DEFAULT_SUBSCRIPTION_CHANGED = 101; private static final int EVENT_SUBSCRIPTION_CHANGED = 102; private static final int EVENT_REQUEST_NETWORK = 103; private static final int EVENT_RELEASE_NETWORK = 104; private static final int EVENT_EMERGENCY_TOGGLE = 105; private static final int EVENT_RADIO_CAPABILITY_CHANGED = 106; private static final int EVENT_PREFERRED_SUBSCRIPTION_CHANGED = 107; private static final int EVENT_CHANGE_PREFERRED_SUBSCRIPTION = 107; private static final int EVENT_RADIO_AVAILABLE = 108; private static final int EVENT_PHONE_IN_CALL_CHANGED = 109; private static final int EVENT_NETWORK_VALIDATION_DONE = 110; Loading Loading @@ -349,9 +354,16 @@ public class PhoneSwitcher extends Handler { resendRilCommands(msg); break; } case EVENT_PREFERRED_SUBSCRIPTION_CHANGED: { onEvaluate(REQUESTS_UNCHANGED, "preferredDataSubscriptionIdChanged"); registerDefaultNetworkChangeCallback(); case EVENT_CHANGE_PREFERRED_SUBSCRIPTION: { int subId = msg.arg1; boolean needValidation = (msg.arg2 == 1); ISetOpportunisticDataCallback callback = (ISetOpportunisticDataCallback) msg.obj; if (SubscriptionManager.isUsableSubscriptionId(subId)) { setOpportunisticDataSubscription(subId, needValidation, callback); } else { unsetOpportunisticDataSubscription(callback); } break; } case EVENT_RADIO_AVAILABLE: { Loading Loading @@ -779,20 +791,34 @@ public class PhoneSwitcher extends Handler { * subscription. It has to be an active subscription, and PhoneSwitcher will try to validate * it first if needed. */ public void setOpportunisticDataSubscription(int subId) { private void setOpportunisticDataSubscription(int subId, boolean needValidation, ISetOpportunisticDataCallback callback) { if (!mSubscriptionController.isActiveSubId(subId)) { log("Can't switch data to inactive subId " + subId); sendSetOpptCallbackHelper(callback, SET_OPPORTUNISTIC_SUB_INVALID_PARAMETER); return; } if (mValidator.isValidating() && (!needValidation || subId != mValidator.getSubIdInValidation())) { mValidator.stopValidation(); } if (subId == mPreferredDataSubId) { sendSetOpptCallbackHelper(callback, SET_OPPORTUNISTIC_SUB_SUCCESS); return; } logDataSwitchEvent(TelephonyEvent.EventState.START, DataSwitch.Reason.CBRS); // If validation feature is not supported, set it directly. Otherwise, // start validation on the subscription first. if (!CellularNetworkValidator.isValidationFeatureSupported()) { setPreferredDataSubscriptionId(subId); } else { if (CellularNetworkValidator.isValidationFeatureSupported() && needValidation) { logDataSwitchEvent(TelephonyEvent.EventState.START, DataSwitch.Reason.CBRS); mSetOpptSubCallback = callback; mValidator.validate(subId, DEFAULT_VALIDATION_EXPIRATION_TIME, false, mValidationCallback); } else { setPreferredSubscription(subId); sendSetOpptCallbackHelper(callback, SET_OPPORTUNISTIC_SUB_SUCCESS); } } Loading @@ -800,33 +826,54 @@ public class PhoneSwitcher extends Handler { * Unset opportunistic data subscription. It's an indication to switch Internet data back * from opportunistic subscription to primary subscription. */ public void unsetOpportunisticDataSubscription() { logDataSwitchEvent(TelephonyEvent.EventState.START, DataSwitch.Reason.CBRS); if (CellularNetworkValidator.isValidationFeatureSupported() && mValidator.isValidating()) { private void unsetOpportunisticDataSubscription(ISetOpportunisticDataCallback callback) { if (mValidator.isValidating()) { mValidator.stopValidation(); } // Set mPreferredDataSubId back to DEFAULT_SUBSCRIPTION_ID. This will trigger // data switch to mDefaultDataSubId. setPreferredDataSubscriptionId(SubscriptionManager.DEFAULT_SUBSCRIPTION_ID); setPreferredSubscription(SubscriptionManager.DEFAULT_SUBSCRIPTION_ID); sendSetOpptCallbackHelper(callback, SET_OPPORTUNISTIC_SUB_SUCCESS); } private void sendSetOpptCallbackHelper(ISetOpportunisticDataCallback callback, int result) { if (callback == null) return; try { callback.onComplete(result); } catch (RemoteException exception) { log("RemoteException " + exception); } } /** * Set opportunistic data subscription. */ private void setPreferredSubscription(int subId) { if (mPreferredDataSubId != subId) { mPreferredDataSubId = subId; logDataSwitchEvent(TelephonyEvent.EventState.START, DataSwitch.Reason.CBRS); onEvaluate(REQUESTS_UNCHANGED, "preferredDataSubscriptionIdChanged"); registerDefaultNetworkChangeCallback(); } } private void onValidationDone(int subId, boolean passed) { log("Network validation " + (passed ? "passed" : "failed") + " on subId " + subId); mValidator.stopValidation(); if (passed) setPreferredDataSubscriptionId(subId); if (passed) setPreferredSubscription(subId); // Trigger callback if needed sendSetOpptCallbackHelper(mSetOpptSubCallback, passed ? SET_OPPORTUNISTIC_SUB_SUCCESS : SET_OPPORTUNISTIC_SUB_VALIDATION_FAILED); mSetOpptSubCallback = null; } // TODO b/123598154: rename preferredDataSub to opportunisticSubId. private void setPreferredDataSubscriptionId(int subId) { if (mPreferredDataSubId != subId) { log("setPreferredDataSubscriptionId subId changed to " + subId); mPreferredDataSubId = subId; Message msg = PhoneSwitcher.this.obtainMessage(EVENT_PREFERRED_SUBSCRIPTION_CHANGED); msg.sendToTarget(); } public void trySetPreferredSubscription(int subId, boolean needValidation, ISetOpportunisticDataCallback callback) { PhoneSwitcher.this.obtainMessage(EVENT_CHANGE_PREFERRED_SUBSCRIPTION, subId, needValidation ? 1 : 0, callback).sendToTarget(); } private boolean isCallActive(Phone phone) { Loading src/java/com/android/internal/telephony/SubscriptionController.java +4 −6 Original line number Diff line number Diff line Loading @@ -2690,16 +2690,14 @@ public class SubscriptionController extends ISub.Stub { } @Override public void setPreferredDataSubscriptionId(int subId) { public void setPreferredDataSubscriptionId(int subId, boolean needValidation, ISetOpportunisticDataCallback callback) { enforceModifyPhoneState("setPreferredDataSubscriptionId"); final long token = Binder.clearCallingIdentity(); try { if (SubscriptionManager.isUsableSubscriptionId(subId)) { PhoneSwitcher.getInstance().setOpportunisticDataSubscription(subId); } else { PhoneSwitcher.getInstance().unsetOpportunisticDataSubscription(); } PhoneSwitcher.getInstance().trySetPreferredSubscription( subId, needValidation, callback); } finally { Binder.restoreCallingIdentity(token); } Loading tests/telephonytests/src/com/android/internal/telephony/PhoneSwitcherTest.java +6 −4 Original line number Diff line number Diff line Loading @@ -386,13 +386,14 @@ public class PhoneSwitcherTest extends TelephonyTest { assertTrue(mDataAllowed[0]); // Set sub 2 as preferred sub should make phone 1 activated and phone 0 deactivated. mPhoneSwitcher.setOpportunisticDataSubscription(2); mPhoneSwitcher.trySetPreferredSubscription(2, false, null); waitABit(); assertFalse(mDataAllowed[0]); assertTrue(mDataAllowed[1]); // Unset preferred sub should make default data sub (phone 0 / sub 1) activated again. mPhoneSwitcher.unsetOpportunisticDataSubscription(); mPhoneSwitcher.trySetPreferredSubscription(SubscriptionManager.DEFAULT_SUBSCRIPTION_ID, false, null); waitABit(); assertTrue(mDataAllowed[0]); assertFalse(mDataAllowed[1]); Loading Loading @@ -441,7 +442,7 @@ public class PhoneSwitcherTest extends TelephonyTest { assertTrue(mPhoneSwitcher.shouldApplyNetworkRequest(mmsRequest, 1)); // Set sub 2 as preferred sub should make phone 1 preferredDataModem mPhoneSwitcher.setOpportunisticDataSubscription(2); mPhoneSwitcher.trySetPreferredSubscription(2, false, null); waitABit(); verify(mMockRadioConfig).setPreferredDataModem(eq(1), any()); verify(mActivePhoneSwitchHandler, times(2)).sendMessageAtTime(any(), anyLong()); Loading @@ -454,7 +455,8 @@ public class PhoneSwitcherTest extends TelephonyTest { clearInvocations(mActivePhoneSwitchHandler); // Unset preferred sub should make phone0 preferredDataModem again. mPhoneSwitcher.unsetOpportunisticDataSubscription(); mPhoneSwitcher.trySetPreferredSubscription(SubscriptionManager.DEFAULT_SUBSCRIPTION_ID, false, null); waitABit(); verify(mMockRadioConfig).setPreferredDataModem(eq(0), any()); verify(mActivePhoneSwitchHandler, times(2)).sendMessageAtTime(any(), anyLong()); Loading Loading
src/java/com/android/internal/telephony/PhoneConfigurationModels.java +1 −1 Original line number Diff line number Diff line Loading @@ -40,7 +40,7 @@ class PhoneConfigurationModels { List<ModemInfo> logicalModemList = new ArrayList<>(); logicalModemList.add(modemInfo1); logicalModemList.add(modemInfo2); DSDS_CAPABILITY = new PhoneCapability(1, 2, 0, logicalModemList, false); DSDS_CAPABILITY = new PhoneCapability(1, 2, 0, logicalModemList, true); logicalModemList = new ArrayList<>(); logicalModemList.add(modemInfo1); Loading
src/java/com/android/internal/telephony/PhoneSwitcher.java +70 −23 Original line number Diff line number Diff line Loading @@ -22,6 +22,9 @@ import static android.telephony.PhoneStateListener.LISTEN_PRECISE_CALL_STATE; import static android.telephony.SubscriptionManager.DEFAULT_SUBSCRIPTION_ID; import static android.telephony.SubscriptionManager.INVALID_PHONE_INDEX; import static android.telephony.SubscriptionManager.INVALID_SUBSCRIPTION_ID; import static android.telephony.TelephonyManager.SET_OPPORTUNISTIC_SUB_INVALID_PARAMETER; import static android.telephony.TelephonyManager.SET_OPPORTUNISTIC_SUB_SUCCESS; import static android.telephony.TelephonyManager.SET_OPPORTUNISTIC_SUB_VALIDATION_FAILED; import android.content.BroadcastReceiver; import android.content.Context; Loading Loading @@ -113,13 +116,15 @@ public class PhoneSwitcher extends Handler { private int mPhoneIdInCall = SubscriptionManager.INVALID_PHONE_INDEX; private ISetOpportunisticDataCallback mSetOpptSubCallback; private static final int EVENT_DEFAULT_SUBSCRIPTION_CHANGED = 101; private static final int EVENT_SUBSCRIPTION_CHANGED = 102; private static final int EVENT_REQUEST_NETWORK = 103; private static final int EVENT_RELEASE_NETWORK = 104; private static final int EVENT_EMERGENCY_TOGGLE = 105; private static final int EVENT_RADIO_CAPABILITY_CHANGED = 106; private static final int EVENT_PREFERRED_SUBSCRIPTION_CHANGED = 107; private static final int EVENT_CHANGE_PREFERRED_SUBSCRIPTION = 107; private static final int EVENT_RADIO_AVAILABLE = 108; private static final int EVENT_PHONE_IN_CALL_CHANGED = 109; private static final int EVENT_NETWORK_VALIDATION_DONE = 110; Loading Loading @@ -349,9 +354,16 @@ public class PhoneSwitcher extends Handler { resendRilCommands(msg); break; } case EVENT_PREFERRED_SUBSCRIPTION_CHANGED: { onEvaluate(REQUESTS_UNCHANGED, "preferredDataSubscriptionIdChanged"); registerDefaultNetworkChangeCallback(); case EVENT_CHANGE_PREFERRED_SUBSCRIPTION: { int subId = msg.arg1; boolean needValidation = (msg.arg2 == 1); ISetOpportunisticDataCallback callback = (ISetOpportunisticDataCallback) msg.obj; if (SubscriptionManager.isUsableSubscriptionId(subId)) { setOpportunisticDataSubscription(subId, needValidation, callback); } else { unsetOpportunisticDataSubscription(callback); } break; } case EVENT_RADIO_AVAILABLE: { Loading Loading @@ -779,20 +791,34 @@ public class PhoneSwitcher extends Handler { * subscription. It has to be an active subscription, and PhoneSwitcher will try to validate * it first if needed. */ public void setOpportunisticDataSubscription(int subId) { private void setOpportunisticDataSubscription(int subId, boolean needValidation, ISetOpportunisticDataCallback callback) { if (!mSubscriptionController.isActiveSubId(subId)) { log("Can't switch data to inactive subId " + subId); sendSetOpptCallbackHelper(callback, SET_OPPORTUNISTIC_SUB_INVALID_PARAMETER); return; } if (mValidator.isValidating() && (!needValidation || subId != mValidator.getSubIdInValidation())) { mValidator.stopValidation(); } if (subId == mPreferredDataSubId) { sendSetOpptCallbackHelper(callback, SET_OPPORTUNISTIC_SUB_SUCCESS); return; } logDataSwitchEvent(TelephonyEvent.EventState.START, DataSwitch.Reason.CBRS); // If validation feature is not supported, set it directly. Otherwise, // start validation on the subscription first. if (!CellularNetworkValidator.isValidationFeatureSupported()) { setPreferredDataSubscriptionId(subId); } else { if (CellularNetworkValidator.isValidationFeatureSupported() && needValidation) { logDataSwitchEvent(TelephonyEvent.EventState.START, DataSwitch.Reason.CBRS); mSetOpptSubCallback = callback; mValidator.validate(subId, DEFAULT_VALIDATION_EXPIRATION_TIME, false, mValidationCallback); } else { setPreferredSubscription(subId); sendSetOpptCallbackHelper(callback, SET_OPPORTUNISTIC_SUB_SUCCESS); } } Loading @@ -800,33 +826,54 @@ public class PhoneSwitcher extends Handler { * Unset opportunistic data subscription. It's an indication to switch Internet data back * from opportunistic subscription to primary subscription. */ public void unsetOpportunisticDataSubscription() { logDataSwitchEvent(TelephonyEvent.EventState.START, DataSwitch.Reason.CBRS); if (CellularNetworkValidator.isValidationFeatureSupported() && mValidator.isValidating()) { private void unsetOpportunisticDataSubscription(ISetOpportunisticDataCallback callback) { if (mValidator.isValidating()) { mValidator.stopValidation(); } // Set mPreferredDataSubId back to DEFAULT_SUBSCRIPTION_ID. This will trigger // data switch to mDefaultDataSubId. setPreferredDataSubscriptionId(SubscriptionManager.DEFAULT_SUBSCRIPTION_ID); setPreferredSubscription(SubscriptionManager.DEFAULT_SUBSCRIPTION_ID); sendSetOpptCallbackHelper(callback, SET_OPPORTUNISTIC_SUB_SUCCESS); } private void sendSetOpptCallbackHelper(ISetOpportunisticDataCallback callback, int result) { if (callback == null) return; try { callback.onComplete(result); } catch (RemoteException exception) { log("RemoteException " + exception); } } /** * Set opportunistic data subscription. */ private void setPreferredSubscription(int subId) { if (mPreferredDataSubId != subId) { mPreferredDataSubId = subId; logDataSwitchEvent(TelephonyEvent.EventState.START, DataSwitch.Reason.CBRS); onEvaluate(REQUESTS_UNCHANGED, "preferredDataSubscriptionIdChanged"); registerDefaultNetworkChangeCallback(); } } private void onValidationDone(int subId, boolean passed) { log("Network validation " + (passed ? "passed" : "failed") + " on subId " + subId); mValidator.stopValidation(); if (passed) setPreferredDataSubscriptionId(subId); if (passed) setPreferredSubscription(subId); // Trigger callback if needed sendSetOpptCallbackHelper(mSetOpptSubCallback, passed ? SET_OPPORTUNISTIC_SUB_SUCCESS : SET_OPPORTUNISTIC_SUB_VALIDATION_FAILED); mSetOpptSubCallback = null; } // TODO b/123598154: rename preferredDataSub to opportunisticSubId. private void setPreferredDataSubscriptionId(int subId) { if (mPreferredDataSubId != subId) { log("setPreferredDataSubscriptionId subId changed to " + subId); mPreferredDataSubId = subId; Message msg = PhoneSwitcher.this.obtainMessage(EVENT_PREFERRED_SUBSCRIPTION_CHANGED); msg.sendToTarget(); } public void trySetPreferredSubscription(int subId, boolean needValidation, ISetOpportunisticDataCallback callback) { PhoneSwitcher.this.obtainMessage(EVENT_CHANGE_PREFERRED_SUBSCRIPTION, subId, needValidation ? 1 : 0, callback).sendToTarget(); } private boolean isCallActive(Phone phone) { Loading
src/java/com/android/internal/telephony/SubscriptionController.java +4 −6 Original line number Diff line number Diff line Loading @@ -2690,16 +2690,14 @@ public class SubscriptionController extends ISub.Stub { } @Override public void setPreferredDataSubscriptionId(int subId) { public void setPreferredDataSubscriptionId(int subId, boolean needValidation, ISetOpportunisticDataCallback callback) { enforceModifyPhoneState("setPreferredDataSubscriptionId"); final long token = Binder.clearCallingIdentity(); try { if (SubscriptionManager.isUsableSubscriptionId(subId)) { PhoneSwitcher.getInstance().setOpportunisticDataSubscription(subId); } else { PhoneSwitcher.getInstance().unsetOpportunisticDataSubscription(); } PhoneSwitcher.getInstance().trySetPreferredSubscription( subId, needValidation, callback); } finally { Binder.restoreCallingIdentity(token); } Loading
tests/telephonytests/src/com/android/internal/telephony/PhoneSwitcherTest.java +6 −4 Original line number Diff line number Diff line Loading @@ -386,13 +386,14 @@ public class PhoneSwitcherTest extends TelephonyTest { assertTrue(mDataAllowed[0]); // Set sub 2 as preferred sub should make phone 1 activated and phone 0 deactivated. mPhoneSwitcher.setOpportunisticDataSubscription(2); mPhoneSwitcher.trySetPreferredSubscription(2, false, null); waitABit(); assertFalse(mDataAllowed[0]); assertTrue(mDataAllowed[1]); // Unset preferred sub should make default data sub (phone 0 / sub 1) activated again. mPhoneSwitcher.unsetOpportunisticDataSubscription(); mPhoneSwitcher.trySetPreferredSubscription(SubscriptionManager.DEFAULT_SUBSCRIPTION_ID, false, null); waitABit(); assertTrue(mDataAllowed[0]); assertFalse(mDataAllowed[1]); Loading Loading @@ -441,7 +442,7 @@ public class PhoneSwitcherTest extends TelephonyTest { assertTrue(mPhoneSwitcher.shouldApplyNetworkRequest(mmsRequest, 1)); // Set sub 2 as preferred sub should make phone 1 preferredDataModem mPhoneSwitcher.setOpportunisticDataSubscription(2); mPhoneSwitcher.trySetPreferredSubscription(2, false, null); waitABit(); verify(mMockRadioConfig).setPreferredDataModem(eq(1), any()); verify(mActivePhoneSwitchHandler, times(2)).sendMessageAtTime(any(), anyLong()); Loading @@ -454,7 +455,8 @@ public class PhoneSwitcherTest extends TelephonyTest { clearInvocations(mActivePhoneSwitchHandler); // Unset preferred sub should make phone0 preferredDataModem again. mPhoneSwitcher.unsetOpportunisticDataSubscription(); mPhoneSwitcher.trySetPreferredSubscription(SubscriptionManager.DEFAULT_SUBSCRIPTION_ID, false, null); waitABit(); verify(mMockRadioConfig).setPreferredDataModem(eq(0), any()); verify(mActivePhoneSwitchHandler, times(2)).sendMessageAtTime(any(), anyLong()); Loading