Implemented a way of clearing conversations from db
This commit is contained in:
parent
6c97505ecb
commit
4da028bdf2
|
@ -70,6 +70,7 @@ import ch.protonmail.android.domain.entity.user.Address
|
|||
import ch.protonmail.android.domain.entity.user.User
|
||||
import ch.protonmail.android.events.FetchLabelsEvent
|
||||
import ch.protonmail.android.jobs.FetchByLocationJob
|
||||
import ch.protonmail.android.mailbox.data.local.ConversationDao
|
||||
import ch.protonmail.android.servers.notification.CHANNEL_ID_EMAIL
|
||||
import ch.protonmail.android.settings.pin.PinSettingsActivity
|
||||
import ch.protonmail.android.uiModel.SettingsItemUiModel
|
||||
|
@ -117,6 +118,7 @@ abstract class BaseSettingsActivity : BaseConnectivityActivity() {
|
|||
|
||||
var contactDao: ContactDao? = null
|
||||
var messageDao: MessageDao? = null
|
||||
var conversationDao: ConversationDao? = null
|
||||
private var searchDatabase: MessageDao? = null
|
||||
private var notificationDao: NotificationDao? = null
|
||||
var counterDao: CounterDao? = null
|
||||
|
@ -159,6 +161,7 @@ abstract class BaseSettingsActivity : BaseConnectivityActivity() {
|
|||
|
||||
contactDao = ContactDatabase.getInstance(applicationContext, userId).getDao()
|
||||
messageDao = MessageDatabase.getInstance(applicationContext, userId).getDao()
|
||||
conversationDao = MessageDatabase.getInstance(applicationContext, userId).getConversationDao()
|
||||
searchDatabase = MessageDatabase.getSearchDatabase(applicationContext, userId).getDao()
|
||||
notificationDao = NotificationDatabase.getInstance(applicationContext, userId).getDao()
|
||||
counterDao = CounterDatabase.getInstance(applicationContext, userId).getDao()
|
||||
|
@ -410,6 +413,7 @@ abstract class BaseSettingsActivity : BaseConnectivityActivity() {
|
|||
contactDao,
|
||||
messageDao,
|
||||
searchDatabase,
|
||||
conversationDao,
|
||||
notificationDao,
|
||||
counterDao,
|
||||
attachmentMetadataDao,
|
||||
|
|
|
@ -32,6 +32,7 @@ import ch.protonmail.android.data.local.NotificationDatabase
|
|||
import ch.protonmail.android.data.local.PendingActionDao
|
||||
import ch.protonmail.android.data.local.PendingActionDatabase
|
||||
import ch.protonmail.android.domain.entity.Id
|
||||
import ch.protonmail.android.mailbox.data.local.ConversationDao
|
||||
import javax.inject.Inject
|
||||
import javax.inject.Singleton
|
||||
|
||||
|
@ -62,6 +63,11 @@ class DatabaseProvider @Inject constructor(
|
|||
fun provideMessageSearchDao(userId: Id): MessageDao =
|
||||
MessageDatabase.getSearchDatabase(context, userId).getDao()
|
||||
|
||||
// TODO remove once the usage in ClearUserData use-case is removed
|
||||
//Conversation
|
||||
fun provideConversationDao(userId: Id): ConversationDao =
|
||||
MessageDatabase.getInstance(context, userId).getConversationDao()
|
||||
|
||||
// Notification
|
||||
fun provideNotificationDao(userId: Id): NotificationDao =
|
||||
NotificationDatabase.getInstance(context, userId).getDao()
|
||||
|
|
|
@ -19,23 +19,25 @@
|
|||
package ch.protonmail.android.mailbox.data
|
||||
|
||||
import ch.protonmail.android.api.ProtonMailApiManager
|
||||
import ch.protonmail.android.di.CurrentUserId
|
||||
import ch.protonmail.android.domain.entity.Id
|
||||
import ch.protonmail.android.mailbox.data.local.ConversationDao
|
||||
import ch.protonmail.android.mailbox.data.remote.model.ConversationsResponse
|
||||
import ch.protonmail.android.mailbox.domain.Conversation
|
||||
import ch.protonmail.android.mailbox.domain.ConversationsRepository
|
||||
import ch.protonmail.android.mailbox.domain.model.GetConversationsParameters
|
||||
import com.dropbox.android.external.store4.ExperimentalStoreApi
|
||||
import com.dropbox.android.external.store4.Fetcher
|
||||
import com.dropbox.android.external.store4.SourceOfTruth
|
||||
import com.dropbox.android.external.store4.StoreBuilder
|
||||
import com.dropbox.android.external.store4.StoreRequest
|
||||
import kotlinx.coroutines.FlowPreview
|
||||
import kotlinx.coroutines.flow.Flow
|
||||
import kotlinx.coroutines.flow.map
|
||||
import me.proton.core.data.arch.toDataResult
|
||||
import me.proton.core.domain.arch.DataResult
|
||||
import javax.inject.Inject
|
||||
|
||||
@FlowPreview
|
||||
class ConversationsRepositoryImpl @Inject constructor(
|
||||
private val conversationDao: ConversationDao,
|
||||
private val api: ProtonMailApiManager
|
||||
|
@ -52,7 +54,8 @@ class ConversationsRepositoryImpl @Inject constructor(
|
|||
writer = { key: StoreKey, output: ConversationsResponse ->
|
||||
val conversations = output.conversationResponse.toListLocal(key.userId.s)
|
||||
conversationDao.insertOrUpdate(*conversations.toTypedArray())
|
||||
}
|
||||
},
|
||||
deleteAll = { conversationDao.clear() }
|
||||
)
|
||||
).build()
|
||||
|
||||
|
@ -62,4 +65,7 @@ class ConversationsRepositoryImpl @Inject constructor(
|
|||
override fun getConversations(params: GetConversationsParameters, userId: Id):
|
||||
Flow<DataResult<List<Conversation>>> =
|
||||
store.stream(StoreRequest.cached(StoreKey(params, userId), true)).map { it.toDataResult() }
|
||||
|
||||
@ExperimentalStoreApi
|
||||
override suspend fun clearConversations() = store.clearAll()
|
||||
}
|
||||
|
|
|
@ -44,4 +44,9 @@ interface ConversationsRepository {
|
|||
* @throws exception when the repository fails getting this conversation for any unhandled reasons
|
||||
*/
|
||||
//suspend fun getConversation(conversationId: String, messageId: String): Conversation?
|
||||
|
||||
/**
|
||||
* Deletes all the conversations from the [TABLE_CONVERSATIONS] inside the local storage
|
||||
*/
|
||||
suspend fun clearConversations()
|
||||
}
|
||||
|
|
|
@ -55,6 +55,10 @@ class ClearUserData @Inject constructor(
|
|||
val counterDao = runCatching { databaseProvider.provideCounterDao(userId) }.getOrNull()
|
||||
val messageDao = runCatching { databaseProvider.provideMessageDao(userId) }.getOrNull()
|
||||
val messageSearchDao = runCatching { databaseProvider.provideMessageSearchDao(userId) }.getOrNull()
|
||||
// TODO remove this dependency and use the ConversationRepository.clear()
|
||||
// right now it creates a circular dependency,
|
||||
// so this needs to happen when this use-case is refactored to use only repositories
|
||||
val conversationDao = runCatching { databaseProvider.provideConversationDao(userId) }.getOrNull()
|
||||
val notificationDao = runCatching { databaseProvider.provideNotificationDao(userId) }.getOrNull()
|
||||
val pendingActionDao = runCatching { databaseProvider.providePendingActionDao(userId) }.getOrNull()
|
||||
|
||||
|
@ -87,19 +91,23 @@ class ClearUserData @Inject constructor(
|
|||
clearAttachmentsCache()
|
||||
clearLabelsCache()
|
||||
}
|
||||
conversationDao?.run {
|
||||
clear()
|
||||
}
|
||||
notificationDao?.clearNotificationCache()
|
||||
pendingActionDao?.run {
|
||||
clearPendingSendCache()
|
||||
clearPendingUploadCache()
|
||||
}
|
||||
}
|
||||
|
||||
startCleaningServices(userId)
|
||||
}
|
||||
|
||||
// TODO replace services, options:
|
||||
// 1) extract in this use case
|
||||
// 2) extract in separate use case/s
|
||||
// 3) extract in worker/s
|
||||
// 1) extract in this use case
|
||||
// 2) extract in separate use case/s
|
||||
// 3) extract in worker/s
|
||||
private fun startCleaningServices(userId: Id) {
|
||||
AttachmentClearingService.startClearUpImmediatelyService(context, userId)
|
||||
MessageBodyClearingService.startClearUpService()
|
||||
|
|
|
@ -63,6 +63,7 @@ import ch.protonmail.android.data.local.PendingActionDatabase;
|
|||
import ch.protonmail.android.domain.entity.Id;
|
||||
import ch.protonmail.android.events.ApiOfflineEvent;
|
||||
import ch.protonmail.android.events.ForceUpgradeEvent;
|
||||
import ch.protonmail.android.mailbox.data.local.ConversationDao;
|
||||
import ch.protonmail.android.storage.AttachmentClearingService;
|
||||
import ch.protonmail.android.storage.MessageBodyClearingService;
|
||||
import timber.log.Timber;
|
||||
|
@ -174,6 +175,7 @@ public class AppUtil {
|
|||
ContactDatabase.Companion.getInstance(context, userId).getDao(),
|
||||
MessageDatabase.Companion.getInstance(context, userId).getDao(),
|
||||
MessageDatabase.Companion.getSearchDatabase(context, userId).getDao(),
|
||||
MessageDatabase.Companion.getInstance(context, userId).getConversationDao(),
|
||||
NotificationDatabase.Companion.getInstance(context, userId).getDao(),
|
||||
CounterDatabase.Companion.getInstance(context, userId).getDao(),
|
||||
AttachmentMetadataDatabase.Companion.getInstance(context, userId).getDao(),
|
||||
|
@ -302,6 +304,7 @@ public class AppUtil {
|
|||
final ContactDao contactDao,
|
||||
final MessageDao messageDao,
|
||||
final MessageDao searchDatabase,
|
||||
final ConversationDao conversationDao,
|
||||
final NotificationDao notificationDao,
|
||||
final CounterDao counterDao,
|
||||
final AttachmentMetadataDao attachmentMetadataDao,
|
||||
|
@ -314,6 +317,7 @@ public class AppUtil {
|
|||
contactDao,
|
||||
messageDao,
|
||||
searchDatabase,
|
||||
conversationDao,
|
||||
notificationDao,
|
||||
counterDao,
|
||||
attachmentMetadataDao,
|
||||
|
@ -330,6 +334,7 @@ public class AppUtil {
|
|||
final ContactDao contactDao,
|
||||
final MessageDao messageDao,
|
||||
final MessageDao searchDatabase,
|
||||
final ConversationDao conversationDao,
|
||||
final NotificationDao notificationDao,
|
||||
final CounterDao counterDao,
|
||||
final AttachmentMetadataDao attachmentMetadataDao,
|
||||
|
@ -354,6 +359,7 @@ public class AppUtil {
|
|||
messageDao.clearMessagesCache();
|
||||
messageDao.clearAttachmentsCache();
|
||||
messageDao.clearLabelsCache();
|
||||
conversationDao.clear();
|
||||
searchDatabase.clearMessagesCache();
|
||||
searchDatabase.clearAttachmentsCache();
|
||||
searchDatabase.clearLabelsCache();
|
||||
|
|
Loading…
Reference in New Issue