Loading data/src/main/java/com/moez/QKSMS/repository/MessageRepositoryImpl.kt +14 −1 Original line number Diff line number Diff line Loading @@ -66,8 +66,11 @@ import java.io.File import java.io.FileNotFoundException import java.io.FileOutputStream import java.io.IOException import java.util.* import java.util.concurrent.TimeUnit import javax.inject.Inject import javax.inject.Singleton import kotlin.collections.ArrayList import kotlin.math.sqrt @Singleton Loading Loading @@ -724,4 +727,14 @@ class MessageRepositoryImpl @Inject constructor( } } override fun getOldMessageCounts(maxAgeDays: Int): Map<Long, Int> { return Realm.getDefaultInstance().use { realm -> realm.where(Message::class.java) .lessThan("date", now() - TimeUnit.DAYS.toMillis(maxAgeDays.toLong())) .findAll() .groupingBy { message -> message.threadId } .eachCount() } } } domain/src/main/java/com/moez/QKSMS/repository/MessageRepository.kt +5 −0 Original line number Diff line number Diff line Loading @@ -102,4 +102,9 @@ interface MessageRepository { fun deleteMessages(vararg messageIds: Long) /** * Returns the number of messages older than [maxAgeDays] per conversation */ fun getOldMessageCounts(maxAgeDays: Int): Map<Long, Int> } presentation/src/main/java/com/moez/QKSMS/feature/settings/SettingsController.kt +19 −2 Original line number Diff line number Diff line Loading @@ -24,6 +24,7 @@ import android.content.Context import android.os.Build import android.text.format.DateFormat import android.view.View import androidx.appcompat.app.AlertDialog import androidx.core.view.isVisible import com.bluelinelabs.conductor.RouterTransaction import com.google.android.material.snackbar.Snackbar Loading @@ -39,9 +40,9 @@ import com.moez.QKSMS.common.util.Colors import com.moez.QKSMS.common.util.extensions.animateLayoutChanges import com.moez.QKSMS.common.util.extensions.setBackgroundTint import com.moez.QKSMS.common.util.extensions.setVisible import com.moez.QKSMS.common.widget.TextInputDialog import com.moez.QKSMS.common.widget.PreferenceView import com.moez.QKSMS.common.widget.QkSwitch import com.moez.QKSMS.common.widget.TextInputDialog import com.moez.QKSMS.databinding.SettingsControllerBinding import com.moez.QKSMS.feature.settings.about.AboutController import com.moez.QKSMS.feature.settings.autodelete.AutoDeleteDialog Loading @@ -55,7 +56,11 @@ import com.uber.autodispose.autoDisposable import io.reactivex.Observable import io.reactivex.subjects.PublishSubject import io.reactivex.subjects.Subject import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.suspendCancellableCoroutine import kotlinx.coroutines.withContext import javax.inject.Inject import kotlin.coroutines.resume class SettingsController : QkController<SettingsView, SettingsState, SettingsPresenter, SettingsControllerBinding>( SettingsControllerBinding::inflate Loading Loading @@ -192,7 +197,8 @@ class SettingsController : QkController<SettingsView, SettingsState, SettingsPre is SyncRepository.SyncProgress.Running -> { binding.syncingProgress.isVisible = true binding.syncingProgress.max = state.syncProgress.max progressAnimator.apply { setIntValues(binding.syncingProgress.progress, state.syncProgress.progress) }.start() progressAnimator.apply { setIntValues(binding.syncingProgress.progress, state.syncProgress.progress) } .start() binding.syncingProgress.isIndeterminate = state.syncProgress.indeterminate } } Loading Loading @@ -231,6 +237,17 @@ class SettingsController : QkController<SettingsView, SettingsState, SettingsPre override fun showAutoDeleteDialog(days: Int) = autoDeleteDialog.setExpiry(days).show() override suspend fun showAutoDeleteWarningDialog(messages: Int): Boolean = withContext(Dispatchers.Main) { suspendCancellableCoroutine<Boolean> { cont -> AlertDialog.Builder(activity!!) .setMessage(context.resources.getString(R.string.settings_auto_delete_warning, messages)) .setOnCancelListener { cont.resume(false) } .setNegativeButton(R.string.button_cancel) { _, _ -> cont.resume(false) } .setPositiveButton(R.string.button_yes) { _, _ -> cont.resume(true) } .show() } } override fun showMmsSizePicker() = mmsSizeDialog.show(activity!!) override fun showSwipeActions() { Loading presentation/src/main/java/com/moez/QKSMS/feature/settings/SettingsPresenter.kt +13 −0 Original line number Diff line number Diff line Loading @@ -28,6 +28,7 @@ import com.moez.QKSMS.common.util.DateFormatter import com.moez.QKSMS.common.util.extensions.makeToast import com.moez.QKSMS.interactor.SyncMessages import com.moez.QKSMS.manager.AnalyticsManager import com.moez.QKSMS.repository.MessageRepository import com.moez.QKSMS.repository.SyncRepository import com.moez.QKSMS.util.NightModeManager import com.moez.QKSMS.util.Preferences Loading @@ -35,6 +36,8 @@ import com.uber.autodispose.android.lifecycle.scope import com.uber.autodispose.autoDisposable import io.reactivex.rxkotlin.plusAssign import io.reactivex.rxkotlin.withLatestFrom import io.reactivex.schedulers.Schedulers import kotlinx.coroutines.runBlocking import timber.log.Timber import java.util.* import java.util.concurrent.TimeUnit Loading @@ -47,6 +50,7 @@ class SettingsPresenter @Inject constructor( private val context: Context, private val billingManager: BillingManager, private val dateFormatter: DateFormatter, private val messageRepo: MessageRepository, private val navigator: Navigator, private val nightModeManager: NightModeManager, private val prefs: Preferences, Loading Loading @@ -253,6 +257,15 @@ class SettingsPresenter @Inject constructor( .subscribe() view.autoDeleteChanged() .observeOn(Schedulers.io()) .filter { maxAge -> if (maxAge == 0) { return@filter true } val counts = messageRepo.getOldMessageCounts(maxAge) runBlocking { view.showAutoDeleteWarningDialog(counts.values.sum()) } } .doOnNext(prefs.autoDelete::set) .autoDisposable(view.scope()) .subscribe() Loading presentation/src/main/java/com/moez/QKSMS/feature/settings/SettingsView.kt +1 −0 Original line number Diff line number Diff line Loading @@ -43,6 +43,7 @@ interface SettingsView : QkViewContract<SettingsState> { fun showDelayDurationDialog() fun showSignatureDialog(signature: String) fun showAutoDeleteDialog(days: Int) suspend fun showAutoDeleteWarningDialog(messages: Int): Boolean fun showMmsSizePicker() fun showSwipeActions() fun showThemePicker() Loading Loading
data/src/main/java/com/moez/QKSMS/repository/MessageRepositoryImpl.kt +14 −1 Original line number Diff line number Diff line Loading @@ -66,8 +66,11 @@ import java.io.File import java.io.FileNotFoundException import java.io.FileOutputStream import java.io.IOException import java.util.* import java.util.concurrent.TimeUnit import javax.inject.Inject import javax.inject.Singleton import kotlin.collections.ArrayList import kotlin.math.sqrt @Singleton Loading Loading @@ -724,4 +727,14 @@ class MessageRepositoryImpl @Inject constructor( } } override fun getOldMessageCounts(maxAgeDays: Int): Map<Long, Int> { return Realm.getDefaultInstance().use { realm -> realm.where(Message::class.java) .lessThan("date", now() - TimeUnit.DAYS.toMillis(maxAgeDays.toLong())) .findAll() .groupingBy { message -> message.threadId } .eachCount() } } }
domain/src/main/java/com/moez/QKSMS/repository/MessageRepository.kt +5 −0 Original line number Diff line number Diff line Loading @@ -102,4 +102,9 @@ interface MessageRepository { fun deleteMessages(vararg messageIds: Long) /** * Returns the number of messages older than [maxAgeDays] per conversation */ fun getOldMessageCounts(maxAgeDays: Int): Map<Long, Int> }
presentation/src/main/java/com/moez/QKSMS/feature/settings/SettingsController.kt +19 −2 Original line number Diff line number Diff line Loading @@ -24,6 +24,7 @@ import android.content.Context import android.os.Build import android.text.format.DateFormat import android.view.View import androidx.appcompat.app.AlertDialog import androidx.core.view.isVisible import com.bluelinelabs.conductor.RouterTransaction import com.google.android.material.snackbar.Snackbar Loading @@ -39,9 +40,9 @@ import com.moez.QKSMS.common.util.Colors import com.moez.QKSMS.common.util.extensions.animateLayoutChanges import com.moez.QKSMS.common.util.extensions.setBackgroundTint import com.moez.QKSMS.common.util.extensions.setVisible import com.moez.QKSMS.common.widget.TextInputDialog import com.moez.QKSMS.common.widget.PreferenceView import com.moez.QKSMS.common.widget.QkSwitch import com.moez.QKSMS.common.widget.TextInputDialog import com.moez.QKSMS.databinding.SettingsControllerBinding import com.moez.QKSMS.feature.settings.about.AboutController import com.moez.QKSMS.feature.settings.autodelete.AutoDeleteDialog Loading @@ -55,7 +56,11 @@ import com.uber.autodispose.autoDisposable import io.reactivex.Observable import io.reactivex.subjects.PublishSubject import io.reactivex.subjects.Subject import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.suspendCancellableCoroutine import kotlinx.coroutines.withContext import javax.inject.Inject import kotlin.coroutines.resume class SettingsController : QkController<SettingsView, SettingsState, SettingsPresenter, SettingsControllerBinding>( SettingsControllerBinding::inflate Loading Loading @@ -192,7 +197,8 @@ class SettingsController : QkController<SettingsView, SettingsState, SettingsPre is SyncRepository.SyncProgress.Running -> { binding.syncingProgress.isVisible = true binding.syncingProgress.max = state.syncProgress.max progressAnimator.apply { setIntValues(binding.syncingProgress.progress, state.syncProgress.progress) }.start() progressAnimator.apply { setIntValues(binding.syncingProgress.progress, state.syncProgress.progress) } .start() binding.syncingProgress.isIndeterminate = state.syncProgress.indeterminate } } Loading Loading @@ -231,6 +237,17 @@ class SettingsController : QkController<SettingsView, SettingsState, SettingsPre override fun showAutoDeleteDialog(days: Int) = autoDeleteDialog.setExpiry(days).show() override suspend fun showAutoDeleteWarningDialog(messages: Int): Boolean = withContext(Dispatchers.Main) { suspendCancellableCoroutine<Boolean> { cont -> AlertDialog.Builder(activity!!) .setMessage(context.resources.getString(R.string.settings_auto_delete_warning, messages)) .setOnCancelListener { cont.resume(false) } .setNegativeButton(R.string.button_cancel) { _, _ -> cont.resume(false) } .setPositiveButton(R.string.button_yes) { _, _ -> cont.resume(true) } .show() } } override fun showMmsSizePicker() = mmsSizeDialog.show(activity!!) override fun showSwipeActions() { Loading
presentation/src/main/java/com/moez/QKSMS/feature/settings/SettingsPresenter.kt +13 −0 Original line number Diff line number Diff line Loading @@ -28,6 +28,7 @@ import com.moez.QKSMS.common.util.DateFormatter import com.moez.QKSMS.common.util.extensions.makeToast import com.moez.QKSMS.interactor.SyncMessages import com.moez.QKSMS.manager.AnalyticsManager import com.moez.QKSMS.repository.MessageRepository import com.moez.QKSMS.repository.SyncRepository import com.moez.QKSMS.util.NightModeManager import com.moez.QKSMS.util.Preferences Loading @@ -35,6 +36,8 @@ import com.uber.autodispose.android.lifecycle.scope import com.uber.autodispose.autoDisposable import io.reactivex.rxkotlin.plusAssign import io.reactivex.rxkotlin.withLatestFrom import io.reactivex.schedulers.Schedulers import kotlinx.coroutines.runBlocking import timber.log.Timber import java.util.* import java.util.concurrent.TimeUnit Loading @@ -47,6 +50,7 @@ class SettingsPresenter @Inject constructor( private val context: Context, private val billingManager: BillingManager, private val dateFormatter: DateFormatter, private val messageRepo: MessageRepository, private val navigator: Navigator, private val nightModeManager: NightModeManager, private val prefs: Preferences, Loading Loading @@ -253,6 +257,15 @@ class SettingsPresenter @Inject constructor( .subscribe() view.autoDeleteChanged() .observeOn(Schedulers.io()) .filter { maxAge -> if (maxAge == 0) { return@filter true } val counts = messageRepo.getOldMessageCounts(maxAge) runBlocking { view.showAutoDeleteWarningDialog(counts.values.sum()) } } .doOnNext(prefs.autoDelete::set) .autoDisposable(view.scope()) .subscribe() Loading
presentation/src/main/java/com/moez/QKSMS/feature/settings/SettingsView.kt +1 −0 Original line number Diff line number Diff line Loading @@ -43,6 +43,7 @@ interface SettingsView : QkViewContract<SettingsState> { fun showDelayDurationDialog() fun showSignatureDialog(signature: String) fun showAutoDeleteDialog(days: Int) suspend fun showAutoDeleteWarningDialog(messages: Int): Boolean fun showMmsSizePicker() fun showSwipeActions() fun showThemePicker() Loading