summaryrefslogtreecommitdiff
path: root/java/com/android/dialer/calldetails/CallDetailsEntryViewHolder.java
diff options
context:
space:
mode:
Diffstat (limited to 'java/com/android/dialer/calldetails/CallDetailsEntryViewHolder.java')
-rw-r--r--java/com/android/dialer/calldetails/CallDetailsEntryViewHolder.java77
1 files changed, 77 insertions, 0 deletions
diff --git a/java/com/android/dialer/calldetails/CallDetailsEntryViewHolder.java b/java/com/android/dialer/calldetails/CallDetailsEntryViewHolder.java
index 05957ae80..a9be544a0 100644
--- a/java/com/android/dialer/calldetails/CallDetailsEntryViewHolder.java
+++ b/java/com/android/dialer/calldetails/CallDetailsEntryViewHolder.java
@@ -16,23 +16,36 @@
package com.android.dialer.calldetails;
+import android.content.ActivityNotFoundException;
+import android.content.ContentUris;
import android.content.Context;
+import android.content.Intent;
import android.net.Uri;
import android.provider.CallLog.Calls;
+import android.provider.MediaStore;
import android.support.annotation.ColorInt;
import android.support.annotation.NonNull;
import android.support.v4.content.ContextCompat;
+import android.support.v4.content.FileProvider;
import android.support.v4.os.BuildCompat;
import android.support.v7.widget.RecyclerView.ViewHolder;
import android.text.TextUtils;
+import android.text.format.DateFormat;
+import android.view.Menu;
import android.view.View;
+import android.webkit.MimeTypeMap;
import android.widget.ImageView;
+import android.widget.PopupMenu;
import android.widget.TextView;
+import android.widget.Toast;
import com.android.dialer.calldetails.CallDetailsEntries.CallDetailsEntry;
import com.android.dialer.calllogutils.CallLogDates;
import com.android.dialer.calllogutils.CallLogDurations;
import com.android.dialer.calllogutils.CallTypeHelper;
import com.android.dialer.calllogutils.CallTypeIconsView;
+import com.android.dialer.callrecord.CallRecording;
+import com.android.dialer.callrecord.CallRecordingDataStore;
+import com.android.dialer.callrecord.impl.CallRecorderService;
import com.android.dialer.common.LogUtil;
import com.android.dialer.enrichedcall.historyquery.proto.HistoryResult;
import com.android.dialer.enrichedcall.historyquery.proto.HistoryResult.Type;
@@ -41,6 +54,11 @@ import com.android.dialer.oem.MotorolaUtils;
import com.android.dialer.util.DialerUtils;
import com.android.dialer.util.IntentUtil;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.List;
+import java.util.Locale;
+
/** ViewHolder for call entries in {@link OldCallDetailsActivity} or {@link CallDetailsActivity}. */
public class CallDetailsEntryViewHolder extends ViewHolder {
@@ -66,6 +84,7 @@ public class CallDetailsEntryViewHolder extends ViewHolder {
private final TextView rttTranscript;
private final ImageView multimediaImage;
+ private final TextView playbackButton;
// TODO(maxwelb): Display this when location is stored - a bug
@SuppressWarnings("unused")
@@ -83,6 +102,7 @@ public class CallDetailsEntryViewHolder extends ViewHolder {
callTime = (TextView) container.findViewById(R.id.call_time);
callDuration = (TextView) container.findViewById(R.id.call_duration);
+ playbackButton = (TextView) container.findViewById(R.id.play_recordings);
multimediaImageContainer = container.findViewById(R.id.multimedia_image_container);
multimediaDetailsContainer = container.findViewById(R.id.ec_container);
multimediaDivider = container.findViewById(R.id.divider);
@@ -101,6 +121,7 @@ public class CallDetailsEntryViewHolder extends ViewHolder {
PhotoInfo photoInfo,
CallDetailsEntry entry,
CallTypeHelper callTypeHelper,
+ CallRecordingDataStore callRecordingDataStore,
boolean showMultimediaDivider) {
int callType = entry.getCallType();
boolean isVideoCall = (entry.getFeatures() & Calls.FEATURES_VIDEO) == Calls.FEATURES_VIDEO;
@@ -139,6 +160,22 @@ public class CallDetailsEntryViewHolder extends ViewHolder {
CallLogDurations.formatDurationAndDataUsageA11y(
context, entry.getDuration(), entry.getDataUsage()));
}
+
+ // do this synchronously to prevent recordings from "popping in" after detail item is displayed
+ final List<CallRecording> recordings;
+ if (CallRecorderService.isEnabled(context)) {
+ callRecordingDataStore.open(context); // opens unless already open
+ recordings = callRecordingDataStore.getRecordings(number, entry.getDate());
+ } else {
+ recordings = null;
+ }
+
+ int count = recordings != null ? recordings.size() : 0;
+ playbackButton.setOnClickListener(v -> handleRecordingClick(v, recordings));
+ playbackButton.setText(
+ context.getResources().getQuantityString(R.plurals.play_recordings, count, count));
+ playbackButton.setVisibility(count > 0 ? View.VISIBLE : View.GONE);
+
setMultimediaDetails(number, entry, showMultimediaDivider);
if (isRttCall) {
if (entry.getHasRttTranscript()) {
@@ -209,6 +246,46 @@ public class CallDetailsEntryViewHolder extends ViewHolder {
DialerUtils.startActivityWithErrorToast(context, IntentUtil.getSendSmsIntent(number));
}
+ private void handleRecordingClick(View v, List<CallRecording> recordings) {
+ final Context context = v.getContext();
+ if (recordings.size() == 1) {
+ playRecording(context, recordings.get(0));
+ } else {
+ PopupMenu menu = new PopupMenu(context, v);
+ String pattern = DateFormat.getBestDateTimePattern(Locale.getDefault(),
+ DateFormat.is24HourFormat(context) ? "Hmss" : "hmssa");
+ SimpleDateFormat format = new SimpleDateFormat(pattern);
+
+ for (int i = 0; i < recordings.size(); i++) {
+ final long startTime = recordings.get(i).startRecordingTime;
+ final String formattedDate = format.format(new Date(startTime));
+ menu.getMenu().add(Menu.NONE, i, i, formattedDate);
+ }
+ menu.setOnMenuItemClickListener(item -> {
+ playRecording(context, recordings.get(item.getItemId()));
+ return true;
+ });
+ menu.show();
+ }
+ }
+
+ private void playRecording(Context context, CallRecording recording) {
+ Uri uri = ContentUris.withAppendedId(
+ MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, recording.mediaId);
+ String extension = MimeTypeMap.getFileExtensionFromUrl(recording.fileName);
+ String mime = !TextUtils.isEmpty(extension)
+ ? MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension) : "audio/*";
+ try {
+ Intent intent = new Intent(Intent.ACTION_VIEW)
+ .setDataAndType(uri, mime)
+ .addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
+ context.startActivity(intent);
+ } catch (ActivityNotFoundException e) {
+ Toast.makeText(context, R.string.call_playback_no_app_found_toast, Toast.LENGTH_LONG)
+ .show();
+ }
+ }
+
private static boolean isIncoming(@NonNull HistoryResult historyResult) {
return historyResult.getType() == Type.INCOMING_POST_CALL
|| historyResult.getType() == Type.INCOMING_CALL_COMPOSER;