Updating voicemail notifications for transcription, part 2

Changing voicemail notifications to match the latest mocks,
(replacing the 'Voicemail' title with what was the notification
content, and putting the voicemail status or transcription in
the notification content). The notifications will be updated in
a following cl.

screen shot: https://drive.google.com/open?id=0B9o_KvtLkcuIbDdjaTNHTFFZLW9YZEo1SG5scDR6SzloaWc4

Bug: 37340510
Test: manual
PiperOrigin-RevId: 167928866
Change-Id: I81492f7fbf1cc398401a948e036854d6a8ff878b
diff --git a/java/com/android/dialer/app/calllog/CallLogNotificationsQueryHelper.java b/java/com/android/dialer/app/calllog/CallLogNotificationsQueryHelper.java
index c749b65..649a663 100644
--- a/java/com/android/dialer/app/calllog/CallLogNotificationsQueryHelper.java
+++ b/java/com/android/dialer/app/calllog/CallLogNotificationsQueryHelper.java
@@ -24,7 +24,7 @@
 import android.content.Context;
 import android.database.Cursor;
 import android.net.Uri;
-import android.os.Build.VERSION_CODES;
+import android.os.Build;
 import android.provider.CallLog.Calls;
 import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
@@ -35,14 +35,17 @@
 import com.android.dialer.app.R;
 import com.android.dialer.calllogutils.PhoneNumberDisplayUtil;
 import com.android.dialer.common.LogUtil;
+import com.android.dialer.compat.android.provider.VoicemailCompat;
 import com.android.dialer.location.GeoUtil;
 import com.android.dialer.phonenumbercache.ContactInfo;
 import com.android.dialer.phonenumbercache.ContactInfoHelper;
 import com.android.dialer.util.PermissionsUtil;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
 
 /** Helper class operating on call log notifications. */
+@TargetApi(Build.VERSION_CODES.M)
 public class CallLogNotificationsQueryHelper {
 
   private final Context mContext;
@@ -230,6 +233,7 @@
     public final String transcription;
     public final String countryIso;
     public final long dateMs;
+    public final int transcriptionState;
 
     public NewCall(
         Uri callsUri,
@@ -240,7 +244,8 @@
         String accountId,
         String transcription,
         String countryIso,
-        long dateMs) {
+        long dateMs,
+        int transcriptionState) {
       this.callsUri = callsUri;
       this.voicemailUri = voicemailUri;
       this.number = number;
@@ -250,6 +255,7 @@
       this.transcription = transcription;
       this.countryIso = countryIso;
       this.dateMs = dateMs;
+      this.transcriptionState = transcriptionState;
     }
   }
 
@@ -270,6 +276,16 @@
       Calls.COUNTRY_ISO,
       Calls.DATE
     };
+
+    private static final String[] PROJECTION_O;
+
+    static {
+      List<String> list = new ArrayList<>();
+      list.addAll(Arrays.asList(PROJECTION));
+      list.add(VoicemailCompat.TRANSCRIPTION_STATE);
+      PROJECTION_O = list.toArray(new String[list.size()]);
+    }
+
     private static final int ID_COLUMN_INDEX = 0;
     private static final int NUMBER_COLUMN_INDEX = 1;
     private static final int VOICEMAIL_URI_COLUMN_INDEX = 2;
@@ -279,6 +295,7 @@
     private static final int TRANSCRIPTION_COLUMN_INDEX = 6;
     private static final int COUNTRY_ISO_COLUMN_INDEX = 7;
     private static final int DATE_COLUMN_INDEX = 8;
+    private static final int TRANSCRIPTION_STATE_COLUMN_INDEX = 9;
 
     private final ContentResolver mContentResolver;
     private final Context mContext;
@@ -290,7 +307,7 @@
 
     @Override
     @Nullable
