fetch all drafts at once for better performance

This commit is contained in:
tibbi 2021-10-18 19:22:06 +02:00
parent dbab7f20d0
commit 29c0666243
2 changed files with 35 additions and 20 deletions

View File

@ -266,11 +266,8 @@ class ConversationsAdapter(
private fun fetchDrafts(drafts: HashMap<Long, String?>) {
drafts.clear()
conversations.forEach { conversation ->
val draft = activity.getSmsDraft(conversation.threadId)
if (draft != null) {
drafts[conversation.threadId] = draft
}
for ((threadId, draft) in activity.getAllDrafts()) {
drafts[threadId] = draft
}
}

View File

@ -802,6 +802,25 @@ fun Context.getSmsDraft(threadId: Long): String? {
return null
}
fun Context.getAllDrafts(): HashMap<Long, String?> {
val drafts = HashMap<Long, String?>()
val uri = Sms.Draft.CONTENT_URI
val projection = arrayOf(Sms.BODY, Sms.THREAD_ID)
try {
queryCursor(uri, projection) { cursor ->
cursor.use {
val threadId = cursor.getLongValue(Sms.THREAD_ID)
val draft = cursor.getStringValue(Sms.BODY) ?: return@queryCursor
drafts[threadId] = draft
}
}
} catch (e: Exception) {
}
return drafts
}
fun Context.saveSmsDraft(body: String, threadId: Long) {
val uri = Sms.Draft.CONTENT_URI
val contentValues = ContentValues().apply {
@ -874,21 +893,20 @@ fun Context.getFileSizeFromUri(uri: Uri): Long {
// if "content://" uri scheme, try contentResolver table
if (uri.scheme.equals(ContentResolver.SCHEME_CONTENT)) {
return contentResolver.query(uri, arrayOf(OpenableColumns.SIZE), null, null, null)
?.use { cursor ->
// maybe shouldn't trust ContentResolver for size:
// https://stackoverflow.com/questions/48302972/content-resolver-returns-wrong-size
val sizeIndex = cursor.getColumnIndex(OpenableColumns.SIZE)
if (sizeIndex == -1) {
return@use FILE_SIZE_NONE
}
cursor.moveToFirst()
return try {
cursor.getLong(sizeIndex)
} catch (_: Throwable) {
FILE_SIZE_NONE
}
} ?: FILE_SIZE_NONE
return contentResolver.query(uri, arrayOf(OpenableColumns.SIZE), null, null, null)?.use { cursor ->
// maybe shouldn't trust ContentResolver for size:
// https://stackoverflow.com/questions/48302972/content-resolver-returns-wrong-size
val sizeIndex = cursor.getColumnIndex(OpenableColumns.SIZE)
if (sizeIndex == -1) {
return@use FILE_SIZE_NONE
}
cursor.moveToFirst()
return try {
cursor.getLong(sizeIndex)
} catch (_: Throwable) {
FILE_SIZE_NONE
}
} ?: FILE_SIZE_NONE
} else {
return FILE_SIZE_NONE
}