Merge "[Setting] Use @SystemApi to replace the hidden api"
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index ba74aa8..94b8e12 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -39,6 +39,7 @@
     <uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
     <uses-permission android:name="android.permission.INTERNET" />
     <uses-permission android:name="android.permission.CLEAR_APP_USER_DATA" />
+    <uses-permission android:name="android.permission.READ_PRIVILEGED_PHONE_STATE" />
     <uses-permission android:name="android.permission.READ_PHONE_STATE" />
     <uses-permission android:name="android.permission.MODIFY_PHONE_STATE" />
     <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
diff --git a/res/values/arrays.xml b/res/values/arrays.xml
index 65d9c2e..753e924 100644
--- a/res/values/arrays.xml
+++ b/res/values/arrays.xml
@@ -457,6 +457,11 @@
         <item>1xRTT</item>
         <item>IS95B</item>
         <item>IS95A</item>
+        <item>GSM</item>
+        <item>TD_SCDMA</item>
+        <item>IWLAN</item>
+        <item>LTE_CA</item>
+        <item>NR</item>
     </string-array>
 
     <string-array translatable="false" name="bearer_values">
@@ -492,6 +497,16 @@
         <item>5</item>
         <!-- Do not translate. -->
         <item>4</item>
+        <!-- Do not translate. -->
+        <item>16</item>
+        <!-- Do not translate. -->
+        <item>17</item>
+        <!-- Do not translate. -->
+        <item>18</item>
+        <!-- Do not translate. -->
+        <item>19</item>
+        <!-- Do not translate. -->
+        <item>20</item>
     </string-array>
 
     <!-- MVNO Info used in APN editor -->
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index f31a266..001578a 100755
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -218,8 +218,8 @@
     <dimen name="fingerprint_finish_max_size">288dp</dimen>
 
     <!-- Face -->
-    <dimen name="face_preview_translate_y">0dp</dimen>
-    <dimen name="face_preview_translate_x">0dp</dimen>
+    <item name="face_preview_translate_y" format="float" type="dimen">0</item>
+    <item name="face_preview_translate_x" format="float" type="dimen">0</item>
     <item name="face_preview_scale" format="float" type="dimen">1.0</item>
 
     <!-- Confirm device credentials -->
diff --git a/src/com/android/settings/SettingsDumpService.java b/src/com/android/settings/SettingsDumpService.java
index a57e983..501536a 100644
--- a/src/com/android/settings/SettingsDumpService.java
+++ b/src/com/android/settings/SettingsDumpService.java
@@ -103,7 +103,7 @@
         DataUsageController controller = new DataUsageController(this);
         ConnectivityManager connectivityManager = getSystemService(ConnectivityManager.class);
         SubscriptionManager manager = SubscriptionManager.from(this);
