From 4b9217e3e6f3d3c3e6b96fb40f89566a2bfec07f Mon Sep 17 00:00:00 2001 From: adbenitez Date: Tue, 30 Sep 2025 16:29:47 +0200 Subject: [PATCH 1/7] rename calls package --- src/main/AndroidManifest.xml | 2 +- .../securesms/ConversationActivity.java | 4 ++-- .../securesms/ConversationFragment.java | 2 +- .../securesms/ConversationItem.java | 6 ++--- .../CallActivity.java} | 8 +++---- .../CallUtil.java} | 24 +++++++++---------- .../notifications/NotificationCenter.java | 12 +++++----- 7 files changed, 29 insertions(+), 29 deletions(-) rename src/main/java/org/thoughtcrime/securesms/{videochat/VideochatActivity.java => calls/CallActivity.java} (95%) rename src/main/java/org/thoughtcrime/securesms/{videochat/VideochatUtil.java => calls/CallUtil.java} (68%) diff --git a/src/main/AndroidManifest.xml b/src/main/AndroidManifest.xml index eba9a14cf..702cdadbd 100644 --- a/src/main/AndroidManifest.xml +++ b/src/main/AndroidManifest.xml @@ -371,7 +371,7 @@ android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize"> - Date: Tue, 30 Sep 2025 17:30:38 +0200 Subject: [PATCH 2/7] hide delivery status if not sending or error --- .../securesms/components/ConversationItemFooter.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/thoughtcrime/securesms/components/ConversationItemFooter.java b/src/main/java/org/thoughtcrime/securesms/components/ConversationItemFooter.java index f74c0ce6b..fe6d61444 100644 --- a/src/main/java/org/thoughtcrime/securesms/components/ConversationItemFooter.java +++ b/src/main/java/org/thoughtcrime/securesms/components/ConversationItemFooter.java @@ -94,10 +94,12 @@ public class ConversationItemFooter extends LinearLayout { private void presentDeliveryStatus(@NonNull DcMsg messageRecord) { // isDownloading is temporary and should be checked first. boolean isDownloading = messageRecord.getDownloadState() == DcMsg.DC_DOWNLOAD_IN_PROGRESS; + boolean isCall = messageRecord.getType() == DcMsg.DC_MSG_CALL; if (isDownloading) deliveryStatusView.setDownloading(); + else if (messageRecord.isPending()) deliveryStatusView.setPending(); else if (messageRecord.isFailed()) deliveryStatusView.setFailed(); - else if (!messageRecord.isOutgoing()) deliveryStatusView.setNone(); + else if (!messageRecord.isOutgoing() || isCall) deliveryStatusView.setNone(); else if (messageRecord.isRemoteRead()) deliveryStatusView.setRead(); else if (messageRecord.isDelivered()) deliveryStatusView.setSent(); else if (messageRecord.isPreparing()) deliveryStatusView.setPreparing(); From f28fffb9dfb3b09caf8139c2881ee4c8b1e7c2b0 Mon Sep 17 00:00:00 2001 From: adbenitez Date: Tue, 30 Sep 2025 20:07:47 +0200 Subject: [PATCH 3/7] update core --- jni/deltachat-core-rust | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jni/deltachat-core-rust b/jni/deltachat-core-rust index 1ba448fe1..ba2e573c2 160000 --- a/jni/deltachat-core-rust +++ b/jni/deltachat-core-rust @@ -1 +1 @@ -Subproject commit 1ba448fe199751e0854fccccde8c768229a5f44e +Subproject commit ba2e573c2358f7c29bf3ad3bb082dd74da167261 From 7ace2b9baf55156ec5f870e58cf7af5976a65e5f Mon Sep 17 00:00:00 2001 From: adbenitez Date: Tue, 30 Sep 2025 20:46:01 +0200 Subject: [PATCH 4/7] add spaces arround == --- src/main/java/org/thoughtcrime/securesms/ConversationItem.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/thoughtcrime/securesms/ConversationItem.java b/src/main/java/org/thoughtcrime/securesms/ConversationItem.java index 7c16139e1..c41bdd53a 100644 --- a/src/main/java/org/thoughtcrime/securesms/ConversationItem.java +++ b/src/main/java/org/thoughtcrime/securesms/ConversationItem.java @@ -578,7 +578,7 @@ public class ConversationItem extends BaseConversationItem ViewUtil.updateLayoutParams(groupSenderHolder, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); footer.setVisibility(VISIBLE); } - else if (messageRecord.getType()==DcMsg.DC_MSG_CALL) { + else if (messageRecord.getType() == DcMsg.DC_MSG_CALL) { callViewStub.get().setVisibility(View.VISIBLE); if (mediaThumbnailStub.resolved()) mediaThumbnailStub.get().setVisibility(View.GONE); if (audioViewStub.resolved()) audioViewStub.get().setVisibility(View.GONE); From 74208fff6964c1d52398ddc2871607b6c02f6212 Mon Sep 17 00:00:00 2001 From: adbenitez Date: Tue, 30 Sep 2025 22:37:47 +0200 Subject: [PATCH 5/7] update CallInfo --- src/main/java/chat/delta/rpc/types/CallInfo.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/chat/delta/rpc/types/CallInfo.java b/src/main/java/chat/delta/rpc/types/CallInfo.java index 9d8c59f72..f75708d86 100644 --- a/src/main/java/chat/delta/rpc/types/CallInfo.java +++ b/src/main/java/chat/delta/rpc/types/CallInfo.java @@ -2,6 +2,8 @@ package chat.delta.rpc.types; public class CallInfo { + /* True if SDP offer has a video. */ + public Boolean hasVideo; /** * SDP offer. *

From ae8ce94c002e08ec26466d0a791a1b59bc97e12a Mon Sep 17 00:00:00 2001 From: adbenitez Date: Tue, 30 Sep 2025 22:39:37 +0200 Subject: [PATCH 6/7] add spaces around == --- .../java/org/thoughtcrime/securesms/ConversationItem.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/thoughtcrime/securesms/ConversationItem.java b/src/main/java/org/thoughtcrime/securesms/ConversationItem.java index c41bdd53a..d388cc226 100644 --- a/src/main/java/org/thoughtcrime/securesms/ConversationItem.java +++ b/src/main/java/org/thoughtcrime/securesms/ConversationItem.java @@ -412,7 +412,7 @@ public class ConversationItem extends BaseConversationItem String text = messageRecord.getText(); - if (messageRecord.getType()==DcMsg.DC_MSG_CALL || text.isEmpty()) { + if (messageRecord.getType() == DcMsg.DC_MSG_CALL || text.isEmpty()) { bodyText.setVisibility(View.GONE); } else { @@ -821,7 +821,7 @@ public class ConversationItem extends BaseConversationItem return stickerStub.get().getFooter(); } else if (hasOnlyThumbnail(messageRecord) && TextUtils.isEmpty(messageRecord.getText())) { return mediaThumbnailStub.get().getFooter(); - } else if (messageRecord.getType()==DcMsg.DC_MSG_CALL) { + } else if (messageRecord.getType() == DcMsg.DC_MSG_CALL) { return callViewStub.get().getFooter(); } else { return footer; From 8ae640746169693107fd748769a1339a05a4b2e6 Mon Sep 17 00:00:00 2001 From: adbenitez Date: Tue, 30 Sep 2025 22:41:14 +0200 Subject: [PATCH 7/7] 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