From 0c57113d8e62b6191cdcbe140ef46ea99501b4b2 Mon Sep 17 00:00:00 2001 From: Alex Hart Date: Wed, 17 May 2023 09:46:36 -0300 Subject: [PATCH] Add migration for call link recipient link. --- .../securesms/database/CallTableTest.kt | 107 +++++++----------- .../database/DatabaseConsistencyTest.kt | 1 + .../securesms/database/CallLinkTable.kt | 20 +++- .../securesms/database/CallTable.kt | 37 ++---- .../securesms/database/RecipientTable.kt | 6 +- .../helpers/SignalDatabaseMigrations.kt | 7 +- .../V193_BackCallLinksWithRecipient.kt | 94 +++++++++++++++ .../securesms/jobs/CallSyncEventJob.kt | 2 +- .../messages/MessageContentProcessor.java | 7 +- .../messages/SyncMessageProcessor.kt | 7 +- app/src/main/protowire/JobData.proto | 13 +-- 11 files changed, 185 insertions(+), 116 deletions(-) create mode 100644 app/src/main/java/org/thoughtcrime/securesms/database/helpers/migration/V193_BackCallLinksWithRecipient.kt diff --git a/app/src/androidTest/java/org/thoughtcrime/securesms/database/CallTableTest.kt b/app/src/androidTest/java/org/thoughtcrime/securesms/database/CallTableTest.kt index 828ad567d4..36d9ebeaad 100644 --- a/app/src/androidTest/java/org/thoughtcrime/securesms/database/CallTableTest.kt +++ b/app/src/androidTest/java/org/thoughtcrime/securesms/database/CallTableTest.kt @@ -21,7 +21,6 @@ class CallTableTest { @Test fun givenACall_whenISetTimestamp_thenIExpectUpdatedTimestamp() { val callId = 1L - val conversationId = CallTable.CallConversationId.Peer(harness.others[0]) val now = System.currentTimeMillis() SignalDatabase.calls.insertAcceptedGroupCall( callId, @@ -30,8 +29,8 @@ class CallTableTest { now ) - SignalDatabase.calls.setTimestamp(callId, conversationId, -1L) - val call = SignalDatabase.calls.getCallById(callId, conversationId) + SignalDatabase.calls.setTimestamp(callId, harness.others[0], -1L) + val call = SignalDatabase.calls.getCallById(callId, harness.others[0]) assertNotNull(call) assertEquals(-1L, call?.timestamp) @@ -43,7 +42,6 @@ class CallTableTest { @Test fun givenPreExistingEvent_whenIDeleteGroupCall_thenIMarkDeletedAndSetTimestamp() { val callId = 1L - val conversationId = CallTable.CallConversationId.Peer(harness.others[0]) val now = System.currentTimeMillis() SignalDatabase.calls.insertAcceptedGroupCall( callId, @@ -52,10 +50,10 @@ class CallTableTest { now ) - val call = SignalDatabase.calls.getCallById(callId, conversationId) + val call = SignalDatabase.calls.getCallById(callId, harness.others[0]) SignalDatabase.calls.deleteGroupCall(call!!) - val deletedCall = SignalDatabase.calls.getCallById(callId, conversationId) + val deletedCall = SignalDatabase.calls.getCallById(callId, harness.others[0]) val oldestDeletionTimestamp = SignalDatabase.calls.getOldestDeletionTimestamp() assertEquals(CallTable.Event.DELETE, deletedCall?.event) @@ -66,7 +64,6 @@ class CallTableTest { @Test fun givenNoPreExistingEvent_whenIDeleteGroupCall_thenIInsertAndMarkCallDeleted() { val callId = 1L - val conversationId = CallTable.CallConversationId.Peer(harness.others[0]) SignalDatabase.calls.insertDeletedGroupCallFromSyncEvent( callId, harness.others[0], @@ -74,7 +71,7 @@ class CallTableTest { System.currentTimeMillis() ) - val call = SignalDatabase.calls.getCallById(callId, conversationId) + val call = SignalDatabase.calls.getCallById(callId, harness.others[0]) assertNotNull(call) val oldestDeletionTimestamp = SignalDatabase.calls.getOldestDeletionTimestamp() @@ -87,7 +84,6 @@ class CallTableTest { @Test fun givenNoPriorEvent_whenIInsertAcceptedOutgoingGroupCall_thenIExpectLocalRingerAndOutgoingRing() { val callId = 1L - val conversationId = CallTable.CallConversationId.Peer(harness.others[0]) SignalDatabase.calls.insertAcceptedGroupCall( callId, harness.others[0], @@ -95,7 +91,7 @@ class CallTableTest { System.currentTimeMillis() ) - val call = SignalDatabase.calls.getCallById(callId, conversationId) + val call = SignalDatabase.calls.getCallById(callId, harness.others[0]) assertNotNull(call) assertEquals(CallTable.Event.OUTGOING_RING, call?.event) assertEquals(harness.self.id, call?.ringerRecipient) @@ -105,7 +101,6 @@ class CallTableTest { @Test fun givenNoPriorEvent_whenIInsertAcceptedIncomingGroupCall_thenIExpectJoined() { val callId = 1L - val conversationId = CallTable.CallConversationId.Peer(harness.others[0]) SignalDatabase.calls.insertAcceptedGroupCall( callId, harness.others[0], @@ -113,7 +108,7 @@ class CallTableTest { System.currentTimeMillis() ) - val call = SignalDatabase.calls.getCallById(callId, conversationId) + val call = SignalDatabase.calls.getCallById(callId, harness.others[0]) assertNotNull(call) assertEquals(CallTable.Event.JOINED, call?.event) assertNull(call?.ringerRecipient) @@ -123,7 +118,6 @@ class CallTableTest { @Test fun givenARingingCall_whenIAcceptedIncomingGroupCall_thenIExpectAccepted() { val callId = 1L - val conversationId = CallTable.CallConversationId.Peer(harness.others[0]) SignalDatabase.calls.insertOrUpdateGroupCallFromRingState( ringId = callId, groupRecipientId = harness.others[0], @@ -132,7 +126,7 @@ class CallTableTest { ringState = CallManager.RingUpdate.REQUESTED ) - val call = SignalDatabase.calls.getCallById(callId, conversationId) + val call = SignalDatabase.calls.getCallById(callId, harness.others[0]) assertNotNull(call) assertEquals(CallTable.Event.RINGING, call?.event) @@ -140,14 +134,13 @@ class CallTableTest { call!! ) - val acceptedCall = SignalDatabase.calls.getCallById(callId, conversationId) + val acceptedCall = SignalDatabase.calls.getCallById(callId, harness.others[0]) assertEquals(CallTable.Event.ACCEPTED, acceptedCall?.event) } @Test fun givenAMissedCall_whenIAcceptedIncomingGroupCall_thenIExpectAccepted() { val callId = 1L - val conversationId = CallTable.CallConversationId.Peer(harness.others[0]) SignalDatabase.calls.insertOrUpdateGroupCallFromRingState( ringId = callId, groupRecipientId = harness.others[0], @@ -156,7 +149,7 @@ class CallTableTest { ringState = CallManager.RingUpdate.EXPIRED_REQUEST ) - val call = SignalDatabase.calls.getCallById(callId, conversationId) + val call = SignalDatabase.calls.getCallById(callId, harness.others[0]) assertNotNull(call) assertEquals(CallTable.Event.MISSED, call?.event) @@ -164,14 +157,13 @@ class CallTableTest { call!! ) - val acceptedCall = SignalDatabase.calls.getCallById(callId, conversationId) + val acceptedCall = SignalDatabase.calls.getCallById(callId, harness.others[0]) assertEquals(CallTable.Event.ACCEPTED, acceptedCall?.event) } @Test fun givenADeclinedCall_whenIAcceptedIncomingGroupCall_thenIExpectAccepted() { val callId = 1L - val conversationId = CallTable.CallConversationId.Peer(harness.others[0]) SignalDatabase.calls.insertOrUpdateGroupCallFromRingState( ringId = callId, groupRecipientId = harness.others[0], @@ -180,7 +172,7 @@ class CallTableTest { ringState = CallManager.RingUpdate.DECLINED_ON_ANOTHER_DEVICE ) - val call = SignalDatabase.calls.getCallById(callId, conversationId) + val call = SignalDatabase.calls.getCallById(callId, harness.others[0]) assertNotNull(call) assertEquals(CallTable.Event.DECLINED, call?.event) @@ -188,7 +180,7 @@ class CallTableTest { call!! ) - val acceptedCall = SignalDatabase.calls.getCallById(callId, conversationId) + val acceptedCall = SignalDatabase.calls.getCallById(callId, harness.others[0]) assertEquals(CallTable.Event.ACCEPTED, acceptedCall?.event) } @@ -196,7 +188,6 @@ class CallTableTest { fun givenAGenericGroupCall_whenIAcceptedIncomingGroupCall_thenIExpectAccepted() { val era = "aaa" val callId = CallId.fromEra(era).longValue() - val conversationId = CallTable.CallConversationId.Peer(harness.others[0]) SignalDatabase.calls.insertOrUpdateGroupCallFromLocalEvent( groupRecipientId = harness.others[0], sender = harness.others[1], @@ -206,7 +197,7 @@ class CallTableTest { isCallFull = false ) - val call = SignalDatabase.calls.getCallById(callId, conversationId) + val call = SignalDatabase.calls.getCallById(callId, harness.others[0]) assertNotNull(call) assertEquals(CallTable.Event.GENERIC_GROUP_CALL, call?.event) @@ -214,7 +205,7 @@ class CallTableTest { call!! ) - val acceptedCall = SignalDatabase.calls.getCallById(callId, conversationId) + val acceptedCall = SignalDatabase.calls.getCallById(callId, harness.others[0]) assertEquals(CallTable.Event.JOINED, acceptedCall?.event) } @@ -222,7 +213,6 @@ class CallTableTest { fun givenNoPriorCallEvent_whenIReceiveAGroupCallUpdateMessage_thenIExpectAGenericGroupCall() { val era = "aaa" val callId = CallId.fromEra(era).longValue() - val conversationId = CallTable.CallConversationId.Peer(harness.others[0]) SignalDatabase.calls.insertOrUpdateGroupCallFromLocalEvent( groupRecipientId = harness.others[0], sender = harness.others[1], @@ -232,7 +222,7 @@ class CallTableTest { isCallFull = false ) - val call = SignalDatabase.calls.getCallById(callId, conversationId) + val call = SignalDatabase.calls.getCallById(callId, harness.others[0]) assertNotNull(call) assertEquals(CallTable.Event.GENERIC_GROUP_CALL, call?.event) } @@ -242,7 +232,6 @@ class CallTableTest { val era = "aaa" val callId = CallId.fromEra(era).longValue() val now = System.currentTimeMillis() - val conversationId = CallTable.CallConversationId.Peer(harness.others[0]) SignalDatabase.calls.insertOrUpdateGroupCallFromLocalEvent( groupRecipientId = harness.others[0], sender = harness.others[1], @@ -252,7 +241,7 @@ class CallTableTest { isCallFull = false ) - SignalDatabase.calls.getCallById(callId, conversationId).let { + SignalDatabase.calls.getCallById(callId, harness.others[0]).let { assertNotNull(it) assertEquals(now, it?.timestamp) } @@ -266,7 +255,7 @@ class CallTableTest { isCallFull = false ) - val call = SignalDatabase.calls.getCallById(callId, conversationId) + val call = SignalDatabase.calls.getCallById(callId, harness.others[0]) assertNotNull(call) assertEquals(CallTable.Event.GENERIC_GROUP_CALL, call?.event) assertEquals(1L, call?.timestamp) @@ -275,7 +264,6 @@ class CallTableTest { @Test fun givenADeletedCallEvent_whenIReceiveARingUpdate_thenIIgnoreTheRingUpdate() { val callId = 1L - val conversationId = CallTable.CallConversationId.Peer(harness.others[0]) SignalDatabase.calls.insertDeletedGroupCallFromSyncEvent( callId = callId, recipientId = harness.others[0], @@ -291,7 +279,7 @@ class CallTableTest { ringState = CallManager.RingUpdate.REQUESTED ) - val call = SignalDatabase.calls.getCallById(callId, conversationId) + val call = SignalDatabase.calls.getCallById(callId, harness.others[0]) assertNotNull(call) assertEquals(CallTable.Event.DELETE, call?.event) } @@ -301,7 +289,6 @@ class CallTableTest { val era = "aaa" val callId = CallId.fromEra(era).longValue() val now = System.currentTimeMillis() - val conversationId = CallTable.CallConversationId.Peer(harness.others[0]) SignalDatabase.calls.insertOrUpdateGroupCallFromLocalEvent( groupRecipientId = harness.others[0], sender = harness.others[1], @@ -319,7 +306,7 @@ class CallTableTest { CallManager.RingUpdate.REQUESTED ) - val call = SignalDatabase.calls.getCallById(callId, conversationId) + val call = SignalDatabase.calls.getCallById(callId, harness.others[0]) assertNotNull(call) assertEquals(CallTable.Event.RINGING, call?.event) assertEquals(harness.others[1], call?.ringerRecipient) @@ -330,7 +317,6 @@ class CallTableTest { val era = "aaa" val callId = CallId.fromEra(era).longValue() val now = System.currentTimeMillis() - val conversationId = CallTable.CallConversationId.Peer(harness.others[0]) SignalDatabase.calls.insertAcceptedGroupCall( callId, harness.others[0], @@ -346,7 +332,7 @@ class CallTableTest { CallManager.RingUpdate.REQUESTED ) - val call = SignalDatabase.calls.getCallById(callId, conversationId) + val call = SignalDatabase.calls.getCallById(callId, harness.others[0]) assertNotNull(call) assertEquals(CallTable.Event.ACCEPTED, call?.event) assertEquals(harness.others[1], call?.ringerRecipient) @@ -357,7 +343,6 @@ class CallTableTest { val era = "aaa" val callId = CallId.fromEra(era).longValue() val now = System.currentTimeMillis() - val conversationId = CallTable.CallConversationId.Peer(harness.others[0]) SignalDatabase.calls.insertOrUpdateGroupCallFromLocalEvent( groupRecipientId = harness.others[0], sender = harness.others[1], @@ -375,7 +360,7 @@ class CallTableTest { CallManager.RingUpdate.EXPIRED_REQUEST ) - val call = SignalDatabase.calls.getCallById(callId, conversationId) + val call = SignalDatabase.calls.getCallById(callId, harness.others[0]) assertNotNull(call) assertEquals(CallTable.Event.MISSED, call?.event) assertEquals(harness.others[1], call?.ringerRecipient) @@ -386,7 +371,6 @@ class CallTableTest { val era = "aaa" val callId = CallId.fromEra(era).longValue() val now = System.currentTimeMillis() - val conversationId = CallTable.CallConversationId.Peer(harness.others[0]) SignalDatabase.calls.insertOrUpdateGroupCallFromLocalEvent( groupRecipientId = harness.others[0], sender = harness.others[1], @@ -412,7 +396,7 @@ class CallTableTest { CallManager.RingUpdate.EXPIRED_REQUEST ) - val call = SignalDatabase.calls.getCallById(callId, conversationId) + val call = SignalDatabase.calls.getCallById(callId, harness.others[0]) assertNotNull(call) assertEquals(CallTable.Event.MISSED, call?.event) assertEquals(harness.others[1], call?.ringerRecipient) @@ -423,7 +407,6 @@ class CallTableTest { val era = "aaa" val callId = CallId.fromEra(era).longValue() val now = System.currentTimeMillis() - val conversationId = CallTable.CallConversationId.Peer(harness.others[0]) SignalDatabase.calls.insertAcceptedGroupCall( callId, harness.others[0], @@ -439,7 +422,7 @@ class CallTableTest { CallManager.RingUpdate.BUSY_LOCALLY ) - val call = SignalDatabase.calls.getCallById(callId, conversationId) + val call = SignalDatabase.calls.getCallById(callId, harness.others[0]) assertNotNull(call) assertEquals(CallTable.Event.ACCEPTED, call?.event) } @@ -449,7 +432,6 @@ class CallTableTest { val era = "aaa" val callId = CallId.fromEra(era).longValue() val now = System.currentTimeMillis() - val conversationId = CallTable.CallConversationId.Peer(harness.others[0]) SignalDatabase.calls.insertAcceptedGroupCall( callId, harness.others[0], @@ -465,7 +447,7 @@ class CallTableTest { CallManager.RingUpdate.BUSY_ON_ANOTHER_DEVICE ) - val call = SignalDatabase.calls.getCallById(callId, conversationId) + val call = SignalDatabase.calls.getCallById(callId, harness.others[0]) assertNotNull(call) assertEquals(CallTable.Event.ACCEPTED, call?.event) } @@ -475,7 +457,6 @@ class CallTableTest { val era = "aaa" val callId = CallId.fromEra(era).longValue() val now = System.currentTimeMillis() - val conversationId = CallTable.CallConversationId.Peer(harness.others[0]) SignalDatabase.calls.insertOrUpdateGroupCallFromLocalEvent( groupRecipientId = harness.others[0], sender = harness.others[1], @@ -501,7 +482,7 @@ class CallTableTest { CallManager.RingUpdate.BUSY_LOCALLY ) - val call = SignalDatabase.calls.getCallById(callId, conversationId) + val call = SignalDatabase.calls.getCallById(callId, harness.others[0]) assertNotNull(call) assertEquals(CallTable.Event.MISSED, call?.event) } @@ -511,7 +492,6 @@ class CallTableTest { val era = "aaa" val callId = CallId.fromEra(era).longValue() val now = System.currentTimeMillis() - val conversationId = CallTable.CallConversationId.Peer(harness.others[0]) SignalDatabase.calls.insertOrUpdateGroupCallFromLocalEvent( groupRecipientId = harness.others[0], sender = harness.others[1], @@ -537,7 +517,7 @@ class CallTableTest { CallManager.RingUpdate.BUSY_ON_ANOTHER_DEVICE ) - val call = SignalDatabase.calls.getCallById(callId, conversationId) + val call = SignalDatabase.calls.getCallById(callId, harness.others[0]) assertNotNull(call) assertEquals(CallTable.Event.MISSED, call?.event) } @@ -547,7 +527,6 @@ class CallTableTest { val era = "aaa" val callId = CallId.fromEra(era).longValue() val now = System.currentTimeMillis() - val conversationId = CallTable.CallConversationId.Peer(harness.others[0]) SignalDatabase.calls.insertOrUpdateGroupCallFromLocalEvent( groupRecipientId = harness.others[0], sender = harness.others[1], @@ -565,7 +544,7 @@ class CallTableTest { CallManager.RingUpdate.ACCEPTED_ON_ANOTHER_DEVICE ) - val call = SignalDatabase.calls.getCallById(callId, conversationId) + val call = SignalDatabase.calls.getCallById(callId, harness.others[0]) assertNotNull(call) assertEquals(CallTable.Event.ACCEPTED, call?.event) } @@ -574,7 +553,6 @@ class CallTableTest { fun givenARingingCallEvent_whenRingDeclinedOnAnotherDevice_thenIMoveToDeclinedState() { val era = "aaa" val callId = CallId.fromEra(era).longValue() - val conversationId = CallTable.CallConversationId.Peer(harness.others[0]) SignalDatabase.calls.insertOrUpdateGroupCallFromRingState( callId, @@ -592,7 +570,7 @@ class CallTableTest { CallManager.RingUpdate.DECLINED_ON_ANOTHER_DEVICE ) - val call = SignalDatabase.calls.getCallById(callId, conversationId) + val call = SignalDatabase.calls.getCallById(callId, harness.others[0]) assertNotNull(call) assertEquals(CallTable.Event.DECLINED, call?.event) } @@ -601,7 +579,6 @@ class CallTableTest { fun givenAMissedCallEvent_whenRingDeclinedOnAnotherDevice_thenIMoveToDeclinedState() { val era = "aaa" val callId = CallId.fromEra(era).longValue() - val conversationId = CallTable.CallConversationId.Peer(harness.others[0]) SignalDatabase.calls.insertOrUpdateGroupCallFromRingState( callId, @@ -619,7 +596,7 @@ class CallTableTest { CallManager.RingUpdate.DECLINED_ON_ANOTHER_DEVICE ) - val call = SignalDatabase.calls.getCallById(callId, conversationId) + val call = SignalDatabase.calls.getCallById(callId, harness.others[0]) assertNotNull(call) assertEquals(CallTable.Event.DECLINED, call?.event) } @@ -628,7 +605,6 @@ class CallTableTest { fun givenAnOutgoingRingCallEvent_whenRingDeclinedOnAnotherDevice_thenIDoNotChangeState() { val era = "aaa" val callId = CallId.fromEra(era).longValue() - val conversationId = CallTable.CallConversationId.Peer(harness.others[0]) SignalDatabase.calls.insertAcceptedGroupCall( callId, @@ -645,7 +621,7 @@ class CallTableTest { CallManager.RingUpdate.DECLINED_ON_ANOTHER_DEVICE ) - val call = SignalDatabase.calls.getCallById(callId, conversationId) + val call = SignalDatabase.calls.getCallById(callId, harness.others[0]) assertNotNull(call) assertEquals(CallTable.Event.OUTGOING_RING, call?.event) } @@ -653,7 +629,6 @@ class CallTableTest { @Test fun givenNoPriorEvent_whenRingRequested_thenICreateAnEventInTheRingingStateAndSetRinger() { val callId = 1L - val conversationId = CallTable.CallConversationId.Peer(harness.others[0]) SignalDatabase.calls.insertOrUpdateGroupCallFromRingState( callId, harness.others[0], @@ -662,7 +637,7 @@ class CallTableTest { CallManager.RingUpdate.REQUESTED ) - val call = SignalDatabase.calls.getCallById(callId, conversationId) + val call = SignalDatabase.calls.getCallById(callId, harness.others[0]) assertNotNull(call) assertEquals(CallTable.Event.RINGING, call?.event) assertEquals(harness.others[1], call?.ringerRecipient) @@ -672,7 +647,6 @@ class CallTableTest { @Test fun givenNoPriorEvent_whenRingExpired_thenICreateAnEventInTheMissedStateAndSetRinger() { val callId = 1L - val conversationId = CallTable.CallConversationId.Peer(harness.others[0]) SignalDatabase.calls.insertOrUpdateGroupCallFromRingState( callId, harness.others[0], @@ -681,7 +655,7 @@ class CallTableTest { CallManager.RingUpdate.EXPIRED_REQUEST ) - val call = SignalDatabase.calls.getCallById(callId, conversationId) + val call = SignalDatabase.calls.getCallById(callId, harness.others[0]) assertNotNull(call) assertEquals(CallTable.Event.MISSED, call?.event) assertEquals(harness.others[1], call?.ringerRecipient) @@ -691,7 +665,6 @@ class CallTableTest { @Test fun givenNoPriorEvent_whenRingCancelledByRinger_thenICreateAnEventInTheMissedStateAndSetRinger() { val callId = 1L - val conversationId = CallTable.CallConversationId.Peer(harness.others[0]) SignalDatabase.calls.insertOrUpdateGroupCallFromRingState( callId, harness.others[0], @@ -700,7 +673,7 @@ class CallTableTest { CallManager.RingUpdate.CANCELLED_BY_RINGER ) - val call = SignalDatabase.calls.getCallById(callId, conversationId) + val call = SignalDatabase.calls.getCallById(callId, harness.others[0]) assertNotNull(call) assertEquals(CallTable.Event.MISSED, call?.event) assertEquals(harness.others[1], call?.ringerRecipient) @@ -710,7 +683,6 @@ class CallTableTest { @Test fun givenNoPriorEvent_whenRingCancelledBecauseUserIsBusyLocally_thenICreateAnEventInTheMissedState() { val callId = 1L - val conversationId = CallTable.CallConversationId.Peer(harness.others[0]) SignalDatabase.calls.insertOrUpdateGroupCallFromRingState( callId, harness.others[0], @@ -719,7 +691,7 @@ class CallTableTest { CallManager.RingUpdate.BUSY_LOCALLY ) - val call = SignalDatabase.calls.getCallById(callId, conversationId) + val call = SignalDatabase.calls.getCallById(callId, harness.others[0]) assertNotNull(call) assertEquals(CallTable.Event.MISSED, call?.event) assertNotNull(call?.messageId) @@ -728,7 +700,6 @@ class CallTableTest { @Test fun givenNoPriorEvent_whenRingCancelledBecauseUserIsBusyOnAnotherDevice_thenICreateAnEventInTheMissedState() { val callId = 1L - val conversationId = CallTable.CallConversationId.Peer(harness.others[0]) SignalDatabase.calls.insertOrUpdateGroupCallFromRingState( callId, harness.others[0], @@ -737,7 +708,7 @@ class CallTableTest { CallManager.RingUpdate.BUSY_ON_ANOTHER_DEVICE ) - val call = SignalDatabase.calls.getCallById(callId, conversationId) + val call = SignalDatabase.calls.getCallById(callId, harness.others[0]) assertNotNull(call) assertEquals(CallTable.Event.MISSED, call?.event) assertNotNull(call?.messageId) @@ -746,7 +717,6 @@ class CallTableTest { @Test fun givenNoPriorEvent_whenRingAcceptedOnAnotherDevice_thenICreateAnEventInTheAcceptedState() { val callId = 1L - val conversationId = CallTable.CallConversationId.Peer(harness.others[0]) SignalDatabase.calls.insertOrUpdateGroupCallFromRingState( callId, harness.others[0], @@ -755,7 +725,7 @@ class CallTableTest { CallManager.RingUpdate.ACCEPTED_ON_ANOTHER_DEVICE ) - val call = SignalDatabase.calls.getCallById(callId, conversationId) + val call = SignalDatabase.calls.getCallById(callId, harness.others[0]) assertNotNull(call) assertEquals(CallTable.Event.ACCEPTED, call?.event) assertNotNull(call?.messageId) @@ -764,7 +734,6 @@ class CallTableTest { @Test fun givenNoPriorEvent_whenRingDeclinedOnAnotherDevice_thenICreateAnEventInTheDeclinedState() { val callId = 1L - val conversationId = CallTable.CallConversationId.Peer(harness.others[0]) SignalDatabase.calls.insertOrUpdateGroupCallFromRingState( callId, harness.others[0], @@ -773,7 +742,7 @@ class CallTableTest { CallManager.RingUpdate.DECLINED_ON_ANOTHER_DEVICE ) - val call = SignalDatabase.calls.getCallById(callId, conversationId) + val call = SignalDatabase.calls.getCallById(callId, harness.others[0]) assertNotNull(call) assertEquals(CallTable.Event.DECLINED, call?.event) assertNotNull(call?.messageId) diff --git a/app/src/androidTest/java/org/thoughtcrime/securesms/database/DatabaseConsistencyTest.kt b/app/src/androidTest/java/org/thoughtcrime/securesms/database/DatabaseConsistencyTest.kt index b2abf6bf22..dbd03dfae7 100644 --- a/app/src/androidTest/java/org/thoughtcrime/securesms/database/DatabaseConsistencyTest.kt +++ b/app/src/androidTest/java/org/thoughtcrime/securesms/database/DatabaseConsistencyTest.kt @@ -111,6 +111,7 @@ class DatabaseConsistencyTest { .split("\n") .map { it.trim() } .joinToString(separator = " ") + .replace(Regex.fromLiteral(" ,"), ",") .replace(Regex("\\s+"), " ") .replace(Regex.fromLiteral("( "), "(") .replace(Regex.fromLiteral(" )"), ")") diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/CallLinkTable.kt b/app/src/main/java/org/thoughtcrime/securesms/database/CallLinkTable.kt index 81c62e58b7..2e721de33c 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/CallLinkTable.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/CallLinkTable.kt @@ -1,13 +1,16 @@ package org.thoughtcrime.securesms.database import android.content.Context +import androidx.core.content.contentValuesOf import org.signal.core.util.logging.Log +import org.signal.core.util.update import org.thoughtcrime.securesms.conversation.colors.AvatarColor +import org.thoughtcrime.securesms.recipients.RecipientId /** * Table containing ad-hoc call link details */ -class CallLinkTable(context: Context, databaseHelper: SignalDatabase) : DatabaseTable(context, databaseHelper) { +class CallLinkTable(context: Context, databaseHelper: SignalDatabase) : DatabaseTable(context, databaseHelper), RecipientIdDatabaseReference { companion object { private val TAG = Log.tag(CallLinkTable::class.java) @@ -22,6 +25,7 @@ class CallLinkTable(context: Context, databaseHelper: SignalDatabase) : Database const val REVOKED = "revoked" const val EXPIRATION = "expiration" const val AVATAR_COLOR = "avatar_color" + const val RECIPIENT_ID = "recipient_id" //language=sql const val CREATE_TABLE = """ @@ -34,7 +38,8 @@ class CallLinkTable(context: Context, databaseHelper: SignalDatabase) : Database $RESTRICTIONS INTEGER NOT NULL, $REVOKED INTEGER NOT NULL, $EXPIRATION INTEGER NOT NULL, - $AVATAR_COLOR TEXT NOT NULL + $AVATAR_COLOR TEXT NOT NULL, + $RECIPIENT_ID INTEGER UNIQUE REFERENCES ${RecipientTable.TABLE_NAME} (${RecipientTable.ID}) ON DELETE CASCADE ) """ } @@ -45,4 +50,15 @@ class CallLinkTable(context: Context, databaseHelper: SignalDatabase) : Database val avatarColor: AvatarColor, val isApprovalRequired: Boolean ) + + override fun remapRecipient(fromId: RecipientId, toId: RecipientId) { + writableDatabase.update(TABLE_NAME) + .values( + contentValuesOf( + RECIPIENT_ID to toId.toLong() + ) + ) + .where("$RECIPIENT_ID = ?", fromId.toLong()) + .run() + } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/CallTable.kt b/app/src/main/java/org/thoughtcrime/securesms/database/CallTable.kt index 3cce00ec0d..6fa4567769 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/CallTable.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/CallTable.kt @@ -52,7 +52,6 @@ class CallTable(context: Context, databaseHelper: SignalDatabase) : DatabaseTabl private const val CALL_ID = "call_id" private const val MESSAGE_ID = "message_id" private const val PEER = "peer" - private const val CALL_LINK = "call_link" private const val TYPE = "type" private const val DIRECTION = "direction" private const val EVENT = "event" @@ -67,22 +66,19 @@ class CallTable(context: Context, databaseHelper: SignalDatabase) : DatabaseTabl $CALL_ID INTEGER NOT NULL, $MESSAGE_ID INTEGER DEFAULT NULL REFERENCES ${MessageTable.TABLE_NAME} (${MessageTable.ID}) ON DELETE SET NULL, $PEER INTEGER DEFAULT NULL REFERENCES ${RecipientTable.TABLE_NAME} (${RecipientTable.ID}) ON DELETE CASCADE, - $CALL_LINK TEXT DEFAULT NULL REFERENCES ${CallLinkTable.TABLE_NAME} (${CallLinkTable.ROOM_ID}) ON DELETE CASCADE, $TYPE INTEGER NOT NULL, $DIRECTION INTEGER NOT NULL, $EVENT INTEGER NOT NULL, $TIMESTAMP INTEGER NOT NULL, $RINGER INTEGER DEFAULT NULL, $DELETION_TIMESTAMP INTEGER DEFAULT 0, - UNIQUE ($CALL_ID, $PEER, $CALL_LINK) ON CONFLICT FAIL, - CHECK (($PEER IS NULL AND $CALL_LINK IS NOT NULL) OR ($PEER IS NOT NULL AND $CALL_LINK IS NULL)) + UNIQUE ($CALL_ID, $PEER) ON CONFLICT FAIL ) """ val CREATE_INDEXES = arrayOf( "CREATE INDEX call_call_id_index ON $TABLE_NAME ($CALL_ID)", "CREATE INDEX call_message_id_index ON $TABLE_NAME ($MESSAGE_ID)", - "CREATE INDEX call_call_link_index ON $TABLE_NAME ($CALL_LINK)", "CREATE INDEX call_peer_index ON $TABLE_NAME ($PEER)" ) } @@ -139,8 +135,8 @@ class CallTable(context: Context, databaseHelper: SignalDatabase) : DatabaseTabl } } - fun getCallById(callId: Long, conversationId: CallConversationId): Call? { - val query = getCallSelectionQuery(callId, conversationId) + fun getCallById(callId: Long, recipientId: RecipientId): Call? { + val query = getCallSelectionQuery(callId, recipientId) return readableDatabase .select() @@ -393,7 +389,7 @@ class CallTable(context: Context, databaseHelper: SignalDatabase) : DatabaseTabl } val callId = CallId.fromEra(peekGroupCallEraId).longValue() - val call = getCallById(callId, CallConversationId.Peer(groupRecipientId)) + val call = getCallById(callId, groupRecipientId) val messageId: MessageId = if (call != null) { if (call.event == Event.DELETE) { Log.d(TAG, "Dropping group call update for deleted call.") @@ -444,9 +440,8 @@ class CallTable(context: Context, databaseHelper: SignalDatabase) : DatabaseTabl groupRecipientId: RecipientId, timestamp: Long ) { - val conversationId = CallConversationId.Peer(groupRecipientId) if (messageId != null) { - val call = getCallById(callId, conversationId) + val call = getCallById(callId, groupRecipientId) if (call == null) { val direction = if (sender == Recipient.self().id) Direction.OUTGOING else Direction.INCOMING @@ -467,7 +462,7 @@ class CallTable(context: Context, databaseHelper: SignalDatabase) : DatabaseTabl Log.d(TAG, "Inserted new call event from group call update message. Call Id: $callId") } else { if (timestamp < call.timestamp) { - setTimestamp(callId, conversationId, timestamp) + setTimestamp(callId, groupRecipientId, timestamp) Log.d(TAG, "Updated call event timestamp for call id $callId") } @@ -519,7 +514,7 @@ class CallTable(context: Context, databaseHelper: SignalDatabase) : DatabaseTabl } fun isRingCancelled(ringId: Long, groupRecipientId: RecipientId): Boolean { - val call = getCallById(ringId, CallConversationId.Peer(groupRecipientId)) ?: return false + val call = getCallById(ringId, groupRecipientId) ?: return false return call.event != Event.RINGING && call.event != Event.GENERIC_GROUP_CALL } @@ -532,7 +527,7 @@ class CallTable(context: Context, databaseHelper: SignalDatabase) : DatabaseTabl ) { Log.d(TAG, "Processing group ring state update for $ringId in state $ringState") - val call = getCallById(ringId, CallConversationId.Peer(groupRecipientId)) + val call = getCallById(ringId, groupRecipientId) if (call != null) { if (call.event == Event.DELETE) { Log.d(TAG, "Ignoring ring request for $ringId since its event has been deleted.") @@ -676,9 +671,9 @@ class CallTable(context: Context, databaseHelper: SignalDatabase) : DatabaseTabl Log.d(TAG, "Inserted a new group ring event for $callId with event $event") } - fun setTimestamp(callId: Long, conversationId: CallConversationId, timestamp: Long) { + fun setTimestamp(callId: Long, recipientId: RecipientId, timestamp: Long) { writableDatabase.withinTransaction { db -> - val call = getCallById(callId, conversationId) + val call = getCallById(callId, recipientId) if (call == null || call.event == Event.DELETE) { Log.d(TAG, "Refusing to update deleted call event.") return@withinTransaction @@ -788,11 +783,8 @@ class CallTable(context: Context, databaseHelper: SignalDatabase) : DatabaseTabl .run() } - private fun getCallSelectionQuery(callId: Long, conversationId: CallConversationId): SqlUtil.Query { - return when (conversationId) { - is CallConversationId.CallLink -> SqlUtil.Query("$CALL_ID = ? AND $CALL_LINK = ?", SqlUtil.buildArgs(callId, conversationId.callLinkId)) - is CallConversationId.Peer -> SqlUtil.Query("$CALL_ID = ? AND $PEER = ?", SqlUtil.buildArgs(callId, conversationId.recipientId)) - } + private fun getCallSelectionQuery(callId: Long, recipientId: RecipientId): SqlUtil.Query { + return SqlUtil.Query("$CALL_ID = ? AND $PEER = ?", SqlUtil.buildArgs(callId, recipientId)) } private fun getMessageIds(callRowIds: Set): Set { @@ -1099,11 +1091,6 @@ class CallTable(context: Context, databaseHelper: SignalDatabase) : DatabaseTabl } } - sealed interface CallConversationId { - data class Peer(val recipientId: RecipientId) : CallConversationId - data class CallLink(val callLinkId: Int) : CallConversationId - } - enum class Event(private val code: Int) { /** * 1:1 Calls only. diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/RecipientTable.kt b/app/src/main/java/org/thoughtcrime/securesms/database/RecipientTable.kt index 050fa9780a..a8e1ff9114 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/RecipientTable.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/RecipientTable.kt @@ -136,6 +136,7 @@ open class RecipientTable(context: Context, databaseHelper: SignalDatabase) : Da const val EMAIL = "email" const val GROUP_ID = "group_id" const val DISTRIBUTION_LIST_ID = "distribution_list_id" + private const val CALL_LINK_ROOM_ID = "call_link_room_id" const val GROUP_TYPE = "group_type" const val BLOCKED = "blocked" private const val MESSAGE_RINGTONE = "message_ringtone" @@ -252,7 +253,8 @@ open class RecipientTable(context: Context, databaseHelper: SignalDatabase) : Da $UNREGISTERED_TIMESTAMP INTEGER DEFAULT 0, $HIDDEN INTEGER DEFAULT 0, $REPORTING_TOKEN BLOB DEFAULT NULL, - $SYSTEM_NICKNAME TEXT DEFAULT NULL + $SYSTEM_NICKNAME TEXT DEFAULT NULL, + $CALL_LINK_ROOM_ID TEXT DEFAULT NULL ) """ @@ -4574,7 +4576,7 @@ open class RecipientTable(context: Context, databaseHelper: SignalDatabase) : Da } enum class GroupType(val id: Int) { - NONE(0), MMS(1), SIGNAL_V1(2), SIGNAL_V2(3), DISTRIBUTION_LIST(4); + NONE(0), MMS(1), SIGNAL_V1(2), SIGNAL_V2(3), DISTRIBUTION_LIST(4), CALL_LINK(5); companion object { fun fromId(id: Int): GroupType { diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/helpers/SignalDatabaseMigrations.kt b/app/src/main/java/org/thoughtcrime/securesms/database/helpers/SignalDatabaseMigrations.kt index 61543eaf79..3aad9a26b9 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/helpers/SignalDatabaseMigrations.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/helpers/SignalDatabaseMigrations.kt @@ -48,6 +48,7 @@ import org.thoughtcrime.securesms.database.helpers.migration.V189_CreateCallLink import org.thoughtcrime.securesms.database.helpers.migration.V190_UniqueMessageMigration import org.thoughtcrime.securesms.database.helpers.migration.V191_UniqueMessageMigrationV2 import org.thoughtcrime.securesms.database.helpers.migration.V192_CallLinkTableNullableRootKeys +import org.thoughtcrime.securesms.database.helpers.migration.V193_BackCallLinksWithRecipient /** * Contains all of the database migrations for [SignalDatabase]. Broken into a separate file for cleanliness. @@ -56,7 +57,7 @@ object SignalDatabaseMigrations { val TAG: String = Log.tag(SignalDatabaseMigrations.javaClass) - const val DATABASE_VERSION = 192 + const val DATABASE_VERSION = 193 @JvmStatic fun migrate(context: Application, db: SQLiteDatabase, oldVersion: Int, newVersion: Int) { @@ -235,6 +236,10 @@ object SignalDatabaseMigrations { if (oldVersion < 192) { V192_CallLinkTableNullableRootKeys.migrate(context, db, oldVersion, newVersion) } + + if (oldVersion < 193) { + V193_BackCallLinksWithRecipient.migrate(context, db, oldVersion, newVersion) + } } @JvmStatic diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/helpers/migration/V193_BackCallLinksWithRecipient.kt b/app/src/main/java/org/thoughtcrime/securesms/database/helpers/migration/V193_BackCallLinksWithRecipient.kt new file mode 100644 index 0000000000..f4ff3dc240 --- /dev/null +++ b/app/src/main/java/org/thoughtcrime/securesms/database/helpers/migration/V193_BackCallLinksWithRecipient.kt @@ -0,0 +1,94 @@ +/* + * Copyright 2023 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.thoughtcrime.securesms.database.helpers.migration + +import android.app.Application +import net.zetetic.database.sqlcipher.SQLiteDatabase +import org.signal.core.util.SqlUtil +import org.signal.core.util.logging.Log + +/** + * Back CallLinks with a Recipient to ease integration and ensure we can support + * different features which would require that relation in the future. + */ +object V193_BackCallLinksWithRecipient : SignalDatabaseMigration { + + private val TAG = Log.tag(V193_BackCallLinksWithRecipient::class.java) + + override fun migrate(context: Application, db: SQLiteDatabase, oldVersion: Int, newVersion: Int) { + // add new column to recipient table to store the room id + db.execSQL("ALTER TABLE recipient ADD COLUMN call_link_room_id TEXT DEFAULT NULL") + + // recreate the call link table with the new recipient id reference. + db.execSQL("DROP TABLE call_link") + db.execSQL( + """ + CREATE TABLE call_link ( + _id INTEGER PRIMARY KEY, + root_key BLOB, + room_id TEXT NOT NULL UNIQUE, + admin_key BLOB, + name TEXT NOT NULL, + restrictions INTEGER NOT NULL, + revoked INTEGER NOT NULL, + expiration INTEGER NOT NULL, + avatar_color TEXT NOT NULL, + recipient_id INTEGER UNIQUE REFERENCES recipient (_id) ON DELETE CASCADE + ) + """.trimIndent() + ) + + // recreate the call table dropping the call_link column + db.execSQL( + """ + CREATE TABLE call_tmp ( + _id INTEGER PRIMARY KEY, + call_id INTEGER NOT NULL, + message_id INTEGER DEFAULT NULL REFERENCES message (_id) ON DELETE SET NULL, + peer INTEGER DEFAULT NULL REFERENCES recipient (_id) ON DELETE CASCADE, + type INTEGER NOT NULL, + direction INTEGER NOT NULL, + event INTEGER NOT NULL, + timestamp INTEGER NOT NULL, + ringer INTEGER DEFAULT NULL, + deletion_timestamp INTEGER DEFAULT 0, + UNIQUE (call_id, peer) ON CONFLICT FAIL + ) + """.trimIndent() + ) + + db.execSQL( + """ + INSERT INTO call_tmp + SELECT + _id, + call_id, + message_id, + peer, + type, + direction, + event, + timestamp, + ringer, + deletion_timestamp + FROM call + """.trimIndent() + ) + + db.execSQL("DROP TABLE call") + db.execSQL("ALTER TABLE call_tmp RENAME TO call") + + db.execSQL("CREATE INDEX IF NOT EXISTS call_call_id_index ON call (call_id)") + db.execSQL("CREATE INDEX IF NOT EXISTS call_message_id_index ON call (message_id)") + db.execSQL("CREATE INDEX IF NOT EXISTS call_peer_index ON call (peer)") + + val foreignKeyViolations: List = SqlUtil.getForeignKeyViolations(db, "call") + if (foreignKeyViolations.isNotEmpty()) { + Log.w(TAG, "Foreign key violations!\n${foreignKeyViolations.joinToString(separator = "\n")}") + throw IllegalStateException("Foreign key violations!") + } + } +} diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/CallSyncEventJob.kt b/app/src/main/java/org/thoughtcrime/securesms/jobs/CallSyncEventJob.kt index b407c9dd5c..f8eae4e1c4 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/CallSyncEventJob.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/CallSyncEventJob.kt @@ -101,7 +101,7 @@ class CallSyncEventJob private constructor( } private fun processEvent(callSyncEvent: CallSyncEventJobRecord): CallSyncEventJobRecord? { - val call = SignalDatabase.calls.getCallById(callSyncEvent.callId, CallTable.CallConversationId.Peer(callSyncEvent.deserializeRecipientId())) + val call = SignalDatabase.calls.getCallById(callSyncEvent.callId, callSyncEvent.deserializeRecipientId()) if (call == null) { Log.w(TAG, "Cannot process event for call that does not exist. Dropping.") return null diff --git a/app/src/main/java/org/thoughtcrime/securesms/messages/MessageContentProcessor.java b/app/src/main/java/org/thoughtcrime/securesms/messages/MessageContentProcessor.java index 8925c1a86a..22a7c97262 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/messages/MessageContentProcessor.java +++ b/app/src/main/java/org/thoughtcrime/securesms/messages/MessageContentProcessor.java @@ -1294,7 +1294,7 @@ public class MessageContentProcessor { log(envelopeTimestamp, "Synchronize call event call: " + callId); - CallTable.Call call = SignalDatabase.calls().getCallById(callId, new CallTable.CallConversationId.Peer(recipientId)); + CallTable.Call call = SignalDatabase.calls().getCallById(callId, recipientId); if (call != null) { boolean typeMismatch = call.getType() != type; boolean directionMismatch = call.getDirection() != direction; @@ -1337,9 +1337,8 @@ public class MessageContentProcessor { GroupId groupId = GroupId.push(callEvent.getConversationId().toByteArray()); RecipientId recipientId = Recipient.externalGroupExact(groupId).getId(); - CallTable.CallConversationId callConversationId = new CallTable.CallConversationId.Peer(recipientId); - CallTable.Call call = SignalDatabase.calls().getCallById(callId, callConversationId); + CallTable.Call call = SignalDatabase.calls().getCallById(callId, recipientId); if (call != null) { if (call.getType() != type) { warn(envelopeTimestamp, "Group/Ad-hoc call event type mismatch, ignoring. timestamp: " + timestamp + " type: " + type + " direction: " + direction + " event: " + event + " hasPeer: " + callEvent.hasConversationId()); @@ -1352,7 +1351,7 @@ public class MessageContentProcessor { break; case ACCEPTED: if (call.getTimestamp() < callEvent.getTimestamp()) { - SignalDatabase.calls().setTimestamp(call.getCallId(), callConversationId, callEvent.getTimestamp()); + SignalDatabase.calls().setTimestamp(call.getCallId(), recipientId, callEvent.getTimestamp()); } if (callEvent.getDirection() == SyncMessage.CallEvent.Direction.INCOMING) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/messages/SyncMessageProcessor.kt b/app/src/main/java/org/thoughtcrime/securesms/messages/SyncMessageProcessor.kt index bd1dacd574..39c12f9986 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/messages/SyncMessageProcessor.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/messages/SyncMessageProcessor.kt @@ -1172,7 +1172,7 @@ object SyncMessageProcessor { log(envelopeTimestamp, "Synchronize call event call: $callId") - val call = SignalDatabase.calls.getCallById(callId, CallTable.CallConversationId.Peer(recipientId)) + val call = SignalDatabase.calls.getCallById(callId, recipientId) if (call != null) { val typeMismatch = call.type !== type val directionMismatch = call.direction !== direction @@ -1209,9 +1209,8 @@ object SyncMessageProcessor { val groupId: GroupId = GroupId.push(callEvent.conversationId.toByteArray()) val recipientId = Recipient.externalGroupExact(groupId).id - val conversationId = CallTable.CallConversationId.Peer(recipientId) - val call = SignalDatabase.calls.getCallById(callId, CallTable.CallConversationId.Peer(recipientId)) + val call = SignalDatabase.calls.getCallById(callId, recipientId) if (call != null) { if (call.type !== type) { @@ -1222,7 +1221,7 @@ object SyncMessageProcessor { CallTable.Event.DELETE -> SignalDatabase.calls.deleteGroupCall(call) CallTable.Event.ACCEPTED -> { if (call.timestamp < callEvent.timestamp) { - SignalDatabase.calls.setTimestamp(call.callId, conversationId, callEvent.timestamp) + SignalDatabase.calls.setTimestamp(call.callId, recipientId, callEvent.timestamp) } if (callEvent.direction == SyncMessage.CallEvent.Direction.INCOMING) { SignalDatabase.calls.acceptIncomingGroupCall(call) diff --git a/app/src/main/protowire/JobData.proto b/app/src/main/protowire/JobData.proto index 6aa970f55b..fe8af67d85 100644 --- a/app/src/main/protowire/JobData.proto +++ b/app/src/main/protowire/JobData.proto @@ -6,14 +6,11 @@ option java_package = "org.thoughtcrime.securesms.jobs.protos"; option java_multiple_files = true; message CallSyncEventJobRecord { - oneof conversationId { - uint64 recipientId = 1; - string callLinkId = 2; - } - - uint64 callId = 3; - uint32 direction = 4; - uint32 event = 5; + uint64 recipientId = 1; + reserved 2; + uint64 callId = 3; + uint32 direction = 4; + uint32 event = 5; } message CallSyncEventJobData {