-    @TargetApi(VERSION_CODES.M)
+    @TargetApi(Build.VERSION_CODES.M)
     public List<NewCall> query(int type) {
       if (!PermissionsUtil.hasPermission(mContext, Manifest.permission.READ_CALL_LOG)) {
         LogUtil.w(
@@ -309,7 +326,7 @@
       try (Cursor cursor =
           mContentResolver.query(
               Calls.CONTENT_URI_WITH_VOICEMAIL,
-              PROJECTION,
+              (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) ? PROJECTION_O : PROJECTION,
               selection,
               selectionArgs,
               Calls.DEFAULT_SORT_ORDER)) {
@@ -345,7 +362,10 @@
           cursor.getString(PHONE_ACCOUNT_ID_COLUMN_INDEX),
           cursor.getString(TRANSCRIPTION_COLUMN_INDEX),
           cursor.getString(COUNTRY_ISO_COLUMN_INDEX),
-          cursor.getLong(DATE_COLUMN_INDEX));
+          cursor.getLong(DATE_COLUMN_INDEX),
+          Build.VERSION.SDK_INT >= Build.VERSION_CODES.O
+              ? cursor.getInt(TRANSCRIPTION_STATE_COLUMN_INDEX)
+              : VoicemailCompat.TRANSCRIPTION_NOT_STARTED);
     }
   }
 }
diff --git a/java/com/android/dialer/app/calllog/MissedCallNotifier.java b/java/com/android/dialer/app/calllog/MissedCallNotifier.java
index b363b5a..de76619 100644
--- a/java/com/android/dialer/app/calllog/MissedCallNotifier.java
+++ b/java/com/android/dialer/app/calllog/MissedCallNotifier.java
@@ -47,6 +47,7 @@
 import com.android.dialer.callintent.CallIntentBuilder;
 import com.android.dialer.common.LogUtil;
 import com.android.dialer.common.concurrent.DialerExecutor.Worker;
+import com.android.dialer.compat.android.provider.VoicemailCompat;
 import com.android.dialer.notification.DialerNotificationManager;
 import com.android.dialer.notification.NotificationChannelId;
 import com.android.dialer.notification.NotificationManagerUtils;
@@ -153,7 +154,8 @@
                   null,
                   null,
                   null,
-                  System.currentTimeMillis());
+                  System.currentTimeMillis(),
+                  VoicemailCompat.TRANSCRIPTION_NOT_STARTED);
 
       // TODO: look up caller ID that is not in contacts.
       ContactInfo contactInfo =
diff --git a/java/com/android/dialer/app/calllog/VisualVoicemailNotifier.java b/java/com/android/dialer/app/calllog/VisualVoicemailNotifier.java
index cbadfd3..2796349 100644
--- a/java/com/android/dialer/app/calllog/VisualVoicemailNotifier.java
+++ b/java/com/android/dialer/app/calllog/VisualVoicemailNotifier.java
@@ -27,7 +27,6 @@
 import android.os.Build.VERSION_CODES;
 import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
-import android.support.v4.os.BuildCompat;
 import android.telecom.PhoneAccount;
 import android.telecom.PhoneAccountHandle;
 import android.telephony.TelephonyManager;
@@ -39,6 +38,7 @@
 import com.android.dialer.app.contactinfo.ContactPhotoLoader;
 import com.android.dialer.app.list.DialtactsPagerAdapter;
 import com.android.dialer.common.LogUtil;
+import com.android.dialer.compat.android.provider.VoicemailCompat;
 import com.android.dialer.logging.DialerImpression;
 import com.android.dialer.logging.Logger;
 import com.android.dialer.notification.DialerNotificationManager;
@@ -84,7 +84,7 @@
             .setGroupSummary(true)
             .setContentIntent(newVoicemailIntent(context, null));
 
