From 8ae640746169693107fd748769a1339a05a4b2e6 Mon Sep 17 00:00:00 2001 From: adbenitez Date: Tue, 30 Sep 2025 22:41:14 +0200 Subject: [PATCH] add call duration to message bubble --- .../securesms/components/CallItemView.java | 6 ++++++ .../components/ConversationItemFooter.java | 19 +++++++++++++++++-- .../securesms/util/DateUtils.java | 13 +++++++++++++ src/main/res/values/strings.xml | 12 ++++++++++++ 4 files changed, 48 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/thoughtcrime/securesms/components/CallItemView.java b/src/main/java/org/thoughtcrime/securesms/components/CallItemView.java index 4d829b2bd..fe6dcdbad 100644 --- a/src/main/java/org/thoughtcrime/securesms/components/CallItemView.java +++ b/src/main/java/org/thoughtcrime/securesms/components/CallItemView.java @@ -55,6 +55,12 @@ public class CallItemView extends FrameLayout { public void setCallItem(boolean isOutgoing, CallInfo callInfo) { this.callInfo = callInfo; + if (callInfo.state instanceof CallState.Completed) { + footer.setCallDuration(((CallState.Completed) callInfo.state).duration); + } else { + footer.setCallDuration(0); // reset + } + if (callInfo.state instanceof CallState.Missed) { title.setText(R.string.missed_call); } else if (callInfo.state instanceof CallState.Cancelled) { diff --git a/src/main/java/org/thoughtcrime/securesms/components/ConversationItemFooter.java b/src/main/java/org/thoughtcrime/securesms/components/ConversationItemFooter.java index fe6d61444..11b1b281f 100644 --- a/src/main/java/org/thoughtcrime/securesms/components/ConversationItemFooter.java +++ b/src/main/java/org/thoughtcrime/securesms/components/ConversationItemFooter.java @@ -26,6 +26,7 @@ public class ConversationItemFooter extends LinearLayout { private ImageView locationIndicatorView; private DeliveryStatusView deliveryStatusView; private Integer textColor = null; + private int callDuration = 0; public ConversationItemFooter(Context context) { super(context); @@ -59,6 +60,11 @@ public class ConversationItemFooter extends LinearLayout { } } + /* Call duration in seconds. Only >0 if this is a call message */ + public void setCallDuration(int duration) { + callDuration = duration; + } + public void setMessageRecord(@NonNull DcMsg messageRecord) { presentDate(messageRecord); boolean bookmark = messageRecord.getOriginalMsgId() != 0 || messageRecord.getSavedMsgId() != 0; @@ -86,9 +92,18 @@ public class ConversationItemFooter extends LinearLayout { deliveryStatusView.setTint(color); } - private void presentDate(@NonNull DcMsg messageRecord) { + private void presentDate(@NonNull DcMsg dcMsg) { dateView.forceLayout(); - dateView.setText(DateUtils.getExtendedRelativeTimeSpanString(getContext(), messageRecord.getTimestamp())); + Context context = getContext(); + String date = dcMsg.getType() == DcMsg.DC_MSG_CALL? + DateUtils.getFormattedCallTime(context, dcMsg.getTimestamp()) + : DateUtils.getExtendedRelativeTimeSpanString(context, dcMsg.getTimestamp()); + if (callDuration > 0) { + String duration = DateUtils.getFormattedCallDuration(context, callDuration); + dateView.setText(context.getString(R.string.call_date_and_duration, date, duration)); + } else { + dateView.setText(date); + } } private void presentDeliveryStatus(@NonNull DcMsg messageRecord) { diff --git a/src/main/java/org/thoughtcrime/securesms/util/DateUtils.java b/src/main/java/org/thoughtcrime/securesms/util/DateUtils.java index 14c6cdf33..ed1345792 100644 --- a/src/main/java/org/thoughtcrime/securesms/util/DateUtils.java +++ b/src/main/java/org/thoughtcrime/securesms/util/DateUtils.java @@ -119,6 +119,19 @@ public class DateUtils extends android.text.format.DateUtils { TimeUnit.MILLISECONDS.toSeconds(millis-(TimeUnit.MILLISECONDS.toMinutes(millis)*60000))); } + public static String getFormattedCallDuration(Context c, int seconds) { + if (seconds < 60) { + return c.getResources().getQuantityString(R.plurals.n_seconds_ext, seconds, seconds); + } + + int mins = seconds / 60; + return c.getResources().getQuantityString(R.plurals.n_minutes_ext, mins, mins); + } + + public static String getFormattedCallTime(final Context c, final long timestamp) { + return getFormattedDateTime(timestamp, DateFormat.is24HourFormat(c)? "HH:mm" : "hh:mm a"); + } + public static String getFormattedTimespan(Context c, int timestamp) { int mins = timestamp / (1000 * 60); if (mins / 60 == 0) { diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml index a83e8af2c..2f98f699d 100644 --- a/src/main/res/values/strings.xml +++ b/src/main/res/values/strings.xml @@ -118,11 +118,22 @@ Last seen %1$s Last seen: Unknown + + + %d second + %d seconds + + + + %d minute + %d minutes + %d min %d min + %d hour @@ -377,6 +388,7 @@ Declined Call Canceled Call Missed Call + %1$s, %2$s Video Chat