Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(MyKSuite-01): Use core module and fetch data #2175

Merged
merged 10 commits into from
Feb 19, 2025
Merged
82 changes: 82 additions & 0 deletions .idea/navEditor.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion Core
Submodule Core updated 66 files
+70 −0 MykSuite/build.gradle.kts
+0 −0 MykSuite/consumer-rules.pro
+21 −0 MykSuite/proguard-rules.pro
+172 −0 MykSuite/schemas/com.infomaniak.core.myksuite.ui.data.MyKSuiteDatabase/1.json
+73 −0 MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/components/MyKSuiteChips.kt
+37 −0 MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/components/MyKSuiteGradient.kt
+78 −0 MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/components/MyKSuitePrimaryButton.kt
+36 −0 MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/components/WeightOneSpacer.kt
+51 −0 MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/data/KSuitePack.kt
+65 −0 MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/data/MyKSuiteData.kt
+42 −0 MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/data/MyKSuiteDataDao.kt
+51 −0 MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/data/MyKSuiteDataManager.kt
+54 −0 MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/data/MyKSuiteDatabase.kt
+32 −0 MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/data/kSuiteDrive.kt
+39 −0 MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/data/kSuiteMail.kt
+25 −0 MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/network/ApiRoutes.kt
+220 −0 MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/screens/MyKSuiteDashboardScreen.kt
+141 −0 MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/screens/MyKSuiteUpgradeBottomSheet.kt
+47 −0 MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/screens/MyKSuiteUpgradeFeature.kt
+92 −0 MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/screens/components/AppStorageQuotas.kt
+104 −0 MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/screens/components/ExpandableItemView.kt
+74 −0 MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/screens/components/LimitedFunctionnalities.kt
+60 −0 MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/screens/components/MyKSuiteButtonType.kt
+73 −0 MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/screens/components/UpgradeFeature.kt
+96 −0 MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/screens/components/UserAvatar.kt
+60 −0 MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/theme/ColorsDark.kt
+66 −0 MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/theme/ColorsLight.kt
+34 −0 MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/theme/Dimens.kt
+37 −0 MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/theme/Margin.kt
+61 −0 MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/theme/Theme.kt
+82 −0 MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/theme/Type.kt
+51 −0 MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/views/BaseMyKSuiteChipView.kt
+28 −0 MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/views/MyKSuiteChipView.kt
+51 −0 MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/views/MyKSuiteDashboardFragment.kt
+28 −0 MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/views/MyKSuitePlusChipView.kt
+48 −0 MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/views/MyKSuiteUpgradeBottomSheetDialog.kt
+79 −0 MykSuite/src/main/res/drawable-night/ic_logo_my_ksuite.xml
+105 −0 MykSuite/src/main/res/drawable-night/ic_logo_my_ksuite_plus.xml
+29 −0 MykSuite/src/main/res/drawable-night/ic_person.xml
+198 −0 MykSuite/src/main/res/drawable-night/illu_banner.xml
+26 −0 MykSuite/src/main/res/drawable-night/illu_dashboard_background.xml
+26 −0 MykSuite/src/main/res/drawable/ic_chevron_down.xml
+26 −0 MykSuite/src/main/res/drawable/ic_chevron_up.xml
+26 −0 MykSuite/src/main/res/drawable/ic_cross_thick.xml
+27 −0 MykSuite/src/main/res/drawable/ic_drive_cloud.xml
+27 −0 MykSuite/src/main/res/drawable/ic_envelope.xml
+27 −0 MykSuite/src/main/res/drawable/ic_enveloppe_italic.xml
+27 −0 MykSuite/src/main/res/drawable/ic_folder_circle_filled_arrow_up.xml
+27 −0 MykSuite/src/main/res/drawable/ic_gift.xml
+79 −0 MykSuite/src/main/res/drawable/ic_logo_my_ksuite.xml
+105 −0 MykSuite/src/main/res/drawable/ic_logo_my_ksuite_plus.xml
+27 −0 MykSuite/src/main/res/drawable/ic_padlock.xml
+27 −0 MykSuite/src/main/res/drawable/ic_paperplane.xml
+29 −0 MykSuite/src/main/res/drawable/ic_person.xml
+198 −0 MykSuite/src/main/res/drawable/illu_banner.xml
+26 −0 MykSuite/src/main/res/drawable/illu_dashboard_background.xml
+47 −0 MykSuite/src/main/res/navigation/my_ksuite_navigation.xml
+47 −0 MykSuite/src/main/res/values-de/strings.xml
+47 −0 MykSuite/src/main/res/values-es/strings.xml
+47 −0 MykSuite/src/main/res/values-fr/strings.xml
+47 −0 MykSuite/src/main/res/values-it/strings.xml
+20 −0 MykSuite/src/main/res/values-night/colors.xml
+24 −0 MykSuite/src/main/res/values/attrs.xml
+20 −0 MykSuite/src/main/res/values/colors.xml
+51 −0 MykSuite/src/main/res/values/strings.xml
+16 −1 gradle/core.versions.toml
4 changes: 4 additions & 0 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,7 @@ dependencies {
implementation project(path: ':Core:Legacy:BugTracker')
implementation project(path: ':Core:Legacy:Confetti')
implementation project(path: ':Core:Legacy:Stores')
implementation project(path: ':Core:MyKSuite')
implementation project(path: ':HtmlCleaner')

implementation libs.rich.html.editor
Expand Down Expand Up @@ -120,6 +121,9 @@ dependencies {

implementation libs.coil.svg

// Compose
implementation libs.compose.ui.android

// Test
testImplementation libs.junit
androidTestImplementation libs.ext.junit
Expand Down
5 changes: 3 additions & 2 deletions app/src/main/java/com/infomaniak/mail/MainApplication.kt
Original file line number Diff line number Diff line change
Expand Up @@ -125,7 +125,7 @@ open class MainApplication : Application(), ImageLoaderFactory, DefaultLifecycle
if (BuildConfig.DEBUG) configureDebugMode()
configureSentry()
enforceAppTheme()
configureAccountUtils()
configureRoomDatabases()
configureAppReloading()
configureInfomaniakCore()
notificationUtils.initNotificationChannel()
Expand Down Expand Up @@ -217,8 +217,9 @@ open class MainApplication : Application(), ImageLoaderFactory, DefaultLifecycle
AppCompatDelegate.setDefaultNightMode(localSettings.theme.mode)
}

private fun configureAccountUtils() {
private fun configureRoomDatabases() {
AccountUtils.init(this)
MyKSuiteDataUtils.initDatabase(this)
}

private fun configureAppReloading() {
Expand Down
11 changes: 11 additions & 0 deletions app/src/main/java/com/infomaniak/mail/data/api/ApiRepository.kt
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
*/
package com.infomaniak.mail.data.api

import com.infomaniak.core.myksuite.ui.data.MyKSuiteData
import com.infomaniak.lib.core.InfomaniakCore
import com.infomaniak.lib.core.R
import com.infomaniak.lib.core.api.ApiController
Expand Down Expand Up @@ -64,6 +65,7 @@ import okhttp3.OkHttpClient
import okhttp3.Request
import okhttp3.Response
import java.util.Date
import com.infomaniak.core.myksuite.ui.network.ApiRoutes as MyKSuiteApiRoutes

object ApiRepository : ApiRepositoryCore() {

Expand Down Expand Up @@ -449,6 +451,15 @@ object ApiRepository : ApiRepositoryCore() {
return callApi(url = ApiRoutes.shareLink(mailboxUuid, folderId, mailId), method = POST)
}

fun getMyKSuiteData(okHttpClient: OkHttpClient): ApiResponse<MyKSuiteData> {
return ApiController.callApi(
url = MyKSuiteApiRoutes.myKSuiteData,
method = ApiController.ApiMethod.GET,
okHttpClient = okHttpClient,
useKotlinxSerialization = true,
)
}

/**
* Create batches of the given values to perform the given request
* @param values Data to batch
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -159,6 +159,7 @@ object RealmDatabase {
private object RealmConfig {

//region Configurations versions
const val APP_SETTINGS_SCHEMA_VERSION = 2L
const val USER_INFO_SCHEMA_VERSION = 2L
const val MAILBOX_INFO_SCHEMA_VERSION = 8L
const val MAILBOX_CONTENT_SCHEMA_VERSION = 21L
Expand Down Expand Up @@ -208,6 +209,8 @@ object RealmDatabase {
val appSettings = RealmConfiguration
.Builder(appSettingsSet)
.name(appSettingsDbName)
.schemaVersion(APP_SETTINGS_SCHEMA_VERSION)
.migration(APP_SETTINGS_MIGRATION)
.build()

val userInfo
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,10 @@ import io.realm.kotlin.dynamic.getValue
import io.realm.kotlin.migration.AutomaticSchemaMigration
import io.realm.kotlin.migration.AutomaticSchemaMigration.MigrationContext

val APP_SETTINGS_MIGRATION = AutomaticSchemaMigration { migrationContext ->
SentryDebug.addMigrationBreadcrumb(migrationContext)
}

val USER_INFO_MIGRATION = AutomaticSchemaMigration { migrationContext ->
SentryDebug.addMigrationBreadcrumb(migrationContext)
migrationContext.deleteRealmFromFirstMigration()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ class AppSettings : RealmObject {

var currentUserId: Int = DEFAULT_ID
var currentMailboxId: Int = DEFAULT_ID
var myKSuiteId: Int = DEFAULT_ID

companion object {
const val DEFAULT_ID = -1
Expand Down
31 changes: 27 additions & 4 deletions app/src/main/java/com/infomaniak/mail/ui/MainViewModel.kt
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ package com.infomaniak.mail.ui
import android.app.Application
import androidx.lifecycle.*
import com.infomaniak.lib.core.models.ApiResponse
import com.infomaniak.lib.core.networking.HttpClient
import com.infomaniak.lib.core.networking.HttpUtils
import com.infomaniak.lib.core.networking.NetworkAvailability
import com.infomaniak.lib.core.utils.ApiErrorCode.Companion.translateError
Expand Down Expand Up @@ -54,16 +55,13 @@ import com.infomaniak.mail.di.IoDispatcher
import com.infomaniak.mail.di.MailboxInfoRealm
import com.infomaniak.mail.ui.main.SnackbarManager
import com.infomaniak.mail.ui.main.SnackbarManager.UndoData
import com.infomaniak.mail.utils.AccountUtils
import com.infomaniak.mail.utils.*
import com.infomaniak.mail.utils.ContactUtils.getPhoneContacts
import com.infomaniak.mail.utils.ContactUtils.mergeApiContactsIntoPhoneContacts
import com.infomaniak.mail.utils.NotificationUtils
import com.infomaniak.mail.utils.NotificationUtils.Companion.cancelNotification
import com.infomaniak.mail.utils.SharedUtils
import com.infomaniak.mail.utils.SharedUtils.Companion.updateSignatures
import com.infomaniak.mail.utils.Utils.isPermanentDeleteFolder
import com.infomaniak.mail.utils.Utils.runCatchingRealm
import com.infomaniak.mail.utils.coroutineContext
import com.infomaniak.mail.utils.extensions.*
import com.infomaniak.mail.views.itemViews.AvatarMergedContactData
import dagger.hilt.android.lifecycle.HiltViewModel
Expand All @@ -76,6 +74,8 @@ import io.sentry.Sentry
import io.sentry.SentryLevel
import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*
import kotlinx.serialization.ExperimentalSerializationApi
import kotlinx.serialization.MissingFieldException
import okhttp3.Request
import java.util.Date
import java.util.UUID
Expand Down Expand Up @@ -300,6 +300,9 @@ class MainViewModel @Inject constructor(
// Refresh User
AccountUtils.updateCurrentUser()

// Refresh My kSuite asynchronously, because it's not required for the threads list display
launch { updateMyKSuiteData() }

// Refresh Mailboxes
SentryLog.d(TAG, "Refresh mailboxes from remote")
with(ApiRepository.getMailboxes()) {
Expand Down Expand Up @@ -335,6 +338,26 @@ class MainViewModel @Inject constructor(
}
}

private suspend fun updateMyKSuiteData() {
runCatching {
MyKSuiteDataUtils.requestKSuiteData()
val apiResponse = ApiRepository.getMyKSuiteData(HttpClient.okHttpClient)
if (apiResponse.data != null) {
MyKSuiteDataUtils.upsertKSuiteData(apiResponse.data!!)
} else {
@OptIn(ExperimentalSerializationApi::class)
apiResponse.error?.exception?.let {
if (it is MissingFieldException || it.message?.contains("Unexpected JSON token") == true) {
SentryLog.e(TAG, "Error decoding the api result MyKSuiteObject", it)
}
}
}
}.onFailure { exception ->
if (exception is CancellationException) throw exception
SentryLog.d(TAG, "Exception during myKSuite data fetch", exception)
}
}

private fun selectMailbox(mailbox: Mailbox) {
if (mailbox.objectId != _currentMailboxObjectId.value) {
SentryLog.d(TAG, "Select mailbox: ${mailbox.email}")
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
/*
* Infomaniak Mail - Android
* Copyright (C) 2025 Infomaniak Network SA
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.infomaniak.mail.ui.main.settings

import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import com.infomaniak.core.myksuite.ui.views.MyKSuiteDashboardFragment
import com.infomaniak.mail.utils.extensions.setSystemBarsColors
import com.infomaniak.core.myksuite.R as RMyKSuite

class KSuiteDashboardFragment : MyKSuiteDashboardFragment() {

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
setSystemBarsColors(statusBarColor = RMyKSuite.color.dashboardBackground)
return super.onCreateView(inflater, container, savedInstanceState)
}
}
Loading
Loading