Provide allow-list to recipient of voicemail intents.

This enables an app receiving the intent to launch a background activity
to perform more time consuming (but time sensitive) voicemail related
work.

Test: Manual test; verified that when new VVM broadcast is sent that the
broadcast options are set to allow-list the recipient for 10sec.
Bug: 173155475

Merged-In: I4768ca3aa607bf3341ac8fe89fa074fe65dfedea
Change-Id: I4768ca3aa607bf3341ac8fe89fa074fe65dfedea
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 9542e6d..be62fc1 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -4,6 +4,8 @@
         android:sharedUserLabel="@string/sharedUserLabel">
 
     <uses-permission android:name="android.permission.BIND_DIRECTORY_SEARCH" />
+    <!-- For sending voicemail intents -->
+    <uses-permission android:name="android.permission.CHANGE_DEVICE_IDLE_TEMP_WHITELIST" />
     <uses-permission android:name="android.permission.GET_ACCOUNTS" />
     <uses-permission android:name="android.permission.GET_ACCOUNTS_PRIVILEGED" />
     <uses-permission android:name="android.permission.INTERACT_ACROSS_USERS" />
diff --git a/src/com/android/providers/contacts/VoicemailNotifier.java b/src/com/android/providers/contacts/VoicemailNotifier.java
index 159cec7..b4033ea 100644
--- a/src/com/android/providers/contacts/VoicemailNotifier.java
+++ b/src/com/android/providers/contacts/VoicemailNotifier.java
@@ -1,5 +1,6 @@
 package com.android.providers.contacts;
 
+import android.app.BroadcastOptions;
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
@@ -27,6 +28,12 @@
 
     private final String TAG = "VoicemailNotifier";
 
+    /**
+     * Grant recipients of new voicemail broadcasts a 10sec allowlist so they can start a background
+     * service to do VVM processing.
+     */
+    private final long VOICEMAIL_ALLOW_LIST_DURATION_MILLIS = 10000;
+
     private final Context mContext;
     private final Uri mBaseUri;
 
@@ -85,7 +92,17 @@
                     intent.putExtra(VoicemailContract.EXTRA_SELF_CHANGE,
                             callingPackages.contains(component.getPackageName()));
                 }
-                mContext.sendBroadcast(intent);
+                if (intentAction.equals(VoicemailContract.ACTION_NEW_VOICEMAIL)) {
+                    BroadcastOptions bopts = BroadcastOptions.makeBasic();
+                    bopts.setTemporaryAppWhitelistDuration(VOICEMAIL_ALLOW_LIST_DURATION_MILLIS);
+                    Log.i(TAG, String.format("sendNotification: allowMillis=%d, pkg=%s",
+                            VOICEMAIL_ALLOW_LIST_DURATION_MILLIS, component.getPackageName()));
+                    mContext.sendBroadcast(intent, android.Manifest.permission.READ_VOICEMAIL,
+                            bopts.toBundle());
+                } else {
+                    mContext.sendBroadcast(intent);
+                }
+
                 Log.v(TAG, String.format("Sent intent. act:%s, url:%s, comp:%s," +
                                 " self_change:%s", intent.getAction(), intent.getData(),
                         component.getClassName(),