Merge "Check active state of opportunistic subscription before returning its port index." into tm-qpr-dev am: b5f5eb3fa5

Original change: https://googleplex-android-review.googlesource.com/c/platform/packages/services/AlternativeNetworkAccess/+/19458812

Change-Id: I2c74bf84131a0b14569016eb201ea91025b4dc16
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
diff --git a/src/com/android/ons/ONSProfileSelector.java b/src/com/android/ons/ONSProfileSelector.java
index 261a7ef..95287fc 100644
--- a/src/com/android/ons/ONSProfileSelector.java
+++ b/src/com/android/ons/ONSProfileSelector.java
@@ -378,19 +378,27 @@
     protected int getAvailableESIMPortIndex() {
         //Check if an opportunistic subscription is already active. If yes then, use the same port.
         List<SubscriptionInfo> subscriptionInfos = mSubscriptionManager
-                .getOpportunisticSubscriptions();
-        if (subscriptionInfos != null && subscriptionInfos.size() > 0) {
-            return subscriptionInfos.get(0).getPortIndex();
+                .getCompleteActiveSubscriptionInfoList();
+        if (subscriptionInfos != null) {
+            logDebug("[getAvailableESIMPortIndex] subscriptionInfos size:"
+                    + subscriptionInfos.size());
+            for (SubscriptionInfo subscriptionInfo : subscriptionInfos) {
+                if (subscriptionInfo.isEmbedded() && subscriptionInfo.isOpportunistic()) {
+                    return subscriptionInfo.getPortIndex();
+                }
+            }
         }
 
         //Look for available port.
         for (UiccCardInfo uiccCardInfo : mTelephonyManager.getUiccCardsInfo()) {
+            logDebug("[getAvailableESIMPortIndex] CardInfo: " + uiccCardInfo.toString());
             if (!uiccCardInfo.isEuicc()) {
                 continue;
             }
 
             EuiccManager euiccManager = mEuiccManager.createForCardId(uiccCardInfo.getCardId());
             for (UiccPortInfo uiccPortInfo : uiccCardInfo.getPorts()) {
+                logDebug("[getAvailableESIMPortIndex] PortInfo: " + uiccPortInfo.toString());
                 //Port is available if no profiles enabled on it.
                 if (euiccManager.isSimPortAvailable(uiccPortInfo.getPortIndex())) {
                     return uiccPortInfo.getPortIndex();
@@ -398,6 +406,7 @@
             }
         }
 
+        logDebug("[getAvailableESIMPortIndex] No Port is available.");
         return TelephonyManager.INVALID_PORT_INDEX;
     }
 
diff --git a/tests/src/com/android/ons/ONSProfileSelectorTest.java b/tests/src/com/android/ons/ONSProfileSelectorTest.java
index 116d1a5..68925f7 100644
--- a/tests/src/com/android/ons/ONSProfileSelectorTest.java
+++ b/tests/src/com/android/ons/ONSProfileSelectorTest.java
@@ -268,6 +268,8 @@
                     .getOpportunisticSubscriptions();
                 doReturn(activeSubscriptionInfoList).when(mSubscriptionManager)
                         .getActiveSubscriptionInfoList();
+                doReturn(activeSubscriptionInfoList).when(mSubscriptionManager)
+                        .getCompleteActiveSubscriptionInfoList();
                 doReturn(true).when(mSubscriptionManager).isActiveSubId(subId);
                 doReturn(true).when(mSubscriptionBoundTelephonyManager).enableModemForSlot(
                     anyInt(), anyBoolean());
@@ -310,13 +312,18 @@
 
         List<SubscriptionInfo> subscriptionInfoList = new ArrayList<SubscriptionInfo>();
         SubscriptionInfo subscriptionInfo = new SubscriptionInfo(5, "", 1, "TMO", "TMO", 1, 1,
-                "123", 1, null, "310", "210", "", false, null, "1");
+                "123", 1, null, "310", "210", "", true, null, "1", 1, true, null, false, 1, 1, 1,
+                null, null, false, 0);
         subscriptionInfoList.add(subscriptionInfo);
         SubscriptionInfo subscriptionInfo_2 = new SubscriptionInfo(8, "", 1, "Vzw", "Vzw", 1, 1,
-                "123", 1, null, "311", "480", "", false, null, "1");
+                "456", 1, null, "311", "480", "", true, null, "1", 1, true, null, false, 1, 1, 1,
+                null, null, false, 1);
         subscriptionInfoList.add(subscriptionInfo_2);
         doReturn(subscriptionInfo).when(mSubscriptionManager).getActiveSubscriptionInfo(5);
         doReturn(subscriptionInfo_2).when(mSubscriptionManager).getActiveSubscriptionInfo(8);
