diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 30760dc..982332b 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -182,6 +182,8 @@
     <!-- Needed for emergency contact notification. -->
     <uses-permission android:name="android.permission.WRITE_BLOCKED_NUMBERS" />
     <uses-permission android:name="android.permission.NETWORK_SETTINGS" />
+    <!-- Needed for emergency info user name. -->
+    <uses-permission android:name="com.android.emergency.permission.READ_EMERGENCY_INFO_NAME"/>
 
     <!-- This tells the activity manager to not delay any of our activity
          start requests, even if they happen immediately after the user
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 2bce34b..7a1b471 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -1124,6 +1124,8 @@
 
     <!-- Title for the button of emergency information -->
     <string name="emergency_information_title">Emergency information</string>
+    <!-- Content description for the button of emergency information -->
+    <string name="emergency_information_button_content_description"><xliff:g id="user_name">%s</xliff:g>\'s emergency information</string>
     <!-- Dialog title for the "radio enable" UI for emergency calls -->
     <string name="emergency_enable_radio_dialog_title">Emergency call</string>
     <!-- Title for the emergency dialpad UI -->
diff --git a/src/com/android/phone/EmergencyDialer.java b/src/com/android/phone/EmergencyDialer.java
index ea9eae1..19c4983 100644
--- a/src/com/android/phone/EmergencyDialer.java
+++ b/src/com/android/phone/EmergencyDialer.java
@@ -25,21 +25,26 @@
 import android.app.Dialog;
 import android.app.WallpaperManager;
 import android.content.BroadcastReceiver;
+import android.content.ContentResolver;
 import android.content.Context;
 import android.content.Intent;
 import android.content.IntentFilter;
+import android.database.ContentObserver;
+import android.database.Cursor;
 import android.graphics.Point;
 import android.media.AudioManager;
 import android.media.ToneGenerator;
 import android.net.Uri;
 import android.os.AsyncTask;
 import android.os.Bundle;
+import android.os.Handler;
 import android.os.PersistableBundle;
 import android.provider.Settings;
 import android.telecom.PhoneAccount;
 import android.telecom.TelecomManager;
 import android.telephony.CarrierConfigManager;
 import android.telephony.PhoneNumberUtils;
+import android.telephony.Rlog;
 import android.telephony.ServiceState;
 import android.telephony.SubscriptionManager;
 import android.telephony.TelephonyManager;
@@ -168,6 +173,25 @@
 
     private boolean mAreEmergencyDialerShortcutsEnabled;
 
+    /** Key of emergency information user name */
+    private static final String KEY_EMERGENCY_INFO_NAME = "name";
+
+    /** Authority of emergency information */
+    private static final String AUTHORITY = "com.android.emergency.info.name";
+
+    /** Content path of emergency information name */
+    private static final String CONTENT_PATH = "name";
+
+    /** Content URI of emergency information */
+    private static final Uri CONTENT_URI = new Uri.Builder()
+            .scheme(ContentResolver.SCHEME_CONTENT)
+            .authority(AUTHORITY)
+            .path(CONTENT_PATH)
+            .build();
+
+    /** ContentObserver for monitoring emergency info name changes */
+    private ContentObserver mEmergencyInfoNameObserver;
+
     @Override
     public void beforeTextChanged(CharSequence s, int start, int count, int after) {
         // Do nothing
@@ -312,6 +336,10 @@
             }
         }
         unregisterReceiver(mBroadcastReceiver);
+        if (mEmergencyInfoNameObserver != null) {
+            getContentResolver().unregisterContentObserver(mEmergencyInfoNameObserver);
+            mEmergencyInfoNameObserver = null;
+        }
     }
 
     @Override
@@ -358,7 +386,7 @@
     @Override
     public void onBackPressed() {
         // If emergency dialer shortcut is enabled and Dialpad view is visible, pressing the
-        // back key will back to display FasterEmergencyDialer view.
+        // back key will back to display EmergencyShortcutView view.
         // Otherwise, it would finish the activity.
         if (mAreEmergencyDialerShortcutsEnabled && mDialpadView != null
                 && mDialpadView.getVisibility() == View.VISIBLE) {
@@ -428,7 +456,7 @@
         String phoneNumber = button.getPhoneNumber();
 
         if (!TextUtils.isEmpty(phoneNumber)) {
-            Log.d(LOG_TAG, "dial emergency number: " + phoneNumber);
+            if (DBG) Log.d(LOG_TAG, "dial emergency number: " + Rlog.pii(LOG_TAG, phoneNumber));
             TelecomManager tm = (TelecomManager) getSystemService(TELECOM_SERVICE);
             tm.placeCall(Uri.fromParts(PhoneAccount.SCHEME_TEL, phoneNumber, null), null);
         } else {
@@ -884,6 +912,19 @@
         setupEmergencyCallShortcutButton();
 
         switchView(mEmergencyShortcutView, mDialpadView, false);
+
+        mEmergencyInfoNameObserver = new ContentObserver(new Handler()) {
+            @Override
+            public void onChange(boolean selfChange) {
+                super.onChange(selfChange);
+                getEmergencyInfoNameAsync();
+            }
+        };
+        // Register ContentProvider for monitoring emergency info name changes.
+        getContentResolver().registerContentObserver(CONTENT_URI, false,
+                mEmergencyInfoNameObserver);
+        // Query emergency info name.
+        getEmergencyInfoNameAsync();
     }
 
     private void setLocationInfo(String country) {
@@ -1004,4 +1045,38 @@
                     }
                 });
     }