-        TelephonyManager telephonyManager = TelephonyManager.from(this);
+        TelephonyManager telephonyManager = this.getSystemService(TelephonyManager.class);
         if (connectivityManager.isNetworkSupported(ConnectivityManager.TYPE_MOBILE)) {
             JSONArray array = new JSONArray();
             for (SubscriptionInfo info : manager.getAllSubscriptionInfoList()) {
diff --git a/src/com/android/settings/biometrics/face/FaceEnrollPreviewFragment.java b/src/com/android/settings/biometrics/face/FaceEnrollPreviewFragment.java
index 8806712..853ca7c 100644
--- a/src/com/android/settings/biometrics/face/FaceEnrollPreviewFragment.java
+++ b/src/com/android/settings/biometrics/face/FaceEnrollPreviewFragment.java
@@ -18,6 +18,7 @@
 
 import android.app.settings.SettingsEnums;
 import android.content.Context;
+import android.graphics.Matrix;
 import android.graphics.SurfaceTexture;
 import android.hardware.camera2.CameraAccessException;
 import android.hardware.camera2.CameraCaptureSession;
@@ -316,14 +317,19 @@
         scaleX = scaleX / smaller;
         scaleY = scaleY / smaller;
 
-        // Apply the transformation/scale
-        mTextureView.setTranslationX(getResources().getDimension(R.dimen.face_preview_translate_x));
-        mTextureView.setTranslationY(getResources().getDimension(R.dimen.face_preview_translate_y));
-
+        final TypedValue tx = new TypedValue();
+        final TypedValue ty = new TypedValue();
         final TypedValue scale = new TypedValue();
+        getResources().getValue(R.dimen.face_preview_translate_x, tx, true /* resolveRefs */);
+        getResources().getValue(R.dimen.face_preview_translate_y, ty, true /* resolveRefs */);
         getResources().getValue(R.dimen.face_preview_scale, scale, true /* resolveRefs */);
-        mTextureView.setScaleX(scaleX * scale.getFloat());
-        mTextureView.setScaleY(scaleY * scale.getFloat());
+
+        // Apply the transformation/scale
+        final Matrix transform = new Matrix();
+        mTextureView.getTransform(transform);
+        transform.setScale(scaleX * scale.getFloat(), scaleY * scale.getFloat());
+        transform.postTranslate(tx.getFloat(), ty.getFloat());
+        mTextureView.setTransform(transform);
     }
 
     private void closeCamera() {
diff --git a/src/com/android/settings/datausage/DataUsageBaseFragment.java b/src/com/android/settings/datausage/DataUsageBaseFragment.java
index f6e88cc..299ce43 100644
--- a/src/com/android/settings/datausage/DataUsageBaseFragment.java
+++ b/src/com/android/settings/datausage/DataUsageBaseFragment.java
@@ -51,7 +51,7 @@
 
         services.mPolicyEditor = new NetworkPolicyEditor(services.mPolicyManager);
 
-        services.mTelephonyManager = TelephonyManager.from(context);
+        services.mTelephonyManager = context.getSystemService(TelephonyManager.class);
         services.mSubscriptionManager = SubscriptionManager.from(context);
         services.mUserManager = UserManager.get(context);
     }
diff --git a/src/com/android/settings/datausage/DataUsageUtils.java b/src/com/android/settings/datausage/DataUsageUtils.java
index 0e400a2..ef3e7b6 100644
--- a/src/com/android/settings/datausage/DataUsageUtils.java
+++ b/src/com/android/settings/datausage/DataUsageUtils.java
@@ -33,7 +33,6 @@
 import android.text.format.Formatter.BytesResult;
 import android.util.Log;
 
-import java.util.ArrayList;
 import java.util.List;
 
 /**
@@ -72,7 +71,7 @@
             return false;
         }
 
-        final TelephonyManager telephonyManager = TelephonyManager.from(context);
+        final TelephonyManager telephonyManager = context.getSystemService(TelephonyManager.class);
         final NetworkStatsManager networkStatsManager =
                 context.getSystemService(NetworkStatsManager.class);
         boolean hasEthernetUsage = false;
@@ -115,7 +114,7 @@
             }
             return false;
         }
-        final TelephonyManager tele = TelephonyManager.from(context);
+        final TelephonyManager tele = context.getSystemService(TelephonyManager.class);
         // require both supported network and ready SIM
         boolean isReady = true;
         for (SubscriptionInfo subInfo : subInfoList) {
diff --git a/src/com/android/settings/deviceinfo/OWNERS b/src/com/android/settings/deviceinfo/OWNERS
new file mode 100644
index 0000000..bedbe16
--- /dev/null
+++ b/src/com/android/settings/deviceinfo/OWNERS
@@ -0,0 +1,6 @@
+# Default reviewers for this and subdirectories.
+andychou@google.com
+bonianchen@google.com
+allenwtsu@google.com
+
+# Emergency approvers in case the above are not available
diff --git a/src/com/android/settings/deviceinfo/simstatus/SimStatusDialogController.java b/src/com/android/settings/deviceinfo/simstatus/SimStatusDialogController.java
index 0751141..26d8e2b 100644
--- a/src/com/android/settings/deviceinfo/simstatus/SimStatusDialogController.java
+++ b/src/com/android/settings/deviceinfo/simstatus/SimStatusDialogController.java
@@ -25,6 +25,7 @@
 import android.os.Bundle;
 import android.os.PersistableBundle;
 import android.os.UserHandle;
+import android.telephony.Annotation;
 import android.telephony.CarrierConfigManager;
 import android.telephony.CellSignalStrength;
 import android.telephony.PhoneStateListener;
@@ -35,12 +36,14 @@
 import android.telephony.SubscriptionManager;
 import android.telephony.SubscriptionManager.OnSubscriptionsChangedListener;
 import android.telephony.TelephonyManager;
+import android.telephony.UiccCardInfo;
 import android.telephony.euicc.EuiccManager;
 import android.text.TextUtils;
 
 import androidx.annotation.NonNull;
 import androidx.annotation.VisibleForTesting;
 
+import com.android.internal.telephony.PhoneConstants;
 import com.android.settings.R;
 import com.android.settingslib.DeviceInfoUtils;
 import com.android.settingslib.Utils;
@@ -50,6 +53,7 @@
 import com.android.settingslib.core.lifecycle.events.OnResume;
 
 import java.util.List;
+import java.util.Map;
 
 public class SimStatusDialogController implements LifecycleObserver, OnResume, OnPause {
 
@@ -82,6 +86,8 @@
     @VisibleForTesting
     final static int ICCID_INFO_VALUE_ID = R.id.icc_id_value;
     @VisibleForTesting
+    final static int EID_INFO_LABEL_ID = R.id.esim_id_label;
+    @VisibleForTesting
     final static int EID_INFO_VALUE_ID = R.id.esim_id_value;
     @VisibleForTesting
     final static int IMS_REGISTRATION_STATE_LABEL_ID = R.id.ims_reg_state_label;
@@ -100,15 +106,18 @@
                 public void onSubscriptionsChanged() {
                     mSubscriptionInfo = mSubscriptionManager.getActiveSubscriptionInfo(
                             mSubscriptionInfo.getSubscriptionId());
+                    mTelephonyManager = mTelephonyManager.createForSubscriptionId(
+                            mSubscriptionInfo.getSubscriptionId());
                     updateNetworkProvider();
                 }
             };
 
     private SubscriptionInfo mSubscriptionInfo;
-    private int mSlotIndex;
+
+    private final int mSlotIndex;
+    private TelephonyManager mTelephonyManager;
 
     private final SimStatusDialogFragment mDialog;
-    private final TelephonyManager mTelephonyManager;
     private final SubscriptionManager mSubscriptionManager;
     private final CarrierConfigManager mCarrierConfigManager;
     private final EuiccManager mEuiccManager;
@@ -166,11 +175,13 @@
         mPhoneStateListener = getPhoneStateListener();
         updateNetworkProvider();
 
-        final ServiceState serviceState = getCurrentServiceState();
+        final ServiceState serviceState = mTelephonyManager.getServiceState();
+        final SignalStrength signalStrength = mTelephonyManager.getSignalStrength();
+
         updatePhoneNumber();
         updateLatestAreaInfo();
         updateServiceState(serviceState);
-        updateSignalStrength(getSignalStrength());
+        updateSignalStrength(signalStrength);
         updateNetworkType();
         updateRoamingStatus(serviceState);
         updateIccidNumber();
@@ -182,12 +193,12 @@
         if (mSubscriptionInfo == null) {
             return;
         }
-
-        mTelephonyManager.createForSubscriptionId(mSubscriptionInfo.getSubscriptionId())
-                .listen(mPhoneStateListener,
-                        PhoneStateListener.LISTEN_DATA_CONNECTION_STATE
-                                | PhoneStateListener.LISTEN_SIGNAL_STRENGTHS
-                                | PhoneStateListener.LISTEN_SERVICE_STATE);
+        mTelephonyManager = mTelephonyManager.createForSubscriptionId(
+                mSubscriptionInfo.getSubscriptionId());
+        mTelephonyManager.listen(mPhoneStateListener,
+                PhoneStateListener.LISTEN_DATA_CONNECTION_STATE
+                        | PhoneStateListener.LISTEN_SIGNAL_STRENGTHS
+                        | PhoneStateListener.LISTEN_SERVICE_STATE);
         mSubscriptionManager.addOnSubscriptionsChangedListener(mOnSubscriptionsChangedListener);
 
         if (mShowLatestAreaInfo) {
@@ -209,8 +220,7 @@
         }
 
         mSubscriptionManager.removeOnSubscriptionsChangedListener(mOnSubscriptionsChangedListener);
-        mTelephonyManager.createForSubscriptionId(mSubscriptionInfo.getSubscriptionId())
-                .listen(mPhoneStateListener, PhoneStateListener.LISTEN_NONE);
+        mTelephonyManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_NONE);
 
         if (mShowLatestAreaInfo) {
             mContext.unregisterReceiver(mAreaInfoReceiver);
@@ -313,7 +323,7 @@
             return;
         }
 
-        ServiceState serviceState = getCurrentServiceState();
+        ServiceState serviceState = mTelephonyManager.getServiceState();
         if (serviceState == null || !Utils.isInService(serviceState)) {
             return;
         }
@@ -342,13 +352,13 @@
         String dataNetworkTypeName = null;
         String voiceNetworkTypeName = null;
         final int subId = mSubscriptionInfo.getSubscriptionId();
-        final int actualDataNetworkType = mTelephonyManager.getDataNetworkType(subId);
-        final int actualVoiceNetworkType = mTelephonyManager.getVoiceNetworkType(subId);
+        final int actualDataNetworkType = mTelephonyManager.getDataNetworkType();
+        final int actualVoiceNetworkType = mTelephonyManager.getVoiceNetworkType();
         if (TelephonyManager.NETWORK_TYPE_UNKNOWN != actualDataNetworkType) {
-            dataNetworkTypeName = mTelephonyManager.getNetworkTypeName(actualDataNetworkType);
+            dataNetworkTypeName = getNetworkTypeName(actualDataNetworkType);
         }
         if (TelephonyManager.NETWORK_TYPE_UNKNOWN != actualVoiceNetworkType) {
-            voiceNetworkTypeName = mTelephonyManager.getNetworkTypeName(actualVoiceNetworkType);
+            voiceNetworkTypeName = getNetworkTypeName(actualVoiceNetworkType);
         }
 
         boolean show4GForLTE = false;
@@ -393,15 +403,48 @@
             mDialog.removeSettingFromScreen(ICCID_INFO_LABEL_ID);
             mDialog.removeSettingFromScreen(ICCID_INFO_VALUE_ID);
         } else {
-            mDialog.setText(ICCID_INFO_VALUE_ID, getSimSerialNumber(subscriptionId));
+            mDialog.setText(ICCID_INFO_VALUE_ID, mTelephonyManager.getSimSerialNumber());
         }
     }
 
     private void updateEid() {
-        if (mEuiccManager.isEnabled()) {
-            mDialog.setText(EID_INFO_VALUE_ID, mEuiccManager.getEid());
-        } else {
+        boolean shouldHaveEid = false;
+        String eid = null;
+
+        if (mTelephonyManager.getPhoneCount() > PhoneConstants.MAX_PHONE_COUNT_SINGLE_SIM) {
+            // Get EID per-SIM in multi-SIM mode
+            Map<Integer, Integer> mapping = mTelephonyManager.getLogicalToPhysicalSlotMapping();
+            int pSlotId = mapping.getOrDefault(mSlotIndex,
+                    SubscriptionManager.INVALID_SIM_SLOT_INDEX);
+
+            if (pSlotId != SubscriptionManager.INVALID_SIM_SLOT_INDEX) {
+                List<UiccCardInfo> infos = mTelephonyManager.getUiccCardsInfo();
+
+                for (UiccCardInfo info : infos) {
+                    if (info.getSlotIndex() == pSlotId) {
+                        if (info.isEuicc()) {
+                            shouldHaveEid = true;
+                            eid = info.getEid();
+
+                            if (TextUtils.isEmpty(eid)) {
+                                eid = mEuiccManager.createForCardId(info.getCardId()).getEid();
+                            }
+                        }
+                        break;
+                    }
+                }
+            }
+        } else if (mEuiccManager.isEnabled()) {
+            // Get EID of default eSIM in single-SIM mode
+            shouldHaveEid = true;
+            eid = mEuiccManager.getEid();
+        }
+
+        if (!shouldHaveEid) {
+            mDialog.removeSettingFromScreen(EID_INFO_LABEL_ID);
             mDialog.removeSettingFromScreen(EID_INFO_VALUE_ID);
+        } else if (!TextUtils.isEmpty(eid)) {
+            mDialog.setText(EID_INFO_VALUE_ID, eid);
         }
     }
 
@@ -426,12 +469,6 @@
         return SubscriptionManager.from(mContext).getActiveSubscriptionInfoForSimSlotIndex(slotId);
     }
 
-    @VisibleForTesting
-    ServiceState getCurrentServiceState() {
-        return mTelephonyManager.getServiceStateForSubscriber(
-                mSubscriptionInfo.getSubscriptionId());
-    }
-
     private int getDbm(SignalStrength signalStrength) {
         List<CellSignalStrength> cellSignalStrengthList = signalStrength.getCellSignalStrengths();
         int dbm = -1;
@@ -490,12 +527,50 @@
     }
 
     @VisibleForTesting
-    SignalStrength getSignalStrength() {
-        return mTelephonyManager.getSignalStrength();
-    }
-
-    @VisibleForTesting
-    String getSimSerialNumber(int subscriptionId) {
-        return mTelephonyManager.getSimSerialNumber(subscriptionId);
+    static String getNetworkTypeName(@Annotation.NetworkType int type) {
+        switch (type) {
+            case TelephonyManager.NETWORK_TYPE_GPRS:
+                return "GPRS";
+            case TelephonyManager.NETWORK_TYPE_EDGE:
+                return "EDGE";
+            case TelephonyManager.NETWORK_TYPE_UMTS:
+                return "UMTS";
+            case TelephonyManager.NETWORK_TYPE_HSDPA:
+                return "HSDPA";
+            case TelephonyManager.NETWORK_TYPE_HSUPA:
+                return "HSUPA";
+            case TelephonyManager.NETWORK_TYPE_HSPA:
+                return "HSPA";
+            case TelephonyManager.NETWORK_TYPE_CDMA:
+                return "CDMA";
+            case TelephonyManager.NETWORK_TYPE_EVDO_0:
+                return "CDMA - EvDo rev. 0";
+            case TelephonyManager.NETWORK_TYPE_EVDO_A:
+                return "CDMA - EvDo rev. A";
+            case TelephonyManager.NETWORK_TYPE_EVDO_B:
+                return "CDMA - EvDo rev. B";
+            case TelephonyManager.NETWORK_TYPE_1xRTT:
+                return "CDMA - 1xRTT";
+            case TelephonyManager.NETWORK_TYPE_LTE:
+                return "LTE";
+            case TelephonyManager.NETWORK_TYPE_EHRPD:
+                return "CDMA - eHRPD";
+            case TelephonyManager.NETWORK_TYPE_IDEN:
+                return "iDEN";
+            case TelephonyManager.NETWORK_TYPE_HSPAP:
+                return "HSPA+";
+            case TelephonyManager.NETWORK_TYPE_GSM:
+                return "GSM";
+            case TelephonyManager.NETWORK_TYPE_TD_SCDMA:
+                return "TD_SCDMA";
+            case TelephonyManager.NETWORK_TYPE_IWLAN:
+                return "IWLAN";
+            case TelephonyManager.NETWORK_TYPE_LTE_CA:
+                return "LTE_CA";
+            case TelephonyManager.NETWORK_TYPE_NR:
+                return "NR";
+            default:
+                return "UNKNOWN";
+        }
     }
 }
diff --git a/src/com/android/settings/network/MobileDataContentObserver.java b/src/com/android/settings/network/MobileDataContentObserver.java
index b8a1c8c..15e726f 100644
--- a/src/com/android/settings/network/MobileDataContentObserver.java
+++ b/src/com/android/settings/network/MobileDataContentObserver.java
@@ -33,9 +33,13 @@
         super(handler);
     }
 
-    public static Uri getObservableUri(int subId) {
+    /**
+     * Return a URI of mobile data(ON vs OFF)
+     */
+    public static Uri getObservableUri(Context context, int subId) {
         Uri uri = Settings.Global.getUriFor(Settings.Global.MOBILE_DATA);
-        if (TelephonyManager.getDefault().getSimCount() != 1) {
+        TelephonyManager telephonyManager = context.getSystemService(TelephonyManager.class);
+        if (telephonyManager.getSimCount() != 1) {
             uri = Settings.Global.getUriFor(Settings.Global.MOBILE_DATA + subId);
         }
         return uri;
@@ -54,7 +58,7 @@
     }
 
     public void register(Context context, int subId) {
-        final Uri uri = getObservableUri(subId);
+        final Uri uri = getObservableUri(context, subId);
         context.getContentResolver().registerContentObserver(uri, false, this);
 
     }
diff --git a/src/com/android/settings/network/OWNERS b/src/com/android/settings/network/OWNERS
new file mode 100644
index 0000000..bedbe16
--- /dev/null
+++ b/src/com/android/settings/network/OWNERS
@@ -0,0 +1,6 @@
+# Default reviewers for this and subdirectories.
+andychou@google.com
+bonianchen@google.com
+allenwtsu@google.com
+
+# Emergency approvers in case the above are not available
diff --git a/src/com/android/settings/network/telephony/DataServiceSetupPreferenceController.java b/src/com/android/settings/network/telephony/DataServiceSetupPreferenceController.java
index d1fbd73..46f398c 100644
--- a/src/com/android/settings/network/telephony/DataServiceSetupPreferenceController.java
+++ b/src/com/android/settings/network/telephony/DataServiceSetupPreferenceController.java
@@ -63,7 +63,8 @@
 
     public void init(int subId) {
         mSubId = subId;
-        mTelephonyManager = TelephonyManager.from(mContext).createForSubscriptionId(mSubId);
+        mTelephonyManager = mContext.getSystemService(TelephonyManager.class)
+                .createForSubscriptionId(mSubId);
     }
 
     @Override
diff --git a/src/com/android/settings/network/telephony/EnabledNetworkModePreferenceController.java b/src/com/android/settings/network/telephony/EnabledNetworkModePreferenceController.java
index 3abb36a..675a1ba 100644
--- a/src/com/android/settings/network/telephony/EnabledNetworkModePreferenceController.java
+++ b/src/com/android/settings/network/telephony/EnabledNetworkModePreferenceController.java
@@ -27,7 +27,6 @@
 import android.provider.Settings;
 import android.telephony.CarrierConfigManager;
 import android.telephony.RadioAccessFamily;
-import android.telephony.ServiceState;
 import android.telephony.SubscriptionManager;
 import android.telephony.TelephonyManager;
 import android.text.TextUtils;
@@ -148,7 +147,8 @@
     public void init(Lifecycle lifecycle, int subId) {
         mSubId = subId;
         final PersistableBundle carrierConfig = mCarrierConfigManager.getConfigForSubId(mSubId);
-        mTelephonyManager = TelephonyManager.from(mContext).createForSubscriptionId(mSubId);
+        mTelephonyManager = mContext.getSystemService(TelephonyManager.class)
+                .createForSubscriptionId(mSubId);
 
         final boolean isLteOnCdma =
                 mTelephonyManager.getLteOnCdmaMode() == PhoneConstants.LTE_ON_CDMA_TRUE;
diff --git a/src/com/android/settings/network/telephony/MmsMessagePreferenceController.java b/src/com/android/settings/network/telephony/MmsMessagePreferenceController.java
index b8d2081..c1f2949 100644
--- a/src/com/android/settings/network/telephony/MmsMessagePreferenceController.java
+++ b/src/com/android/settings/network/telephony/MmsMessagePreferenceController.java
@@ -91,7 +91,8 @@
 
     public void init(int subId) {
         mSubId = subId;
-        mTelephonyManager = TelephonyManager.from(mContext).createForSubscriptionId(mSubId);
+        mTelephonyManager = mContext.getSystemService(TelephonyManager.class)
+                .createForSubscriptionId(mSubId);
     }
 
     @Override
diff --git a/src/com/android/settings/network/telephony/MobileDataPreferenceController.java b/src/com/android/settings/network/telephony/MobileDataPreferenceController.java
index c06b78b..f18340a 100644
--- a/src/com/android/settings/network/telephony/MobileDataPreferenceController.java
+++ b/src/com/android/settings/network/telephony/MobileDataPreferenceController.java
@@ -138,7 +138,8 @@
     public void init(FragmentManager fragmentManager, int subId) {
         mFragmentManager = fragmentManager;
         mSubId = subId;
-        mTelephonyManager = TelephonyManager.from(mContext).createForSubscriptionId(mSubId);
+        mTelephonyManager = mContext.getSystemService(TelephonyManager.class)
+                .createForSubscriptionId(mSubId);
     }
 
     @VisibleForTesting
diff --git a/src/com/android/settings/network/telephony/MobileDataSlice.java b/src/com/android/settings/network/telephony/MobileDataSlice.java
index 152028c..c70ae1a 100644
--- a/src/com/android/settings/network/telephony/MobileDataSlice.java
+++ b/src/com/android/settings/network/telephony/MobileDataSlice.java
@@ -252,7 +252,7 @@
             }
 
             public void register(Context context, int subId) {
-                final Uri uri = MobileDataContentObserver.getObservableUri(subId);
+                final Uri uri = MobileDataContentObserver.getObservableUri(context, subId);
                 context.getContentResolver().registerContentObserver(uri, false, this);
             }
 
diff --git a/src/com/android/settings/network/telephony/MobileNetworkSettings.java b/src/com/android/settings/network/telephony/MobileNetworkSettings.java
index f1e0819..004291a 100644
--- a/src/com/android/settings/network/telephony/MobileNetworkSettings.java
+++ b/src/com/android/settings/network/telephony/MobileNetworkSettings.java
@@ -187,7 +187,8 @@
         final Context context = getContext();
 
         mUserManager = (UserManager) context.getSystemService(Context.USER_SERVICE);
-        mTelephonyManager = TelephonyManager.from(context).createForSubscriptionId(mSubId);
+        mTelephonyManager = context.getSystemService(TelephonyManager.class)
+                .createForSubscriptionId(mSubId);
 
         onRestoreInstance(icicle);
     }
diff --git a/src/com/android/settings/network/telephony/PreferredNetworkModePreferenceController.java b/src/com/android/settings/network/telephony/PreferredNetworkModePreferenceController.java
index 7b24a93..89e2d5b8 100644
--- a/src/com/android/settings/network/telephony/PreferredNetworkModePreferenceController.java
+++ b/src/com/android/settings/network/telephony/PreferredNetworkModePreferenceController.java
@@ -20,7 +20,6 @@
 import android.os.PersistableBundle;
 import android.provider.Settings;
 import android.telephony.CarrierConfigManager;
-import android.telephony.ServiceState;
 import android.telephony.SubscriptionManager;
 import android.telephony.TelephonyManager;
 
@@ -97,7 +96,8 @@
     public void init(int subId) {
         mSubId = subId;
         final PersistableBundle carrierConfig = mCarrierConfigManager.getConfigForSubId(mSubId);
-        mTelephonyManager = TelephonyManager.from(mContext).createForSubscriptionId(mSubId);
+        mTelephonyManager = mContext.getSystemService(TelephonyManager.class)
+                .createForSubscriptionId(mSubId);
 
         final boolean isLteOnCdma =
                 mTelephonyManager.getLteOnCdmaMode() == PhoneConstants.LTE_ON_CDMA_TRUE;
diff --git a/src/com/android/settings/network/telephony/cdma/CdmaBasePreferenceController.java b/src/com/android/settings/network/telephony/cdma/CdmaBasePreferenceController.java
index ea7d82f..07805b0 100644
--- a/src/com/android/settings/network/telephony/cdma/CdmaBasePreferenceController.java
+++ b/src/com/android/settings/network/telephony/cdma/CdmaBasePreferenceController.java
@@ -73,7 +73,8 @@
     public void init(PreferenceManager preferenceManager, int subId) {
         mPreferenceManager = preferenceManager;
         mSubId = subId;
-        mTelephonyManager = TelephonyManager.from(mContext).createForSubscriptionId(mSubId);
+        mTelephonyManager = mContext.getSystemService(TelephonyManager.class)
+                .createForSubscriptionId(mSubId);
     }
 
     public void init(int subId) {
diff --git a/src/com/android/settings/network/telephony/cdma/CdmaListPreference.java b/src/com/android/settings/network/telephony/cdma/CdmaListPreference.java
index 14c7169..2cb1840 100644
--- a/src/com/android/settings/network/telephony/cdma/CdmaListPreference.java
+++ b/src/com/android/settings/network/telephony/cdma/CdmaListPreference.java
@@ -41,6 +41,7 @@
     }
 
     public void setSubId(int subId) {
-        mTelephonyManager = TelephonyManager.from(getContext()).createForSubscriptionId(subId);
+        mTelephonyManager = getContext().getSystemService(TelephonyManager.class)
+                .createForSubscriptionId(subId);
     }
 }
diff --git a/src/com/android/settings/network/telephony/gsm/AutoSelectPreferenceController.java b/src/com/android/settings/network/telephony/gsm/AutoSelectPreferenceController.java
index 56d0b2d..626390a 100644
--- a/src/com/android/settings/network/telephony/gsm/AutoSelectPreferenceController.java
+++ b/src/com/android/settings/network/telephony/gsm/AutoSelectPreferenceController.java
@@ -144,7 +144,8 @@
 
     public AutoSelectPreferenceController init(int subId) {
         mSubId = subId;
-        mTelephonyManager = TelephonyManager.from(mContext).createForSubscriptionId(mSubId);
+        mTelephonyManager = mContext.getSystemService(TelephonyManager.class)
+                .createForSubscriptionId(mSubId);
         final PersistableBundle carrierConfig = mContext.getSystemService(
                 CarrierConfigManager.class).getConfigForSubId(mSubId);
         mOnlyAutoSelectInHome = carrierConfig != null
@@ -187,4 +188,4 @@
     public interface OnNetworkSelectModeListener {
         void onNetworkSelectModeChanged();
     }
-}
\ No newline at end of file
+}
diff --git a/src/com/android/settings/network/telephony/gsm/OpenNetworkSelectPagePreferenceController.java b/src/com/android/settings/network/telephony/gsm/OpenNetworkSelectPagePreferenceController.java
index d679373..8c3928d 100644
--- a/src/com/android/settings/network/telephony/gsm/OpenNetworkSelectPagePreferenceController.java
+++ b/src/com/android/settings/network/telephony/gsm/OpenNetworkSelectPagePreferenceController.java
@@ -29,7 +29,6 @@
 import androidx.preference.PreferenceScreen;
 
 import com.android.settings.R;
