mirror of
https://github.com/signalapp/Signal-Android.git
synced 2026-04-22 01:40:07 +01:00
Update contact hiding to spec.
This commit is contained in:
@@ -491,6 +491,10 @@ class DistributionListTables constructor(context: Context?, databaseHelper: Sign
|
||||
}
|
||||
}
|
||||
|
||||
fun removeMemberFromAllLists(member: RecipientId) {
|
||||
writableDatabase.delete(MembershipTable.TABLE_NAME, "${MembershipTable.RECIPIENT_ID} = ?", SqlUtil.buildArgs(member))
|
||||
}
|
||||
|
||||
fun removeMemberFromList(listId: DistributionListId, privacyMode: DistributionListPrivacyMode, member: RecipientId) {
|
||||
writableDatabase.delete(MembershipTable.TABLE_NAME, "${MembershipTable.LIST_ID} = ? AND ${MembershipTable.RECIPIENT_ID} = ? AND ${MembershipTable.PRIVACY_MODE} = ?", SqlUtil.buildArgs(listId, member, privacyMode.serialize()))
|
||||
}
|
||||
|
||||
@@ -1708,6 +1708,65 @@ open class MessageTable(context: Context?, databaseHelper: SignalDatabase) : Dat
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete all the stories received from the recipient in 1:1 stories
|
||||
*/
|
||||
fun deleteStoriesForRecipient(recipientId: RecipientId): Int {
|
||||
return writableDatabase.withinTransaction { db ->
|
||||
val threadId = threads.getThreadIdFor(recipientId)
|
||||
val storesInRecipientThread = "$IS_STORY_CLAUSE AND $THREAD_ID = ?"
|
||||
val sharedArgs = buildArgs(threadId)
|
||||
|
||||
val deleteStoryRepliesQuery = """
|
||||
DELETE FROM $TABLE_NAME
|
||||
WHERE
|
||||
$PARENT_STORY_ID > 0 AND
|
||||
$PARENT_STORY_ID IN (
|
||||
SELECT $ID
|
||||
FROM $TABLE_NAME
|
||||
WHERE $storesInRecipientThread
|
||||
)
|
||||
"""
|
||||
|
||||
val disassociateQuoteQuery = """
|
||||
UPDATE $TABLE_NAME
|
||||
SET
|
||||
$QUOTE_MISSING = 1,
|
||||
$QUOTE_BODY = ''
|
||||
WHERE
|
||||
$PARENT_STORY_ID < 0 AND
|
||||
ABS($PARENT_STORY_ID) IN (
|
||||
SELECT $ID
|
||||
FROM $TABLE_NAME
|
||||
WHERE $storesInRecipientThread
|
||||
)
|
||||
"""
|
||||
|
||||
db.execSQL(deleteStoryRepliesQuery, sharedArgs)
|
||||
db.execSQL(disassociateQuoteQuery, sharedArgs)
|
||||
|
||||
ApplicationDependencies.getDatabaseObserver().notifyStoryObservers(recipientId)
|
||||
|
||||
val deletedStoryCount = db.select(ID)
|
||||
.from(TABLE_NAME)
|
||||
.where(storesInRecipientThread, sharedArgs)
|
||||
.run()
|
||||
.use { cursor ->
|
||||
while (cursor.moveToNext()) {
|
||||
deleteMessage(cursor.requireLong(ID))
|
||||
}
|
||||
|
||||
cursor.count
|
||||
}
|
||||
|
||||
if (deletedStoryCount > 0) {
|
||||
OptimizeMessageSearchIndexJob.enqueue()
|
||||
}
|
||||
|
||||
deletedStoryCount
|
||||
}
|
||||
}
|
||||
|
||||
private fun disassociateStoryQuotes(storyId: Long) {
|
||||
writableDatabase
|
||||
.update(TABLE_NAME)
|
||||
|
||||
@@ -1740,22 +1740,24 @@ open class RecipientTable(context: Context, databaseHelper: SignalDatabase) : Da
|
||||
}
|
||||
}
|
||||
|
||||
fun markHidden(id: RecipientId, clearProfileKey: Boolean = false) {
|
||||
fun markHidden(id: RecipientId, clearProfileKey: Boolean = false, showMessageRequest: Boolean = false) {
|
||||
val contentValues = if (clearProfileKey) {
|
||||
contentValuesOf(
|
||||
HIDDEN to 1,
|
||||
HIDDEN to if (showMessageRequest) Recipient.HiddenState.HIDDEN_MESSAGE_REQUEST.serialize() else Recipient.HiddenState.HIDDEN.serialize(),
|
||||
PROFILE_SHARING to 0,
|
||||
PROFILE_KEY to null
|
||||
)
|
||||
} else {
|
||||
contentValuesOf(
|
||||
HIDDEN to 1,
|
||||
HIDDEN to if (showMessageRequest) Recipient.HiddenState.HIDDEN_MESSAGE_REQUEST.serialize() else Recipient.HiddenState.HIDDEN.serialize(),
|
||||
PROFILE_SHARING to 0
|
||||
)
|
||||
}
|
||||
|
||||
val updated = writableDatabase.update(TABLE_NAME, contentValues, "$ID_WHERE AND $TYPE = ?", SqlUtil.buildArgs(id, RecipientType.INDIVIDUAL.id)) > 0
|
||||
if (updated) {
|
||||
SignalDatabase.distributionLists.removeMemberFromAllLists(id)
|
||||
SignalDatabase.messages.deleteStoriesForRecipient(id)
|
||||
rotateStorageId(id)
|
||||
ApplicationDependencies.getDatabaseObserver().notifyRecipientChanged(id)
|
||||
StorageSyncHelper.scheduleSyncForDataChange()
|
||||
@@ -3033,7 +3035,7 @@ open class RecipientTable(context: Context, databaseHelper: SignalDatabase) : Da
|
||||
fun getRegistered(): List<RecipientId> {
|
||||
val results: MutableList<RecipientId> = LinkedList()
|
||||
|
||||
readableDatabase.query(TABLE_NAME, ID_PROJECTION, "$REGISTERED = ? and $HIDDEN = ?", arrayOf("1", "0"), null, null, null).use { cursor ->
|
||||
readableDatabase.query(TABLE_NAME, ID_PROJECTION, "$REGISTERED = ? and $HIDDEN = ?", arrayOf("1", "${Recipient.HiddenState.NOT_HIDDEN.serialize()}"), null, null, null).use { cursor ->
|
||||
while (cursor != null && cursor.moveToNext()) {
|
||||
results.add(RecipientId.from(cursor.getLong(cursor.getColumnIndexOrThrow(ID))))
|
||||
}
|
||||
@@ -3045,7 +3047,7 @@ open class RecipientTable(context: Context, databaseHelper: SignalDatabase) : Da
|
||||
return readableDatabase
|
||||
.select(ID)
|
||||
.from(TABLE_NAME)
|
||||
.where("$REGISTERED = ? and $HIDDEN = ? AND $ACI_COLUMN NOT NULL", 1, 0)
|
||||
.where("$REGISTERED = ? and $HIDDEN = ? AND $ACI_COLUMN NOT NULL", 1, Recipient.HiddenState.NOT_HIDDEN.serialize())
|
||||
.run()
|
||||
.readToSet { cursor ->
|
||||
RecipientId.from(cursor.requireLong(ID))
|
||||
@@ -3078,7 +3080,7 @@ open class RecipientTable(context: Context, databaseHelper: SignalDatabase) : Da
|
||||
return readableDatabase
|
||||
.select(E164)
|
||||
.from(TABLE_NAME)
|
||||
.where("$REGISTERED = ? and $HIDDEN = ? AND $E164 NOT NULL", 1, 0)
|
||||
.where("$REGISTERED = ? and $HIDDEN = ? AND $E164 NOT NULL", 1, Recipient.HiddenState.NOT_HIDDEN.serialize())
|
||||
.run()
|
||||
.readToSet { cursor ->
|
||||
cursor.requireNonNullString(E164)
|
||||
@@ -4194,7 +4196,7 @@ open class RecipientTable(context: Context, databaseHelper: SignalDatabase) : Da
|
||||
hasGroupsInCommon = cursor.requireBoolean(GROUPS_IN_COMMON),
|
||||
badges = parseBadgeList(cursor.requireBlob(BADGES)),
|
||||
needsPniSignature = cursor.requireBoolean(NEEDS_PNI_SIGNATURE),
|
||||
isHidden = cursor.requireBoolean(HIDDEN),
|
||||
hiddenState = Recipient.HiddenState.deserialize(cursor.requireInt(HIDDEN)),
|
||||
callLinkRoomId = cursor.requireString(CALL_LINK_ROOM_ID)?.let { CallLinkRoomId.DatabaseSerializer.deserialize(it) }
|
||||
)
|
||||
}
|
||||
|
||||
@@ -75,7 +75,7 @@ data class RecipientRecord(
|
||||
val badges: List<Badge>,
|
||||
@get:JvmName("needsPniSignature")
|
||||
val needsPniSignature: Boolean,
|
||||
val isHidden: Boolean,
|
||||
val hiddenState: Recipient.HiddenState,
|
||||
val callLinkRoomId: CallLinkRoomId?
|
||||
) {
|
||||
|
||||
|
||||
Reference in New Issue
Block a user