diff --git a/data/src/main/java/com/moez/QKSMS/repository/MessageRepositoryImpl.kt b/data/src/main/java/com/moez/QKSMS/repository/MessageRepositoryImpl.kt index 1eb62d23..b91846ce 100644 --- a/data/src/main/java/com/moez/QKSMS/repository/MessageRepositoryImpl.kt +++ b/data/src/main/java/com/moez/QKSMS/repository/MessageRepositoryImpl.kt @@ -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 @@ -724,4 +727,14 @@ class MessageRepositoryImpl @Inject constructor( } } -} \ No newline at end of file + override fun getOldMessageCounts(maxAgeDays: Int): Map { + return Realm.getDefaultInstance().use { realm -> + realm.where(Message::class.java) + .lessThan("date", now() - TimeUnit.DAYS.toMillis(maxAgeDays.toLong())) + .findAll() + .groupingBy { message -> message.threadId } + .eachCount() + } + } + +} diff --git a/domain/src/main/java/com/moez/QKSMS/repository/ConversationRepository.kt b/domain/src/main/java/com/moez/QKSMS/repository/ConversationRepository.kt index 7ccf33ff..e94d1c9f 100644 --- a/domain/src/main/java/com/moez/QKSMS/repository/ConversationRepository.kt +++ b/domain/src/main/java/com/moez/QKSMS/repository/ConversationRepository.kt @@ -91,4 +91,4 @@ interface ConversationRepository { fun deleteConversations(vararg threadIds: Long) -} \ No newline at end of file +} diff --git a/domain/src/main/java/com/moez/QKSMS/repository/MessageRepository.kt b/domain/src/main/java/com/moez/QKSMS/repository/MessageRepository.kt index 217e312a..ce09b206 100644 --- a/domain/src/main/java/com/moez/QKSMS/repository/MessageRepository.kt +++ b/domain/src/main/java/com/moez/QKSMS/repository/MessageRepository.kt @@ -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 + } 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 eace81b3..104a305b 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 @@ -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 @@ -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 @@ -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( SettingsControllerBinding::inflate @@ -192,7 +197,8 @@ class SettingsController : QkController { 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 } } @@ -231,6 +237,17 @@ class SettingsController : QkController { 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() { diff --git a/presentation/src/main/java/com/moez/QKSMS/feature/settings/SettingsPresenter.kt b/presentation/src/main/java/com/moez/QKSMS/feature/settings/SettingsPresenter.kt index 17923df9..708d0671 100644 --- a/presentation/src/main/java/com/moez/QKSMS/feature/settings/SettingsPresenter.kt +++ b/presentation/src/main/java/com/moez/QKSMS/feature/settings/SettingsPresenter.kt @@ -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 @@ -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 @@ -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, @@ -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() diff --git a/presentation/src/main/java/com/moez/QKSMS/feature/settings/SettingsView.kt b/presentation/src/main/java/com/moez/QKSMS/feature/settings/SettingsView.kt index f0350609..853b23d6 100644 --- a/presentation/src/main/java/com/moez/QKSMS/feature/settings/SettingsView.kt +++ b/presentation/src/main/java/com/moez/QKSMS/feature/settings/SettingsView.kt @@ -43,6 +43,7 @@ interface SettingsView : QkViewContract { fun showDelayDurationDialog() fun showSignatureDialog(signature: String) fun showAutoDeleteDialog(days: Int) + suspend fun showAutoDeleteWarningDialog(messages: Int): Boolean fun showMmsSizePicker() fun showSwipeActions() fun showThemePicker() diff --git a/presentation/src/main/res/values/strings.xml b/presentation/src/main/res/values/strings.xml index 09dc8371..50f4752a 100644 --- a/presentation/src/main/res/values/strings.xml +++ b/presentation/src/main/res/values/strings.xml @@ -262,6 +262,7 @@ Messages will be deleted after the specified number of days Number of days Never + Are you sure you would like to enable this setting? %1$d messages will be deleted Never After 1 day