Signal-Android/app/src/spinner/java/org/thoughtcrime/securesms/database/GV2UpdateTransformer.kt

47 wiersze
1.9 KiB
Kotlin

package org.thoughtcrime.securesms.database
import android.database.Cursor
import org.signal.core.util.CursorUtil
import org.signal.core.util.requireLong
import org.signal.spinner.ColumnTransformer
import org.signal.spinner.DefaultColumnTransformer
import org.thoughtcrime.securesms.database.model.MessageRecord
import org.thoughtcrime.securesms.database.model.UpdateDescription
import org.thoughtcrime.securesms.database.model.databaseprotos.DecryptedGroupV2Context
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies
import org.thoughtcrime.securesms.util.Base64
object GV2UpdateTransformer : ColumnTransformer {
override fun matches(tableName: String?, columnName: String): Boolean {
return columnName == MmsSmsColumns.BODY && (tableName == null || (tableName == SmsDatabase.TABLE_NAME || tableName == MmsDatabase.TABLE_NAME))
}
override fun transform(tableName: String?, columnName: String, cursor: Cursor): String {
val type: Long = cursor.getMessageType()
if (type == -1L) {
return DefaultColumnTransformer.transform(tableName, columnName, cursor)
}
val body: String? = CursorUtil.requireString(cursor, MmsSmsColumns.BODY)
return if (MmsSmsColumns.Types.isGroupV2(type) && MmsSmsColumns.Types.isGroupUpdate(type) && body != null) {
val decoded = Base64.decode(body)
val decryptedGroupV2Context = DecryptedGroupV2Context.parseFrom(decoded)
val gv2ChangeDescription: UpdateDescription = MessageRecord.getGv2ChangeDescription(ApplicationDependencies.getApplication(), body, null)
"${gv2ChangeDescription.spannable}<br><br>${decryptedGroupV2Context.change}"
} else {
body ?: ""
}
}
}
private fun Cursor.getMessageType(): Long {
return when {
getColumnIndex(SmsDatabase.TYPE) != -1 -> requireLong(SmsDatabase.TYPE)
getColumnIndex(MmsDatabase.MESSAGE_BOX) != -1 -> requireLong(MmsDatabase.MESSAGE_BOX)
else -> -1
}
}