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() {