Get emergency info name from EmergencyInfo

If user have set emergency name in EmergencyInfo, the name will be used to show on
emergency info button. The content description of emergency info button
become "userName's emergency information".

Test: Manually
Bug: 80406570
Change-Id: I622d46e9646528f9d9383964b742377bb380b5a2
Merged-In: I622d46e9646528f9d9383964b742377bb380b5a2
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