-import com.android.settings.core.BasePreferenceController;
 import com.android.settings.core.SubSettingLauncher;
 import com.android.settings.network.telephony.MobileNetworkUtils;
 import com.android.settings.network.telephony.NetworkSelectSettings;
@@ -100,7 +99,8 @@
 
     public OpenNetworkSelectPagePreferenceController init(int subId) {
         mSubId = subId;
-        mTelephonyManager = TelephonyManager.from(mContext).createForSubscriptionId(mSubId);
+        mTelephonyManager = mContext.getSystemService(TelephonyManager.class)
+                .createForSubscriptionId(mSubId);
         return this;
     }
 
diff --git a/src/com/android/settings/sim/OWNERS b/src/com/android/settings/sim/OWNERS
new file mode 100644
index 0000000..bedbe16
--- /dev/null
+++ b/src/com/android/settings/sim/OWNERS
@@ -0,0 +1,6 @@
+# Default reviewers for this and subdirectories.
+andychou@google.com
+bonianchen@google.com
+allenwtsu@google.com
+
+# Emergency approvers in case the above are not available
diff --git a/src/com/android/settings/slices/SliceBuilderUtils.java b/src/com/android/settings/slices/SliceBuilderUtils.java
index 0714b03..b3ddc58 100644
--- a/src/com/android/settings/slices/SliceBuilderUtils.java
+++ b/src/com/android/settings/slices/SliceBuilderUtils.java
@@ -240,6 +240,8 @@
         searchDestination.putExtra(SettingsActivity.EXTRA_FRAGMENT_ARG_KEY, key)
                 .setAction("com.android.settings.SEARCH_RESULT_TRAMPOLINE")
                 .setComponent(null);