+        doReturn(subscriptionInfoList).when(mSubscriptionManager)
+                .getCompleteActiveSubscriptionInfoList();
+        doReturn(subscriptionInfoList).when(mSubscriptionManager).getOpportunisticSubscriptions();
 
         List<CellInfo> results2 = new ArrayList<CellInfo>();
         CellIdentityLte cellIdentityLte = new CellIdentityLte(310, 210, 1, 1, 1);
@@ -353,8 +360,6 @@
             @Override
             public void run() {
                 Looper.prepare();
-                doReturn(subscriptionInfoList).when(mSubscriptionManager)
-                        .getOpportunisticSubscriptions();
                 doReturn(true).when(mSubscriptionManager).isActiveSubId(anyInt());
                 doReturn(true).when(mSubscriptionBoundTelephonyManager).enableModemForSlot(
                         anyInt(), anyBoolean());
@@ -628,7 +633,7 @@
         activeSubscriptionInfoList.add(subscriptionInfo1);
         activeSubscriptionInfoList.add(subscriptionInfo2);
         doReturn(activeSubscriptionInfoList).when(mSubscriptionManager)
-                .getActiveSubscriptionInfoList();
+                .getCompleteActiveSubscriptionInfoList();
 
         List<CellInfo> results2 = new ArrayList<CellInfo>();
         CellIdentityLte cellIdentityLte = new CellIdentityLte(310, 210, 1, 1, 1);
@@ -821,31 +826,43 @@
         }).start();
         waitUntilReady();
         waitForMs(500);