+
+    /**
+     * Get emergency info name from EmergencyInfo and then update EmergencyInfoGroup.
+     */
+    private void getEmergencyInfoNameAsync() {
+        new AsyncTask<Void, Void, String>() {
+            @Override
+            protected String doInBackground(Void... params) {
+                String name = "";
+                try (Cursor cursor = getContentResolver().query(CONTENT_URI, null, null, null,
+                        null)) {
+                    if (cursor != null && cursor.moveToFirst()) {
+                        int index = cursor.getColumnIndex(KEY_EMERGENCY_INFO_NAME);
+                        name = index > -1 ? cursor.getString(index) : "";
+                    }
+                } catch (IllegalArgumentException ex) {
+                    Log.w(LOG_TAG, "getEmergencyInfoNameAsync failed", ex);
+                }
+                return name;
+            }
+
+            @Override
+            protected void onPostExecute(String result) {
+                super.onPostExecute(result);
+                if (!isFinishing() && !isDestroyed()) {
+                    // Update emergency info with emergency info name
+                    EmergencyInfoGroup group = findViewById(R.id.emergency_info_group);
+                    if (group != null) {
+                        group.updateEmergencyInfo(result);
+                    }
+                }
+            }
+        }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
+    }
 }
diff --git a/src/com/android/phone/EmergencyInfoGroup.java b/src/com/android/phone/EmergencyInfoGroup.java
index 8100a5a..9940b3f 100644
--- a/src/com/android/phone/EmergencyInfoGroup.java
+++ b/src/com/android/phone/EmergencyInfoGroup.java
@@ -25,6 +25,7 @@
 import android.os.UserHandle;
 import android.os.UserManager;
 import android.telephony.TelephonyManager;
+import android.text.TextUtils;
 import android.util.AttributeSet;
 import android.view.View;
 import android.widget.ImageView;
@@ -45,9 +46,10 @@
 public class EmergencyInfoGroup extends LinearLayout {
 
     private ImageView mEmergencyInfoImage;
-    private TextView mEmergencyInfoName;
+    private TextView mEmergencyInfoNameTextView;
     private View mEmergencyInfoTitle;
     private View mEmergencyInfoButton;
+    private String mDefaultEmergencyInfoName;
 
     public EmergencyInfoGroup(Context context, @Nullable AttributeSet attrs) {
         super(context, attrs);
@@ -59,7 +61,9 @@
         mEmergencyInfoTitle = findViewById(R.id.emergency_info_title);
         mEmergencyInfoButton = findViewById(R.id.emergency_info_button);
         mEmergencyInfoImage = (ImageView) findViewById(R.id.emergency_info_image);
-        mEmergencyInfoName = (TextView) findViewById(R.id.emergency_info_name);
+        mEmergencyInfoNameTextView = (TextView) findViewById(R.id.emergency_info_name);
+        mDefaultEmergencyInfoName = getContext().getResources().getString(
+                R.string.emergency_information_title);
     }
 
     @Override
@@ -87,18 +91,6 @@
                     .setPackage(packageName);
             mEmergencyInfoButton.setTag(R.id.tag_intent, intent);
             mEmergencyInfoImage.setImageDrawable(getCircularUserIcon());
-
-            /* TODO: Get user name.
-                if user name exist:
-                    1. mEmergencyInfoTitle show title.
-                    2. mEmergencyInfoName show user name.
-                if user name does not exist:
-                    1. mEmergencyInfoTitle hide.
-                    2. mEmergencyInfoName show app label. */
-            mEmergencyInfoTitle.setVisibility(View.INVISIBLE);
-            mEmergencyInfoName.setText(getContext().getResources().getString(
-                    R.string.emergency_information_title));
-
             visible = true;
         }
 
@@ -123,4 +115,19 @@
 
         return drawableUserIcon;
     }
-}
+
+    void updateEmergencyInfo(String emergencyInfoName) {
+        String infoNameDescription;
+        if (TextUtils.isEmpty(emergencyInfoName)) {
+            mEmergencyInfoTitle.setVisibility(View.INVISIBLE);
+            mEmergencyInfoNameTextView.setText(mDefaultEmergencyInfoName);
+            infoNameDescription = mDefaultEmergencyInfoName;
+        } else {
+            mEmergencyInfoTitle.setVisibility(View.VISIBLE);
+            mEmergencyInfoNameTextView.setText(emergencyInfoName);
+            infoNameDescription = getContext().getString(
+                    R.string.emergency_information_button_content_description, emergencyInfoName);
+        }
+        mEmergencyInfoNameTextView.setContentDescription(infoNameDescription);
+    }
+}
\ No newline at end of file