+        searchDestination.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
+
         return searchDestination;
     }
 
diff --git a/tests/robotests/src/com/android/settings/deviceinfo/simstatus/SimStatusDialogControllerTest.java b/tests/robotests/src/com/android/settings/deviceinfo/simstatus/SimStatusDialogControllerTest.java
index 2c0b4fc..782fb25 100644
--- a/tests/robotests/src/com/android/settings/deviceinfo/simstatus/SimStatusDialogControllerTest.java
+++ b/tests/robotests/src/com/android/settings/deviceinfo/simstatus/SimStatusDialogControllerTest.java
@@ -18,6 +18,7 @@
 
 import static com.android.settings.deviceinfo.simstatus.SimStatusDialogController.CELL_DATA_NETWORK_TYPE_VALUE_ID;
 import static com.android.settings.deviceinfo.simstatus.SimStatusDialogController.CELL_VOICE_NETWORK_TYPE_VALUE_ID;
+import static com.android.settings.deviceinfo.simstatus.SimStatusDialogController.EID_INFO_LABEL_ID;
 import static com.android.settings.deviceinfo.simstatus.SimStatusDialogController.EID_INFO_VALUE_ID;
 import static com.android.settings.deviceinfo.simstatus.SimStatusDialogController.ICCID_INFO_LABEL_ID;
 import static com.android.settings.deviceinfo.simstatus.SimStatusDialogController.ICCID_INFO_VALUE_ID;
