Merge "Add EID into SIM status dialog"
diff --git a/res/layout/dialog_sim_status.xml b/res/layout/dialog_sim_status.xml
index 66b17d7..66d583b 100644
--- a/res/layout/dialog_sim_status.xml
+++ b/res/layout/dialog_sim_status.xml
@@ -141,5 +141,18 @@
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
             android:text="@string/device_info_not_available"/>
+
+        <TextView
+            style="@style/device_info_dialog_label"
+            android:id="@+id/esim_id_label"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:text="@string/status_esim_id"/>
+        <TextView
+            style="@style/device_info_dialog_value"
+            android:id="@+id/esim_id_value"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:text="@string/device_info_not_available"/>
     </LinearLayout>
 </ScrollView>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 4e76d5d..800113e 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -2765,6 +2765,8 @@
     <string name="status_latest_area_info">Operator info</string>
     <!-- About phone, status item title. The status of data access.  For example, the value may be "Connected" -->
     <string name="status_data_state">Mobile network state</string>
+    <!-- About phone, status item title. The ID of embedded SIM card. -->
+    <string name="status_esim_id">EID</string>
     <!-- About phone, status item title. The status of whether we have service.  for example, the value may be "In service" -->
     <string name="status_service_state">Service state</string>
     <!-- About phone, status item title. The  current cell tower signal strength -->
diff --git a/src/com/android/settings/deviceinfo/simstatus/SimStatusDialogController.java b/src/com/android/settings/deviceinfo/simstatus/SimStatusDialogController.java
index 91440f7..af898d5 100644
--- a/src/com/android/settings/deviceinfo/simstatus/SimStatusDialogController.java
+++ b/src/com/android/settings/deviceinfo/simstatus/SimStatusDialogController.java
@@ -26,6 +26,7 @@
 import android.content.IntentFilter;
 import android.content.pm.PackageManager;
 import android.content.res.Resources;
+import android.os.AsyncTask;
 import android.os.Bundle;
 import android.os.PersistableBundle;
 import android.os.UserHandle;
@@ -41,10 +42,12 @@
 import android.telephony.TelephonyManager;
 import android.text.BidiFormatter;
 import android.text.TextDirectionHeuristics;
+import android.telephony.euicc.EuiccManager;
 import android.text.TextUtils;
 import android.util.Log;
 
 import com.android.settings.R;
+import com.android.settings.wrapper.EuiccManagerWrapper;
 import com.android.settingslib.DeviceInfoUtils;
 import com.android.settingslib.core.lifecycle.Lifecycle;
 import com.android.settingslib.core.lifecycle.LifecycleObserver;
@@ -81,6 +84,8 @@
     final static int ICCID_INFO_LABEL_ID = R.id.icc_id_label;
     @VisibleForTesting
     final static int ICCID_INFO_VALUE_ID = R.id.icc_id_value;
+    @VisibleForTesting
+    final static int EID_INFO_VALUE_ID = R.id.esim_id_value;
 
     private final static String CB_AREA_INFO_RECEIVED_ACTION =
             "com.android.cellbroadcastreceiver.CB_AREA_INFO_RECEIVED";
@@ -92,6 +97,7 @@
     private final SubscriptionInfo mSubscriptionInfo;
     private final TelephonyManager mTelephonyManager;
     private final CarrierConfigManager mCarrierConfigManager;
+    private final EuiccManagerWrapper mEuiccManager;
     private final Resources mRes;
     private final Context mContext;
 
@@ -116,7 +122,6 @@
         }
     };
 
-
     private PhoneStateListener mPhoneStateListener;
 
     public SimStatusDialogController(@NonNull SimStatusDialogFragment dialog, Lifecycle lifecycle,
@@ -128,6 +133,7 @@
                 TELEPHONY_SERVICE);
         mCarrierConfigManager = (CarrierConfigManager) mContext.getSystemService(
                 CARRIER_CONFIG_SERVICE);
+        mEuiccManager = new EuiccManagerWrapper(mContext);
 
         mRes = mContext.getResources();
 
@@ -137,6 +143,8 @@
     }
 
     public void initialize() {
+        updateEid();
+
         if (mSubscriptionInfo == null) {
             return;
         }
@@ -363,6 +371,10 @@
         }
     }
 
