From 0f33d3677b00a1ef0ade6fc781a0e18b41b9f8fb Mon Sep 17 00:00:00 2001 From: tibbi Date: Mon, 21 Dec 2020 16:17:33 +0100 Subject: [PATCH] create a db table for attachments --- .../smsmessenger/databases/MessagesDatabase.kt | 17 ++++++++++++++++- .../smsmessenger/extensions/Context.kt | 9 ++++++--- .../smsmessenger/interfaces/AttachmentsDao.kt | 11 +++++++++++ .../smsmessenger/models/Attachment.kt | 15 ++++++++++++++- 4 files changed, 47 insertions(+), 5 deletions(-) create mode 100644 app/src/main/kotlin/com/simplemobiletools/smsmessenger/interfaces/AttachmentsDao.kt diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/databases/MessagesDatabase.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/databases/MessagesDatabase.kt index a514dd12..774bc8a4 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/databases/MessagesDatabase.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/databases/MessagesDatabase.kt @@ -4,14 +4,20 @@ import android.content.Context import androidx.room.Database import androidx.room.Room import androidx.room.RoomDatabase +import androidx.room.migration.Migration +import androidx.sqlite.db.SupportSQLiteDatabase +import com.simplemobiletools.smsmessenger.interfaces.AttachmentsDao import com.simplemobiletools.smsmessenger.interfaces.ConversationsDao +import com.simplemobiletools.smsmessenger.models.Attachment import com.simplemobiletools.smsmessenger.models.Conversation -@Database(entities = [(Conversation::class)], version = 1) +@Database(entities = [Conversation::class, Attachment::class], version = 2) abstract class MessagesDatabase : RoomDatabase() { abstract fun ConversationsDao(): ConversationsDao + abstract fun AttachmentsDao(): AttachmentsDao + companion object { private var db: MessagesDatabase? = null @@ -20,11 +26,20 @@ abstract class MessagesDatabase : RoomDatabase() { synchronized(MessagesDatabase::class) { if (db == null) { db = Room.databaseBuilder(context.applicationContext, MessagesDatabase::class.java, "conversations.db") + .fallbackToDestructiveMigration() + .addMigrations(MIGRATION_1_2) .build() } } } return db!! } + + private val MIGRATION_1_2 = object : Migration(1, 2) { + override fun migrate(database: SupportSQLiteDatabase) { + database.execSQL("CREATE TABLE IF NOT EXISTS `attachments` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `message_id` INTEGER NOT NULL, `uri_string` TEXT NOT NULL, `mimetype` TEXT NOT NULL, `width` INTEGER NOT NULL, `height` INTEGER NOT NULL, `filename` TEXT NOT NULL)") + database.execSQL("CREATE UNIQUE INDEX `index_attachments_message_id` ON `attachments` (`message_id`)") + } + } } } diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt index 79673bf6..83b7104b 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt @@ -27,6 +27,7 @@ import com.simplemobiletools.smsmessenger.R import com.simplemobiletools.smsmessenger.activities.ThreadActivity import com.simplemobiletools.smsmessenger.databases.MessagesDatabase import com.simplemobiletools.smsmessenger.helpers.* +import com.simplemobiletools.smsmessenger.interfaces.AttachmentsDao import com.simplemobiletools.smsmessenger.interfaces.ConversationsDao import com.simplemobiletools.smsmessenger.models.* import com.simplemobiletools.smsmessenger.receivers.DirectReplyReceiver @@ -41,6 +42,8 @@ fun Context.getMessagessDB() = MessagesDatabase.getInstance(this) val Context.conversationsDB: ConversationsDao get() = getMessagessDB().ConversationsDao() +val Context.attachmentsDB: AttachmentsDao get() = getMessagessDB().AttachmentsDao() + fun Context.getMessages(threadId: Int): ArrayList { val uri = Sms.CONTENT_URI val projection = arrayOf( @@ -257,15 +260,15 @@ fun Context.getMmsAttachment(id: Long): MessageAttachment { var attachmentName = "" queryCursor(uri, projection, selection, selectionArgs, showErrors = true) { cursor -> - val partId = cursor.getStringValue(Mms._ID) + val partId = cursor.getLongValue(Mms._ID) val mimetype = cursor.getStringValue(Mms.Part.CONTENT_TYPE) if (mimetype == "text/plain") { messageAttachment.text = cursor.getStringValue(Mms.Part.TEXT) ?: "" } else if (mimetype.startsWith("image/") || mimetype.startsWith("video/")) { - val attachment = Attachment(Uri.withAppendedPath(uri, partId).toString(), mimetype, 0, 0, "") + val attachment = Attachment(partId, id, Uri.withAppendedPath(uri, partId.toString()).toString(), mimetype, 0, 0, "") messageAttachment.attachments.add(attachment) } else if (mimetype != "application/smil") { - val attachment = Attachment(Uri.withAppendedPath(uri, partId).toString(), mimetype, 0, 0, attachmentName) + val attachment = Attachment(partId, id, Uri.withAppendedPath(uri, partId.toString()).toString(), mimetype, 0, 0, attachmentName) messageAttachment.attachments.add(attachment) } else { val text = cursor.getStringValue(Mms.Part.TEXT) diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/interfaces/AttachmentsDao.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/interfaces/AttachmentsDao.kt new file mode 100644 index 00000000..240fa747 --- /dev/null +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/interfaces/AttachmentsDao.kt @@ -0,0 +1,11 @@ +package com.simplemobiletools.smsmessenger.interfaces + +import androidx.room.Dao +import androidx.room.Query +import com.simplemobiletools.smsmessenger.models.Attachment + +@Dao +interface AttachmentsDao { + @Query("SELECT * FROM attachments") + fun getAll(): List +} diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/models/Attachment.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/models/Attachment.kt index dec7cd1b..4aabd072 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/models/Attachment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/models/Attachment.kt @@ -1,7 +1,20 @@ package com.simplemobiletools.smsmessenger.models import android.net.Uri +import androidx.room.ColumnInfo +import androidx.room.Entity +import androidx.room.Index +import androidx.room.PrimaryKey + +@Entity(tableName = "attachments", indices = [(Index(value = ["message_id"], unique = true))]) +data class Attachment( + @PrimaryKey(autoGenerate = true) var id: Long?, + @ColumnInfo(name = "message_id") var messageId: Long, + @ColumnInfo(name = "uri_string") var uriString: String, + @ColumnInfo(name = "mimetype") var mimetype: String, + @ColumnInfo(name = "width") var width: Int, + @ColumnInfo(name = "height") var height: Int, + @ColumnInfo(name = "filename") var filename: String) { -data class Attachment(var uriString: String, var mimetype: String, var width: Int, var height: Int, var filename: String) { fun getUri() = Uri.parse(uriString) }