Merge Android R

Bug: 168057903
Merged-In: I76a40f211cb9022b7ee1c372266c8cc1e2537e57
Change-Id: I0e116f3777af27d0e768ac234e4cc97b23fe23f8
diff --git a/Android.bp b/Android.bp
index fe7c040..297565e 100644
--- a/Android.bp
+++ b/Android.bp
@@ -19,7 +19,10 @@
     name: "ONS",
     platform_apis: true,
     privileged: true,
-    libs: ["telephony-common"],
+    libs: [
+        "telephony-common",
+        "app-compat-annotations",
+    ],
     srcs: ["src/**/*.java"],
     aaptflags: ["--auto-add-overlay"],
     certificate: "platform",
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index b1163dd..dfee080 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -35,7 +35,7 @@
 
         <service android:name=".OpportunisticNetworkService"
                  android:enabled="true"
-                 android:exported="true"
+                 android:exported="false"
                  android:directBootAware="true"
                  android:singleUser="true" />
 
diff --git a/CleanSpec.mk b/CleanSpec.mk
index fbabcab..c21bc41 100644
--- a/CleanSpec.mk
+++ b/CleanSpec.mk
@@ -48,6 +48,7 @@
 $(call add-clean-step, rm -rf $(PRODUCT_OUT)/obj/APPS/ANS_intermediates)
 $(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/priv-app/ANS)
 $(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/APPS/ANS_intermediates)
+$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/priv-app/ONSLib)
 
 # ************************************************
 # NEWER CLEAN STEPS MUST BE AT THE END OF THE LIST
diff --git a/src/com/android/ons/ONSProfileSelector.java b/src/com/android/ons/ONSProfileSelector.java
index 7266660..3e903c9 100644
--- a/src/com/android/ons/ONSProfileSelector.java
+++ b/src/com/android/ons/ONSProfileSelector.java
@@ -28,13 +28,13 @@
 import android.os.HandlerThread;
 import android.os.Message;
 import android.os.RemoteException;
-import android.os.ServiceManager;
 import android.telephony.AvailableNetworkInfo;
 import android.telephony.CellInfo;
 import android.telephony.CellInfoLte;
 import android.telephony.SignalStrength;
 import android.telephony.SubscriptionInfo;
 import android.telephony.SubscriptionManager;
+import android.telephony.TelephonyFrameworkInitializer;
 import android.telephony.TelephonyManager;
 import android.text.TextUtils;
 
@@ -148,7 +148,8 @@
                                                     .UPDATE_AVAILABLE_NETWORKS_INVALID_ARGUMENTS);
                                 } else {
                                     if (Compatibility.isChangeEnabled(
-                                            TelephonyManager.CALLBACK_ON_MORE_ERROR_CODE_CHANGE)) {
+                                            OpportunisticNetworkService
+                                                    .CALLBACK_ON_MORE_ERROR_CODE_CHANGE)) {
                                         sendUpdateNetworksCallbackHelper(mNetworkScanCallback,
                                                 TelephonyManager
                                                         .UPDATE_AVAILABLE_NETWORKS_SERVICE_IS_DISABLED);
@@ -172,7 +173,8 @@
                                 TelephonyManager.UPDATE_AVAILABLE_NETWORKS_SUCCESS);
                         } else {
                             if (Compatibility.isChangeEnabled(
-                                    TelephonyManager.CALLBACK_ON_MORE_ERROR_CODE_CHANGE)) {
+                                    OpportunisticNetworkService
+                                            .CALLBACK_ON_MORE_ERROR_CODE_CHANGE)) {
                                 sendUpdateNetworksCallbackHelper(mNetworkScanCallback,
                                         TelephonyManager
                                                 .UPDATE_AVAILABLE_NETWORKS_ENABLE_MODEM_FAIL);
@@ -294,7 +296,6 @@
                 }
             }
         }
-
         return SubscriptionManager.INVALID_SUBSCRIPTION_ID;
     }
 
