diff --git a/src/com/android/phone/MobileNetworkSettings.java b/src/com/android/phone/MobileNetworkSettings.java
index 9fbee90..4650744 100644
--- a/src/com/android/phone/MobileNetworkSettings.java
+++ b/src/com/android/phone/MobileNetworkSettings.java
@@ -16,7 +16,6 @@
 
 package com.android.phone;
 
-import android.annotation.Nullable;
 import android.app.ActionBar;
 import android.app.Activity;
 import android.app.DialogFragment;
@@ -43,7 +42,6 @@
 import android.preference.SwitchPreference;
 import android.provider.Settings;
 import android.telephony.CarrierConfigManager;
-import android.telephony.PhoneNumberUtils;
 import android.telephony.PhoneStateListener;
 import android.telephony.SubscriptionInfo;
 import android.telephony.SubscriptionManager;
@@ -56,7 +54,6 @@
 import android.widget.TabHost;
 
 import com.android.ims.ImsManager;
-import com.android.internal.annotations.VisibleForTesting;
 import com.android.internal.telephony.Phone;
 import com.android.internal.telephony.PhoneConstants;
 import com.android.internal.telephony.PhoneFactory;
@@ -646,14 +643,11 @@
                 prefSet.addPreference(mButton4glte);
                 if (showEuiccSettings(getActivity())) {
                     prefSet.addPreference(mEuiccSettingsPref);
-                    if (TextUtils.isEmpty(mTelephonyManager.getLine1Number())) {
+                    String spn = mTelephonyManager.getSimOperatorName();
+                    if (TextUtils.isEmpty(spn)) {
                         mEuiccSettingsPref.setSummary(null);
                     } else {
-                        mEuiccSettingsPref.setSummary(
-                                getEuiccSettingsSummary(
-                                        mTelephonyManager.getSimOperatorName(),
-                                        PhoneNumberUtils.formatNumber(
-                                                mTelephonyManager.getLine1Number())));
+                        mEuiccSettingsPref.setSummary(spn);
                     }
                 }
             }
@@ -1128,31 +1122,6 @@
             mButtonPreferredNetworkMode.setValue(Integer.toString(settingsNetworkMode));
         }
 
-        @VisibleForTesting
-        String getEuiccSettingsSummary(@Nullable String spn, @Nullable String phoneNum) {
-            if (!TextUtils.isEmpty(spn) && !TextUtils.isEmpty(phoneNum)
-                    && phoneNum.length() >= NUM_LAST_PHONE_DIGITS) {
-                // Format the number and use the last one part or multiple
-                // parts whose total length is greater or equal to NUM_LAST_PHONE_DIGITS.
-                // TODO (b/36647649): This needs to be finalized by UX team
-                String shownNum;
-                int lastIndex = phoneNum.lastIndexOf('-');
-                if (lastIndex == -1) {
-                    shownNum = phoneNum.substring(phoneNum.length() - NUM_LAST_PHONE_DIGITS);
-                } else {
-                    shownNum = phoneNum.substring(lastIndex + 1);
-                    while (shownNum.length() < NUM_LAST_PHONE_DIGITS && lastIndex != -1) {
-                        lastIndex = phoneNum.lastIndexOf('-', lastIndex - 1);
-                        shownNum = phoneNum.substring(lastIndex + 1);
-                    }
-                }
-                return getString(R.string.carrier_settings_euicc_summary, spn, shownNum);
-            } else {
-                return null;
-            }
-        }
-
-
         private void UpdatePreferredNetworkModeSummary(int NetworkMode) {
             switch(NetworkMode) {
                 case Phone.NT_MODE_TDSCDMA_GSM_WCDMA:
diff --git a/tests/src/com/android/phone/MobileNetworkSettingsTest.java b/tests/src/com/android/phone/MobileNetworkSettingsTest.java
deleted file mode 100644
index bd5839b..0000000
--- a/tests/src/com/android/phone/MobileNetworkSettingsTest.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Copyright (C) 2017 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.phone;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNull;
-
-import android.app.Activity;
-import android.app.FragmentManager;
-import android.support.test.rule.ActivityTestRule;
-import android.support.test.runner.AndroidJUnit4;
-import android.telephony.PhoneNumberUtils;
-
-
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-
-
-@RunWith(AndroidJUnit4.class)
-public class MobileNetworkSettingsTest {
-
-    @Rule
-    public ActivityTestRule<MobileNetworkSettings> mRule =
-            new ActivityTestRule<>(MobileNetworkSettings.class);
-
-    private Activity mActivity;
-    private MobileNetworkSettings.MobileNetworkFragment mFragment;
-
-    @Before
-    public void setUp() {
-        MockitoAnnotations.initMocks(this);
-        mActivity = mRule.getActivity();
-        FragmentManager fragmentManager = mActivity.getFragmentManager();
-        mFragment = (MobileNetworkSettings.MobileNetworkFragment)
-                fragmentManager.findFragmentById(R.id.network_setting_content);
-    }
-
-    @Test
-    public void testGetEuiccSettingsSummary() {
-
-        assertNull(mFragment.getEuiccSettingsSummary(null, "1234"));
-        assertNull(mFragment.getEuiccSettingsSummary("spn", null));
-        assertNull(mFragment.getEuiccSettingsSummary("spn", "123"));
-        assertEquals(mFragment.getEuiccSettingsSummary("spn", "123456789"),
-                mFragment.getString(R.string.carrier_settings_euicc_summary, "spn", "6789"));
-        assertEquals(mFragment.getEuiccSettingsSummary("spn", "1234-56-78"),
-                mFragment.getString(R.string.carrier_settings_euicc_summary, "spn", "56-78"));
-        assertEquals(mFragment.getEuiccSettingsSummary("spn", "1234-56789"),
-                mFragment.getString(R.string.carrier_settings_euicc_summary, "spn", "56789"));
-        assertEquals(mFragment.getEuiccSettingsSummary("spn", "56-789"),
-                mFragment.getString(R.string.carrier_settings_euicc_summary, "spn", "56-789"));
-        assertEquals(
-                mFragment.getEuiccSettingsSummary(
-                    "spn", PhoneNumberUtils.formatNumber("16501234567")),
-                mFragment.getString(R.string.carrier_settings_euicc_summary, "spn", "4567"));
-    }
-}