@@ -55,10 +56,12 @@
 import android.telephony.SubscriptionInfo;
 import android.telephony.SubscriptionManager;
 import android.telephony.TelephonyManager;
+import android.telephony.UiccCardInfo;
 import android.telephony.euicc.EuiccManager;
 
 import androidx.lifecycle.LifecycleOwner;
 
+import com.android.internal.telephony.PhoneConstants;
 import com.android.settings.R;
 import com.android.settings.testutils.shadow.ShadowDeviceInfoUtils;
 import com.android.settingslib.DeviceInfoUtils;
@@ -79,7 +82,9 @@
 import org.robolectric.util.ReflectionHelpers;
 
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 @RunWith(RobolectricTestRunner.class)
 @Config(shadows = {ShadowDeviceInfoUtils.class})
@@ -117,6 +122,9 @@
     private LifecycleOwner mLifecycleOwner;
     private Lifecycle mLifecycle;
 
+    private static final String TEST_EID_FROM_CARD = "11111111111111111111111111111111";
+    private static final String TEST_EID_FROM_MANAGER = "22222222222222222222222222222222";
+
     @Before
     public void setup() {
         MockitoAnnotations.initMocks(this);
@@ -126,7 +134,6 @@
         mLifecycle = new Lifecycle(mLifecycleOwner);
         mController = spy(new SimStatusDialogController(mDialog, mLifecycle, 0 /* phone id */));
         ShadowDeviceInfoUtils.setPhoneNumber("");
-        doReturn(mServiceState).when(mController).getCurrentServiceState();
         //CellSignalStrength setup
         doReturn(0).when(mCellSignalStrengthCdma).getDbm();
         doReturn(0).when(mCellSignalStrengthCdma).getAsuLevel();
@@ -137,20 +144,31 @@
 
         doReturn(null).when(mSignalStrength).getCellSignalStrengths();
         doReturn(mPhoneStateListener).when(mController).getPhoneStateListener();
-        doReturn(mSignalStrength).when(mController).getSignalStrength();
         doReturn(mSubscriptionInfo).when(mSubscriptionManager).getActiveSubscriptionInfo(anyInt());
 
-        when(mEuiccManager.isEnabled()).thenReturn(true);
-        when(mEuiccManager.getEid()).thenReturn("");
         ReflectionHelpers.setField(mController, "mTelephonyManager", mTelephonyManager);
         ReflectionHelpers.setField(mController, "mCarrierConfigManager", mCarrierConfigManager);
         ReflectionHelpers.setField(mController, "mSubscriptionInfo", mSubscriptionInfo);
         ReflectionHelpers.setField(mController, "mEuiccManager", mEuiccManager);
         ReflectionHelpers.setField(mController, "mSubscriptionManager", mSubscriptionManager);
+
+        when(mTelephonyManager.getPhoneCount()).thenReturn(
+                PhoneConstants.MAX_PHONE_COUNT_SINGLE_SIM);
+        when(mTelephonyManager.getUiccCardsInfo()).thenReturn(new ArrayList<UiccCardInfo>());
+        when(mTelephonyManager.getLogicalToPhysicalSlotMapping()).thenReturn(
+                new HashMap<Integer, Integer>());
+
+        when(mEuiccManager.isEnabled()).thenReturn(false);
+        when(mEuiccManager.getEid()).thenReturn("");
+        when(mEuiccManager.createForCardId(anyInt())).thenReturn(mEuiccManager);
+
         when(mCarrierConfigManager.getConfigForSubId(anyInt())).thenReturn(mPersistableBundle);
         when(mPersistableBundle.getBoolean(
                 CarrierConfigManager.KEY_SHOW_SIGNAL_STRENGTH_IN_SIM_STATUS_BOOL))
                 .thenReturn(true);
+        when(mTelephonyManager.createForSubscriptionId(anyInt())).thenReturn(mTelephonyManager);
+        doReturn(mServiceState).when(mTelephonyManager).getServiceState();
+        doReturn(mSignalStrength).when(mTelephonyManager).getSignalStrength();
 
         final ShadowPackageManager shadowPackageManager =
                 Shadows.shadowOf(RuntimeEnvironment.application.getPackageManager());
@@ -313,25 +331,25 @@
     @Test
     @Ignore
     public void initialize_updateVoiceNetworkTypeWithEdge_shouldUpdateSettingToEdge() {
-        when(mTelephonyManager.getVoiceNetworkType(anyInt())).thenReturn(
+        when(mTelephonyManager.getVoiceNetworkType()).thenReturn(
                 TelephonyManager.NETWORK_TYPE_EDGE);
 
         mController.initialize();
 
         verify(mDialog).setText(CELL_VOICE_NETWORK_TYPE_VALUE_ID,
-                TelephonyManager.getNetworkTypeName(TelephonyManager.NETWORK_TYPE_EDGE));
+                SimStatusDialogController.getNetworkTypeName(TelephonyManager.NETWORK_TYPE_EDGE));
     }
 
     @Test
     @Ignore
     public void initialize_updateDataNetworkTypeWithEdge_shouldUpdateSettingToEdge() {
-        when(mTelephonyManager.getDataNetworkType(anyInt())).thenReturn(
+        when(mTelephonyManager.getDataNetworkType()).thenReturn(
                 TelephonyManager.NETWORK_TYPE_EDGE);
 
         mController.initialize();
 
         verify(mDialog).setText(CELL_DATA_NETWORK_TYPE_VALUE_ID,
-                TelephonyManager.getNetworkTypeName(TelephonyManager.NETWORK_TYPE_EDGE));
+                SimStatusDialogController.getNetworkTypeName(TelephonyManager.NETWORK_TYPE_EDGE));
     }
 
     @Test
@@ -400,7 +418,7 @@
         final String iccid = "12351351231241";
         when(mPersistableBundle.getBoolean(
                 CarrierConfigManager.KEY_SHOW_ICCID_IN_SIM_STATUS_BOOL)).thenReturn(true);
-        doReturn(iccid).when(mController).getSimSerialNumber(anyInt());
+        doReturn(iccid).when(mTelephonyManager).getSimSerialNumber();
 
         mController.initialize();
 
@@ -408,25 +426,283 @@
     }
 
     @Test
