Skip to content

Commit 5930a1c

Browse files
authored
feat(MyKSuite): Stop fetching myKSuite data if user doesn't have a my kSuite offer (#2227)
2 parents f48fa20 + 938642e commit 5930a1c

File tree

8 files changed

+45
-22
lines changed

8 files changed

+45
-22
lines changed

app/src/main/java/com/infomaniak/mail/MainApplication.kt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,9 @@ open class MainApplication : Application(), ImageLoaderFactory, DefaultLifecycle
105105
@Inject
106106
lateinit var appUpdateWorkerScheduler: AppUpdateScheduler
107107

108+
@Inject
109+
lateinit var myKSuiteDataUtils: MyKSuiteDataUtils
110+
108111
@Inject
109112
@IoDispatcher
110113
lateinit var ioDispatcher: CoroutineDispatcher
@@ -209,7 +212,7 @@ open class MainApplication : Application(), ImageLoaderFactory, DefaultLifecycle
209212

210213
private fun configureRoomDatabases() {
211214
AccountUtils.init(this)
212-
MyKSuiteDataUtils.initDatabase(this)
215+
myKSuiteDataUtils.initDatabase(this)
213216
}
214217

215218
private fun configureAppReloading() {

app/src/main/java/com/infomaniak/mail/data/cache/mailboxInfo/MailboxController.kt

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,10 @@ class MailboxController @Inject constructor(
9090
return getLockedMailboxesQuery(userId, mailboxInfoRealm).toMailboxesFlow()
9191
}
9292

93+
fun getMyKSuiteMailboxCount(userId: Int): Long {
94+
return getMyKSuiteMailboxesQuery(userId, mailboxInfoRealm).count().find()
95+
}
96+
9397
private fun RealmQuery<Mailbox>.toMailboxesFlow() = asFlow().map { it.list }
9498
//endregion
9599

@@ -155,6 +159,7 @@ class MailboxController @Inject constructor(
155159
private val isValidInLdap = "${Mailbox.isValidInLdapPropertyName} == true"
156160
private val isLocked = "${Mailbox.isLockedPropertyName} == true"
157161
private val hasValidPassword = "${Mailbox::hasValidPassword.name} == true"
162+
private val isMyKSuite = "${Mailbox::isFree.name} == true"
158163

159164
private fun getMailboxesQuery(
160165
userId: Int? = null,
@@ -203,6 +208,10 @@ class MailboxController @Inject constructor(
203208
private fun getLockedMailboxesQuery(userId: Int, realm: TypedRealm): RealmQuery<Mailbox> {
204209
return realm.query("${checkHasUserId(userId)} AND ($isLocked OR NOT $isValidInLdap)")
205210
}
211+
212+
private fun getMyKSuiteMailboxesQuery(userId: Int, realm: TypedRealm): RealmQuery<Mailbox> {
213+
return realm.query<Mailbox>("${checkHasUserId(userId)} AND $isMyKSuite")
214+
}
206215
//endregion
207216

208217
//region Get data

app/src/main/java/com/infomaniak/mail/ui/MainViewModel.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@ class MainViewModel @Inject constructor(
9292
private val mailboxController: MailboxController,
9393
private val mergedContactController: MergedContactController,
9494
private val messageController: MessageController,
95+
private val myKSuiteDataUtils: MyKSuiteDataUtils,
9596
private val notificationUtils: NotificationUtils,
9697
private val permissionsController: PermissionsController,
9798
private val quotasController: QuotasController,
@@ -317,7 +318,7 @@ class MainViewModel @Inject constructor(
317318
AccountUtils.updateCurrentUser()
318319

319320
// Refresh My kSuite asynchronously, because it's not required for the threads list display
320-
launch { MyKSuiteDataUtils.fetchData() }
321+
launch { myKSuiteDataUtils.fetchData() }
321322

322323
// Refresh Mailboxes
323324
SentryLog.d(TAG, "Refresh mailboxes from remote")

app/src/main/java/com/infomaniak/mail/ui/main/settings/MykSuiteViewModel.kt

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -24,20 +24,19 @@ import com.infomaniak.lib.core.utils.SingleLiveEvent
2424
import com.infomaniak.mail.data.cache.mailboxInfo.MailboxController
2525
import com.infomaniak.mail.data.models.mailbox.Mailbox
2626
import com.infomaniak.mail.di.IoDispatcher
27-
import com.infomaniak.mail.di.MailboxInfoRealm
2827
import com.infomaniak.mail.utils.AccountUtils
2928
import com.infomaniak.mail.utils.MyKSuiteDataUtils
3029
import com.infomaniak.mail.utils.coroutineContext
3130
import dagger.hilt.android.lifecycle.HiltViewModel
32-
import io.realm.kotlin.Realm
3331
import kotlinx.coroutines.CoroutineDispatcher
3432
import kotlinx.coroutines.launch
3533
import javax.inject.Inject
3634

3735
@HiltViewModel
3836
class MykSuiteViewModel @Inject constructor(
39-
@MailboxInfoRealm private val mailboxInfoRealm: Realm,
4037
@IoDispatcher private val ioDispatcher: CoroutineDispatcher,
38+
private val mailboxController: MailboxController,
39+
private val myKSuiteDataUtils: MyKSuiteDataUtils,
4140
) : ViewModel() {
4241

4342
private val ioCoroutineContext = viewModelScope.coroutineContext(ioDispatcher)
@@ -46,16 +45,10 @@ class MykSuiteViewModel @Inject constructor(
4645
val myKSuiteDataResult = SingleLiveEvent<MyKSuiteData?>()
4746

4847
fun getMyKSuiteMailbox(mailboxId: Int) = viewModelScope.launch {
49-
myKSuiteMailboxResult.postValue(
50-
MailboxController.getMailbox(
51-
userId = AccountUtils.currentUserId,
52-
mailboxId = mailboxId,
53-
realm = mailboxInfoRealm,
54-
)
55-
)
48+
myKSuiteMailboxResult.postValue(mailboxController.getMailbox(userId = AccountUtils.currentUserId, mailboxId = mailboxId))
5649
}
5750

5851
fun refreshMyKSuite() = viewModelScope.launch(ioCoroutineContext) {
59-
myKSuiteDataResult.postValue(MyKSuiteDataUtils.fetchData())
52+
myKSuiteDataResult.postValue(myKSuiteDataUtils.fetchData())
6053
}
6154
}

app/src/main/java/com/infomaniak/mail/ui/main/settings/SettingsFragment.kt

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,9 @@ class SettingsFragment : Fragment() {
6464
@Inject
6565
lateinit var localSettings: LocalSettings
6666

67+
@Inject
68+
lateinit var myKSuiteDataUtils: MyKSuiteDataUtils
69+
6770
override fun onCreate(savedInstanceState: Bundle?) {
6871
super.onCreate(savedInstanceState)
6972
saveFocusWhenNavigatingBack(getLayout = { binding.linearLayoutContainer }, lifecycle)
@@ -87,8 +90,8 @@ class SettingsFragment : Fragment() {
8790
}
8891

8992
private fun setupMyKSuite() {
90-
binding.myKSuiteLayout.isGone = MyKSuiteDataUtils.myKSuite == null
91-
MyKSuiteDataUtils.myKSuite?.let { setupMyKSuiteLayout(it) } ?: myKSuiteViewModel.refreshMyKSuite()
93+
binding.myKSuiteLayout.isGone = myKSuiteDataUtils.myKSuite == null
94+
myKSuiteDataUtils.myKSuite?.let { setupMyKSuiteLayout(it) } ?: myKSuiteViewModel.refreshMyKSuite()
9295
}
9396

9497
private fun setupMyKSuiteLayout(myKSuiteData: MyKSuiteData) = with(binding) {
@@ -149,7 +152,7 @@ class SettingsFragment : Fragment() {
149152

150153
binding.mailboxesList.adapter = mailboxesAdapter
151154
mainViewModel.mailboxesLive.observe(viewLifecycleOwner) { mailboxes ->
152-
mailboxesAdapter.setMailboxes(mailboxes.filterNot { it.mailboxId == MyKSuiteDataUtils.myKSuite?.mail?.mailboxId })
155+
mailboxesAdapter.setMailboxes(mailboxes.filterNot { it.mailboxId == myKSuiteDataUtils.myKSuite?.mail?.mailboxId })
153156
}
154157
}
155158

app/src/main/java/com/infomaniak/mail/ui/main/user/SwitchUserViewModel.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import com.infomaniak.mail.data.cache.mailboxInfo.MailboxController
2828
import com.infomaniak.mail.data.models.AppSettings
2929
import com.infomaniak.mail.di.IoDispatcher
3030
import com.infomaniak.mail.utils.AccountUtils
31+
import com.infomaniak.mail.utils.MyKSuiteDataUtils
3132
import com.infomaniak.mail.utils.extensions.appContext
3233
import dagger.hilt.android.lifecycle.HiltViewModel
3334
import kotlinx.coroutines.CoroutineDispatcher
@@ -38,6 +39,7 @@ import javax.inject.Inject
3839
class SwitchUserViewModel @Inject constructor(
3940
application: Application,
4041
private val mailboxController: MailboxController,
42+
private val myKSuiteDataUtils: MyKSuiteDataUtils,
4143
@IoDispatcher private val ioDispatcher: CoroutineDispatcher,
4244
) : AndroidViewModel(application) {
4345

@@ -51,6 +53,7 @@ class SwitchUserViewModel @Inject constructor(
5153
if (user.id != AccountUtils.currentUserId) {
5254
appContext.trackAccountEvent("switch")
5355
RealmDatabase.backupPreviousRealms()
56+
myKSuiteDataUtils.myKSuite = null
5457
AccountUtils.currentUser = user
5558
AccountUtils.currentMailboxId = mailboxController.getFirstValidMailbox(user.id)?.mailboxId ?: AppSettings.DEFAULT_ID
5659
AccountUtils.reloadApp?.invoke()

app/src/main/java/com/infomaniak/mail/utils/LogoutUser.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ class LogoutUser @Inject constructor(
4343
private val globalCoroutineScope: CoroutineScope,
4444
private val localSettings: LocalSettings,
4545
private val mailboxController: MailboxController,
46+
private val myKSuiteDataUtils: MyKSuiteDataUtils,
4647
private val playServicesUtils: PlayServicesUtils,
4748
private val storesSettingsRepository: StoresSettingsRepository,
4849
@IoDispatcher private val ioDispatcher: CoroutineDispatcher,
@@ -52,7 +53,7 @@ class LogoutUser @Inject constructor(
5253

5354
user.logoutToken()
5455
AccountUtils.removeUser(user)
55-
MyKSuiteDataUtils.deleteData(user.id)
56+
myKSuiteDataUtils.deleteData(user.id)
5657
RealmDatabase.removeUserData(appContext, user.id)
5758
mailboxController.deleteUserMailboxes(user.id)
5859
localSettings.removeRegisteredFirebaseUser(userId = user.id)

app/src/main/java/com/infomaniak/mail/utils/MyKSuiteDataUtils.kt

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,23 +22,28 @@ import com.infomaniak.core.myksuite.ui.data.MyKSuiteDataManager
2222
import com.infomaniak.lib.core.networking.HttpClient
2323
import com.infomaniak.lib.core.utils.SentryLog
2424
import com.infomaniak.mail.data.api.ApiRepository
25+
import com.infomaniak.mail.data.cache.mailboxInfo.MailboxController
2526
import kotlinx.serialization.ExperimentalSerializationApi
2627
import kotlinx.serialization.MissingFieldException
28+
import javax.inject.Inject
29+
import javax.inject.Singleton
2730
import kotlin.coroutines.cancellation.CancellationException
2831

29-
object MyKSuiteDataUtils : MyKSuiteDataManager() {
30-
31-
private val TAG = MyKSuiteDataUtils::class.simpleName.toString()
32+
@Singleton
33+
class MyKSuiteDataUtils @Inject constructor(private val mailboxController: MailboxController) : MyKSuiteDataManager() {
3234

3335
override val currentUserId get() = AccountUtils.currentUserId
3436

3537
override var myKSuite: MyKSuiteData? = null
3638

3739
override suspend fun fetchData(): MyKSuiteData? = runCatching {
38-
MyKSuiteDataUtils.requestKSuiteData()
40+
requestKSuiteData()
41+
// Only fetch the Data if the current user has a my kSuite mailbox
42+
if (mailboxController.getMyKSuiteMailboxCount(userId = AccountUtils.currentUserId) == 0L) return@runCatching null
43+
3944
val apiResponse = ApiRepository.getMyKSuiteData(HttpClient.okHttpClient)
4045
if (apiResponse.data != null) {
41-
MyKSuiteDataUtils.upsertKSuiteData(apiResponse.data!!)
46+
upsertKSuiteData(apiResponse.data!!)
4247
} else {
4348
@OptIn(ExperimentalSerializationApi::class)
4449
apiResponse.error?.exception?.let {
@@ -52,4 +57,9 @@ object MyKSuiteDataUtils : MyKSuiteDataManager() {
5257
SentryLog.d(TAG, "Exception during myKSuite data fetch", exception)
5358
null
5459
}
60+
61+
companion object {
62+
63+
private val TAG = MyKSuiteDataUtils::class.simpleName.toString()
64+
}
5565
}

0 commit comments

Comments
 (0)