+    private void updateEid() {
+        mDialog.setText(EID_INFO_VALUE_ID, mEuiccManager.getEid());
+    }
+
     private SubscriptionInfo getPhoneSubscriptionInfo(int slotId) {
         final List<SubscriptionInfo> subscriptionInfoList = SubscriptionManager.from(
                 mContext).getActiveSubscriptionInfoList();
diff --git a/src/com/android/settings/wrapper/EuiccManagerWrapper.java b/src/com/android/settings/wrapper/EuiccManagerWrapper.java
new file mode 100644
index 0000000..2a51526
--- /dev/null
+++ b/src/com/android/settings/wrapper/EuiccManagerWrapper.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.wrapper;
+
+import android.annotation.Nullable;
+import android.content.Context;
+import android.telephony.euicc.EuiccManager;
+
+/**
+ * This class replicates a subset of the {@link android.telephony.euicc.EuiccManager}.
+ * The interface exists so that we can use a thin wrapper around the EuiccManager in
+ * production code and a mock in tests.
+ */
+public class EuiccManagerWrapper {
+
+    private final EuiccManager mEuiccManager;
+
+    public EuiccManagerWrapper(Context context) {
+        mEuiccManager = (EuiccManager) context.getSystemService(Context.EUICC_SERVICE);
+    }
+
+    /**
+     * Returns the EID identifying the eUICC hardware.
+     *
+     * <p>Requires that the calling app has carrier privileges on the active subscription on the
+     * eUICC.
+     *
+     * @return the EID. May be null if {@link EuiccManager#isEnabled()} is false or the eUICC is not
+     * ready.
+     */
+    @Nullable
+    public String getEid() {
+        return mEuiccManager.getEid();
+    }
+}
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 cea4580..b10de63 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
         .CELLULAR_NETWORK_TYPE_VALUE_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
@@ -60,6 +61,7 @@
 import com.android.settings.R;
 import com.android.settings.TestConfig;
 import com.android.settings.testutils.SettingsRobolectricTestRunner;
+import com.android.settings.wrapper.EuiccManagerWrapper;
 import com.android.settingslib.core.lifecycle.Lifecycle;
 
 import org.junit.Before;
@@ -91,7 +93,8 @@
     private CarrierConfigManager mCarrierConfigManager;
     @Mock
     private PersistableBundle mPersistableBundle;
-
+    @Mock
+    private EuiccManagerWrapper mEuiccManager;
 
     private SimStatusDialogController mController;
     private Context mContext;
@@ -107,15 +110,18 @@
         mLifecycle = new Lifecycle(mLifecycleOwner);
         mController = spy(
                 new SimStatusDialogController(mDialog, mLifecycle, 0 /* phone id */));
+        mEuiccManager = spy(new EuiccManagerWrapper(mContext));
         doReturn(mServiceState).when(mController).getCurrentServiceState();
         doReturn(0).when(mController).getDbm(any());
         doReturn(0).when(mController).getAsuLevel(any());
         doReturn(mPhoneStateListener).when(mController).getPhoneStateListener();
         doReturn("").when(mController).getPhoneNumber();
         doReturn(mSignalStrength).when(mController).getSignalStrength();
+        doReturn("").when(mEuiccManager).getEid();
         ReflectionHelpers.setField(mController, "mTelephonyManager", mTelephonyManager);
         ReflectionHelpers.setField(mController, "mCarrierConfigManager", mCarrierConfigManager);
         ReflectionHelpers.setField(mController, "mSubscriptionInfo", mSubscriptionInfo);
+        ReflectionHelpers.setField(mController, "mEuiccManager", mEuiccManager);
         when(mCarrierConfigManager.getConfigForSubId(anyInt())).thenReturn(mPersistableBundle);
     }
 
@@ -273,4 +279,14 @@
 
         verify(mDialog).setText(ICCID_INFO_VALUE_ID, iccid);
     }
+
+    @Test
+    public void initialize_showEid_shouldSetEidToSetting() {
+        final String eid = "12351351231241";
+        doReturn(eid).when(mEuiccManager).getEid();
+
+        mController.initialize();
+
+        verify(mDialog).setText(EID_INFO_VALUE_ID, eid);
+    }
 }