From 15ee8c6cac71c9ed4440ada8a8fd4d0592d80312 Mon Sep 17 00:00:00 2001 From: Christian Ascheberg Date: Thu, 17 Sep 2020 08:52:48 +0200 Subject: [PATCH] Fix timestamp of missed call record. Fixes #7647 --- .../conversation/ConversationUpdateItem.java | 2 +- .../securesms/database/MessageDatabase.java | 2 +- .../securesms/database/MmsDatabase.java | 2 +- .../securesms/database/SmsDatabase.java | 12 ++++----- .../database/model/MessageRecord.java | 2 +- .../securesms/service/WebRtcCallService.java | 26 ++++++++++--------- 6 files changed, 24 insertions(+), 22 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationUpdateItem.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationUpdateItem.java index e128b39859..8405bb7f19 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationUpdateItem.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationUpdateItem.java @@ -186,7 +186,7 @@ public final class ConversationUpdateItem extends LinearLayout else if (messageRecord.isOutgoingCall()) icon.setImageResource(R.drawable.ic_call_made_grey600_24dp); else icon.setImageResource(R.drawable.ic_call_missed_grey600_24dp); - date.setText(DateUtils.getExtendedRelativeTimeSpanString(getContext(), locale, messageRecord.getDateReceived())); + date.setText(DateUtils.getExtendedRelativeTimeSpanString(getContext(), locale, messageRecord.getDateSent())); title.setVisibility(GONE); date.setVisibility(View.VISIBLE); diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/MessageDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/MessageDatabase.java index d6dfceb630..6e7ae2e62e 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/MessageDatabase.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/MessageDatabase.java @@ -126,7 +126,7 @@ public abstract class MessageDatabase extends Database implements MmsSmsColumns public abstract @NonNull Pair insertReceivedCall(@NonNull RecipientId address); public abstract @NonNull Pair insertOutgoingCall(@NonNull RecipientId address); - public abstract @NonNull Pair insertMissedCall(@NonNull RecipientId address); + public abstract @NonNull Pair insertMissedCall(@NonNull RecipientId address, long timestamp); public abstract Optional insertMessageInbox(IncomingTextMessage message, long type); public abstract Optional insertMessageInbox(IncomingTextMessage message); diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/MmsDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/MmsDatabase.java index 446ecbf1aa..7bd9babebf 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/MmsDatabase.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/MmsDatabase.java @@ -389,7 +389,7 @@ public class MmsDatabase extends MessageDatabase { } @Override - public @NonNull Pair insertMissedCall(@NonNull RecipientId address) { + public @NonNull Pair insertMissedCall(@NonNull RecipientId address, long timestamp) { throw new UnsupportedOperationException(); } diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/SmsDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/SmsDatabase.java index 5fcc14e442..5e25a2687f 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/SmsDatabase.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/SmsDatabase.java @@ -644,20 +644,20 @@ public class SmsDatabase extends MessageDatabase { @Override public @NonNull Pair insertReceivedCall(@NonNull RecipientId address) { - return insertCallLog(address, Types.INCOMING_CALL_TYPE, false); + return insertCallLog(address, Types.INCOMING_CALL_TYPE, false, System.currentTimeMillis()); } @Override public @NonNull Pair insertOutgoingCall(@NonNull RecipientId address) { - return insertCallLog(address, Types.OUTGOING_CALL_TYPE, false); + return insertCallLog(address, Types.OUTGOING_CALL_TYPE, false, System.currentTimeMillis()); } @Override - public @NonNull Pair insertMissedCall(@NonNull RecipientId address) { - return insertCallLog(address, Types.MISSED_CALL_TYPE, true); + public @NonNull Pair insertMissedCall(@NonNull RecipientId address, long timestamp) { + return insertCallLog(address, Types.MISSED_CALL_TYPE, true, timestamp); } - private @NonNull Pair insertCallLog(@NonNull RecipientId recipientId, long type, boolean unread) { + private @NonNull Pair insertCallLog(@NonNull RecipientId recipientId, long type, boolean unread, long timestamp) { Recipient recipient = Recipient.resolved(recipientId); long threadId = DatabaseFactory.getThreadDatabase(context).getThreadIdFor(recipient); @@ -665,7 +665,7 @@ public class SmsDatabase extends MessageDatabase { values.put(RECIPIENT_ID, recipientId.serialize()); values.put(ADDRESS_DEVICE_ID, 1); values.put(DATE_RECEIVED, System.currentTimeMillis()); - values.put(DATE_SENT, System.currentTimeMillis()); + values.put(DATE_SENT, timestamp); values.put(READ, unread ? 0 : 1); values.put(TYPE, type); values.put(THREAD_ID, threadId); 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 19906c3fe8..503d217fa5 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 @@ -270,7 +270,7 @@ public abstract class MessageRecord extends DisplayRecord { } public long getTimestamp() { - if (isPush() && getDateSent() < getDateReceived()) { + if ((isPush() || isCallLog()) && getDateSent() < getDateReceived()) { return getDateSent(); } return getDateReceived(); diff --git a/app/src/main/java/org/thoughtcrime/securesms/service/WebRtcCallService.java b/app/src/main/java/org/thoughtcrime/securesms/service/WebRtcCallService.java index 5ed306c26d..5533e86cc0 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/service/WebRtcCallService.java +++ b/app/src/main/java/org/thoughtcrime/securesms/service/WebRtcCallService.java @@ -80,7 +80,6 @@ import org.whispersystems.signalservice.api.push.exceptions.UnregisteredUserExce import java.io.IOException; import java.util.ArrayList; -import java.util.Collections; import java.util.LinkedHashMap; import java.util.LinkedList; import java.util.List; @@ -202,6 +201,7 @@ public class WebRtcCallService extends Service implements CallManager.Observer, @Nullable private RemotePeer busyPeer; @Nullable private RemotePeer preJoinPeer; @Nullable private SparseArray peerMap; + private long callStartTimestamp; @Nullable private EglBase eglBase; @Nullable private BroadcastVideoSink localSink; @@ -422,7 +422,7 @@ public class WebRtcCallService extends Service implements CallManager.Observer, Log.i(TAG, "PSTN line is busy."); intent.putExtra(EXTRA_BROADCAST, true); handleSendBusy(intent); - insertMissedCall(remotePeer, true); + insertMissedCall(remotePeer, true, serverReceivedTimestamp); return; } @@ -431,11 +431,12 @@ public class WebRtcCallService extends Service implements CallManager.Observer, intent.putExtra(EXTRA_BROADCAST, true); intent.putExtra(EXTRA_HANGUP_TYPE, HangupMessage.Type.NEED_PERMISSION.getCode()); handleSendHangup(intent); - insertMissedCall(remotePeer, true); + insertMissedCall(remotePeer, true, serverReceivedTimestamp); return; } peerMap.append(remotePeer.hashCode(), remotePeer); + callStartTimestamp = serverReceivedTimestamp; Log.i(TAG, "add remotePeer callId: " + remotePeer.getCallId() + " key: " + remotePeer.hashCode()); isRemoteVideoOffer = offerType == OfferMessage.Type.VIDEO_CALL; @@ -523,6 +524,7 @@ public class WebRtcCallService extends Service implements CallManager.Observer, EventBus.getDefault().removeStickyEvent(WebRtcViewModel.class); peerMap.append(remotePeer.hashCode(), remotePeer); + callStartTimestamp = System.currentTimeMillis(); Log.i(TAG, "add remotePeer callId: " + remotePeer.getCallId() + " key: " + remotePeer.hashCode()); initializeVideo(); @@ -552,8 +554,8 @@ public class WebRtcCallService extends Service implements CallManager.Observer, } } - private void insertMissedCall(@NonNull RemotePeer remotePeer, boolean signal) { - Pair messageAndThreadId = DatabaseFactory.getSmsDatabase(this).insertMissedCall(remotePeer.getId()); + private void insertMissedCall(@NonNull RemotePeer remotePeer, boolean signal, long timestamp) { + Pair messageAndThreadId = DatabaseFactory.getSmsDatabase(this).insertMissedCall(remotePeer.getId(), timestamp); ApplicationDependencies.getMessageNotifier().updateNotification(this, messageAndThreadId.second(), signal); } @@ -572,7 +574,7 @@ public class WebRtcCallService extends Service implements CallManager.Observer, try { callManager.hangup(); - DatabaseFactory.getSmsDatabase(this).insertMissedCall(activePeer.getId()); + DatabaseFactory.getSmsDatabase(this).insertMissedCall(activePeer.getId(), System.currentTimeMillis()); terminate(activePeer); } catch (CallException e) { callFailure("hangup() failed: ", e); @@ -1166,7 +1168,7 @@ public class WebRtcCallService extends Service implements CallManager.Observer, Log.i(TAG, "handleReceivedOfferExpired(): call_id: " + remotePeer.getCallId()); - insertMissedCall(remotePeer, true); + insertMissedCall(remotePeer, true, callStartTimestamp); terminate(remotePeer); } @@ -1195,7 +1197,7 @@ public class WebRtcCallService extends Service implements CallManager.Observer, stopForeground(true); } - insertMissedCall(remotePeer, true); + insertMissedCall(remotePeer, true, callStartTimestamp); terminate(remotePeer); } @@ -1216,7 +1218,7 @@ public class WebRtcCallService extends Service implements CallManager.Observer, boolean incomingBeforeAccept = remotePeer.getState() == CallState.ANSWERING || remotePeer.getState() == CallState.LOCAL_RINGING; if (incomingBeforeAccept) { - insertMissedCall(remotePeer, true); + insertMissedCall(remotePeer, true, callStartTimestamp); } terminate(remotePeer); @@ -1303,7 +1305,7 @@ public class WebRtcCallService extends Service implements CallManager.Observer, boolean incomingBeforeAccept = remotePeer.getState() == CallState.ANSWERING || remotePeer.getState() == CallState.LOCAL_RINGING; if (incomingBeforeAccept) { - insertMissedCall(remotePeer, true); + insertMissedCall(remotePeer, true, callStartTimestamp); } terminate(remotePeer); @@ -1319,7 +1321,7 @@ public class WebRtcCallService extends Service implements CallManager.Observer, } if (remotePeer.getState() == CallState.ANSWERING || remotePeer.getState() == CallState.LOCAL_RINGING) { - insertMissedCall(remotePeer, true); + insertMissedCall(remotePeer, true, callStartTimestamp); } terminate(remotePeer); @@ -1383,7 +1385,7 @@ public class WebRtcCallService extends Service implements CallManager.Observer, camera.setEnabled(false); camera.dispose(); } - + camera = new Camera(WebRtcCallService.this, WebRtcCallService.this, eglBase, localCameraState.getActiveDirection()); localCameraState = camera.getCameraState(); });