From b546d661ba498d5d1fcf1ced4a09a3bce807d58c Mon Sep 17 00:00:00 2001 From: Cody Henthorne Date: Wed, 4 Jan 2023 12:05:49 -0500 Subject: [PATCH] Update 1:1 call event copy. --- .../ConversationListItem.java | 13 ++++--- .../securesms/database/ThreadBodyUtil.java | 29 ++++++++++++++ .../database/model/MediaMmsMessageRecord.java | 22 +++++------ .../database/model/MessageRecord.java | 12 +++--- .../webrtc/IncomingCallActionProcessor.java | 2 +- app/src/main/res/values/strings.xml | 38 +++++++++++-------- 6 files changed, 76 insertions(+), 40 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListItem.java b/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListItem.java index fbdb3529d..e4b47a438 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListItem.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListItem.java @@ -45,6 +45,7 @@ import com.bumptech.glide.load.resource.bitmap.CenterCrop; import com.makeramen.roundedimageview.RoundedDrawable; import org.signal.core.util.DimensionUnit; +import org.signal.core.util.StringUtil; import org.signal.core.util.logging.Log; import org.thoughtcrime.securesms.BindableConversationListItem; import org.thoughtcrime.securesms.OverlayTransformation; @@ -530,17 +531,17 @@ public final class ConversationListItem extends ConstraintLayout implements Bind String draftText = context.getString(R.string.ThreadRecord_draft); return emphasisAdded(context, draftText + " " + thread.getBody(), defaultTint); } else if (MessageTypes.isOutgoingAudioCall(thread.getType())) { - return emphasisAdded(context, context.getString(R.string.ThreadRecord_called), R.drawable.ic_update_audio_call_outgoing_16, defaultTint); + return emphasisAdded(context, StringUtil.isEmpty(thread.getBody()) ? context.getString(R.string.MessageRecord_outgoing_voice_call) : thread.getBody(), R.drawable.ic_update_audio_call_outgoing_16, defaultTint); } else if (MessageTypes.isOutgoingVideoCall(thread.getType())) { - return emphasisAdded(context, context.getString(R.string.ThreadRecord_called), R.drawable.ic_update_video_call_outgoing_16, defaultTint); + return emphasisAdded(context, StringUtil.isEmpty(thread.getBody()) ? context.getString(R.string.MessageRecord_outgoing_video_call) : thread.getBody(), R.drawable.ic_update_video_call_outgoing_16, defaultTint); } else if (MessageTypes.isIncomingAudioCall(thread.getType())) { - return emphasisAdded(context, context.getString(R.string.ThreadRecord_called_you), R.drawable.ic_update_audio_call_incoming_16, defaultTint); + return emphasisAdded(context, StringUtil.isEmpty(thread.getBody()) ? context.getString(R.string.MessageRecord_incoming_voice_call) : thread.getBody(), R.drawable.ic_update_audio_call_incoming_16, defaultTint); } else if (MessageTypes.isIncomingVideoCall(thread.getType())) { - return emphasisAdded(context, context.getString(R.string.ThreadRecord_called_you), R.drawable.ic_update_video_call_incoming_16, defaultTint); + return emphasisAdded(context, StringUtil.isEmpty(thread.getBody()) ? context.getString(R.string.MessageRecord_incoming_video_call) : thread.getBody(), R.drawable.ic_update_video_call_incoming_16, defaultTint); } else if (MessageTypes.isMissedAudioCall(thread.getType())) { - return emphasisAdded(context, context.getString(R.string.ThreadRecord_missed_audio_call), R.drawable.ic_update_audio_call_missed_16, defaultTint); + return emphasisAdded(context, StringUtil.isEmpty(thread.getBody()) ? context.getString(R.string.MessageRecord_missed_voice_call) : thread.getBody(), R.drawable.ic_update_audio_call_missed_16, defaultTint); } else if (MessageTypes.isMissedVideoCall(thread.getType())) { - return emphasisAdded(context, context.getString(R.string.ThreadRecord_missed_video_call), R.drawable.ic_update_video_call_missed_16, defaultTint); + return emphasisAdded(context, StringUtil.isEmpty(thread.getBody()) ? context.getString(R.string.MessageRecord_missed_video_call) : thread.getBody(), R.drawable.ic_update_video_call_missed_16, defaultTint); } else if (MessageTypes.isGroupCall(thread.getType())) { return emphasisAdded(context, MessageRecord.getGroupCallUpdateDescription(context, thread.getBody(), false), defaultTint); } else if (MessageTypes.isJoinedType(thread.getType())) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/ThreadBodyUtil.java b/app/src/main/java/org/thoughtcrime/securesms/database/ThreadBodyUtil.java index 336f69031..07aa7253f 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/ThreadBodyUtil.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/ThreadBodyUtil.java @@ -58,6 +58,8 @@ public final class ThreadBodyUtil { return String.format("%s %s", EmojiStrings.CARD, getPaymentActivationRequestSummary(context, record)); } else if (record.isPaymentsActivated()) { return String.format("%s %s", EmojiStrings.CARD, getPaymentActivatedSummary(context, record)); + } else if (record.isCallLog() && !record.isGroupCall()) { + return getCallLogSummary(context, record); } boolean hasImage = false; @@ -116,6 +118,33 @@ public final class ThreadBodyUtil { return context.getString(R.string.ThreadRecord_can_accept_payments, messageRecord.getRecipient().getShortDisplayName(context)); } } + + private static @NonNull String getCallLogSummary(@NonNull Context context, @NonNull MessageRecord record) { + CallTable.Call call = SignalDatabase.calls().getCallByMessageId(record.getId()); + if (call != null) { + boolean accepted = call.getEvent() == CallTable.Event.ACCEPTED; + if (call.getDirection() == CallTable.Direction.OUTGOING) { + if (call.getType() == CallTable.Type.AUDIO_CALL) { + return context.getString(accepted ? R.string.MessageRecord_outgoing_voice_call : R.string.MessageRecord_unanswered_voice_call); + } else { + return context.getString(accepted ? R.string.MessageRecord_outgoing_video_call : R.string.MessageRecord_unanswered_video_call); + } + } else { + boolean isVideoCall = call.getType() == CallTable.Type.VIDEO_CALL; + boolean isMissed = call.getEvent() == CallTable.Event.MISSED; + + if (accepted) { + return context.getString(isVideoCall ? R.string.MessageRecord_incoming_video_call : R.string.MessageRecord_incoming_voice_call); + } else if (isMissed) { + return isVideoCall ? context.getString(R.string.MessageRecord_missed_video_call) : context.getString(R.string.MessageRecord_missed_voice_call); + } else { + return isVideoCall ? context.getString(R.string.MessageRecord_you_declined_a_video_call) : context.getString(R.string.MessageRecord_you_declined_a_voice_call); + } + } + } else { + return ""; + } + } private static @NonNull String format(@NonNull Context context, @NonNull MessageRecord record, @NonNull String emoji, @StringRes int defaultStringRes) { return String.format("%s %s", emoji, getBodyOrDefault(context, record, defaultStringRes)); diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/model/MediaMmsMessageRecord.java b/app/src/main/java/org/thoughtcrime/securesms/database/model/MediaMmsMessageRecord.java index 22061cf91..c6cb63f23 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/model/MediaMmsMessageRecord.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/model/MediaMmsMessageRecord.java @@ -153,32 +153,32 @@ public class MediaMmsMessageRecord extends MmsMessageRecord { if (call.getDirection() == CallTable.Direction.OUTGOING) { if (call.getType() == CallTable.Type.AUDIO_CALL) { - int updateString = accepted ? R.string.MessageRecord_you_called_date : R.string.MessageRecord_unanswered_audio_call_date; - return staticUpdateDescription(context.getString(updateString, callDateString), R.drawable.ic_update_audio_call_outgoing_16); + int updateString = accepted ? R.string.MessageRecord_outgoing_voice_call : R.string.MessageRecord_unanswered_voice_call; + return staticUpdateDescription(context.getString(R.string.MessageRecord_call_message_with_date, context.getString(updateString), callDateString), R.drawable.ic_update_audio_call_outgoing_16); } else { - int updateString = accepted ? R.string.MessageRecord_you_called_date : R.string.MessageRecord_unanswered_video_call_date; - return staticUpdateDescription(context.getString(updateString, callDateString), R.drawable.ic_update_video_call_outgoing_16); + int updateString = accepted ? R.string.MessageRecord_outgoing_video_call : R.string.MessageRecord_unanswered_video_call; + return staticUpdateDescription(context.getString(R.string.MessageRecord_call_message_with_date, context.getString(updateString), callDateString), R.drawable.ic_update_video_call_outgoing_16); } } else { boolean isVideoCall = call.getType() == CallTable.Type.VIDEO_CALL; boolean isMissed = call.getEvent() == CallTable.Event.MISSED; if (accepted) { - int icon = isVideoCall ? R.drawable.ic_update_video_call_incoming_16 : R.drawable.ic_update_audio_call_incoming_16; - return fromRecipient(getIndividualRecipient(), r -> context.getString(R.string.MessageRecord_s_called_you_date, r.getDisplayName(context), callDateString), icon); + int updateString = isVideoCall ? R.string.MessageRecord_incoming_video_call : R.string.MessageRecord_incoming_voice_call; + int icon = isVideoCall ? R.drawable.ic_update_video_call_incoming_16 : R.drawable.ic_update_audio_call_incoming_16; + return staticUpdateDescription(context.getString(R.string.MessageRecord_call_message_with_date, context.getString(updateString), callDateString), icon); } else if (isMissed) { - return isVideoCall ? staticUpdateDescription(context.getString(R.string.MessageRecord_missed_video_call_date, callDateString), R.drawable.ic_update_video_call_missed_16, ContextCompat.getColor(context, R.color.core_red_shade), ContextCompat.getColor(context, R.color.core_red)) - : staticUpdateDescription(context.getString(R.string.MessageRecord_missed_audio_call_date, callDateString), R.drawable.ic_update_audio_call_missed_16, ContextCompat.getColor(context, R.color.core_red_shade), ContextCompat.getColor(context, R.color.core_red)); + return isVideoCall ? staticUpdateDescription(context.getString(R.string.MessageRecord_call_message_with_date, context.getString(R.string.MessageRecord_missed_video_call), callDateString), R.drawable.ic_update_video_call_missed_16, ContextCompat.getColor(context, R.color.core_red_shade), ContextCompat.getColor(context, R.color.core_red)) + : staticUpdateDescription(context.getString(R.string.MessageRecord_call_message_with_date, context.getString(R.string.MessageRecord_missed_voice_call), callDateString), R.drawable.ic_update_audio_call_missed_16, ContextCompat.getColor(context, R.color.core_red_shade), ContextCompat.getColor(context, R.color.core_red)); } else { - return isVideoCall ? fromRecipient(getIndividualRecipient(), r -> context.getString(R.string.MessageRecord_declined_video_call_date, callDateString), R.drawable.ic_update_video_call_incoming_16) - : fromRecipient(getIndividualRecipient(), r -> context.getString(R.string.MessageRecord_declined_audio_call_date, callDateString), R.drawable.ic_update_audio_call_incoming_16); + return isVideoCall ? staticUpdateDescription(context.getString(R.string.MessageRecord_call_message_with_date, context.getString(R.string.MessageRecord_you_declined_a_video_call), callDateString), R.drawable.ic_update_video_call_incoming_16) + : staticUpdateDescription(context.getString(R.string.MessageRecord_call_message_with_date, context.getString(R.string.MessageRecord_you_declined_a_voice_call), callDateString), R.drawable.ic_update_audio_call_incoming_16); } } } return super.getUpdateDisplayBody(context, recipientClickHandler); } - public @Nullable BodyRangeList getMessageRanges() { return messageRanges; } diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/model/MessageRecord.java b/app/src/main/java/org/thoughtcrime/securesms/database/model/MessageRecord.java index 603ae426b..d40ef30df 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/model/MessageRecord.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/model/MessageRecord.java @@ -176,17 +176,17 @@ public abstract class MessageRecord extends DisplayRecord { } else if (isGroupQuit()) { return fromRecipient(getIndividualRecipient(), r -> context.getString(R.string.ConversationItem_group_action_left, r.getDisplayName(context)), R.drawable.ic_update_group_leave_16); } else if (isIncomingAudioCall()) { - return fromRecipient(getIndividualRecipient(), r -> context.getString(R.string.MessageRecord_s_called_you_date, r.getDisplayName(context), getCallDateString(context)), R.drawable.ic_update_audio_call_incoming_16); + return staticUpdateDescription(context.getString(R.string.MessageRecord_call_message_with_date, context.getString(R.string.MessageRecord_incoming_voice_call), getCallDateString(context)), R.drawable.ic_update_audio_call_incoming_16); } else if (isIncomingVideoCall()) { - return fromRecipient(getIndividualRecipient(), r -> context.getString(R.string.MessageRecord_s_called_you_date, r.getDisplayName(context), getCallDateString(context)), R.drawable.ic_update_video_call_incoming_16); + return staticUpdateDescription(context.getString(R.string.MessageRecord_call_message_with_date, context.getString(R.string.MessageRecord_incoming_video_call), getCallDateString(context)), R.drawable.ic_update_video_call_incoming_16); } else if (isOutgoingAudioCall()) { - return staticUpdateDescription(context.getString(R.string.MessageRecord_you_called_date, getCallDateString(context)), R.drawable.ic_update_audio_call_outgoing_16); + return staticUpdateDescription(context.getString(R.string.MessageRecord_call_message_with_date, context.getString(R.string.MessageRecord_outgoing_voice_call), getCallDateString(context)), R.drawable.ic_update_audio_call_outgoing_16); } else if (isOutgoingVideoCall()) { - return staticUpdateDescription(context.getString(R.string.MessageRecord_you_called_date, getCallDateString(context)), R.drawable.ic_update_video_call_outgoing_16); + return staticUpdateDescription(context.getString(R.string.MessageRecord_call_message_with_date, context.getString(R.string.MessageRecord_outgoing_video_call), getCallDateString(context)), R.drawable.ic_update_video_call_outgoing_16); } else if (isMissedAudioCall()) { - return staticUpdateDescription(context.getString(R.string.MessageRecord_missed_audio_call_date, getCallDateString(context)), R.drawable.ic_update_audio_call_missed_16, ContextCompat.getColor(context, R.color.core_red_shade), ContextCompat.getColor(context, R.color.core_red)); + return staticUpdateDescription(context.getString(R.string.MessageRecord_call_message_with_date, context.getString(R.string.MessageRecord_missed_voice_call), getCallDateString(context)), R.drawable.ic_update_audio_call_missed_16, ContextCompat.getColor(context, R.color.core_red_shade), ContextCompat.getColor(context, R.color.core_red)); } else if (isMissedVideoCall()) { - return staticUpdateDescription(context.getString(R.string.MessageRecord_missed_video_call_date, getCallDateString(context)), R.drawable.ic_update_video_call_missed_16, ContextCompat.getColor(context, R.color.core_red_shade), ContextCompat.getColor(context, R.color.core_red)); + return staticUpdateDescription(context.getString(R.string.MessageRecord_call_message_with_date, context.getString(R.string.MessageRecord_missed_video_call), getCallDateString(context)), R.drawable.ic_update_video_call_missed_16, ContextCompat.getColor(context, R.color.core_red_shade), ContextCompat.getColor(context, R.color.core_red)); } else if (isGroupCall()) { return getGroupCallUpdateDescription(context, getBody(), true); } else if (isJoined()) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/IncomingCallActionProcessor.java b/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/IncomingCallActionProcessor.java index 4be149747..80dbcc2a6 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/IncomingCallActionProcessor.java +++ b/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/IncomingCallActionProcessor.java @@ -157,7 +157,7 @@ public class IncomingCallActionProcessor extends DeviceAwareActionProcessor { webRtcInteractor.sendNotAcceptedCallEventSyncMessage(activePeer, false, - currentState.getCallSetupState(activePeer).isAcceptWithVideo() || currentState.getLocalDeviceState().getCameraState().isEnabled()); + currentState.getCallSetupState(activePeer).isRemoteVideoOffer()); try { webRtcInteractor.rejectIncomingCall(activePeer.getId()); diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index a0165f71c..d4b3c5f04 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1152,19 +1152,29 @@ You have left the group. You updated the group. The group was updated. - You called · %1$s - - Unanswered audio call · %1$s - - Unanswered video call · %1$s - Missed audio call · %1$s - Missed video call · %1$s - - Declined audio call · %1$s - - Declined video call · %1$s + + Outgoing voice call + + Outgoing video call + + Unanswered voice call + + Unanswered video call + + Incoming voice call + + Incoming video call + + Missed voice call + + Missed video call + + You declined a voice call + + You declined a video call + + %1$s · %2$s %s updated the group. - %1$s called you · %2$s %s is on Signal! You disabled disappearing messages. %1$s disabled disappearing messages. @@ -1850,10 +1860,6 @@ Left the group Secure session reset. Draft: - You called - Called you - Missed audio call - Missed video call Media message Sticker View-once photo