-        assertEquals(mONSProfileSelector.getCurrentPreferredData(), 5);
+        assertEquals(5, mONSProfileSelector.getCurrentPreferredData());
     }
 
     @Test
     public void testAvailablePortWhenTwoPrimarySIMsAreActive() {
+        /**
+         * 2 - Primary active subscriptions and
+         * 1 - Inactive opportunistic subscription
+         */
+
         List<SubscriptionInfo> activeSubscriptionInfoList = new ArrayList<SubscriptionInfo>();
         List<SubscriptionInfo> opportunisticInfoList = new ArrayList<SubscriptionInfo>();
 
-        SubscriptionInfo subscriptionInfo1 = new SubscriptionInfo(5, "", 1, "TMO", "TMO", 1, 1,
-                "123", 1, null, "310", "210", "", true, null, "1", 1, false, null, false, 1839, 1,
-                1, null, null, false, 1);
-        SubscriptionInfo subscriptionInfo2 = new SubscriptionInfo(6, "", 1, "TMO", "TMO", 1, 1,
-                "456", 1, null, "310", "211", "", true, null, "1", 1, false, null, false, 1839, 1,
-                1, null, null, false, 2);
+        SubscriptionInfo oppSubInfo = new SubscriptionInfo(4, "", -1, "TMO", "TMO", 1, 1,
+                "001", 1, null, "110", "210", "", true, null, "1", 1, true, null, false, 2839, 1,
+                1, null, null, false, TelephonyManager.INVALID_PORT_INDEX);
 
-        activeSubscriptionInfoList.add(subscriptionInfo1);
-        activeSubscriptionInfoList.add(subscriptionInfo2);
+        SubscriptionInfo primarySubInfo1 = new SubscriptionInfo(5, "", 0, "TMO", "TMO", 1, 1,
+                "123", 1, null, "310", "210", "", true, null, "1", 1, false, null, false, 1839, 1,
+                1, null, null, false, 0);
+        SubscriptionInfo primarySubInfo2 = new SubscriptionInfo(6, "", 0, "TMO", "TMO", 1, 1,
+                "456", 1, null, "310", "211", "", true, null, "1", 1, false, null, false, 1839, 1,
+                1, null, null, false, 1);
+
+        activeSubscriptionInfoList.add(primarySubInfo1);
+        activeSubscriptionInfoList.add(primarySubInfo2);
+        opportunisticInfoList.add(oppSubInfo);
 
         doReturn(opportunisticInfoList).when(mSubscriptionManager).getOpportunisticSubscriptions();
         doReturn(activeSubscriptionInfoList).when(mSubscriptionManager)
-                .getActiveSubscriptionInfoList();
+                .getCompleteActiveSubscriptionInfoList();
 
-        UiccPortInfo uiccPortInfo = new UiccPortInfo("", 1, 1, true);
+        UiccPortInfo uiccPortInfo1 = new UiccPortInfo("", 0, 0, true);
+        UiccPortInfo uiccPortInfo2 = new UiccPortInfo("", 1, 0, true);
         ArrayList<UiccPortInfo> uiccPortInfoList = new ArrayList<>();
-        uiccPortInfoList.add(uiccPortInfo);
+        uiccPortInfoList.add(uiccPortInfo1);
+        uiccPortInfoList.add(uiccPortInfo2);
 
         UiccCardInfo uiccCardInfo = new UiccCardInfo(true, 1, "", 0, false, true, uiccPortInfoList);
         ArrayList<UiccCardInfo> uiccCardInfoList = new ArrayList<>();
@@ -853,34 +870,177 @@
 
         doReturn(uiccCardInfoList).when(mMockTelephonyManager).getUiccCardsInfo();
         doReturn(mMockEuiccManager).when(mMockEuiccManager).createForCardId(1);
+        doReturn(false).when(mMockEuiccManager).isSimPortAvailable(0);
         doReturn(false).when(mMockEuiccManager).isSimPortAvailable(1);
 
         mONSProfileSelector = new MyONSProfileSelector(mContext, null);
+        mONSProfileSelector.mTelephonyManager = mMockTelephonyManager;
+        mONSProfileSelector.mEuiccManager = mMockEuiccManager;
+
         int portIdx = mONSProfileSelector.getAvailableESIMPortIndex();
-        assertEquals(portIdx, TelephonyManager.INVALID_PORT_INDEX);
+        assertEquals(TelephonyManager.INVALID_PORT_INDEX, portIdx);
     }
 
     @Test
     public void testAvailablePortWhenOpportunisticEsimIsActive() {
+        /**
+         * 1 - Primary active subscriptions and
+         * 1 - Active opportunistic subscription
+         */
+
         List<SubscriptionInfo> activeSubscriptionInfoList = new ArrayList<SubscriptionInfo>();
         List<SubscriptionInfo> opportunisticInfoList = new ArrayList<SubscriptionInfo>();
 
-        SubscriptionInfo subscriptionInfo1 = new SubscriptionInfo(5, "", 1, "TMO", "TMO", 1, 1,
+        SubscriptionInfo oppSubInfo = new SubscriptionInfo(5, "", 1, "TMO", "TMO", 1, 1,
                 "123", 1, null, "310", "210", "", true, null, "1", 1, true, null, false, 1839, 1,
-                1, null, null, false, 1);
-        SubscriptionInfo subscriptionInfo2 = new SubscriptionInfo(6, "", 1, "TMO", "TMO", 1, 1,
+                1, null, null, false, 0);
+
+        SubscriptionInfo primarySubInfo = new SubscriptionInfo(6, "", 1, "TMO", "TMO", 1, 1,
                 "456", 1, null, "310", "211", "", true, null, "1", 1, false, null, false, 1839, 1,
-                1, null, null, false, 2);
+                1, null, null, false, 1);
 
-        opportunisticInfoList.add(subscriptionInfo1);
-        activeSubscriptionInfoList.add(subscriptionInfo1);
-        activeSubscriptionInfoList.add(subscriptionInfo2);
+        opportunisticInfoList.add(oppSubInfo);
+        activeSubscriptionInfoList.add(oppSubInfo);
+        activeSubscriptionInfoList.add(primarySubInfo);
 
-        doReturn(opportunisticInfoList).when(mSubscriptionManager).getOpportunisticSubscriptions();
+        doReturn(opportunisticInfoList).when(mSubscriptionManager)
+                .getOpportunisticSubscriptions();
+        doReturn(activeSubscriptionInfoList).when(mSubscriptionManager)
+                .getCompleteActiveSubscriptionInfoList();
 
         mONSProfileSelector = new MyONSProfileSelector(mContext, null);
         int portIdx = mONSProfileSelector.getAvailableESIMPortIndex();
-        assertEquals(portIdx, 1);
+        assertEquals(0, portIdx);
+    }
+
+    @Test
+    public void testAvailablePortWhenTwoOpportunisticEsimsAreActive() {
+        /**
+         * 2 - Active opportunistic subscriptions.
+         */
+
+        List<SubscriptionInfo> activeSubscriptionInfoList = new ArrayList<SubscriptionInfo>();
+        List<SubscriptionInfo> opportunisticInfoList = new ArrayList<SubscriptionInfo>();
+
+        SubscriptionInfo opportunisticSubInfo1 = new SubscriptionInfo(5, "", 1, "TMO", "TMO", 1, 1,
+                "123", 1, null, "310", "210", "", true, null, "1", 1, true, null, false, 1839, 1,
+                1, null, null, false, 0);
+
+        SubscriptionInfo opportunisticSubInfo2 = new SubscriptionInfo(6, "", 1, "TMO", "TMO", 1, 1,
+                "456", 1, null, "310", "211", "", true, null, "1", 1, true, null, false, 1839, 1,
+                1, null, null, false, 1);
+
+        opportunisticInfoList.add(opportunisticSubInfo1);
+        opportunisticInfoList.add(opportunisticSubInfo2);
+        activeSubscriptionInfoList.add(opportunisticSubInfo1);
+        activeSubscriptionInfoList.add(opportunisticSubInfo2);
+
+        doReturn(opportunisticInfoList).when(mSubscriptionManager)
+                .getOpportunisticSubscriptions();
+        doReturn(activeSubscriptionInfoList).when(mSubscriptionManager)
+                .getCompleteActiveSubscriptionInfoList();
+
+        mONSProfileSelector = new MyONSProfileSelector(mContext, null);
+        int portIdx = mONSProfileSelector.getAvailableESIMPortIndex();
+
+        /* one of the opportunistic eSIM port should be selected */
+        assertTrue(portIdx == 0 || portIdx == 1);
+    }
+
+    @Test
+    public void testAvailablePortWhenOpportunisticEsimIsActiveAndInactiveSubscriptions() {
+        /**
+         * 1 - Primary active subscription and
+         * 1 - Active opportunistic subscription and
+         * 2 - Inactive opportunistic subscriptions
+         */
+
+        List<SubscriptionInfo> activeSubscriptionInfoList = new ArrayList<SubscriptionInfo>();
+        List<SubscriptionInfo> opportunisticInfoList = new ArrayList<SubscriptionInfo>();
+
+        SubscriptionInfo opportunisticSubInfo1 = new SubscriptionInfo(5, "", 1, "TMO", "TMO", 1, 1,
+                "123", 1, null, "310", "210", "", true, null, "1", 1, true, null, false, 1839, 1,
+                1, null, null, false, 1);
+        SubscriptionInfo primarySubInfo = new SubscriptionInfo(6, "", 1, "TMO", "TMO", 1, 1,
+                "456", 1, null, "310", "211", "", true, null, "1", 1, false, null, false, 1839, 1,
+                1, null, null, false, 0);
+
+        SubscriptionInfo opportunisticSubInfo2 = new SubscriptionInfo(7, "", 1, "TMO", "TMO", 1, 1,
+                "789", 1, null, "310", "210", "", true, null, "1", 1, true, null, false, 1839, 1,
+                1, null, null, false, TelephonyManager.INVALID_PORT_INDEX);
+
+        SubscriptionInfo oppSubInfo3 = new SubscriptionInfo(8, "", 1, "TMO", "TMO", 1, 1,
+                "012", 1, null, "310", "210", "", true, null, "1", 1, true, null, false, 1839, 1,
+                1, null, null, false, TelephonyManager.INVALID_PORT_INDEX);
+
+        opportunisticInfoList.add(opportunisticSubInfo1);
+        opportunisticInfoList.add(opportunisticSubInfo2);
+        opportunisticInfoList.add(oppSubInfo3);
+        activeSubscriptionInfoList.add(opportunisticSubInfo1);
+        activeSubscriptionInfoList.add(primarySubInfo);
+
+        doReturn(opportunisticInfoList).when(mSubscriptionManager)
+                .getOpportunisticSubscriptions();
+        doReturn(activeSubscriptionInfoList).when(mSubscriptionManager)
+                .getCompleteActiveSubscriptionInfoList();
+
+        mONSProfileSelector = new MyONSProfileSelector(mContext, null);
+        int portIdx = mONSProfileSelector.getAvailableESIMPortIndex();
+        assertEquals(1, portIdx);
+    }
+
+    @Test
+    public void testAvailablePortWhenOnlyInactiveSubscriptions() {
+        /**
+         * 1 - Primary inactive subscription and
+         * 2 - Inactive opportunistic subscriptions
+         */
+
+        List<SubscriptionInfo> activeSubscriptionInfoList = new ArrayList<SubscriptionInfo>();
+        List<SubscriptionInfo> opportunisticInfoList = new ArrayList<SubscriptionInfo>();
+
+        SubscriptionInfo oppSubInfo1 = new SubscriptionInfo(5, "", 1, "TMO", "TMO", 1, 1,
+                "123", 1, null, "310", "210", "", true, null, "1", 1, true, null, false, 1839, 1,
+                1, null, null, false, TelephonyManager.INVALID_PORT_INDEX);
+
+        // Not used in activeSubscriptionInfoList or opportunisticInfoList
+        /*SubscriptionInfo primarySubInfo = new SubscriptionInfo(6, "", 1, "TMO", "TMO", 1, 1,
+                "456", 1, null, "310", "211", "", true, null, "1", 1, false, null, false, 1839, 1,
+                1, null, null, false, 2);*/
+
+        SubscriptionInfo oppSubInfo2 = new SubscriptionInfo(7, "", 1, "TMO", "TMO", 1, 1,
+                "789", 1, null, "310", "210", "", true, null, "1", 1, true, null, false, 1839, 1,
+                1, null, null, false, TelephonyManager.INVALID_PORT_INDEX);
+
+        opportunisticInfoList.add(oppSubInfo1);
+        opportunisticInfoList.add(oppSubInfo2);
+
+        doReturn(opportunisticInfoList).when(mSubscriptionManager)
+                .getOpportunisticSubscriptions();
+        doReturn(activeSubscriptionInfoList).when(mSubscriptionManager)
+                .getCompleteActiveSubscriptionInfoList();
+
+        UiccPortInfo uiccPortInfo1 = new UiccPortInfo("", 0, 0, false);
+        UiccPortInfo uiccPortInfo2 = new UiccPortInfo("", 1, 0, false);
+        ArrayList<UiccPortInfo> uiccPortInfoList = new ArrayList<>();
+        uiccPortInfoList.add(uiccPortInfo1);
+        uiccPortInfoList.add(uiccPortInfo2);
+
+        UiccCardInfo uiccCardInfo = new UiccCardInfo(true, 1, "", 0, false, true, uiccPortInfoList);
+        ArrayList<UiccCardInfo> uiccCardInfoList = new ArrayList<>();
+        uiccCardInfoList.add(uiccCardInfo);
+
+        doReturn(uiccCardInfoList).when(mMockTelephonyManager).getUiccCardsInfo();
+        doReturn(mMockEuiccManager).when(mMockEuiccManager).createForCardId(1);
+        doReturn(true).when(mMockEuiccManager).isSimPortAvailable(0);
+        doReturn(true).when(mMockEuiccManager).isSimPortAvailable(1);
+
+        mONSProfileSelector = new MyONSProfileSelector(mContext, null);
+        mONSProfileSelector.mTelephonyManager = mMockTelephonyManager;
+        mONSProfileSelector.mEuiccManager = mMockEuiccManager;
+
+        int portIdx = mONSProfileSelector.getAvailableESIMPortIndex();
+        assertTrue(portIdx == 0 || portIdx == 1);
     }
 
     @Test