Implemented a way of clearing conversations from db

This commit is contained in:
Zorica Stojchevska 2021-04-14 16:46:10 +02:00 committed by Marino Meneghel
parent 6c97505ecb
commit 4da028bdf2
6 changed files with 40 additions and 5 deletions

View File

@ -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,

View File

@ -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()

View File

@ -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()
}

View File

@ -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()
}

View File

@ -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()

View File

@ -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();