@ -65,6 +65,7 @@ import org.thoughtcrime.securesms.database.model.Quote
import org.thoughtcrime.securesms.dependencies.DatabaseComponent.Companion.get
import org.thoughtcrime.securesms.dependencies.DatabaseComponent.Companion.get
import org.thoughtcrime.securesms.mms.MmsException
import org.thoughtcrime.securesms.mms.MmsException
import org.thoughtcrime.securesms.mms.SlideDeck
import org.thoughtcrime.securesms.mms.SlideDeck
import org.thoughtcrime.securesms.util.asSequence
import java.io.Closeable
import java.io.Closeable
import java.io.IOException
import java.io.IOException
import java.security.SecureRandom
import java.security.SecureRandom
@ -91,54 +92,22 @@ class MmsDatabase(context: Context, databaseHelper: SQLCipherOpenHelper) : Messa
return 0
return 0
}
}
fun addFailures ( messageId : Long , failure : List < NetworkFailure > ) {
fun isOutgoingMessage ( timestamp : Long ) : Boolean =
try {
databaseHelper . writableDatabase . query (
addToDocument ( messageId , NETWORK _FAILURE , failure , NetworkFailureList :: class . java )
TABLE _NAME ,
} catch ( e : IOException ) {
arrayOf ( ID , THREAD _ID , MESSAGE _BOX , ADDRESS ) ,
Log . w ( TAG , e )
DATE _SENT + " = ? " ,
}
arrayOf ( timestamp . toString ( ) ) ,
}
null ,
null ,
fun removeFailure ( messageId : Long , failure : NetworkFailure ? ) {
null ,
try {
null
removeFromDocument ( messageId , NETWORK _FAILURE , failure , NetworkFailureList :: class . java )
) . use { cursor ->
} catch ( e : IOException ) {
cursor . asSequence ( )
Log . w ( TAG , e )
. map { cursor . getColumnIndexOrThrow ( MESSAGE _BOX ) }
}
. map ( cursor :: getLong )
}
. any { MmsSmsColumns . Types . isOutgoingMessageType ( it ) }
fun isOutgoingMessage ( timestamp : Long ) : Boolean {
val database = databaseHelper . writableDatabase
var cursor : Cursor ? = null
var isOutgoing = false
try {
cursor = database . query (
TABLE _NAME ,
arrayOf < String > ( ID , THREAD _ID , MESSAGE _BOX , ADDRESS ) ,
DATE _SENT + " = ? " ,
arrayOf ( timestamp . toString ( ) ) ,
null ,
null ,
null ,
null
)
while ( cursor . moveToNext ( ) ) {
if ( MmsSmsColumns . Types . isOutgoingMessageType (
cursor . getLong (
cursor . getColumnIndexOrThrow (
MESSAGE _BOX
)
)
)
) {
isOutgoing = true
}
}
} finally {
cursor ?. close ( )
}
}
return isOutgoing
}
fun incrementReceiptCount (
fun incrementReceiptCount (
messageId : SyncMessageId ,
messageId : SyncMessageId ,
@ -254,15 +223,6 @@ class MmsDatabase(context: Context, databaseHelper: SQLCipherOpenHelper) : Messa
}
}
}
}
private fun getThreadIdFor ( notification : NotificationInd ) : Long {
val fromString =
if ( notification . from != null && notification . from . textString != null ) toIsoString (
notification . from . textString
) else " "
val recipient = Recipient . from ( context , fromExternal ( context , fromString ) , false )
return get ( context ) . threadDatabase ( ) . getOrCreateThreadIdFor ( recipient )
}
private fun rawQuery ( where : String , arguments : Array < String > ? ) : Cursor {
private fun rawQuery ( where : String , arguments : Array < String > ? ) : Cursor {
val database = databaseHelper . readableDatabase
val database = databaseHelper . readableDatabase
return database . rawQuery (
return database . rawQuery (
@ -273,10 +233,6 @@ class MmsDatabase(context: Context, databaseHelper: SQLCipherOpenHelper) : Messa
)
)
}
}
fun getMessages ( idsAsString : String ) : Cursor {
return rawQuery ( idsAsString , null )
}
fun getMessage ( messageId : Long ) : Cursor {
fun getMessage ( messageId : Long ) : Cursor {
val cursor = rawQuery ( RAW _ID _WHERE , arrayOf ( messageId . toString ( ) ) )
val cursor = rawQuery ( RAW _ID _WHERE , arrayOf ( messageId . toString ( ) ) )
setNotifyConverationListeners ( cursor , getThreadIdForMessage ( messageId ) )
setNotifyConverationListeners ( cursor , getThreadIdForMessage ( messageId ) )
@ -306,48 +262,30 @@ class MmsDatabase(context: Context, databaseHelper: SQLCipherOpenHelper) : Messa
}
}
}
}
fun markAsPendingInsecureSmsFallback ( messageId : Long ) {
private fun markAs (
val threadId = getThreadIdForMessage ( messageId )
messageId : Long ,
baseType : Long ,
threadId : Long = getThreadIdForMessage ( messageId )
) {
updateMailboxBitmask (
updateMailboxBitmask (
messageId ,
messageId ,
MmsSmsColumns . Types . BASE _TYPE _MASK ,
MmsSmsColumns . Types . BASE _TYPE _MASK ,
MmsSmsColumns . Types . BASE _PENDING _INSECURE _SMS _FALLBACK ,
baseType ,
Optional . of ( threadId )
Optional . of ( threadId )
)
)
notifyConversationListeners ( threadId )
notifyConversationListeners ( threadId )
}
}
fun markAsSending ( messageId : Long ) {
fun markAsSending ( messageId : Long ) {
val threadId = getThreadIdForMessage ( messageId )
markAs ( messageId , MmsSmsColumns . Types . BASE _SENDING _TYPE )
updateMailboxBitmask (
messageId ,
MmsSmsColumns . Types . BASE _TYPE _MASK ,
MmsSmsColumns . Types . BASE _SENDING _TYPE ,
Optional . of ( threadId )
)
notifyConversationListeners ( threadId )
}
}
fun markAsSentFailed ( messageId : Long ) {
fun markAsSentFailed ( messageId : Long ) {
val threadId = getThreadIdForMessage ( messageId )
markAs ( messageId , MmsSmsColumns . Types . BASE _SENT _FAILED _TYPE )
updateMailboxBitmask (
messageId ,
MmsSmsColumns . Types . BASE _TYPE _MASK ,
MmsSmsColumns . Types . BASE _SENT _FAILED _TYPE ,
Optional . of ( threadId )
)
notifyConversationListeners ( threadId )
}
}
override fun markAsSent ( messageId : Long , secure : Boolean ) {
override fun markAsSent ( messageId : Long , secure : Boolean ) {
val threadId = getThreadIdForMessage ( messageId )
markAs ( messageId , MmsSmsColumns . Types . BASE _SENT _TYPE or if ( secure ) MmsSmsColumns . Types . PUSH _MESSAGE _BIT or MmsSmsColumns . Types . SECURE _MESSAGE _BIT else 0 )
updateMailboxBitmask (
messageId ,
MmsSmsColumns . Types . BASE _TYPE _MASK ,
MmsSmsColumns . Types . BASE _SENT _TYPE or if ( secure ) MmsSmsColumns . Types . PUSH _MESSAGE _BIT or MmsSmsColumns . Types . SECURE _MESSAGE _BIT else 0 ,
Optional . of ( threadId )
)
notifyConversationListeners ( threadId )
}
}
override fun markUnidentified ( messageId : Long , unidentified : Boolean ) {
override fun markUnidentified ( messageId : Long , unidentified : Boolean ) {
@ -371,13 +309,7 @@ class MmsDatabase(context: Context, databaseHelper: SQLCipherOpenHelper) : Messa
val mentionChange = if ( hasMention ) { 1 } else { 0 }
val mentionChange = if ( hasMention ) { 1 } else { 0 }
get ( context ) . threadDatabase ( ) . decrementUnread ( threadId , 1 , mentionChange )
get ( context ) . threadDatabase ( ) . decrementUnread ( threadId , 1 , mentionChange )
}
}
updateMailboxBitmask (
markAs ( messageId , MmsSmsColumns . Types . BASE _DELETED _TYPE , threadId )
messageId ,
MmsSmsColumns . Types . BASE _TYPE _MASK ,
MmsSmsColumns . Types . BASE _DELETED _TYPE ,
Optional . of ( threadId )
)
notifyConversationListeners ( threadId )
}
}
override fun markExpireStarted ( messageId : Long ) {
override fun markExpireStarted ( messageId : Long ) {
@ -407,10 +339,6 @@ class MmsDatabase(context: Context, databaseHelper: SQLCipherOpenHelper) : Messa
)
)
}
}
fun setAllMessagesRead ( ) : List < MarkedMessageInfo > {
return setMessagesRead ( READ + " = 0 " , null )
}
private fun setMessagesRead ( where : String , arguments : Array < String > ? ) : List < MarkedMessageInfo > {
private fun setMessagesRead ( where : String , arguments : Array < String > ? ) : List < MarkedMessageInfo > {
val database = databaseHelper . writableDatabase
val database = databaseHelper . writableDatabase
val result : MutableList < MarkedMessageInfo > = LinkedList ( )
val result : MutableList < MarkedMessageInfo > = LinkedList ( )
@ -419,7 +347,7 @@ class MmsDatabase(context: Context, databaseHelper: SQLCipherOpenHelper) : Messa
try {
try {
cursor = database . query (
cursor = database . query (
TABLE _NAME ,
TABLE _NAME ,
arrayOf <String > (ID , ADDRESS , DATE _SENT , MESSAGE _BOX , EXPIRES _IN , EXPIRE _STARTED ) ,
arrayOf (ID , ADDRESS , DATE _SENT , MESSAGE _BOX , EXPIRES _IN , EXPIRE _STARTED ) ,
where ,
where ,
arguments ,
arguments ,
null ,
null ,
@ -1400,25 +1328,16 @@ class MmsDatabase(context: Context, databaseHelper: SQLCipherOpenHelper) : Messa
val attachments = get ( context ) . attachmentDatabase ( ) . getAttachment (
val attachments = get ( context ) . attachmentDatabase ( ) . getAttachment (
cursor
cursor
)
)
val contacts : List < Contact ? > = getSharedContacts (
val contacts : List < Contact ? > = getSharedContacts ( cursor , attachments )
cursor , attachments
val contactAttachments : Set < Attachment ? > =
)
contacts . mapNotNull { it ?. avatarAttachment } . toSet ( )
val contactAttachments =
val previews : List < LinkPreview ? > = getLinkPreviews ( cursor , attachments )
contacts . map { obj : Contact ? -> obj !! . avatarAttachment }
val previewAttachments : Set < Attachment ? > =
. filter { a : Attachment ? -> a != null }
previews . mapNotNull { it ?. getThumbnail ( ) ?. orNull ( ) } . toSet ( )
. toSet ( )
val previews : List < LinkPreview ? > = getLinkPreviews (
cursor , attachments
)
val previewAttachments =
previews . filter { lp : LinkPreview ? -> lp !! . getThumbnail ( ) . isPresent }
. map { lp : LinkPreview ? -> lp !! . getThumbnail ( ) . get ( ) }
. toSet ( )
val slideDeck = getSlideDeck (
val slideDeck = getSlideDeck (
Stream . of ( attachments )
attachments
. filterNot { o : DatabaseAttachment ? -> contactAttachments . contains ( o ) }
. filterNot { o : DatabaseAttachment ? -> o in contactAttachments }
. filterNot { o : DatabaseAttachment ? -> previewAttachments . contains ( o ) }
. filterNot { o : DatabaseAttachment ? -> o in previewAttachments }
. toList ( )
)
)
val quote = getQuote ( cursor )
val quote = getQuote ( cursor )
val reactions = get ( context ) . reactionDatabase ( ) . getReactions ( cursor )
val reactions = get ( context ) . reactionDatabase ( ) . getReactions ( cursor )
@ -1623,4 +1542,4 @@ class MmsDatabase(context: Context, databaseHelper: SQLCipherOpenHelper) : Messa
const val CREATE _REACTIONS _LAST _SEEN _COMMAND = " ALTER TABLE $TABLE _NAME ADD COLUMN $REACTIONS _LAST_SEEN INTEGER DEFAULT 0; "
const val CREATE _REACTIONS _LAST _SEEN _COMMAND = " ALTER TABLE $TABLE _NAME ADD COLUMN $REACTIONS _LAST_SEEN INTEGER DEFAULT 0; "
const val CREATE _HAS _MENTION _COMMAND = " ALTER TABLE $TABLE _NAME ADD COLUMN $HAS _MENTION INTEGER DEFAULT 0; "
const val CREATE _HAS _MENTION _COMMAND = " ALTER TABLE $TABLE _NAME ADD COLUMN $HAS _MENTION INTEGER DEFAULT 0; "
}
}
}
}