From 73be4168078678233d71619d8905bc9ddfe22c29 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Sat, 19 Sep 2020 00:57:55 +0200 Subject: [PATCH] Fix crash in flowWithResourceIn() (#967) --- app/build.gradle | 2 +- .../github/wulkanowy/data/db/dao/MessagesDao.kt | 2 +- .../github/wulkanowy/data/db/entities/Message.kt | 12 ++++++------ .../data/repositories/message/MessageLocal.kt | 3 +-- .../data/repositories/message/MessageRemote.kt | 4 ++-- .../repositories/message/MessageRepository.kt | 4 +++- .../message/preview/MessagePreviewPresenter.kt | 4 +++- .../java/io/github/wulkanowy/utils/FlowUtils.kt | 16 ++++++---------- .../java/io/github/wulkanowy/TestEnityCreator.kt | 4 ++-- 9 files changed, 25 insertions(+), 26 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index d9936480..9107f810 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -126,7 +126,7 @@ configurations.all { } dependencies { - implementation "io.github.wulkanowy:sdk:0.20.4" + implementation "io.github.wulkanowy:sdk:b652036" coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.0.10' diff --git a/app/src/main/java/io/github/wulkanowy/data/db/dao/MessagesDao.kt b/app/src/main/java/io/github/wulkanowy/data/db/dao/MessagesDao.kt index 79050de0..729ba6a6 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/dao/MessagesDao.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/dao/MessagesDao.kt @@ -12,7 +12,7 @@ interface MessagesDao : BaseDao { @Transaction @Query("SELECT * FROM Messages WHERE student_id = :studentId AND message_id = :messageId") - fun loadMessageWithAttachment(studentId: Int, messageId: Int): Flow + fun loadMessageWithAttachment(studentId: Int, messageId: Int): Flow @Query("SELECT * FROM Messages WHERE student_id = :studentId AND folder_id = :folder ORDER BY date DESC") fun loadAll(studentId: Int, folder: Int): Flow> diff --git a/app/src/main/java/io/github/wulkanowy/data/db/entities/Message.kt b/app/src/main/java/io/github/wulkanowy/data/db/entities/Message.kt index 914dc381..1f10a164 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/entities/Message.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/entities/Message.kt @@ -36,12 +36,6 @@ data class Message( var unread: Boolean, - @ColumnInfo(name = "unread_by") - val unreadBy: Int, - - @ColumnInfo(name = "read_by") - val readBy: Int, - val removed: Boolean, @ColumnInfo(name = "has_attachments") @@ -54,5 +48,11 @@ data class Message( @ColumnInfo(name = "is_notified") var isNotified: Boolean = true + @ColumnInfo(name = "unread_by") + var unreadBy: Int = 0 + + @ColumnInfo(name = "read_by") + var readBy: Int = 0 + var content: String = "" } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/message/MessageLocal.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/message/MessageLocal.kt index 730bd005..f1c8eaf0 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/message/MessageLocal.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/message/MessageLocal.kt @@ -6,7 +6,6 @@ import io.github.wulkanowy.data.db.entities.Message import io.github.wulkanowy.data.db.entities.MessageAttachment import io.github.wulkanowy.data.db.entities.MessageWithAttachment import io.github.wulkanowy.data.db.entities.Student -import io.github.wulkanowy.data.repositories.message.MessageFolder.TRASHED import kotlinx.coroutines.flow.Flow import javax.inject.Inject import javax.inject.Singleton @@ -29,7 +28,7 @@ class MessageLocal @Inject constructor( messagesDb.deleteAll(messages) } - fun getMessageWithAttachment(student: Student, message: Message): Flow { + fun getMessageWithAttachment(student: Student, message: Message): Flow { return messagesDb.loadMessageWithAttachment(student.id.toInt(), message.messageId) } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/message/MessageRemote.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/message/MessageRemote.kt index fdf0c675..044a13a2 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/message/MessageRemote.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/message/MessageRemote.kt @@ -30,12 +30,12 @@ class MessageRemote @Inject constructor(private val sdk: Sdk) { date = it.date ?: now(), folderId = it.folderId, unread = it.unread ?: false, - unreadBy = it.unreadBy ?: 0, - readBy = it.readBy ?: 0, removed = it.removed, hasAttachments = it.hasAttachments ).apply { content = it.content.orEmpty() + unreadBy = it.unreadBy ?: 0 + readBy = it.readBy ?: 0 } } } diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/message/MessageRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/message/MessageRepository.kt index f653f268..bb932699 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/message/MessageRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/message/MessageRepository.kt @@ -34,12 +34,14 @@ class MessageRepository @Inject constructor( fun getMessage(student: Student, message: Message, markAsRead: Boolean = false) = networkBoundResource( shouldFetch = { + checkNotNull(it, { "This message no longer exist!" }) Timber.d("Message content in db empty: ${it.message.content.isEmpty()}") it.message.unread || it.message.content.isEmpty() }, query = { local.getMessageWithAttachment(student, message) }, - fetch = { remote.getMessagesContentDetails(student, it.message, markAsRead) }, + fetch = { remote.getMessagesContentDetails(student, it!!.message, markAsRead) }, saveFetchResult = { old, (downloadedMessage, attachments) -> + checkNotNull(old, { "Fetched message no longer exist!" }) local.updateMessages(listOf(old.message.copy(unread = !markAsRead).apply { id = old.message.id content = content.ifBlank { downloadedMessage } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewPresenter.kt index d261d1ee..7a633a2d 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewPresenter.kt @@ -64,7 +64,8 @@ class MessagePreviewPresenter @Inject constructor( when (it.status) { Status.LOADING -> Timber.i("Loading message ${message.messageId} preview started") Status.SUCCESS -> { - Timber.i("Loading message ${it.data!!.message.messageId} preview result: Success ") + Timber.i("Loading message ${message.messageId} preview result: Success ") + checkNotNull(it.data, { "Can't find message in local db! Probably no longer exist in this folder" }) this@MessagePreviewPresenter.message = it.data.message this@MessagePreviewPresenter.attachments = it.data.attachments view?.apply { @@ -194,6 +195,7 @@ class MessagePreviewPresenter @Inject constructor( view?.run { lastError = error setErrorDetails(message) + showContent(false) showErrorView(true) setErrorRetryCallback { retryCallback() } } diff --git a/app/src/main/java/io/github/wulkanowy/utils/FlowUtils.kt b/app/src/main/java/io/github/wulkanowy/utils/FlowUtils.kt index 23b86dd3..724458c0 100644 --- a/app/src/main/java/io/github/wulkanowy/utils/FlowUtils.kt +++ b/app/src/main/java/io/github/wulkanowy/utils/FlowUtils.kt @@ -80,17 +80,13 @@ fun flowWithResource(block: suspend () -> T) = flow { fun flowWithResourceIn(block: suspend () -> Flow>) = flow { emit(Resource.loading()) - try { - block() - .catch { emit(Resource.error(it)) } - .collect { - if (it.status != Status.LOADING) { // LOADING is already emitted - emit(it) - } + block() + .catch { emit(Resource.error(it)) } + .collect { + if (it.status != Status.LOADING) { // LOADING is already emitted + emit(it) } - } catch (e: Throwable) { - emit(Resource.error(e)) - } + } } fun Flow>.afterLoading(callback: () -> Unit) = onEach { diff --git a/app/src/test/java/io/github/wulkanowy/TestEnityCreator.kt b/app/src/test/java/io/github/wulkanowy/TestEnityCreator.kt index 35a20030..d15dc953 100644 --- a/app/src/test/java/io/github/wulkanowy/TestEnityCreator.kt +++ b/app/src/test/java/io/github/wulkanowy/TestEnityCreator.kt @@ -90,10 +90,10 @@ fun getMessageEntity( date = now(), folderId = 1, unread = unread, - unreadBy = 1, - readBy = 1, removed = false, hasAttachments = false ).apply { this.content = content + unreadBy = 1 + readBy = 1 }