Fix call log multiselect deletions.

This commit is contained in:
Alex Hart
2023-04-25 16:42:33 -03:00
committed by GitHub
parent eb9915d445
commit 0e631508b2
7 changed files with 106 additions and 28 deletions

View File

@@ -20,6 +20,7 @@ import org.signal.core.util.requireNonNullString
import org.signal.core.util.requireObject
import org.signal.core.util.requireString
import org.signal.core.util.select
import org.signal.core.util.toSingleLine
import org.signal.core.util.update
import org.signal.core.util.withinTransaction
import org.signal.ringrtc.CallId
@@ -544,6 +545,7 @@ class CallTable(context: Context, databaseHelper: SignalDatabase) : DatabaseTabl
else -> Log.w(TAG, "Received a REQUESTED ring event while in ${call.event}. Ignoring.")
}
}
RingUpdate.EXPIRED_REQUEST, RingUpdate.CANCELLED_BY_RINGER -> {
when (call.event) {
Event.GENERIC_GROUP_CALL, Event.RINGING -> updateEventFromRingState(ringId, Event.MISSED, ringerRecipient)
@@ -551,6 +553,7 @@ class CallTable(context: Context, databaseHelper: SignalDatabase) : DatabaseTabl
else -> Unit
}
}
RingUpdate.BUSY_LOCALLY, RingUpdate.BUSY_ON_ANOTHER_DEVICE -> {
when (call.event) {
Event.JOINED -> updateEventFromRingState(ringId, Event.ACCEPTED)
@@ -558,9 +561,11 @@ class CallTable(context: Context, databaseHelper: SignalDatabase) : DatabaseTabl
else -> Log.w(TAG, "Received a busy event we can't process. Ignoring.")
}
}
RingUpdate.ACCEPTED_ON_ANOTHER_DEVICE -> {
updateEventFromRingState(ringId, Event.ACCEPTED)
}
RingUpdate.DECLINED_ON_ANOTHER_DEVICE -> {
when (call.event) {
Event.RINGING, Event.MISSED -> updateEventFromRingState(ringId, Event.DECLINED)
@@ -577,14 +582,17 @@ class CallTable(context: Context, databaseHelper: SignalDatabase) : DatabaseTabl
Log.w(TAG, "Missed original ring request for $ringId")
Event.ACCEPTED
}
RingUpdate.DECLINED_ON_ANOTHER_DEVICE -> {
Log.w(TAG, "Missed original ring request for $ringId")
Event.DECLINED
}
RingUpdate.BUSY_LOCALLY, RingUpdate.BUSY_ON_ANOTHER_DEVICE -> {
Log.w(TAG, "Missed original ring request for $ringId")
Event.MISSED
}
RingUpdate.CANCELLED_BY_RINGER -> {
Log.w(TAG, "Missed original ring request for $ringId")
Event.MISSED
@@ -702,10 +710,72 @@ class CallTable(context: Context, databaseHelper: SignalDatabase) : DatabaseTabl
updateCallEventDeletionTimestamps()
}
fun deleteAllCallEventsExcept(callRowIds: Set<Long>) {
val messageIds = getMessageIds(callRowIds)
SignalDatabase.messages.deleteAllCallUpdatesExcept(messageIds)
updateCallEventDeletionTimestamps()
fun deleteAllCallEventsExcept(callRowIds: Set<Long>, missedOnly: Boolean) {
val callFilter = if (missedOnly) {
"$EVENT = ${Event.serialize(Event.MISSED)} AND $DELETION_TIMESTAMP = 0"
} else {
"$DELETION_TIMESTAMP = 0"
}
if (callRowIds.isEmpty()) {
val threadIds = writableDatabase.withinTransaction { db ->
val ids = db.select(MessageTable.THREAD_ID)
.from(MessageTable.TABLE_NAME)
.where(
"""
${MessageTable.ID} IN (
SELECT $MESSAGE_ID FROM $TABLE_NAME
WHERE $callFilter
)
""".toSingleLine()
)
.run()
.readToList { it.requireLong(MessageTable.THREAD_ID) }
db.delete(MessageTable.TABLE_NAME)
.where(
"""
${MessageTable.ID} IN (
SELECT $MESSAGE_ID FROM $TABLE_NAME
WHERE $callFilter
)
""".toSingleLine()
)
.run()
ids.toSet()
}
threadIds.forEach {
SignalDatabase.threads.update(
threadId = it,
unarchive = false,
allowDeletion = true
)
}
notifyConversationListeners(threadIds)
notifyConversationListListeners()
updateCallEventDeletionTimestamps()
} else {
writableDatabase.withinTransaction { db ->
SqlUtil.buildCollectionQuery(
column = ID,
values = callRowIds,
prefix = "$callFilter AND",
collectionOperator = SqlUtil.CollectionOperator.NOT_IN
).forEach { query ->
val messageIds = db.select(MESSAGE_ID)
.from(TABLE_NAME)
.where(query.where, query.whereArgs)
.run()
.readToList { it.requireLong(MESSAGE_ID) }
.toSet()
SignalDatabase.messages.deleteCallUpdates(messageIds)
updateCallEventDeletionTimestamps()
}
}
}
}
@Discouraged("Using this method is generally considered an error. Utilize other deletion methods instead of this.")
@@ -876,8 +946,6 @@ class CallTable(context: Context, databaseHelper: SignalDatabase) : DatabaseTabl
val date = cursor.requireLong(MessageTable.DATE_RECEIVED)
val groupCallDetails = GroupCallUpdateDetailsUtil.parse(cursor.requireString(MessageTable.BODY))
Log.d(TAG, "${cursor.requireNonNullString("in_period")}")
val children = cursor.requireNonNullString("children")
.split(',')
.map { it.toLong() }

View File

@@ -3193,14 +3193,10 @@ open class MessageTable(context: Context?, databaseHelper: SignalDatabase) : Dat
return deleteCallUpdatesInternal(messageIds, SqlUtil.CollectionOperator.IN)
}
/**
* Deletes all call updates except for those specified in the parameter.
*/
fun deleteAllCallUpdatesExcept(excludedMessageIds: Set<Long>): Int {
return deleteCallUpdatesInternal(excludedMessageIds, SqlUtil.CollectionOperator.NOT_IN)
}
private fun deleteCallUpdatesInternal(messageIds: Set<Long>, collectionOperator: SqlUtil.CollectionOperator): Int {
private fun deleteCallUpdatesInternal(
messageIds: Set<Long>,
collectionOperator: SqlUtil.CollectionOperator
): Int {
var rowsDeleted = 0
val threadIds: Set<Long> = writableDatabase.withinTransaction {
SqlUtil.buildCollectionQuery(