diff --git a/data/src/main/java/com/moez/QKSMS/repository/EmojiReactionRepositoryImpl.kt b/data/src/main/java/com/moez/QKSMS/repository/EmojiReactionRepositoryImpl.kt index 81aba099..3371b5c1 100644 --- a/data/src/main/java/com/moez/QKSMS/repository/EmojiReactionRepositoryImpl.kt +++ b/data/src/main/java/com/moez/QKSMS/repository/EmojiReactionRepositoryImpl.kt @@ -247,7 +247,7 @@ class EmojiReactionRepositoryImpl @Inject constructor( } } - override fun deleteAndReparseAllEmojiReactions(realm: Realm) { + override fun deleteAndReparseAllEmojiReactions(realm: Realm, onProgress: (SyncRepository.SyncProgress) -> Unit) { val startTime = System.currentTimeMillis() realm.delete(EmojiReaction::class.java) @@ -271,6 +271,9 @@ class EmojiReactionRepositoryImpl @Inject constructor( .sort("date", Sort.ASCENDING) // parse oldest to newest to handle reactions & removals properly .findAll() + val max = allMessages?.count() ?: 0 + var progress = 0 + allMessages.forEach { message -> val text = message.getText(false) val parsedReaction = parseEmojiReaction(text) @@ -286,6 +289,18 @@ class EmojiReactionRepositoryImpl @Inject constructor( targetMessage, realm, ) + progress++ + // Update the progress every 25 messages, and then at completion + // that way we don't spam the UI + if (progress % 25 == 0 || progress == max) { + onProgress( + SyncRepository.SyncProgress.ParsingEmojis( + max = max, + progress = progress, + indeterminate = false + ) + ) + } } } diff --git a/data/src/main/java/com/moez/QKSMS/repository/SyncRepositoryImpl.kt b/data/src/main/java/com/moez/QKSMS/repository/SyncRepositoryImpl.kt index b6298564..a29374b1 100644 --- a/data/src/main/java/com/moez/QKSMS/repository/SyncRepositoryImpl.kt +++ b/data/src/main/java/com/moez/QKSMS/repository/SyncRepositoryImpl.kt @@ -229,10 +229,14 @@ class SyncRepositoryImpl @Inject constructor( } } - syncProgress.onNext(SyncRepository.SyncProgress.Running(0, 0, true)) + syncProgress.onNext(SyncRepository.SyncProgress.ParsingEmojis(0, 0, true)) // Now that we have all the messages, we can scan for emoji reactions - reactions.deleteAndReparseAllEmojiReactions(realm) + reactions.deleteAndReparseAllEmojiReactions( + realm, + onProgress = { progress -> + syncProgress.onNext(progress) + }) realm.insert(SyncLog()) }, { diff --git a/domain/src/main/java/com/moez/QKSMS/repository/EmojiReactionRepository.kt b/domain/src/main/java/com/moez/QKSMS/repository/EmojiReactionRepository.kt index 8c648249..fdf4e6b4 100644 --- a/domain/src/main/java/com/moez/QKSMS/repository/EmojiReactionRepository.kt +++ b/domain/src/main/java/com/moez/QKSMS/repository/EmojiReactionRepository.kt @@ -35,5 +35,8 @@ interface EmojiReactionRepository { realm: Realm, ) - fun deleteAndReparseAllEmojiReactions(realm: Realm) + fun deleteAndReparseAllEmojiReactions( + realm: Realm, + onProgress: (SyncRepository.SyncProgress) -> Unit + ) } diff --git a/domain/src/main/java/com/moez/QKSMS/repository/SyncRepository.kt b/domain/src/main/java/com/moez/QKSMS/repository/SyncRepository.kt index f1c73d2b..de36ed4c 100644 --- a/domain/src/main/java/com/moez/QKSMS/repository/SyncRepository.kt +++ b/domain/src/main/java/com/moez/QKSMS/repository/SyncRepository.kt @@ -27,6 +27,7 @@ interface SyncRepository { sealed class SyncProgress { object Idle : SyncProgress() data class Running(val max: Int, val progress: Int, val indeterminate: Boolean) : SyncProgress() + data class ParsingEmojis(val max: Int, val progress: Int, val indeterminate: Boolean) : SyncProgress() } val syncProgress: Observable diff --git a/presentation/src/main/java/com/moez/QKSMS/feature/main/MainActivity.kt b/presentation/src/main/java/com/moez/QKSMS/feature/main/MainActivity.kt index d2244b48..dfdc6a15 100644 --- a/presentation/src/main/java/com/moez/QKSMS/feature/main/MainActivity.kt +++ b/presentation/src/main/java/com/moez/QKSMS/feature/main/MainActivity.kt @@ -337,6 +337,17 @@ class MainActivity : QkThemedActivity(), MainView { syncingProgress.isIndeterminate = state.syncing.indeterminate snackbar.isVisible = false } + + is SyncRepository.SyncProgress.ParsingEmojis -> { + syncing.isVisible = true + syncingLabel.setText(getString(R.string.main_sync_emojis)) + syncingProgress.max = state.syncing.max + progressAnimator.apply { + setIntValues(syncingProgress.progress, state.syncing.progress) + }.start() + syncingProgress.isIndeterminate = state.syncing.indeterminate + snackbar.isVisible = false + } } when { diff --git a/presentation/src/main/java/com/moez/QKSMS/feature/main/MainViewModel.kt b/presentation/src/main/java/com/moez/QKSMS/feature/main/MainViewModel.kt index cdfe7194..74ed84b6 100644 --- a/presentation/src/main/java/com/moez/QKSMS/feature/main/MainViewModel.kt +++ b/presentation/src/main/java/com/moez/QKSMS/feature/main/MainViewModel.kt @@ -128,7 +128,7 @@ class MainViewModel @Inject constructor( Realm.getDefaultInstance().executeTransactionAsync { realm -> val emojiSyncNeeded = realm.where(EmojiSyncNeeded::class.java).findFirst() if (emojiSyncNeeded != null) { - reactions.deleteAndReparseAllEmojiReactions(realm) + reactions.deleteAndReparseAllEmojiReactions(realm) { /* No progress ui needed here */ } emojiSyncNeeded.deleteFromRealm() } } diff --git a/presentation/src/main/java/com/moez/QKSMS/feature/settings/SettingsController.kt b/presentation/src/main/java/com/moez/QKSMS/feature/settings/SettingsController.kt index 579e1d57..d2b5bf9d 100644 --- a/presentation/src/main/java/com/moez/QKSMS/feature/settings/SettingsController.kt +++ b/presentation/src/main/java/com/moez/QKSMS/feature/settings/SettingsController.kt @@ -214,6 +214,13 @@ class SettingsController : QkController { + syncingProgress.isVisible = true + syncingProgress.max = state.syncProgress.max + progressAnimator.apply { setIntValues(syncingProgress.progress, state.syncProgress.progress) }.start() + syncingProgress.isIndeterminate = state.syncProgress.indeterminate + } } } diff --git a/presentation/src/main/res/values/strings.xml b/presentation/src/main/res/values/strings.xml index e765b0f4..0e2aa441 100644 --- a/presentation/src/main/res/values/strings.xml +++ b/presentation/src/main/res/values/strings.xml @@ -61,6 +61,7 @@ Edit message Rename conversation Syncing messages… + Parsing emoji reactions… You: %s Draft: %s Results in messages