mirror of
https://github.com/signalapp/Signal-Android.git
synced 2026-04-20 16:49:40 +01:00
Fix call log multiselect deletions.
This commit is contained in:
@@ -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() }
|
||||
|
||||
@@ -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(
|
||||
|
||||
Reference in New Issue
Block a user