Snap for 8000352 from df78cc657ffd68610562ad5f74c32258cbc99871 to sc-v2-release

Change-Id: If1c25713fe2da01639ff0f0787eb2d78fa9d0955
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index a93fe2a..aa83c18 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -74,6 +74,10 @@
    presses home. -->
   <uses-permission android:name="android.permission.STOP_APP_SWITCHES"/>
 
+  <!-- Used for sending PendingIntents to dynamically registered receivers -->
+  <uses-permission android:name="com.android.dialer.permission.DIALER_ORIGIN"
+    android:protectionLevel="signature" />
+
   <!-- Permissions needed for badger count showing on launch icon. -->
 
   <!--for Samsung-->
diff --git a/java/com/android/dialer/app/calllog/LegacyVoicemailNotifier.java b/java/com/android/dialer/app/calllog/LegacyVoicemailNotifier.java
index 31e9edc..1388f43 100644
--- a/java/com/android/dialer/app/calllog/LegacyVoicemailNotifier.java
+++ b/java/com/android/dialer/app/calllog/LegacyVoicemailNotifier.java
@@ -36,6 +36,7 @@
 import com.android.dialer.location.GeoUtil;
 import com.android.dialer.notification.DialerNotificationManager;
 import com.android.dialer.notification.NotificationChannelManager;
+import com.android.dialer.notification.VoicemailChannelUtils;
 import com.android.dialer.phonenumberutil.PhoneNumberHelper;
 import com.android.dialer.telecom.TelecomUtil;
 import com.android.dialer.theme.base.ThemeComponent;
@@ -181,7 +182,8 @@
     if (context.getSystemService(TelephonyManager.class).getPhoneCount() <= 1) {
       return NOTIFICATION_TAG;
     }
-    return NOTIFICATION_TAG_PREFIX + phoneAccountHandle.getId();
+    return NOTIFICATION_TAG_PREFIX
+        + VoicemailChannelUtils.getHashedPhoneAccountId(phoneAccountHandle);
   }
 
   private LegacyVoicemailNotifier() {}
diff --git a/java/com/android/dialer/notification/VoicemailChannelUtils.java b/java/com/android/dialer/notification/VoicemailChannelUtils.java
index ddc0f77..83bda0f 100644
--- a/java/com/android/dialer/notification/VoicemailChannelUtils.java
+++ b/java/com/android/dialer/notification/VoicemailChannelUtils.java
@@ -16,6 +16,8 @@
 
 package com.android.dialer.notification;
 
+import static java.nio.charset.StandardCharsets.UTF_8;
+
 import android.Manifest.permission;
 import android.annotation.TargetApi;
 import android.app.NotificationChannel;
@@ -38,15 +40,35 @@
 import com.android.dialer.common.Assert;
 import com.android.dialer.common.LogUtil;
 import com.android.dialer.util.PermissionsUtil;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Set;
 
 /** Utilities for working with voicemail channels. */
 @TargetApi(VERSION_CODES.O)