@@ -379,7 +380,7 @@
                 TelephonyManager.UPDATE_AVAILABLE_NETWORKS_SUCCESS);
         } else {
             if (Compatibility.isChangeEnabled(
-                    TelephonyManager.CALLBACK_ON_MORE_ERROR_CODE_CHANGE)) {
+                    OpportunisticNetworkService.CALLBACK_ON_MORE_ERROR_CODE_CHANGE)) {
                 sendUpdateNetworksCallbackHelper(mNetworkScanCallback,
                         TelephonyManager.UPDATE_AVAILABLE_NETWORKS_ENABLE_MODEM_FAIL);
             } else {
@@ -484,7 +485,7 @@
         if (mOppSubscriptionInfos == null) {
             logDebug("null subscription infos");
             if (Compatibility.isChangeEnabled(
-                    TelephonyManager.CALLBACK_ON_MORE_ERROR_CODE_CHANGE)) {
+                    OpportunisticNetworkService.CALLBACK_ON_MORE_ERROR_CODE_CHANGE)) {
                 sendUpdateNetworksCallbackHelper(callbackStub,
                         TelephonyManager.UPDATE_AVAILABLE_NETWORKS_NO_OPPORTUNISTIC_SUB_AVAILABLE);
             } else {
@@ -538,14 +539,13 @@
                             TelephonyManager.UPDATE_AVAILABLE_NETWORKS_SUCCESS);
                     } else {
                         if (Compatibility.isChangeEnabled(
-                                TelephonyManager.CALLBACK_ON_MORE_ERROR_CODE_CHANGE)) {
+                                OpportunisticNetworkService.CALLBACK_ON_MORE_ERROR_CODE_CHANGE)) {
                             sendUpdateNetworksCallbackHelper(callbackStub,
                                     TelephonyManager.UPDATE_AVAILABLE_NETWORKS_ENABLE_MODEM_FAIL);
                         } else {
                             sendUpdateNetworksCallbackHelper(callbackStub,
                                     TelephonyManager.UPDATE_AVAILABLE_NETWORKS_ABORTED);
                         }
-
                     }
                     mProfileSelectionCallback.onProfileSelectionDone();
                     mAvailableNetworkInfos = null;
@@ -557,7 +557,7 @@
             }
         } else if (mOppSubscriptionInfos.size() == 0) {
             if (Compatibility.isChangeEnabled(
-                    TelephonyManager.CALLBACK_ON_MORE_ERROR_CODE_CHANGE)) {
+                    OpportunisticNetworkService.CALLBACK_ON_MORE_ERROR_CODE_CHANGE)) {
                 sendUpdateNetworksCallbackHelper(callbackStub,
                         TelephonyManager.UPDATE_AVAILABLE_NETWORKS_NO_OPPORTUNISTIC_SUB_AVAILABLE);
             } else {
@@ -647,7 +647,7 @@
         int subId = getActiveOpportunisticSubId();
         if (subId == SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
             if (Compatibility.isChangeEnabled(
-                    TelephonyManager.CALLBACK_ON_MORE_ERROR_CODE_CHANGE)) {
+                    OpportunisticNetworkService.CALLBACK_ON_MORE_ERROR_CODE_CHANGE)) {
                 sendUpdateNetworksCallbackHelper(callbackStub,
                         TelephonyManager.UPDATE_AVAILABLE_NETWORKS_NO_OPPORTUNISTIC_SUB_AVAILABLE);
             } else {
@@ -661,7 +661,7 @@
                 TelephonyManager.UPDATE_AVAILABLE_NETWORKS_SUCCESS);
         } else {
             if (Compatibility.isChangeEnabled(
-                    TelephonyManager.CALLBACK_ON_MORE_ERROR_CODE_CHANGE)) {
+                    OpportunisticNetworkService.CALLBACK_ON_MORE_ERROR_CODE_CHANGE)) {
                 sendUpdateNetworksCallbackHelper(callbackStub,
                         TelephonyManager.UPDATE_AVAILABLE_NETWORKS_DISABLE_MODEM_FAIL);
             } else {
@@ -672,7 +672,9 @@
     }
 
     private boolean enableModem(int subId, boolean enable) {
-        if (!mSubscriptionManager.isActiveSubId(subId)) {
+        SubscriptionInfo info = mSubscriptionManager.getActiveSubscriptionInfo(subId);
+        if (info == null) {
+            // Subscription is not active. Do nothing.
             return false;
         }
 
@@ -682,7 +684,7 @@
                 selectProfileForData(SubscriptionManager.DEFAULT_SUBSCRIPTION_ID, false, null);
             }
         }