-    @Ignore
-    public void initialize_showEid_shouldSetEidToSetting() {
-        final String eid = "12351351231241";
-        when(mEuiccManager.getEid()).thenReturn(eid);
+    public void initialize_updateEid_shouldNotSetEid() {
+        when(mTelephonyManager.getPhoneCount()).thenReturn(PhoneConstants.MAX_PHONE_COUNT_DUAL_SIM);
+
+        ArrayList<UiccCardInfo> uiccCardInfos = new ArrayList<>();
+        UiccCardInfo uiccCardInfo1 = new UiccCardInfo(
+                false,                                  // isEuicc
+                0,                                      // cardId
+                null,                                   // eid
+                "123451234567890",                      // iccid
+                0,                                      // slotIndex
+                true);                                  // isRemovable
+        uiccCardInfos.add(uiccCardInfo1);
+        UiccCardInfo uiccCardInfo2 = new UiccCardInfo(
+                true,                                   // isEuicc
+                1,                                      // cardId
+                null,                                   // eid (unavailable)
+                null,                                   // iccid
+                1,                                      // slotIndex
+                false);                                 // isRemovable
+        uiccCardInfos.add(uiccCardInfo2);
+        when(mTelephonyManager.getUiccCardsInfo()).thenReturn(uiccCardInfos);
+
+        Map<Integer, Integer> slotMapping = new HashMap<>();
+        slotMapping.put(0, 1);
+        slotMapping.put(1, 0);
+        when(mTelephonyManager.getLogicalToPhysicalSlotMapping()).thenReturn(slotMapping);
+
+        when(mEuiccManager.isEnabled()).thenReturn(true);
+        when(mEuiccManager.getEid()).thenReturn(null);
 
         mController.initialize();
 
-        verify(mDialog).setText(EID_INFO_VALUE_ID, eid);
+        // Keep 'Not available' if neither the card nor the associated manager can provide EID.
+        verify(mDialog, never()).setText(eq(EID_INFO_VALUE_ID), any());
         verify(mDialog, never()).removeSettingFromScreen(eq(EID_INFO_VALUE_ID));
     }
 
     @Test
-    @Ignore
-    public void initialize_showEid_euiccManagerIsNotEnabled() {
-        when(mEuiccManager.isEnabled()).thenReturn(false);
+    public void initialize_updateEid_shouldSetEidFromCard() {
+        when(mTelephonyManager.getPhoneCount()).thenReturn(PhoneConstants.MAX_PHONE_COUNT_DUAL_SIM);
+
+        ArrayList<UiccCardInfo> uiccCardInfos = new ArrayList<>();
+        UiccCardInfo uiccCardInfo1 = new UiccCardInfo(
+                true,                                   // isEuicc
+                0,                                      // cardId
+                TEST_EID_FROM_CARD,                     // eid
+                null,                                   // iccid
+                0,                                      // slotIndex
+                false);                                 // isRemovable
+        uiccCardInfos.add(uiccCardInfo1);
+        UiccCardInfo uiccCardInfo2 = new UiccCardInfo(
+                false,                                  // isEuicc
+                1,                                      // cardId
+                null,                                   // eid
+                "123451234567890",                      // iccid
+                1,                                      // slotIndex
+                true);                                  // isRemovable
+        uiccCardInfos.add(uiccCardInfo2);
+        when(mTelephonyManager.getUiccCardsInfo()).thenReturn(uiccCardInfos);
+
+        Map<Integer, Integer> slotMapping = new HashMap<>();
+        slotMapping.put(0, 0);
+        slotMapping.put(1, 1);
+        when(mTelephonyManager.getLogicalToPhysicalSlotMapping()).thenReturn(slotMapping);
+
+        when(mEuiccManager.isEnabled()).thenReturn(true);
+        when(mEuiccManager.getEid()).thenReturn(TEST_EID_FROM_MANAGER);
 
         mController.initialize();
 
+        // Set EID retrieved from the card.
+        verify(mDialog).setText(EID_INFO_VALUE_ID, TEST_EID_FROM_CARD);
+        verify(mDialog, never()).removeSettingFromScreen(eq(EID_INFO_VALUE_ID));
+    }
+
+    @Test
+    public void initialize_updateEid_shouldSetEidFromManager() {
+        when(mTelephonyManager.getPhoneCount()).thenReturn(PhoneConstants.MAX_PHONE_COUNT_DUAL_SIM);
+
+        ArrayList<UiccCardInfo> uiccCardInfos = new ArrayList<>();
+        UiccCardInfo uiccCardInfo1 = new UiccCardInfo(
+                false,                                  // isEuicc
+                0,                                      // cardId
+                null,                                   // eid
+                "123451234567890",                      // iccid
+                0,                                      // slotIndex
+                true);                                  // isRemovable
+        uiccCardInfos.add(uiccCardInfo1);
+        UiccCardInfo uiccCardInfo2 = new UiccCardInfo(
+                true,                                   // isEuicc
+                1,                                      // cardId
+                null,                                   // eid (unavailable)
+                null,                                   // iccid
+                1,                                      // slotIndex
+                false);                                 // isRemovable
+        uiccCardInfos.add(uiccCardInfo2);
+        when(mTelephonyManager.getUiccCardsInfo()).thenReturn(uiccCardInfos);
+
+        Map<Integer, Integer> slotMapping = new HashMap<>();
+        slotMapping.put(0, 1);
+        slotMapping.put(1, 0);
+        when(mTelephonyManager.getLogicalToPhysicalSlotMapping()).thenReturn(slotMapping);
+
+        when(mEuiccManager.isEnabled()).thenReturn(true);
+        when(mEuiccManager.getEid()).thenReturn(TEST_EID_FROM_MANAGER);
+        when(mEuiccManager.createForCardId(0)).thenThrow(
+                new RuntimeException("Unexpected card ID was specified"));
+        when(mEuiccManager.createForCardId(1)).thenReturn(mEuiccManager);
+
+        mController.initialize();
+
+        // Set EID retrieved from the manager associated with the card which cannot provide EID.
+        verify(mDialog).setText(EID_INFO_VALUE_ID, TEST_EID_FROM_MANAGER);
+        verify(mDialog, never()).removeSettingFromScreen(eq(EID_INFO_VALUE_ID));
+    }
+
+    @Test
+    public void initialize_updateEid_shouldRemoveEid() {
+        when(mTelephonyManager.getPhoneCount()).thenReturn(PhoneConstants.MAX_PHONE_COUNT_DUAL_SIM);
+
+        ArrayList<UiccCardInfo> uiccCardInfos = new ArrayList<>();
+        UiccCardInfo uiccCardInfo1 = new UiccCardInfo(
+                false,                                  // isEuicc
+                0,                                      // cardId
+                null,                                   // eid
+                "123451234567890",                      // iccid
+                0,                                      // slotIndex
+                true);                                  // isRemovable
+        uiccCardInfos.add(uiccCardInfo1);
+        UiccCardInfo uiccCardInfo2 = new UiccCardInfo(
+                true,                                   // isEuicc
+                1,                                      // cardId
+                TEST_EID_FROM_CARD,                     // eid
+                null,                                   // iccid
+                1,                                      // slotIndex
+                false);                                 // isRemovable
+        uiccCardInfos.add(uiccCardInfo2);
+        when(mTelephonyManager.getUiccCardsInfo()).thenReturn(uiccCardInfos);
+
+        Map<Integer, Integer> slotMapping = new HashMap<>();
+        slotMapping.put(0, 0);
+        slotMapping.put(1, 1);
+        when(mTelephonyManager.getLogicalToPhysicalSlotMapping()).thenReturn(slotMapping);
+
+        when(mEuiccManager.isEnabled()).thenReturn(true);
+        when(mEuiccManager.getEid()).thenReturn(TEST_EID_FROM_MANAGER);
+
+        mController.initialize();
+
+        // Remove EID if the card is not eUICC.
         verify(mDialog, never()).setText(eq(EID_INFO_VALUE_ID), any());
+        verify(mDialog).removeSettingFromScreen(eq(EID_INFO_LABEL_ID));
+        verify(mDialog).removeSettingFromScreen(eq(EID_INFO_VALUE_ID));
+    }
+
+    @Test
+    public void initialize_updateEid_shouldNotSetEidInSingleSimMode() {
+        when(mTelephonyManager.getPhoneCount()).thenReturn(
+                PhoneConstants.MAX_PHONE_COUNT_SINGLE_SIM);
+
+        ArrayList<UiccCardInfo> uiccCardInfos = new ArrayList<>();
+        UiccCardInfo uiccCardInfo = new UiccCardInfo(
+                true,                                   // isEuicc
+                0,                                      // cardId
+                TEST_EID_FROM_CARD,                     // eid (not used)
+                null,                                   // iccid
+                0,                                      // slotIndex
+                false);                                 // isRemovable
+        uiccCardInfos.add(uiccCardInfo);
+        when(mTelephonyManager.getUiccCardsInfo()).thenReturn(uiccCardInfos);
+
+        Map<Integer, Integer> slotMapping = new HashMap<>();
+        slotMapping.put(0, 0);
+        when(mTelephonyManager.getLogicalToPhysicalSlotMapping()).thenReturn(slotMapping);
+
+        when(mEuiccManager.isEnabled()).thenReturn(true);
+        when(mEuiccManager.getEid()).thenReturn(null);
+
+        mController.initialize();
+
+        // Keep 'Not available' if the default eUICC manager cannot provide EID in Single SIM mode.
+        verify(mDialog, never()).setText(eq(EID_INFO_VALUE_ID), any());
+        verify(mDialog, never()).removeSettingFromScreen(eq(EID_INFO_VALUE_ID));
+    }
+
+    @Test
+    public void initialize_updateEid_shouldSetEidInSingleSimModeWithEnabledEuicc() {
+        when(mTelephonyManager.getPhoneCount()).thenReturn(
+                PhoneConstants.MAX_PHONE_COUNT_SINGLE_SIM);
+
+        ArrayList<UiccCardInfo> uiccCardInfos = new ArrayList<>();
+        UiccCardInfo uiccCardInfo = new UiccCardInfo(
+                true,                                   // isEuicc (eUICC slot is selected)
+                0,                                      // cardId
+                TEST_EID_FROM_CARD,                     // eid (not used)
+                null,                                   // iccid
+                0,                                      // slotIndex
+                false);                                 // isRemovable
+        uiccCardInfos.add(uiccCardInfo);
+        when(mTelephonyManager.getUiccCardsInfo()).thenReturn(uiccCardInfos);
+
+        Map<Integer, Integer> slotMapping = new HashMap<>();
+        slotMapping.put(0, 0);
+        when(mTelephonyManager.getLogicalToPhysicalSlotMapping()).thenReturn(slotMapping);
+
+        when(mEuiccManager.isEnabled()).thenReturn(true);
+        when(mEuiccManager.getEid()).thenReturn(TEST_EID_FROM_MANAGER);
+        when(mEuiccManager.createForCardId(anyInt())).thenThrow(
+                new RuntimeException("EID shall be retrieved from the default eUICC manager"));
+
+        mController.initialize();
+
+        // Set EID retrieved from the default eUICC manager in Single SIM mode.
+        verify(mDialog).setText(EID_INFO_VALUE_ID, TEST_EID_FROM_MANAGER);
+        verify(mDialog, never()).removeSettingFromScreen(eq(EID_INFO_VALUE_ID));
+    }
+
+    @Test
+    public void initialize_updateEid_shouldSetEidInSingleSimModeWithDisabledEuicc() {
+        when(mTelephonyManager.getPhoneCount()).thenReturn(
+                PhoneConstants.MAX_PHONE_COUNT_SINGLE_SIM);
+
+        ArrayList<UiccCardInfo> uiccCardInfos = new ArrayList<>();
+        UiccCardInfo uiccCardInfo = new UiccCardInfo(
+                false,                                  // isEuicc (eUICC slot is not selected)
+                0,                                      // cardId
+                null,                                   // eid
+                "123451234567890",                      // iccid
+                0,                                      // slotIndex
+                true);                                  // isRemovable
+        uiccCardInfos.add(uiccCardInfo);
+        when(mTelephonyManager.getUiccCardsInfo()).thenReturn(uiccCardInfos);
+
+        Map<Integer, Integer> slotMapping = new HashMap<>();
+        slotMapping.put(0, 0);
+        when(mTelephonyManager.getLogicalToPhysicalSlotMapping()).thenReturn(slotMapping);
+
+        when(mEuiccManager.isEnabled()).thenReturn(true);
+        when(mEuiccManager.getEid()).thenReturn(TEST_EID_FROM_MANAGER);
+        when(mEuiccManager.createForCardId(anyInt())).thenThrow(
+                new RuntimeException("EID shall be retrieved from the default eUICC manager"));
+
+        mController.initialize();
+
+        // Set EID retrieved from the default eUICC manager in Single SIM mode.
+        verify(mDialog).setText(EID_INFO_VALUE_ID, TEST_EID_FROM_MANAGER);
+        verify(mDialog, never()).removeSettingFromScreen(eq(EID_INFO_VALUE_ID));
+    }
+
+    @Test
+    public void initialize_updateEid_shouldRemoveEidInSingleSimMode() {
+        when(mTelephonyManager.getPhoneCount()).thenReturn(
+                PhoneConstants.MAX_PHONE_COUNT_SINGLE_SIM);
+
+        ArrayList<UiccCardInfo> uiccCardInfos = new ArrayList<>();
+        UiccCardInfo uiccCardInfo = new UiccCardInfo(
+                false,                                  // isEuicc
+                0,                                      // cardId
+                null,                                   // eid
+                "123451234567890",                      // iccid
+                0,                                      // slotIndex
+                true);                                  // isRemovable
+        uiccCardInfos.add(uiccCardInfo);
+        when(mTelephonyManager.getUiccCardsInfo()).thenReturn(uiccCardInfos);
+
+        Map<Integer, Integer> slotMapping = new HashMap<>();
+        slotMapping.put(0, 0);
+        when(mTelephonyManager.getLogicalToPhysicalSlotMapping()).thenReturn(slotMapping);
+
+        when(mEuiccManager.isEnabled()).thenReturn(false);
+        when(mEuiccManager.getEid()).thenReturn(null);
+
+        mController.initialize();
+
+        // Remove EID if the default eUICC manager indicates that eSIM is not enabled.
+        verify(mDialog, never()).setText(eq(EID_INFO_VALUE_ID), any());
+        verify(mDialog).removeSettingFromScreen(eq(EID_INFO_LABEL_ID));
         verify(mDialog).removeSettingFromScreen(eq(EID_INFO_VALUE_ID));
     }
 
@@ -482,7 +758,7 @@
     @Test
     @Ignore
     public void initialize_nullSignalStrength_noCrash() {
-        doReturn(null).when(mController).getSignalStrength();
+        doReturn(null).when(mTelephonyManager).getSignalStrength();
         // we should not crash when running the following line
         mController.initialize();
     }
diff --git a/tests/robotests/src/com/android/settings/network/SubscriptionsPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/network/SubscriptionsPreferenceControllerTest.java
index 51f8ec0..6fd94c3 100644
--- a/tests/robotests/src/com/android/settings/network/SubscriptionsPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/network/SubscriptionsPreferenceControllerTest.java
@@ -29,6 +29,7 @@
 import static org.mockito.ArgumentMatchers.anyBoolean;
 import static org.mockito.ArgumentMatchers.anyInt;
 import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.doNothing;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.spy;
@@ -63,6 +64,7 @@
 import org.mockito.MockitoAnnotations;
 import org.robolectric.Robolectric;
 import org.robolectric.RobolectricTestRunner;
+import org.robolectric.RuntimeEnvironment;
 import org.robolectric.annotation.Config;
 import org.robolectric.shadows.ShadowSubscriptionManager;
 
@@ -107,7 +109,7 @@
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
-        mContext = spy(Robolectric.setupActivity(Activity.class));
+        mContext = spy(RuntimeEnvironment.application);
         mLifecycleOwner = () -> mLifecycle;
         mLifecycle = new Lifecycle(mLifecycleOwner);
         when(mContext.getSystemService(SubscriptionManager.class)).thenReturn(mSubscriptionManager);
@@ -257,14 +259,14 @@
      */
     private void runPreferenceClickTest(final int subscriptionCount, final int selectedPrefIndex) {
         final List<SubscriptionInfo> subs = setupMockSubscriptions(subscriptionCount);
-        mController.displayPreference(mScreen);
         final ArgumentCaptor<Preference> prefCaptor = ArgumentCaptor.forClass(Preference.class);
+        mController.displayPreference(mScreen);
         verify(mPreferenceCategory, times(subscriptionCount)).addPreference(prefCaptor.capture());
         final List<Preference> prefs = prefCaptor.getAllValues();
         final Preference pref = prefs.get(selectedPrefIndex);
-        pref.getOnPreferenceClickListener().onPreferenceClick(pref);
         final ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class);
-        verify(mContext).startActivity(intentCaptor.capture());
+        doNothing().when(mContext).startActivity(intentCaptor.capture());
+        pref.getOnPreferenceClickListener().onPreferenceClick(pref);
         final Intent intent = intentCaptor.getValue();
         assertThat(intent).isNotNull();
         assertThat(intent.hasExtra(Settings.EXTRA_SUB_ID)).isTrue();
diff --git a/tests/robotests/src/com/android/settings/network/telephony/ApnPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/network/telephony/ApnPreferenceControllerTest.java
index ce4c9a2..d362837 100644
--- a/tests/robotests/src/com/android/settings/network/telephony/ApnPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/network/telephony/ApnPreferenceControllerTest.java
@@ -21,6 +21,7 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
+import static org.mockito.Mockito.doNothing;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.verify;
@@ -47,6 +48,7 @@
 import org.mockito.MockitoAnnotations;
 import org.robolectric.Robolectric;
 import org.robolectric.RobolectricTestRunner;
+import org.robolectric.RuntimeEnvironment;
 
 @RunWith(RobolectricTestRunner.class)
 public class ApnPreferenceControllerTest {
@@ -69,7 +71,7 @@
     public void setUp() {
         MockitoAnnotations.initMocks(this);
 
-        mContext = spy(Robolectric.setupActivity(Activity.class));
+        mContext = spy(RuntimeEnvironment.application);
         doReturn(mTelephonyManager).when(mContext).getSystemService(Context.TELEPHONY_SERVICE);
         doReturn(mSubscriptionManager).when(mContext).getSystemService(SubscriptionManager.class);
         doReturn(mTelephonyManager).when(mTelephonyManager).createForSubscriptionId(SUB_ID);
@@ -138,10 +140,10 @@
     @Test
     public void handPreferenceTreeClick_fireIntent() {
         ArgumentCaptor<Intent> captor = ArgumentCaptor.forClass(Intent.class);
+        doNothing().when(mContext).startActivity(captor.capture());
 
         mController.handlePreferenceTreeClick(mPreference);
 
-        verify(mContext).startActivity(captor.capture());
         final Intent intent = captor.getValue();
         assertThat(intent.getAction()).isEqualTo(Settings.ACTION_APN_SETTINGS);
         assertThat(intent.getIntExtra(ApnSettings.SUB_ID, 0)).isEqualTo(SUB_ID);
diff --git a/tests/robotests/src/com/android/settings/network/telephony/DataServiceSetupPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/network/telephony/DataServiceSetupPreferenceControllerTest.java
index 8907164..46e6978 100644
--- a/tests/robotests/src/com/android/settings/network/telephony/DataServiceSetupPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/network/telephony/DataServiceSetupPreferenceControllerTest.java
@@ -21,6 +21,7 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
+import static org.mockito.Mockito.doNothing;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.verify;
@@ -49,6 +50,7 @@
 import org.mockito.MockitoAnnotations;
 import org.robolectric.Robolectric;
 import org.robolectric.RobolectricTestRunner;
+import org.robolectric.RuntimeEnvironment;
 
 @RunWith(RobolectricTestRunner.class)
 public class DataServiceSetupPreferenceControllerTest {
@@ -72,7 +74,7 @@
     public void setUp() {
         MockitoAnnotations.initMocks(this);
 
-        mContext = spy(Robolectric.setupActivity(Activity.class));
+        mContext = spy(RuntimeEnvironment.application);
         doReturn(mTelephonyManager).when(mContext).getSystemService(Context.TELEPHONY_SERVICE);
         doReturn(mTelephonyManager).when(mTelephonyManager).createForSubscriptionId(SUB_ID);
         doReturn(mInvalidTelephonyManager).when(mTelephonyManager).createForSubscriptionId(
@@ -125,11 +127,10 @@
     @Test
     public void handlePreferenceTreeClick_startActivity() {
         ArgumentCaptor<Intent> captor = ArgumentCaptor.forClass(Intent.class);
+        doNothing().when(mContext).startActivity(captor.capture());
 
         mController.handlePreferenceTreeClick(mPreference);
 
-        verify(mContext).startActivity(captor.capture());
-
         final Intent intent = captor.getValue();
         assertThat(intent.getAction()).isEqualTo(Intent.ACTION_VIEW);
         assertThat(intent.getData()).isEqualTo(
diff --git a/tests/robotests/src/com/android/settings/network/telephony/DataUsagePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/network/telephony/DataUsagePreferenceControllerTest.java
index 7a097e7..7681f44 100644
--- a/tests/robotests/src/com/android/settings/network/telephony/DataUsagePreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/network/telephony/DataUsagePreferenceControllerTest.java
@@ -17,6 +17,7 @@
 package com.android.settings.network.telephony;
 
 import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.Mockito.doNothing;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.verify;
@@ -40,6 +41,7 @@
 import org.mockito.MockitoAnnotations;
 import org.robolectric.Robolectric;
 import org.robolectric.RobolectricTestRunner;
+import org.robolectric.RuntimeEnvironment;
 import org.robolectric.Shadows;
 import org.robolectric.shadows.ShadowTelephonyManager;
 import org.robolectric.util.ReflectionHelpers;
@@ -58,7 +60,7 @@
     public void setUp() {
         MockitoAnnotations.initMocks(this);
 
-        mContext = spy(Robolectric.setupActivity(Activity.class));
+        mContext = spy(RuntimeEnvironment.application);
 
         final TelephonyManager telephonyManager = mContext.getSystemService(TelephonyManager.class);
         final ShadowTelephonyManager shadowTelephonyManager = Shadows.shadowOf(telephonyManager);
@@ -91,9 +93,10 @@
     @Test
     public void handlePreferenceTreeClick_needDialog_showDialog() {
         final ArgumentCaptor<Intent> captor = ArgumentCaptor.forClass(Intent.class);
+        doNothing().when(mContext).startActivity(captor.capture());
+
         mController.handlePreferenceTreeClick(mPreference);
 
-        verify(mContext).startActivity(captor.capture());
         final Intent intent = captor.getValue();
 
         assertThat(intent.getAction()).isEqualTo(Settings.ACTION_MOBILE_DATA_USAGE);
diff --git a/tests/robotests/src/com/android/settings/network/telephony/EuiccPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/network/telephony/EuiccPreferenceControllerTest.java
index 7fbddb4..e4cf303 100644
--- a/tests/robotests/src/com/android/settings/network/telephony/EuiccPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/network/telephony/EuiccPreferenceControllerTest.java
@@ -38,6 +38,7 @@
 import org.mockito.MockitoAnnotations;
 import org.robolectric.Robolectric;
 import org.robolectric.RobolectricTestRunner;
+import org.robolectric.RuntimeEnvironment;
 
 @RunWith(RobolectricTestRunner.class)
 public class EuiccPreferenceControllerTest {
@@ -46,6 +47,9 @@
     @Mock
     private TelephonyManager mTelephonyManager;
 
+    @Mock
+    private Activity mActivity;
+
     private EuiccPreferenceController mController;
     private Preference mPreference;
     private Context mContext;
@@ -54,12 +58,12 @@
     public void setUp() {
         MockitoAnnotations.initMocks(this);
 
-        mContext = spy(Robolectric.setupActivity(Activity.class));
-        doReturn(mTelephonyManager).when(mContext).getSystemService(Context.TELEPHONY_SERVICE);
+        mContext = spy(RuntimeEnvironment.application);
+        doReturn(mTelephonyManager).when(mActivity).getSystemService(Context.TELEPHONY_SERVICE);
         doReturn(mTelephonyManager).when(mTelephonyManager).createForSubscriptionId(SUB_ID);
 
         mPreference = new Preference(mContext);
-        mController = new EuiccPreferenceController(mContext, "euicc");
+        mController = new EuiccPreferenceController(mActivity, "euicc");
         mController.init(SUB_ID);
         mPreference.setKey(mController.getPreferenceKey());
     }
@@ -70,7 +74,7 @@
 
         mController.handlePreferenceTreeClick(mPreference);
 
-        verify(mContext).startActivity(captor.capture());
+        verify(mActivity).startActivity(captor.capture());
         assertThat(captor.getValue().getAction()).isEqualTo(
                 EuiccManager.ACTION_MANAGE_EMBEDDED_SUBSCRIPTIONS);
     }