Do not switch out the primary subscription
Do not switch out the primary subscription with
CBRS subscription if the primary is sitting in eSIM
Bug: 129791386
Test: unit test
ONSTests (11 Tests)
------------------
[1/11] com.android.ons.ONSNetworkScanCtlrTest#testStartFastNetworkScan: PASSED (228ms)
[2/11] com.android.ons.ONSNetworkScanCtlrTest#testStartFastNetworkScanFail: PASSED (1ms)
[3/11] com.android.ons.ONSNetworkScanCtlrTest#testStartFastNetworkScanWithMultipleNetworks: PASSED (26ms)
[4/11] com.android.ons.ONSNetworkScanCtlrTest#testStopNetworkScan: PASSED (127ms)
[5/11] com.android.ons.ONSProfileSelectorTest#testStartProfileSelectionSuccess: PASSED (578ms)
[6/11] com.android.ons.ONSProfileSelectorTest#testStartProfileSelectionWithActivePrimarySimOnESim: PASSED (5.153s)
[7/11] com.android.ons.ONSProfileSelectorTest#testStartProfileSelectionWithNoOpportunisticSub: PASSED (126ms)
[8/11] com.android.ons.ONSProfileSelectorTest#testselectProfileForDataWithInActiveSub: PASSED (25ms)
[9/11] com.android.ons.ONSProfileSelectorTest#testselectProfileForDataWithInvalidSubId: PASSED (25ms)
[10/11] com.android.ons.ONSProfileSelectorTest#testselectProfileForDataWithNoOpportunsticSub: PASSED (26ms)
[11/11] com.android.ons.ONSProfileSelectorTest#testselectProfileForDataWithValidSub: PASSED (0ms)
Merged-In: I9003fbd063e335e89a104ccf62081a0fdad09587
Change-Id: I9003fbd063e335e89a104ccf62081a0fdad09587
diff --git a/src/com/android/ons/ONSProfileSelector.java b/src/com/android/ons/ONSProfileSelector.java
index 335ff96..fbd39ed 100644
--- a/src/com/android/ons/ONSProfileSelector.java
+++ b/src/com/android/ons/ONSProfileSelector.java
@@ -380,6 +380,31 @@
return new HashSet<>(availableNetworks1).equals(new HashSet<>(availableNetworks2));
}
+ private boolean isPrimaryActiveOnOpportunisticSlot(
+ ArrayList<AvailableNetworkInfo> availableNetworks) {
+ /* Check if any of the available network is an embedded profile. if none are embedded,
+ * return false
+ * Todo <b/130535071> */
+ if (!isOpportunisticSubEmbedded(availableNetworks)) {
+ return false;
+ }
+
+ List<SubscriptionInfo> subscriptionInfos =
+ mSubscriptionManager.getActiveSubscriptionInfoList(false);
+ if (subscriptionInfos == null) {
+ return false;
+ }
+
+ /* if there is a primary subscription active on the eSIM, return true */
+ for (SubscriptionInfo subscriptionInfo : subscriptionInfos) {
+ if (!subscriptionInfo.isOpportunistic() && subscriptionInfo.isEmbedded()) {
+ return true;
+ }
+ }
+
+ return false;
+
+ }
private void sendUpdateNetworksCallbackHelper(IUpdateAvailableNetworksCallback callback,
int result) {
if (callback == null) {
@@ -404,6 +429,15 @@
TelephonyManager.UPDATE_AVAILABLE_NETWORKS_INVALID_ARGUMENTS);
return;
}
+
+ /* if primary subscription is active on opportunistic slot, do not switch out the same. */
+ if (isPrimaryActiveOnOpportunisticSlot(availableNetworks)) {
+ logDebug("primary subscription active on opportunistic sub");
+ sendUpdateNetworksCallbackHelper(callbackStub,
+ TelephonyManager.UPDATE_AVAILABLE_NETWORKS_INVALID_ARGUMENTS);
+ return;
+ }
+
if (isSame(availableNetworks, mAvailableNetworkInfos)) {
return;
}
@@ -481,6 +515,22 @@
return SubscriptionManager.INVALID_SUBSCRIPTION_ID;
}
+ private boolean isOpportunisticSubEmbedded(
+ ArrayList<AvailableNetworkInfo> availableNetworks) {
+ List<SubscriptionInfo> subscriptionInfos =
+ mSubscriptionManager.getOpportunisticSubscriptions();
+ for (AvailableNetworkInfo availableNetworkInfo : availableNetworks) {
+ for (SubscriptionInfo subscriptionInfo : subscriptionInfos) {
+ if (subscriptionInfo.getSubscriptionId() == availableNetworkInfo.getSubId()
+ && subscriptionInfo.isEmbedded()) {
+ return true;
+ }
+ }
+ }
+
+ return false;
+ }
+
private int getActiveOpportunisticSubId() {
List<SubscriptionInfo> subscriptionInfos =
mSubscriptionManager.getActiveSubscriptionInfoList(false);
diff --git a/tests/src/com/android/ons/ONSProfileSelectorTest.java b/tests/src/com/android/ons/ONSProfileSelectorTest.java
index 0847f44..a5d3a7c 100644
--- a/tests/src/com/android/ons/ONSProfileSelectorTest.java
+++ b/tests/src/com/android/ons/ONSProfileSelectorTest.java
@@ -135,7 +135,8 @@
public void run() {
Looper.prepare();
doReturn(true).when(mONSNetworkScanCtlr).startFastNetworkScan(anyObject());
- doReturn(null).when(mSubscriptionManager).getOpportunisticSubscriptions();
+ doReturn(new ArrayList<>()).when(mSubscriptionManager)
+ .getOpportunisticSubscriptions();
mONSProfileSelector = new MyONSProfileSelector(mContext,
mONSProfileSelectionCallback);
mONSProfileSelector.updateOppSubs();
@@ -228,6 +229,71 @@
assertTrue(mReady);
}
+ @Test
+ public void testStartProfileSelectionWithActivePrimarySimOnESim() {
+ List<SubscriptionInfo> opportunisticSubscriptionInfoList = new ArrayList<SubscriptionInfo>();
+ List<SubscriptionInfo> activeSubscriptionInfoList = new ArrayList<SubscriptionInfo>();
+ SubscriptionInfo subscriptionInfo = new SubscriptionInfo(5, "", 1, "TMO", "TMO", 1, 1,
+ "123", 1, null, "310", "210", "", true, null, "1", true, null, 1839, 1);
+ SubscriptionInfo subscriptionInfo2 = new SubscriptionInfo(6, "", 1, "TMO", "TMO", 1, 1,
+ "123", 1, null, "310", "211", "", true, null, "1", false, null, 1839, 1);
+ opportunisticSubscriptionInfoList.add(subscriptionInfo);
+ activeSubscriptionInfoList.add(subscriptionInfo2);
+
+ ArrayList<String> mccMncs = new ArrayList<>();
+ mccMncs.add("310210");
+ AvailableNetworkInfo availableNetworkInfo = new AvailableNetworkInfo(5, 2, mccMncs,
+ new ArrayList<Integer>());
+ ArrayList<AvailableNetworkInfo> availableNetworkInfos = new ArrayList<AvailableNetworkInfo>();
+ availableNetworkInfos.add(availableNetworkInfo);
+
+ IUpdateAvailableNetworksCallback mCallback = new IUpdateAvailableNetworksCallback.Stub() {
+ @Override
+ public void onComplete(int result) {
+ mResult = result;
+ }
+ };
+
+ mResult = -1;
+ mReady = false;
+ new Thread(new Runnable() {
+ @Override
+ public void run() {
+ Looper.prepare();
+ doReturn(opportunisticSubscriptionInfoList).when(mSubscriptionManager).getOpportunisticSubscriptions();
+ doReturn(false).when(mSubscriptionManager).isActiveSubId(anyInt());
+ doReturn(activeSubscriptionInfoList).when(mSubscriptionManager)
+ .getActiveSubscriptionInfoList(anyBoolean());
+ mONSProfileSelector = new MyONSProfileSelector(mContext,
+ new MyONSProfileSelector.ONSProfileSelectionCallback() {
+ public void onProfileSelectionDone() {
+ setReady(true);
+ }
+ });
+ mONSProfileSelector.updateOppSubs();
+ mONSProfileSelector.startProfileSelection(availableNetworkInfos, mCallback);
+ mLooper = Looper.myLooper();
+ setReady(true);
+ Looper.loop();
+ }
+ }).start();
+
+ // Wait till initialization is complete.
+ waitUntilReady();
+ mReady = false;
+ mDataSubId = -1;
+
+ // Testing startProfileSelection with opportunistic sub.
+ // On success onProfileSelectionDone must get invoked.
+ assertFalse(mReady);
+ waitForMs(100);
+ Intent callbackIntent = new Intent(MyONSProfileSelector.ACTION_SUB_SWITCH);
+ callbackIntent.putExtra("sequenceId", 1);
+ callbackIntent.putExtra("subId", 5);
+ waitUntilReady();
+ assertEquals(TelephonyManager.UPDATE_AVAILABLE_NETWORKS_INVALID_ARGUMENTS, mResult);
+ }
+
public static void waitForMs(long ms) {
try {
Thread.sleep(ms);
@@ -239,7 +305,7 @@
@Test
public void testselectProfileForDataWithNoOpportunsticSub() {
mReady = false;
- doReturn(null).when(mSubscriptionManager).getOpportunisticSubscriptions();
+ doReturn(new ArrayList<>()).when(mSubscriptionManager).getOpportunisticSubscriptions();
new Thread(new Runnable() {
@Override
public void run() {
@@ -269,7 +335,7 @@
"123", 1, null, "310", "210", "", false, null, "1");
subscriptionInfoList.add(subscriptionInfo);
mReady = false;
- doReturn(null).when(mSubscriptionManager).getOpportunisticSubscriptions();
+ doReturn(new ArrayList<>()).when(mSubscriptionManager).getOpportunisticSubscriptions();
new Thread(new Runnable() {
@Override
public void run() {