-        int phoneId = SubscriptionManager.getPhoneId(subId);
+        int phoneId = info.getSimSlotIndex();
         /*  Todo: b/135067156
          *  Reenable this code once 135067156 is fixed
         if (mSubscriptionBoundTelephonyManager.isModemEnabledForSlot(phoneId) == enable) {
@@ -800,11 +802,15 @@
             ISetOpportunisticDataCallback callbackStub) {
         if ((subId == SubscriptionManager.DEFAULT_SUBSCRIPTION_ID)
                 || (isOpprotunisticSub(subId) && mSubscriptionManager.isActiveSubId(subId))) {
-            ISub iSub = ISub.Stub.asInterface(ServiceManager.getService("isub"));
+            ISub iSub = ISub.Stub.asInterface(
+                    TelephonyFrameworkInitializer
+                            .getTelephonyServiceManager()
+                            .getSubscriptionServiceRegisterer()
+                            .get());
             if (iSub == null) {
                 log("Could not get Subscription Service handle");
                 if (Compatibility.isChangeEnabled(
-                        TelephonyManager.CALLBACK_ON_MORE_ERROR_CODE_CHANGE)) {
+                        OpportunisticNetworkService.CALLBACK_ON_MORE_ERROR_CODE_CHANGE)) {
                     sendSetOpptCallbackHelper(callbackStub,
                             TelephonyManager.SET_OPPORTUNISTIC_SUB_REMOTE_SERVICE_EXCEPTION);
                 } else {
@@ -818,7 +824,7 @@
             } catch (RemoteException ex) {
                 log("Could not connect to Subscription Service");
                 if (Compatibility.isChangeEnabled(
-                        TelephonyManager.CALLBACK_ON_MORE_ERROR_CODE_CHANGE)) {
+                        OpportunisticNetworkService.CALLBACK_ON_MORE_ERROR_CODE_CHANGE)) {
                     sendSetOpptCallbackHelper(callbackStub,
                             TelephonyManager.SET_OPPORTUNISTIC_SUB_REMOTE_SERVICE_EXCEPTION);
                 } else {
@@ -831,7 +837,7 @@
         } else {
             log("Inactive sub passed for preferred data " + subId);
             if (Compatibility.isChangeEnabled(
-                    TelephonyManager.CALLBACK_ON_MORE_ERROR_CODE_CHANGE)) {
+                    OpportunisticNetworkService.CALLBACK_ON_MORE_ERROR_CODE_CHANGE)) {
                 if (isOpprotunisticSub(subId)) {
                     sendSetOpptCallbackHelper(callbackStub,
                             TelephonyManager.SET_OPPORTUNISTIC_SUB_INACTIVE_SUBSCRIPTION);
@@ -863,9 +869,14 @@
     protected void updateOpportunisticSubscriptions() {
         synchronized (mLock) {
             mOppSubscriptionInfos = mSubscriptionManager
-                .getOpportunisticSubscriptions().stream()
-                .filter(subInfo -> subInfo.isGroupDisabled() != true)
-                .collect(Collectors.toList());
+                    .getOpportunisticSubscriptions().stream()
+                    .filter(subInfo -> subInfo.isGroupDisabled() != true)
+                    .collect(Collectors.toList());
+            if (mOppSubscriptionInfos != null) {
+                mStandaloneOppSubInfos = mOppSubscriptionInfos.stream()
+                        .filter(subInfo -> subInfo.getGroupUuid() == null)
+                        .collect(Collectors.toList());
+            }
         }
     }
 
diff --git a/src/com/android/ons/OpportunisticNetworkService.java b/src/com/android/ons/OpportunisticNetworkService.java
index 62e292b..1178538 100644
--- a/src/com/android/ons/OpportunisticNetworkService.java
+++ b/src/com/android/ons/OpportunisticNetworkService.java
@@ -18,6 +18,8 @@
 
 import android.app.Service;
 import android.compat.Compatibility;
+import android.compat.annotation.ChangeId;
+import android.compat.annotation.EnabledAfter;
 import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
@@ -25,14 +27,16 @@
 import android.content.SharedPreferences;
 import android.content.pm.PackageManager;
 import android.os.Binder;
+import android.os.Build;
 import android.os.Handler;
 import android.os.IBinder;
 import android.os.Message;
 import android.os.RemoteException;
-import android.os.ServiceManager;
+import android.os.TelephonyServiceManager.ServiceRegisterer;
 import android.telephony.AvailableNetworkInfo;
 import android.telephony.SubscriptionInfo;
 import android.telephony.SubscriptionManager;
+import android.telephony.TelephonyFrameworkInitializer;
 import android.telephony.TelephonyManager;
 
 import com.android.internal.annotations.VisibleForTesting;
@@ -66,7 +70,6 @@
     private static final String TAG = "ONS";
     private static final String PREF_NAME = TAG;
     private static final String PREF_ENABLED = "isEnabled";
-    private static final String SERVICE_NAME = "ions";
     private static final String CARRIER_APP_CONFIG_NAME = "carrierApp";
     private static final String SYSTEM_APP_CONFIG_NAME = "systemApp";
     private static final boolean DBG = true;
@@ -74,6 +77,14 @@
     private static final int MSG_SIM_STATE_CHANGE = 1;
 
     /**
+     * To expand the error codes for {@link TelephonyManager#updateAvailableNetworks} and
+     * {@link TelephonyManager#setPreferredOpportunisticDataSubscription}.
+     */
+    @ChangeId
+    @EnabledAfter(targetSdkVersion = Build.VERSION_CODES.Q)
+    static final long CALLBACK_ON_MORE_ERROR_CODE_CHANGE = 130595455L;
+
+    /**
      * Profile selection callback. Will be called once Profile selector decides on
      * the opportunistic data profile.
      */