-/* package */ final class VoicemailChannelUtils {
+public final class VoicemailChannelUtils {
   @VisibleForTesting static final String GLOBAL_VOICEMAIL_CHANNEL_ID = "phone_voicemail";
   private static final String PER_ACCOUNT_VOICEMAIL_CHANNEL_ID_PREFIX = "phone_voicemail_account_";
+  private static final char[] hexDigits = "0123456789abcdef".toCharArray();
+
+  /**
+   * Returns a String representation of the hashed value of the PhoneAccountHandle's id (the
+   * Sim ICC ID).
+   * In case it fails to hash the id it will return an empty string.
+   */
+  public static String getHashedPhoneAccountId(@NonNull PhoneAccountHandle handle) {
+    byte[] handleBytes = handle.getId().getBytes(UTF_8);
+    try {
+      byte[] hashedBytes = MessageDigest.getInstance("SHA-256").digest(handleBytes);
+      return byteArrayToHexString(hashedBytes);
+    } catch (NoSuchAlgorithmException e) {
+      LogUtil.e("VoicemailChannelUtils.getHashedPhoneAccountId",
+          "NoSuchAlgorithmException throw! Returning empty string!");
+      return "";
+    }
+  }
 
   @SuppressWarnings("MissingPermission") // isSingleSimDevice() returns true if no permission
   static Set<String> getAllChannelIds(@NonNull Context context) {
@@ -124,7 +146,17 @@
 
   private static String getChannelIdForAccount(@NonNull PhoneAccountHandle handle) {
     Assert.isNotNull(handle);
-    return PER_ACCOUNT_VOICEMAIL_CHANNEL_ID_PREFIX + ":" + handle.getId();
+    return PER_ACCOUNT_VOICEMAIL_CHANNEL_ID_PREFIX
+        + ":"
+        + getHashedPhoneAccountId(handle);
+  }
+
+  private static String byteArrayToHexString(byte[] bytes) {
+    StringBuilder sb = new StringBuilder(2 * bytes.length);
+    for (byte b : bytes) {
+      sb.append(hexDigits[(b >> 4) & 0xf]).append(hexDigits[b & 0xf]);
+    }
+    return sb.toString();
   }
 
   /**
diff --git a/java/com/android/dialer/voicemail/listui/error/VoicemailErrorMessage.java b/java/com/android/dialer/voicemail/listui/error/VoicemailErrorMessage.java
index 14d6cff..a3c294d 100644
--- a/java/com/android/dialer/voicemail/listui/error/VoicemailErrorMessage.java
+++ b/java/com/android/dialer/voicemail/listui/error/VoicemailErrorMessage.java
@@ -150,7 +150,7 @@
           public void onClick(View v) {
             Logger.get(context)
                 .logImpression(DialerImpression.Type.VOICEMAIL_ALERT_SET_PIN_CLICKED);
-            Intent intent = new Intent(VoicemailChangePinActivity.ACTION_CHANGE_PIN);
+            Intent intent = new Intent(context, VoicemailChangePinActivity.class);
             intent.putExtra(VoicemailClient.PARAM_PHONE_ACCOUNT_HANDLE, phoneAccountHandle);
             context.startActivity(intent);
           }
diff --git a/java/com/android/dialer/voicemail/settings/AndroidManifest.xml b/java/com/android/dialer/voicemail/settings/AndroidManifest.xml
index 8506ddd..f25858e 100644
--- a/java/com/android/dialer/voicemail/settings/AndroidManifest.xml
+++ b/java/com/android/dialer/voicemail/settings/AndroidManifest.xml
@@ -29,10 +29,6 @@
         android:parentActivityName="com.android.dialer.app.settings.DialerSettingsActivity"
         android:theme="@style/SettingsStyle"
         android:windowSoftInputMode="stateVisible|adjustResize">
-      <intent-filter>
-        <action android:name="com.android.dialer.action.CHANGE_PIN"/>
-        <category android:name="android.intent.category.DEFAULT"/>
-      </intent-filter>
     </activity>
     <activity
         android:name=".RecordVoicemailGreetingActivity"
diff --git a/java/com/android/dialer/voicemail/settings/VoicemailChangePinActivity.java b/java/com/android/dialer/voicemail/settings/VoicemailChangePinActivity.java
index 4e22fb3..ebebdf7 100644
--- a/java/com/android/dialer/voicemail/settings/VoicemailChangePinActivity.java
+++ b/java/com/android/dialer/voicemail/settings/VoicemailChangePinActivity.java
@@ -67,7 +67,6 @@
     implements OnClickListener, OnEditorActionListener, TextWatcher {
 
   private static final String TAG = "VmChangePinActivity";
-  public static final String ACTION_CHANGE_PIN = "com.android.dialer.action.CHANGE_PIN";
 
   private static final int MESSAGE_HANDLE_RESULT = 1;
 
diff --git a/java/com/android/voicemail/impl/sms/StatusSmsFetcher.java b/java/com/android/voicemail/impl/sms/StatusSmsFetcher.java
index 7ddf646..335ec3e 100644
--- a/java/com/android/voicemail/impl/sms/StatusSmsFetcher.java
+++ b/java/com/android/voicemail/impl/sms/StatusSmsFetcher.java
@@ -53,8 +53,12 @@
 
   private static final long STATUS_SMS_TIMEOUT_MILLIS = 60_000;
 
+  private static final String PERMISSION_DIALER_ORIGIN =
+    "com.android.dialer.permission.DIALER_ORIGIN";
+
   private static final String ACTION_REQUEST_SENT_INTENT =
       "com.android.voicemailomtp.sms.REQUEST_SENT";
+
   private static final int ACTION_REQUEST_SENT_REQUEST_CODE = 0;
 
   private CompletableFuture<Bundle> future = new CompletableFuture<>();
@@ -67,7 +71,7 @@
     this.phoneAccountHandle = phoneAccountHandle;
     IntentFilter filter = new IntentFilter(ACTION_REQUEST_SENT_INTENT);
     filter.addAction(OmtpService.ACTION_SMS_RECEIVED);
-    context.registerReceiver(this, filter);
+    context.registerReceiver(this, filter, PERMISSION_DIALER_ORIGIN, /* scheduler= */ null);
   }
 
   @Override
@@ -89,7 +93,10 @@
     // Because the receiver is registered dynamically, implicit intent must be used.
     // There should only be a single status SMS request at a time.
     return PendingIntent.getBroadcast(
-        context, ACTION_REQUEST_SENT_REQUEST_CODE, intent, PendingIntent.FLAG_CANCEL_CURRENT);
+        context,
+        ACTION_REQUEST_SENT_REQUEST_CODE,
+        intent,
+        PendingIntent.FLAG_CANCEL_CURRENT | PendingIntent.FLAG_IMMUTABLE);
   }
 
   @Override