session-android/src/org/thoughtcrime/securesms/loki/LokiThreadDatabase.kt

112 lines
5.9 KiB
Kotlin
Raw Normal View History

2019-07-22 01:38:12 +02:00
package org.thoughtcrime.securesms.loki
import android.content.ContentValues
import android.content.Context
2019-07-22 04:09:34 +02:00
import org.thoughtcrime.securesms.database.Address
2019-07-22 01:38:12 +02:00
import org.thoughtcrime.securesms.database.Database
import org.thoughtcrime.securesms.database.DatabaseFactory
import org.thoughtcrime.securesms.database.helpers.SQLCipherOpenHelper
2019-07-22 04:09:34 +02:00
import org.thoughtcrime.securesms.recipients.Recipient
2019-10-10 01:53:17 +02:00
import org.whispersystems.signalservice.internal.util.JsonUtil
import org.whispersystems.signalservice.loki.api.LokiGroupChat
2019-07-22 01:38:12 +02:00
import org.whispersystems.signalservice.loki.messaging.LokiThreadDatabaseProtocol
import org.whispersystems.signalservice.loki.messaging.LokiThreadFriendRequestStatus
2019-07-22 07:11:38 +02:00
import org.whispersystems.signalservice.loki.messaging.LokiThreadSessionResetStatus
2019-07-22 01:38:12 +02:00
class LokiThreadDatabase(context: Context, helper: SQLCipherOpenHelper) : Database(context, helper), LokiThreadDatabaseProtocol {
var delegate: LokiThreadDatabaseDelegate? = null
companion object {
private val friendRequestTableName = "loki_thread_friend_request_database"
2019-07-22 06:25:59 +02:00
private val sessionResetTableName = "loki_thread_session_reset_database"
2019-10-10 01:53:17 +02:00
private val groupChatMappingTableName = "loki_group_chat_mapping_database"
2019-07-22 01:38:12 +02:00
private val threadID = "thread_id"
private val friendRequestStatus = "friend_request_status"
2019-07-22 06:25:59 +02:00
private val sessionResetStatus = "session_reset_status"
2019-10-10 01:53:17 +02:00
private val groupChatJSON = "group_chat_json"
2019-07-22 01:38:12 +02:00
@JvmStatic val createFriendRequestTableCommand = "CREATE TABLE $friendRequestTableName ($threadID INTEGER PRIMARY KEY, $friendRequestStatus INTEGER DEFAULT 0);"
2019-07-22 06:25:59 +02:00
@JvmStatic val createSessionResetTableCommand = "CREATE TABLE $sessionResetTableName ($threadID INTEGER PRIMARY KEY, $sessionResetStatus INTEGER DEFAULT 0);"
2019-10-10 01:53:17 +02:00
@JvmStatic val createGroupChatMappingTableCommand = "CREATE TABLE $groupChatMappingTableName ($threadID INTEGER PRIMARY KEY, $groupChatJSON TEXT);"
2019-07-22 01:38:12 +02:00
}
2019-08-07 08:48:54 +02:00
override fun getThreadID(hexEncodedPublicKey: String): Long {
val address = Address.fromSerialized(hexEncodedPublicKey)
2019-07-22 04:09:34 +02:00
val recipient = Recipient.from(context, address, false)
return DatabaseFactory.getThreadDatabase(context).getThreadIdFor(recipient)
}
2019-10-10 01:53:17 +02:00
fun getThreadID(messageID: Long): Long {
2019-07-22 01:38:12 +02:00
return DatabaseFactory.getSmsDatabase(context).getThreadIdForMessage(messageID)
}
fun getFriendRequestStatus(threadID: Long): LokiThreadFriendRequestStatus {
val database = databaseHelper.readableDatabase
val result = database.get(friendRequestTableName, "${Companion.threadID} = ?", arrayOf( threadID.toString() )) { cursor ->
cursor.getInt(friendRequestStatus)
}
return if (result != null) {
LokiThreadFriendRequestStatus.values().first { it.rawValue == result }
} else {
LokiThreadFriendRequestStatus.NONE
}
}
override fun setFriendRequestStatus(threadID: Long, friendRequestStatus: LokiThreadFriendRequestStatus) {
val database = databaseHelper.writableDatabase
val contentValues = ContentValues(2)
contentValues.put(Companion.threadID, threadID)
contentValues.put(Companion.friendRequestStatus, friendRequestStatus.rawValue)
database.insertOrUpdate(friendRequestTableName, contentValues, "${Companion.threadID} = ?", arrayOf( threadID.toString() ))
notifyConversationListListeners()
notifyConversationListeners(threadID)
delegate?.handleThreadFriendRequestStatusChanged(threadID)
}
fun hasPendingFriendRequest(threadID: Long): Boolean {
val friendRequestStatus = getFriendRequestStatus(threadID)
return friendRequestStatus == LokiThreadFriendRequestStatus.REQUEST_SENDING || friendRequestStatus == LokiThreadFriendRequestStatus.REQUEST_SENT
|| friendRequestStatus == LokiThreadFriendRequestStatus.REQUEST_RECEIVED
}
2019-07-22 07:11:38 +02:00
override fun getSessionResetStatus(threadID: Long): LokiThreadSessionResetStatus {
2019-07-22 01:38:12 +02:00
val database = databaseHelper.readableDatabase
val result = database.get(sessionResetTableName, "${Companion.threadID} = ?", arrayOf( threadID.toString() )) { cursor ->
2019-07-22 06:25:59 +02:00
cursor.getInt(sessionResetStatus)
2019-07-22 01:38:12 +02:00
}
return if (result != null) {
2019-07-22 07:11:38 +02:00
LokiThreadSessionResetStatus.values().first { it.rawValue == result }
2019-07-22 01:38:12 +02:00
} else {
2019-07-22 07:11:38 +02:00
LokiThreadSessionResetStatus.NONE
2019-07-22 01:38:12 +02:00
}
}
2019-07-22 07:11:38 +02:00
override fun setSessionResetStatus(threadID: Long, sessionResetStatus: LokiThreadSessionResetStatus) {
2019-07-22 01:38:12 +02:00
val database = databaseHelper.writableDatabase
val contentValues = ContentValues(2)
contentValues.put(Companion.threadID, threadID)
2019-07-22 06:25:59 +02:00
contentValues.put(Companion.sessionResetStatus, sessionResetStatus.rawValue)
2019-07-22 01:38:12 +02:00
database.insertOrUpdate(sessionResetTableName, contentValues, "${Companion.threadID} = ?", arrayOf( threadID.toString() ))
notifyConversationListListeners()
notifyConversationListeners(threadID)
}
2019-10-10 01:53:17 +02:00
override fun getGroupChat(threadID: Long): LokiGroupChat? {
val database = databaseHelper.readableDatabase
return database.get(groupChatMappingTableName, "${Companion.threadID} = ?", arrayOf( threadID.toString() )) { cursor ->
val string = cursor.getString(groupChatJSON)
LokiGroupChat.fromJSON(string)
}
}
override fun setGroupChat(groupChat: LokiGroupChat, threadID: Long) {
val database = databaseHelper.writableDatabase
val contentValues = ContentValues(2)
contentValues.put(Companion.threadID, threadID)
contentValues.put(Companion.groupChatJSON, JsonUtil.toJson(groupChat.toJSON()))
database.insertOrUpdate(groupChatMappingTableName, contentValues, "${Companion.threadID} = ?", arrayOf( threadID.toString() ))
}
override fun removeGroupChat(threadID: Long) {
databaseHelper.writableDatabase.delete(groupChatMappingTableName, "${Companion.threadID} = ?", arrayOf( threadID.toString() ))
}
2019-07-22 01:38:12 +02:00
}