-    if (BuildCompat.isAtLeastO()) {
+    if (VERSION.SDK_INT >= VERSION_CODES.O) {
       groupSummary.setGroupAlertBehavior(Notification.GROUP_ALERT_CHILDREN);
       PhoneAccountHandle handle = getAccountForCall(context, newCalls.get(0));
       groupSummary.setChannelId(NotificationChannelManager.getVoicemailChannelId(context, handle));
@@ -136,7 +136,7 @@
         .setAutoCancel(true);
   }
 
-  private static Notification createNotificationForVoicemail(
+  static Notification createNotificationForVoicemail(
       @NonNull Context context,
       @NonNull NewCall voicemail,
       @NonNull Map<String, ContactInfo> contactInfos) {
@@ -146,10 +146,6 @@
     Notification.Builder builder =
         createNotificationBuilder(context)
             .setContentTitle(
-                context
-                    .getResources()
-                    .getQuantityString(R.plurals.notification_voicemail_title, 1, 1))
-            .setContentText(
                 ContactDisplayUtils.getTtsSpannedPhoneNumber(
                     context.getResources(),
                     R.string.notification_new_voicemail_ticker,
@@ -158,13 +154,51 @@
             .setSound(getVoicemailRingtoneUri(context, handle))
             .setDefaults(getNotificationDefaultFlags(context, handle));
 
+    if (!TextUtils.isEmpty(voicemail.transcription)) {
+      Logger.get(context)
+          .logImpression(DialerImpression.Type.VVM_NOTIFICATION_CREATED_WITH_TRANSCRIPTION);
+      builder.setContentText(voicemail.transcription);
+    } else {
+      switch (voicemail.transcriptionState) {
+        case VoicemailCompat.TRANSCRIPTION_IN_PROGRESS:
+          Logger.get(context)
+              .logImpression(DialerImpression.Type.VVM_NOTIFICATION_CREATED_WITH_IN_PROGRESS);
+          builder.setContentText(context.getString(R.string.voicemail_transcription_in_progress));
+          break;
+        case VoicemailCompat.TRANSCRIPTION_FAILED_NO_SPEECH_DETECTED:
+          Logger.get(context)
+              .logImpression(
+                  DialerImpression.Type.VVM_NOTIFICATION_CREATED_WITH_TRANSCRIPTION_FAILURE);
+          builder.setContentText(
+              context.getString(R.string.voicemail_transcription_failed_no_speech));
+          break;
+        case VoicemailCompat.TRANSCRIPTION_FAILED_LANGUAGE_NOT_SUPPORTED:
+          Logger.get(context)
+              .logImpression(
+                  DialerImpression.Type.VVM_NOTIFICATION_CREATED_WITH_TRANSCRIPTION_FAILURE);
+          builder.setContentText(
+              context.getString(R.string.voicemail_transcription_failed_language_not_supported));
+          break;
+        case VoicemailCompat.TRANSCRIPTION_FAILED:
+          Logger.get(context)
+              .logImpression(
+                  DialerImpression.Type.VVM_NOTIFICATION_CREATED_WITH_TRANSCRIPTION_FAILURE);
+          builder.setContentText(context.getString(R.string.voicemail_transcription_failed));
+          break;
+        default:
+          Logger.get(context)
+              .logImpression(DialerImpression.Type.VVM_NOTIFICATION_CREATED_WITH_NO_TRANSCRIPTION);
+          break;
+      }
+    }
+
     if (voicemail.voicemailUri != null) {
       builder.setDeleteIntent(
           CallLogNotificationsService.createMarkSingleNewVoicemailAsOldIntent(
               context, voicemail.voicemailUri));
     }
 
-    if (BuildCompat.isAtLeastO()) {
+    if (VERSION.SDK_INT >= VERSION_CODES.O) {
       builder.setChannelId(NotificationChannelManager.getVoicemailChannelId(context, handle));
     }
 
@@ -173,11 +207,6 @@
     if (photoIcon != null) {
       builder.setLargeIcon(photoIcon);
     }
-    if (!TextUtils.isEmpty(voicemail.transcription)) {
-      Logger.get(context)
-          .logImpression(DialerImpression.Type.VVM_NOTIFICATION_CREATED_WITH_TRANSCRIPTION);
-      builder.setStyle(new Notification.BigTextStyle().bigText(voicemail.transcription));
-    }
     builder.setContentIntent(newVoicemailIntent(context, voicemail));
     Logger.get(context).logImpression(DialerImpression.Type.VVM_NOTIFICATION_CREATED);
     return builder.build();
diff --git a/java/com/android/dialer/logging/dialer_impression.proto b/java/com/android/dialer/logging/dialer_impression.proto
index 94af6c3..154460c 100644
--- a/java/com/android/dialer/logging/dialer_impression.proto
+++ b/java/com/android/dialer/logging/dialer_impression.proto
@@ -532,7 +532,10 @@
     IN_CALL_DIALPAD_CLOSE_BUTTON_PRESSED = 1267;
 
     // More voicemail transcription impressions
-    VVM_TRANSCRIPTION_JOB_STOPPED = 1268;
-    VVM_TRANSCRIPTION_TASK_CANCELLED = 1269;
+    VVM_NOTIFICATION_CREATED_WITH_IN_PROGRESS = 1268;
+    VVM_NOTIFICATION_CREATED_WITH_TRANSCRIPTION_FAILURE = 1269;
+    VVM_NOTIFICATION_CREATED_WITH_NO_TRANSCRIPTION = 1270;
+    VVM_TRANSCRIPTION_JOB_STOPPED = 1271;
+    VVM_TRANSCRIPTION_TASK_CANCELLED = 1272;
   }
 }