@@ -325,8 +336,11 @@
         initialize(getBaseContext());
 
         /* register the service */
-        if (ServiceManager.getService(SERVICE_NAME) == null) {
-            ServiceManager.addService(SERVICE_NAME, mBinder);
+        ServiceRegisterer opportunisticNetworkServiceRegisterer = TelephonyFrameworkInitializer
+                .getTelephonyServiceManager()
+                .getOpportunisticNetworkServiceRegisterer();
+        if (opportunisticNetworkServiceRegisterer.get() == null) {
+            opportunisticNetworkServiceRegisterer.register(mBinder);
         }
     }
 
@@ -388,8 +402,7 @@
             /* carrier apps should report only subscription */
             if (availableNetworks.size() > 1) {
                 log("Carrier app should not pass more than one subscription");
-                if (Compatibility.isChangeEnabled(
-                        TelephonyManager.CALLBACK_ON_MORE_ERROR_CODE_CHANGE)) {
+                if (Compatibility.isChangeEnabled(CALLBACK_ON_MORE_ERROR_CODE_CHANGE)) {
                     sendUpdateNetworksCallbackHelper(callbackStub,
                             TelephonyManager
                                     .UPDATE_AVAILABLE_NETWORKS_MULTIPLE_NETWORKS_NOT_SUPPORTED);
@@ -402,8 +415,7 @@
 
             if (!mProfileSelector.hasOpprotunisticSub(availableNetworks)) {
                 log("No opportunistic subscriptions received");
-                if (Compatibility.isChangeEnabled(
-                        TelephonyManager.CALLBACK_ON_MORE_ERROR_CODE_CHANGE)) {
+                if (Compatibility.isChangeEnabled(CALLBACK_ON_MORE_ERROR_CODE_CHANGE)) {
                     sendUpdateNetworksCallbackHelper(callbackStub,
                             TelephonyManager
                                     .UPDATE_AVAILABLE_NETWORKS_NO_OPPORTUNISTIC_SUB_AVAILABLE);
@@ -415,9 +427,15 @@
             }
 
             for (AvailableNetworkInfo availableNetworkInfo : availableNetworks) {
-                if (Binder.withCleanCallingIdentity(
-                            () -> mSubscriptionManager.isActiveSubId(
-                                    availableNetworkInfo.getSubId()))) {
+                final long identity = Binder.clearCallingIdentity();
+                boolean isActiveSubId = false;
+                try {
+                    isActiveSubId =
+                            mSubscriptionManager.isActiveSubId(availableNetworkInfo.getSubId());
+                } finally {
+                    Binder.restoreCallingIdentity(identity);
+                }
+                if (isActiveSubId) {
                     TelephonyPermissions.enforceCallingOrSelfCarrierPrivilege(mContext,
                         availableNetworkInfo.getSubId(), "updateAvailableNetworks");
                 } else {
@@ -454,8 +472,7 @@
                     /*  if carrier is reporting availability, then it takes higher priority. */
                     mProfileSelector.startProfileSelection(availableNetworks, callbackStub);
                 } else {
-                    if (Compatibility.isChangeEnabled(
-                            TelephonyManager.CALLBACK_ON_MORE_ERROR_CODE_CHANGE)) {
+                    if (Compatibility.isChangeEnabled(CALLBACK_ON_MORE_ERROR_CODE_CHANGE)) {
                         sendUpdateNetworksCallbackHelper(callbackStub,
                                 TelephonyManager.UPDATE_AVAILABLE_NETWORKS_SERVICE_IS_DISABLED);
                     } else {
@@ -521,8 +538,7 @@
                 /* all subscriptions should be opportunistic subscriptions */
                 if (!mProfileSelector.hasOpprotunisticSub(availableNetworks)) {
                     log("No opportunistic subscriptions received");
-                    if (Compatibility.isChangeEnabled(
-                            TelephonyManager.CALLBACK_ON_MORE_ERROR_CODE_CHANGE)) {
+                    if (Compatibility.isChangeEnabled(CALLBACK_ON_MORE_ERROR_CODE_CHANGE)) {
                         sendUpdateNetworksCallbackHelper(callbackStub,
                                 TelephonyManager
                                         .UPDATE_AVAILABLE_NETWORKS_NO_OPPORTUNISTIC_SUB_AVAILABLE);
@@ -534,7 +550,6 @@
                 }
                 mONSConfigInputHashMap.put(SYSTEM_APP_CONFIG_NAME,
                         new ONSConfigInput(availableNetworks, callbackStub));
-
                 /* reporting availability. proceed if carrier app has not requested any, but
                    standalone opportunistic subscription should be handled in priority. */
                 if (mIsEnabled) {
@@ -543,8 +558,7 @@
                         mProfileSelector.startProfileSelection(availableNetworks, callbackStub);
                     }
                 } else {
-                    if (Compatibility.isChangeEnabled(
-                            TelephonyManager.CALLBACK_ON_MORE_ERROR_CODE_CHANGE)) {
+                    if (Compatibility.isChangeEnabled(CALLBACK_ON_MORE_ERROR_CODE_CHANGE)) {
                         sendUpdateNetworksCallbackHelper(callbackStub,
                                 TelephonyManager.UPDATE_AVAILABLE_NETWORKS_SERVICE_IS_DISABLED);
                     } else {
diff --git a/tests/src/com/android/ons/ONSProfileSelectorTest.java b/tests/src/com/android/ons/ONSProfileSelectorTest.java
index 4816ec6..e86726a 100644
--- a/tests/src/com/android/ons/ONSProfileSelectorTest.java
+++ b/tests/src/com/android/ons/ONSProfileSelectorTest.java
@@ -20,7 +20,9 @@
 import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
+import android.os.IBinder;
 import android.os.Looper;
+import android.os.ServiceManager;
 import android.telephony.AvailableNetworkInfo;
 import android.telephony.CellIdentityLte;
 import android.telephony.CellInfo;
@@ -30,6 +32,7 @@
 import android.telephony.TelephonyManager;
 import android.util.Log;
 
+import com.android.internal.telephony.ISub;
 import com.android.internal.telephony.IUpdateAvailableNetworksCallback;
 
 import org.junit.After;
@@ -38,8 +41,10 @@
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 
+import java.lang.reflect.Field;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
 
 public class ONSProfileSelectorTest extends ONSBaseTest {
 
@@ -52,6 +57,12 @@
     ONSNetworkScanCtlr mONSNetworkScanCtlr;
     @Mock
     TelephonyManager mSubscriptionBoundTelephonyManager;
+    @Mock
+    ISub mISubMock;
+    @Mock
+    IBinder mISubBinderMock;
+    @Mock
+    SubscriptionInfo mSubInfo;
     private Looper mLooper;
     private static final String TAG = "ONSProfileSelectorTest";
 
@@ -103,15 +114,30 @@
         }
     }
 
+    private void addISubService() throws Exception {
+        Field field = ServiceManager.class.getDeclaredField("sCache");
+        field.setAccessible(true);
+        ((Map<String, IBinder>)field.get(null)).put("isub", mISubBinderMock);
+        doReturn(mISubMock).when(mISubBinderMock).queryLocalInterface(any());
+    }
+
+    private void removeISubService() throws Exception {
+        Field field = ServiceManager.class.getDeclaredField("sCache");
+        field.setAccessible(true);
+        ((Map<String, IBinder>)field.get(null)).remove("isub");
+    }
+
     @Before
     public void setUp() throws Exception {
         super.setUp("ONSTest");
         mLooper = null;
         MockitoAnnotations.initMocks(this);
+        addISubService();
     }
 
     @After
     public void tearDown() throws Exception {
+        removeISubService();
         super.tearDown();
         if (mLooper != null) {
             mLooper.quit();
@@ -174,15 +200,16 @@
         assertFalse(mCallbackInvoked);
     }
 
-
     @Test
     public void testStartProfileSelectionSuccess() {
+        int subId = 5;
         List<SubscriptionInfo> subscriptionInfoList = new ArrayList<SubscriptionInfo>();
-        SubscriptionInfo subscriptionInfo = new SubscriptionInfo(5, "", 1, "TMO", "TMO", 1, 1,
+        SubscriptionInfo subscriptionInfo = new SubscriptionInfo(subId, "", 1, "TMO", "TMO", 1, 1,
             "123", 1, null, "310", "210", "", false, null, "1");
         SubscriptionInfo subscriptionInfo2 = new SubscriptionInfo(5, "", 1, "TMO", "TMO", 1, 1,
             "123", 1, null, "310", "211", "", false, null, "1");
         subscriptionInfoList.add(subscriptionInfo);
+        doReturn(subscriptionInfo).when(mSubscriptionManager).getActiveSubscriptionInfo(subId);
 
         List<CellInfo> results2 = new ArrayList<CellInfo>();
         CellIdentityLte cellIdentityLte = new CellIdentityLte(310, 210, 1, 1, 1);
@@ -191,7 +218,7 @@
         results2.add((CellInfo) cellInfoLte);
         ArrayList<String> mccMncs = new ArrayList<>();
         mccMncs.add("310210");
-        AvailableNetworkInfo availableNetworkInfo = new AvailableNetworkInfo(1, 1, mccMncs,
+        AvailableNetworkInfo availableNetworkInfo = new AvailableNetworkInfo(subId, 1, mccMncs,
             new ArrayList<Integer>());
         ArrayList<AvailableNetworkInfo> availableNetworkInfos = new ArrayList<AvailableNetworkInfo>();
         availableNetworkInfos.add(availableNetworkInfo);
@@ -211,7 +238,7 @@
                 Looper.prepare();
                 doReturn(subscriptionInfoList).when(mSubscriptionManager)
                     .getOpportunisticSubscriptions();
-                doReturn(true).when(mSubscriptionManager).isActiveSubId(anyInt());
+                doReturn(true).when(mSubscriptionManager).isActiveSubId(subId);
                 doReturn(true).when(mSubscriptionBoundTelephonyManager).enableModemForSlot(
                     anyInt(), anyBoolean());
                 mONSProfileSelector = new MyONSProfileSelector(mContext,
@@ -240,7 +267,7 @@
         mONSProfileSelector.mNetworkAvailableCallBackCpy.onNetworkAvailability(results2);
         Intent callbackIntent = new Intent(MyONSProfileSelector.ACTION_SUB_SWITCH);
         callbackIntent.putExtra("sequenceId", 1);
-        callbackIntent.putExtra("subId", 5);
+        callbackIntent.putExtra("subId", subId);
         waitUntilReady();
         assertEquals(TelephonyManager.UPDATE_AVAILABLE_NETWORKS_SUCCESS, mResult);
         assertTrue(mReady);
@@ -258,6 +285,8 @@
         SubscriptionInfo subscriptionInfo_2 = new SubscriptionInfo(8, "", 1, "Vzw", "Vzw", 1, 1,
                 "123", 1, null, "311", "480", "", false, null, "1");
         subscriptionInfoList.add(subscriptionInfo_2);
+        doReturn(subscriptionInfo).when(mSubscriptionManager).getActiveSubscriptionInfo(5);
+        doReturn(subscriptionInfo_2).when(mSubscriptionManager).getActiveSubscriptionInfo(8);
 
         List<CellInfo> results2 = new ArrayList<CellInfo>();
         CellIdentityLte cellIdentityLte = new CellIdentityLte(310, 210, 1, 1, 1);
@@ -331,6 +360,8 @@
             "123", 1, null, "310", "211", "", true, null, "1", false, null, 1839, 1);
         opportunisticSubscriptionInfoList.add(subscriptionInfo);
         activeSubscriptionInfoList.add(subscriptionInfo2);
+        doReturn(subscriptionInfo).when(mSubscriptionManager).getActiveSubscriptionInfo(5);
+        doReturn(subscriptionInfo2).when(mSubscriptionManager).getActiveSubscriptionInfo(6);
 
         ArrayList<String> mccMncs = new ArrayList<>();
         mccMncs.add("310210");
@@ -428,6 +459,7 @@
         SubscriptionInfo subscriptionInfo = new SubscriptionInfo(5, "", 1, "TMO", "TMO", 1, 1,
             "123", 1, null, "310", "210", "", false, null, "1");
         subscriptionInfoList.add(subscriptionInfo);
+        doReturn(subscriptionInfo).when(mSubscriptionManager).getActiveSubscriptionInfo(5);
         mReady = false;
         doReturn(new ArrayList<>()).when(mSubscriptionManager).getOpportunisticSubscriptions();
         new Thread(new Runnable() {
@@ -458,6 +490,7 @@
         SubscriptionInfo subscriptionInfo = new SubscriptionInfo(5, "", 1, "TMO", "TMO", 1, 1,
             "123", 1, null, "310", "210", "", false, null, "1");
         subscriptionInfoList.add(subscriptionInfo);
+        doReturn(subscriptionInfo).when(mSubscriptionManager).getActiveSubscriptionInfo(5);
         mReady = false;
         doReturn(subscriptionInfoList).when(mSubscriptionManager).getOpportunisticSubscriptions();
         doNothing().when(mSubscriptionManager).setPreferredDataSubscriptionId(
@@ -492,6 +525,7 @@
         SubscriptionInfo subscriptionInfo = new SubscriptionInfo(5, "", 1, "TMO", "TMO", 1, 1,
             "123", 1, null, "310", "210", "", false, null, "1");
         subscriptionInfoList.add(subscriptionInfo);
+        doReturn(subscriptionInfo).when(mSubscriptionManager).getActiveSubscriptionInfo(5);
         mReady = false;
         doReturn(subscriptionInfoList).when(mSubscriptionManager)
             .getActiveSubscriptionInfoList();
@@ -528,9 +562,11 @@
         List<SubscriptionInfo> subscriptionInfoList = new ArrayList<SubscriptionInfo>();
         SubscriptionInfo subscriptionInfo = new SubscriptionInfo(5, "", 1, "TMO", "TMO", 1, 1,
             "123", 1, null, "310", "210", "", false, null, "1");
-        SubscriptionInfo subscriptionInfo2 = new SubscriptionInfo(5, "", 1, "TMO", "TMO", 1, 1,
+        SubscriptionInfo subscriptionInfo2 = new SubscriptionInfo(6, "", 1, "TMO", "TMO", 1, 1,
             "123", 1, null, "310", "211", "", false, null, "1");
         subscriptionInfoList.add(subscriptionInfo);
+        doReturn(subscriptionInfo).when(mSubscriptionManager).getActiveSubscriptionInfo(5);
+        doReturn(subscriptionInfo2).when(mSubscriptionManager).getActiveSubscriptionInfo(6);
 
         List<CellInfo> results2 = new ArrayList<CellInfo>();
         CellIdentityLte cellIdentityLte = new CellIdentityLte(310, 210, 1, 1, 1);
@@ -539,7 +575,7 @@
         results2.add((CellInfo) cellInfoLte);
         ArrayList<String> mccMncs = new ArrayList<>();
         mccMncs.add("310210");
-        AvailableNetworkInfo availableNetworkInfo = new AvailableNetworkInfo(1, 1, mccMncs,
+        AvailableNetworkInfo availableNetworkInfo = new AvailableNetworkInfo(5, 1, mccMncs,
             new ArrayList<Integer>());
         ArrayList<AvailableNetworkInfo> availableNetworkInfos = new ArrayList<AvailableNetworkInfo>();
         availableNetworkInfos.add(availableNetworkInfo);
@@ -634,6 +670,7 @@
         SubscriptionInfo subscriptionInfo = new SubscriptionInfo(5, "", 1, "TMO", "TMO", 1, 1,
                 "123", 1, null, "310", "210", "", true, null, "1", true, null, 0, 0);
         subscriptionInfoList.add(subscriptionInfo);
+        doReturn(subscriptionInfo).when(mSubscriptionManager).getActiveSubscriptionInfo(5);
 
         IUpdateAvailableNetworksCallback mCallback = new IUpdateAvailableNetworksCallback.Stub() {
             @Override
@@ -673,7 +710,7 @@
         }).start();
         waitUntilReady();
         waitForMs(500);
-        assertEquals(mONSProfileSelector.getCurrentPreferredData(), SubscriptionManager.DEFAULT_SUBSCRIPTION_ID);
+        assertEquals(SubscriptionManager.DEFAULT_SUBSCRIPTION_ID, mONSProfileSelector.getCurrentPreferredData());
     }
 
     @Test
@@ -682,6 +719,7 @@
         SubscriptionInfo subscriptionInfo = new SubscriptionInfo(5, "", 1, "TMO", "TMO", 1, 1,
                 "123", 1, null, "310", "210", "", true, null, "1", true, null, 0, 0);
         subscriptionInfoList.add(subscriptionInfo);
+        doReturn(subscriptionInfo).when(mSubscriptionManager).getActiveSubscriptionInfo(5);
 
         IUpdateAvailableNetworksCallback mCallback = new IUpdateAvailableNetworksCallback.Stub() {
             @Override
@@ -723,5 +761,4 @@
         waitForMs(500);
         assertEquals(mONSProfileSelector.getCurrentPreferredData(), 5);
     }
-
 }
diff --git a/tests/src/com/android/ons/OpportunisticNetworkServiceTest.java b/tests/src/com/android/ons/OpportunisticNetworkServiceTest.java
index 05a7f17..0a75371 100644
--- a/tests/src/com/android/ons/OpportunisticNetworkServiceTest.java
+++ b/tests/src/com/android/ons/OpportunisticNetworkServiceTest.java
@@ -15,6 +15,7 @@
  */
 package com.android.ons;
 
+import static org.mockito.Mockito.any;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.times;
@@ -23,13 +24,15 @@
 import android.content.Intent;
 import android.os.Looper;
 import android.os.RemoteException;
-import android.os.ServiceManager;
 import android.telephony.AvailableNetworkInfo;
 import android.telephony.SubscriptionInfo;
 import android.telephony.SubscriptionManager;
+import android.telephony.TelephonyFrameworkInitializer;
 import android.telephony.TelephonyManager;
 import android.util.Log;
 
+import androidx.test.runner.AndroidJUnit4;
+
 import com.android.internal.telephony.IOns;
 import com.android.internal.telephony.ISetOpportunisticDataCallback;
 import com.android.internal.telephony.IUpdateAvailableNetworksCallback;
@@ -39,13 +42,10 @@
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
-import static org.mockito.Mockito.any;
 
 import java.util.ArrayList;
 import java.util.HashMap;
 
-import androidx.test.runner.AndroidJUnit4;
-
 @RunWith(AndroidJUnit4.class)
 public class OpportunisticNetworkServiceTest extends ONSBaseTest {
     private static final String TAG = "ONSTest";
@@ -67,30 +67,22 @@
     public void setUp() throws Exception {
         super.setUp("ONSTest");
         pkgForDebug = mContext != null ? mContext.getOpPackageName() : "<unknown>";
-        pkgForFeature = null;
+        pkgForFeature = mContext != null ? mContext.getAttributionTag() : null;
         Intent intent = new Intent(mContext, OpportunisticNetworkService.class);
         new Thread(new Runnable() {
             @Override
             public void run() {
                 Looper.prepare();
                 mOpportunisticNetworkService = new OpportunisticNetworkService();
-                mContext.startService(intent);
                 mOpportunisticNetworkService.initialize(mContext);
-                mOpportunisticNetworkService.mContext = mContext;
                 mOpportunisticNetworkService.mSubscriptionManager = mSubscriptionManager;
+                iOpportunisticNetworkService = (IOns) mOpportunisticNetworkService.onBind(null);
                 mLooper = Looper.myLooper();
+                setReady(true);
                 Looper.loop();
             }
         }).start();
-        iOpportunisticNetworkService = getIOns();
-        for (int i = 0; i < 5; i++) {
-            if (iOpportunisticNetworkService == null) {
-                waitForMs(500);
-                iOpportunisticNetworkService = getIOns();
-            } else {
-                break;
-            }
-        }
+        waitUntilReady(200);
     }
 
     @After
@@ -359,7 +351,11 @@
     }
 
     private IOns getIOns() {
-        return IOns.Stub.asInterface(ServiceManager.getService("ions"));
+        return IOns.Stub.asInterface(
+                TelephonyFrameworkInitializer
+                        .getTelephonyServiceManager()
+                        .getOpportunisticNetworkServiceRegisterer()
+                        .get());
     }
 
     public static void waitForMs(long ms) {