From 3d64b1c3b815337c8c0f2e4ccd0ab76f1f948ce3 Mon Sep 17 00:00:00 2001 From: Fabian DEVEL Date: Wed, 5 Feb 2025 08:58:54 +0100 Subject: [PATCH 1/6] feat(MyKSuiteApiModel): Add Api models --- MykSuite/build.gradle.kts | 2 + .../core/myksuite/ui/network/ApiRoutes.kt | 25 ++++++++++++ .../core/myksuite/ui/network/KSuitePack.kt | 35 +++++++++++++++++ .../core/myksuite/ui/network/MyKSuiteData.kt | 38 +++++++++++++++++++ .../core/myksuite/ui/network/kSuiteDrive.kt | 30 +++++++++++++++ .../myksuite/ui/network/kSuiteFreeMail.kt | 34 +++++++++++++++++ 6 files changed, 164 insertions(+) create mode 100644 MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/network/ApiRoutes.kt create mode 100644 MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/network/KSuitePack.kt create mode 100644 MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/network/MyKSuiteData.kt create mode 100644 MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/network/kSuiteDrive.kt create mode 100644 MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/network/kSuiteFreeMail.kt diff --git a/MykSuite/build.gradle.kts b/MykSuite/build.gradle.kts index af2955ee..aa2c4059 100644 --- a/MykSuite/build.gradle.kts +++ b/MykSuite/build.gradle.kts @@ -3,6 +3,7 @@ plugins { alias(core.plugins.kotlin.android) alias(core.plugins.compose.compiler) kotlin("plugin.parcelize") + kotlin("plugin.serialization") version core.versions.kotlin id("androidx.navigation.safeargs.kotlin") } @@ -47,6 +48,7 @@ dependencies { implementation(core.androidx.core.ktx) implementation(core.material) implementation(core.navigation.fragment.ktx) + implementation(core.kotlinx.serialization.json) // Compose implementation(core.coil.compose) diff --git a/MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/network/ApiRoutes.kt b/MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/network/ApiRoutes.kt new file mode 100644 index 00000000..1d892f11 --- /dev/null +++ b/MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/network/ApiRoutes.kt @@ -0,0 +1,25 @@ +/* + * Infomaniak Core - 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 . + */ +package com.infomaniak.core.myksuite.ui.network + +object ApiRoutes { + + private const val BASE_URL = "https://api.staging-myksuite.dev.infomaniak.ch" + + val myKSuiteData = "$BASE_URL/1/my_ksuite/current?with=*" +} diff --git a/MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/network/KSuitePack.kt b/MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/network/KSuitePack.kt new file mode 100644 index 00000000..d879c226 --- /dev/null +++ b/MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/network/KSuitePack.kt @@ -0,0 +1,35 @@ +/* + * Infomaniak Core - 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 . + */ +package com.infomaniak.core.myksuite.ui.network + +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +data class KSuitePack( + val id: Int, + val name: String, + @SerialName("drive_storage") + val driveStorage: Long, + @SerialName("mail_storage") + val mailStorage: Long, + @SerialName("mail_daily_limit_send") + val mailDailyLimitSend: Int, + @SerialName("is_max_storage_offer") + val isMaxStorageOffer: Boolean, +) diff --git a/MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/network/MyKSuiteData.kt b/MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/network/MyKSuiteData.kt new file mode 100644 index 00000000..03e9b865 --- /dev/null +++ b/MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/network/MyKSuiteData.kt @@ -0,0 +1,38 @@ +/* + * Infomaniak Core - 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 . + */ +package com.infomaniak.core.myksuite.ui.network + +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +data class MyKSuiteData( + val id: Int, + val status: String, + @SerialName("pack_id") + val kSuitePackId: Int, + @SerialName("pack") + val kSuitePack: KSuitePack? = null, + @SerialName("is_free") + val isFree: Boolean, + val drive: KSuiteDrive? = null, + @SerialName("free_mail") + val freeMail: KSuiteFreeMail? = null, + @SerialName("has_auto_renew") + val hasAutoRenew: Boolean, +) diff --git a/MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/network/kSuiteDrive.kt b/MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/network/kSuiteDrive.kt new file mode 100644 index 00000000..5f7a282e --- /dev/null +++ b/MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/network/kSuiteDrive.kt @@ -0,0 +1,30 @@ +/* + * Infomaniak Core - 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 . + */ +package com.infomaniak.core.myksuite.ui.network + +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +data class KSuiteDrive( + val id: Int, + val name: String, + val size: Long, + @SerialName("used_size") + val usedSize: Long, +) diff --git a/MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/network/kSuiteFreeMail.kt b/MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/network/kSuiteFreeMail.kt new file mode 100644 index 00000000..a9b3a024 --- /dev/null +++ b/MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/network/kSuiteFreeMail.kt @@ -0,0 +1,34 @@ +/* + * Infomaniak Core - 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 . + */ +package com.infomaniak.core.myksuite.ui.network + +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +data class KSuiteFreeMail( + val id: Int, + val email: String, + @SerialName("daily_limit_sent") + val dailyLimitSent: Int, + @SerialName("storage_size_limit") + val storageSizeLimit: Long, + @SerialName("used_size") + val usedSize: Long, +) + From a8eb8a8116b8319ab476ea9b85c9e1187e801016 Mon Sep 17 00:00:00 2001 From: Fabian DEVEL Date: Wed, 5 Feb 2025 09:41:48 +0100 Subject: [PATCH 2/6] chore(MyKSuiteApiModel): Add Room to the module --- MykSuite/build.gradle.kts | 6 ++++++ gradle/core.versions.toml | 6 ++++++ 2 files changed, 12 insertions(+) diff --git a/MykSuite/build.gradle.kts b/MykSuite/build.gradle.kts index aa2c4059..0b39f469 100644 --- a/MykSuite/build.gradle.kts +++ b/MykSuite/build.gradle.kts @@ -4,6 +4,7 @@ plugins { alias(core.plugins.compose.compiler) kotlin("plugin.parcelize") kotlin("plugin.serialization") version core.versions.kotlin + alias(core.plugins.ksp) id("androidx.navigation.safeargs.kotlin") } @@ -50,6 +51,11 @@ dependencies { implementation(core.navigation.fragment.ktx) implementation(core.kotlinx.serialization.json) + // Room + implementation(core.room.runtime) + implementation(core.room.ktx) + ksp(core.room.compiler) + // Compose implementation(core.coil.compose) implementation(core.coil.network.okhttp) diff --git a/gradle/core.versions.toml b/gradle/core.versions.toml index cef8f8aa..60455827 100644 --- a/gradle/core.versions.toml +++ b/gradle/core.versions.toml @@ -7,6 +7,7 @@ integrity = "1.4.0" junit = "4.13.2" junitAndroidx = "1.2.1" kotlin = "2.0.21" +ksp = "2.0.21-1.0.28" kotlinxCoroutines = "1.9.0" kotlinxSerializationJson = "1.7.3" ktor = "3.0.1" @@ -15,6 +16,7 @@ material = "1.12.0" matomo = "4.1.4" navigation = "2.8.5" playReview = "2.0.2" +room = "2.6.1" sentryAndroid = "7.15.0" splitties = "3.0.0" @@ -46,6 +48,9 @@ navigation-fragment-ktx = { group = "androidx.navigation", name = "navigation-fr navigation-safeargs = { module = "androidx.navigation:navigation-safe-args-gradle-plugin", version.ref = "navigation" } play-review = { module = "com.google.android.play:review", version.ref = "playReview" } play-review-ktx = { module = "com.google.android.play:review-ktx", version.ref = "playReview" } +room-compiler = { module = "androidx.room:room-compiler", version.ref = "room" } +room-ktx = { module = "androidx.room:room-ktx", version.ref = "room" } +room-runtime = { module = "androidx.room:room-runtime", version.ref = "room" } sentry-android = { module = "io.sentry:sentry-android", version.ref = "sentryAndroid" } splitties-appctx = { module = "com.louiscad.splitties:splitties-appctx", version.ref = "splitties" } splitties-collections = { module = "com.louiscad.splitties:splitties-collections", version.ref = "splitties" } @@ -61,3 +66,4 @@ junit = { group = "junit", name = "junit", version.ref = "junit" } [plugins] compose-compiler = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" } kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" } +ksp = { id = "com.google.devtools.ksp", version.ref = "ksp" } From 7a9cbbd6bf921484507011f4c9846b14b148ca20 Mon Sep 17 00:00:00 2001 From: Fabian DEVEL Date: Wed, 5 Feb 2025 14:27:42 +0100 Subject: [PATCH 3/6] feat(MyKSuiteApiModel): Transform model in to room entities --- .../core/myksuite/ui/network/KSuitePack.kt | 15 ++++++++++----- .../core/myksuite/ui/network/MyKSuiteData.kt | 15 ++++++++++++++- .../core/myksuite/ui/network/kSuiteDrive.kt | 2 ++ .../core/myksuite/ui/network/kSuiteFreeMail.kt | 4 ++++ 4 files changed, 30 insertions(+), 6 deletions(-) diff --git a/MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/network/KSuitePack.kt b/MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/network/KSuitePack.kt index d879c226..8e93c9dd 100644 --- a/MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/network/KSuitePack.kt +++ b/MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/network/KSuitePack.kt @@ -17,19 +17,24 @@ */ package com.infomaniak.core.myksuite.ui.network +import androidx.room.ColumnInfo import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @Serializable data class KSuitePack( val id: Int, - val name: String, + val name: String = "", @SerialName("drive_storage") - val driveStorage: Long, + @ColumnInfo("drive_storage") + val driveStorage: Long = 0, @SerialName("mail_storage") - val mailStorage: Long, + @ColumnInfo("mail_storage") + val mailStorage: Long = 0, @SerialName("mail_daily_limit_send") - val mailDailyLimitSend: Int, + @ColumnInfo("mail_daily_limit_send") + val mailDailyLimitSend: Int = 0, @SerialName("is_max_storage_offer") - val isMaxStorageOffer: Boolean, + @ColumnInfo("is_max_storage_offer") + val isMaxStorageOffer: Boolean = false, ) diff --git a/MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/network/MyKSuiteData.kt b/MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/network/MyKSuiteData.kt index 03e9b865..cdab3026 100644 --- a/MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/network/MyKSuiteData.kt +++ b/MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/network/MyKSuiteData.kt @@ -17,22 +17,35 @@ */ package com.infomaniak.core.myksuite.ui.network +import androidx.room.ColumnInfo +import androidx.room.Embedded +import androidx.room.Entity +import androidx.room.PrimaryKey import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @Serializable +@Entity data class MyKSuiteData( - val id: Int, + @PrimaryKey val id: Int, val status: String, @SerialName("pack_id") + @ColumnInfo("pack_id") val kSuitePackId: Int, @SerialName("pack") + @ColumnInfo("k_suite_pack_") + @Embedded("k_suite_pack_") val kSuitePack: KSuitePack? = null, @SerialName("is_free") + @ColumnInfo("is_free") val isFree: Boolean, + @Embedded("drive_") val drive: KSuiteDrive? = null, @SerialName("free_mail") + @ColumnInfo("free_mail") + @Embedded("free_mail_") val freeMail: KSuiteFreeMail? = null, @SerialName("has_auto_renew") + @ColumnInfo("has_auto_renew") val hasAutoRenew: Boolean, ) diff --git a/MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/network/kSuiteDrive.kt b/MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/network/kSuiteDrive.kt index 5f7a282e..6bd32e4b 100644 --- a/MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/network/kSuiteDrive.kt +++ b/MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/network/kSuiteDrive.kt @@ -17,6 +17,7 @@ */ package com.infomaniak.core.myksuite.ui.network +import androidx.room.ColumnInfo import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @@ -26,5 +27,6 @@ data class KSuiteDrive( val name: String, val size: Long, @SerialName("used_size") + @ColumnInfo("used_size") val usedSize: Long, ) diff --git a/MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/network/kSuiteFreeMail.kt b/MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/network/kSuiteFreeMail.kt index a9b3a024..9d32f6aa 100644 --- a/MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/network/kSuiteFreeMail.kt +++ b/MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/network/kSuiteFreeMail.kt @@ -17,6 +17,7 @@ */ package com.infomaniak.core.myksuite.ui.network +import androidx.room.ColumnInfo import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @@ -25,10 +26,13 @@ data class KSuiteFreeMail( val id: Int, val email: String, @SerialName("daily_limit_sent") + @ColumnInfo("daily_limit_sent") val dailyLimitSent: Int, @SerialName("storage_size_limit") + @ColumnInfo("storage_size_limit") val storageSizeLimit: Long, @SerialName("used_size") + @ColumnInfo("used_size") val usedSize: Long, ) From b0e2afa800f9617f9e9c67296112f5f5612bd3c7 Mon Sep 17 00:00:00 2001 From: Fabian DEVEL Date: Wed, 5 Feb 2025 16:55:16 +0100 Subject: [PATCH 4/6] feat(MyKSuiteApiModel): Create Room database and dao --- MykSuite/build.gradle.kts | 2 + .../1.json | 160 ++++++++++++++++++ .../ui/{network => data}/KSuitePack.kt | 2 +- .../ui/{network => data}/MyKSuiteData.kt | 13 +- .../core/myksuite/ui/data/MyKSuiteDataDao.kt | 39 +++++ .../myksuite/ui/data/MyKSuiteDataManager.kt | 44 +++++ .../core/myksuite/ui/data/MyKSuiteDatabase.kt | 54 ++++++ .../ui/{network => data}/kSuiteDrive.kt | 2 +- .../kSuiteFreeMail.kt => data/kSuiteMail.kt} | 4 +- 9 files changed, 310 insertions(+), 10 deletions(-) create mode 100644 MykSuite/schemas/com.infomaniak.core.myksuite.ui.data.MyKSuiteDatabase/1.json rename MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/{network => data}/KSuitePack.kt (96%) rename MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/{network => data}/MyKSuiteData.kt (86%) create mode 100644 MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/data/MyKSuiteDataDao.kt create mode 100644 MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/data/MyKSuiteDataManager.kt create mode 100644 MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/data/MyKSuiteDatabase.kt rename MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/{network => data}/kSuiteDrive.kt (95%) rename MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/{network/kSuiteFreeMail.kt => data/kSuiteMail.kt} (94%) diff --git a/MykSuite/build.gradle.kts b/MykSuite/build.gradle.kts index 0b39f469..f7c1a3df 100644 --- a/MykSuite/build.gradle.kts +++ b/MykSuite/build.gradle.kts @@ -21,6 +21,8 @@ android { minSdk = legacyMinSdk consumerProguardFiles("consumer-rules.pro") + + ksp { arg("room.schemaLocation", "$projectDir/schemas") } } buildTypes { diff --git a/MykSuite/schemas/com.infomaniak.core.myksuite.ui.data.MyKSuiteDatabase/1.json b/MykSuite/schemas/com.infomaniak.core.myksuite.ui.data.MyKSuiteDatabase/1.json new file mode 100644 index 00000000..1e1f903e --- /dev/null +++ b/MykSuite/schemas/com.infomaniak.core.myksuite.ui.data.MyKSuiteDatabase/1.json @@ -0,0 +1,160 @@ +{ + "formatVersion": 1, + "database": { + "version": 1, + "identityHash": "86b21a614c09732158d40111fcd5cdc6", + "entities": [ + { + "tableName": "MyKSuiteData", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER NOT NULL, `status` TEXT NOT NULL, `pack_id` INTEGER NOT NULL, `trialExpiryAt` INTEGER, `is_free` INTEGER NOT NULL, `has_auto_renew` INTEGER NOT NULL, `canTrial` INTEGER NOT NULL, `k_suite_pack_id` INTEGER, `k_suite_pack_name` TEXT, `k_suite_pack_drive_storage` INTEGER, `k_suite_pack_mail_storage` INTEGER, `k_suite_pack_mail_daily_limit_send` INTEGER, `k_suite_pack_is_max_storage_offer` INTEGER, `drive_id` INTEGER, `drive_name` TEXT, `drive_size` INTEGER, `drive_used_size` INTEGER, `mail_id` INTEGER, `mail_email` TEXT, `mail_daily_limit_sent` INTEGER, `mail_storage_size_limit` INTEGER, `mail_used_size` INTEGER, PRIMARY KEY(`id`))", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "status", + "columnName": "status", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "kSuitePackId", + "columnName": "pack_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "trialExpiryAt", + "columnName": "trialExpiryAt", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "isFree", + "columnName": "is_free", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "hasAutoRenew", + "columnName": "has_auto_renew", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "canTrial", + "columnName": "canTrial", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "kSuitePack.id", + "columnName": "k_suite_pack_id", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "kSuitePack.name", + "columnName": "k_suite_pack_name", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "kSuitePack.driveStorage", + "columnName": "k_suite_pack_drive_storage", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "kSuitePack.mailStorage", + "columnName": "k_suite_pack_mail_storage", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "kSuitePack.mailDailyLimitSend", + "columnName": "k_suite_pack_mail_daily_limit_send", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "kSuitePack.isMaxStorageOffer", + "columnName": "k_suite_pack_is_max_storage_offer", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "drive.id", + "columnName": "drive_id", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "drive.name", + "columnName": "drive_name", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "drive.size", + "columnName": "drive_size", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "drive.usedSize", + "columnName": "drive_used_size", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "mail.id", + "columnName": "mail_id", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "mail.email", + "columnName": "mail_email", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "mail.dailyLimitSent", + "columnName": "mail_daily_limit_sent", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "mail.storageSizeLimit", + "columnName": "mail_storage_size_limit", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "mail.usedSize", + "columnName": "mail_used_size", + "affinity": "INTEGER", + "notNull": false + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + } + ], + "views": [], + "setupQueries": [ + "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)", + "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '86b21a614c09732158d40111fcd5cdc6')" + ] + } +} \ No newline at end of file diff --git a/MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/network/KSuitePack.kt b/MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/data/KSuitePack.kt similarity index 96% rename from MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/network/KSuitePack.kt rename to MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/data/KSuitePack.kt index 8e93c9dd..f5d07c9d 100644 --- a/MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/network/KSuitePack.kt +++ b/MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/data/KSuitePack.kt @@ -15,7 +15,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package com.infomaniak.core.myksuite.ui.network +package com.infomaniak.core.myksuite.ui.data import androidx.room.ColumnInfo import kotlinx.serialization.SerialName diff --git a/MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/network/MyKSuiteData.kt b/MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/data/MyKSuiteData.kt similarity index 86% rename from MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/network/MyKSuiteData.kt rename to MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/data/MyKSuiteData.kt index cdab3026..bd9ac78d 100644 --- a/MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/network/MyKSuiteData.kt +++ b/MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/data/MyKSuiteData.kt @@ -15,7 +15,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package com.infomaniak.core.myksuite.ui.network +package com.infomaniak.core.myksuite.ui.data import androidx.room.ColumnInfo import androidx.room.Embedded @@ -33,19 +33,20 @@ data class MyKSuiteData( @ColumnInfo("pack_id") val kSuitePackId: Int, @SerialName("pack") - @ColumnInfo("k_suite_pack_") @Embedded("k_suite_pack_") val kSuitePack: KSuitePack? = null, + @SerialName("trial_expiry_at") + val trialExpiryAt: Long? = null, @SerialName("is_free") @ColumnInfo("is_free") val isFree: Boolean, @Embedded("drive_") val drive: KSuiteDrive? = null, - @SerialName("free_mail") - @ColumnInfo("free_mail") - @Embedded("free_mail_") - val freeMail: KSuiteFreeMail? = null, + @Embedded("mail_") + val mail: KSuiteMail? = null, @SerialName("has_auto_renew") @ColumnInfo("has_auto_renew") val hasAutoRenew: Boolean, + @SerialName("can_trial") + val canTrial: Boolean, ) diff --git a/MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/data/MyKSuiteDataDao.kt b/MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/data/MyKSuiteDataDao.kt new file mode 100644 index 00000000..f2a3a7c0 --- /dev/null +++ b/MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/data/MyKSuiteDataDao.kt @@ -0,0 +1,39 @@ +/* + * Infomaniak Core - 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 . + */ +package com.infomaniak.core.myksuite.ui.data + +import androidx.room.Dao +import androidx.room.Delete +import androidx.room.Query +import androidx.room.Upsert + +@Dao +interface MyKSuiteDataDao { + + @Query("SELECT * FROM MyKSuiteData") + suspend fun getAll(): List + + @Query("SELECT * FROM MyKSuiteData WHERE id = :id LIMIT 1") + suspend fun findById(id: Int): MyKSuiteData? + + @Upsert + suspend fun upsert(data: MyKSuiteData) + + @Delete + suspend fun delete(data: MyKSuiteData) +} diff --git a/MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/data/MyKSuiteDataManager.kt b/MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/data/MyKSuiteDataManager.kt new file mode 100644 index 00000000..8f0c9b25 --- /dev/null +++ b/MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/data/MyKSuiteDataManager.kt @@ -0,0 +1,44 @@ +/* + * Infomaniak Core - 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 . + */ +package com.infomaniak.core.myksuite.ui.data + +import android.content.Context + +abstract class MyKSuiteDataManager { + + abstract var currentMyKSuiteId: Int + abstract var currentMyKSuite: MyKSuiteData? + + private var myKSuiteDatabase: MyKSuiteDatabase? = null + + fun initDatabase(appContext: Context) { + myKSuiteDatabase = MyKSuiteDatabase.getDatabase(appContext) + } + + suspend fun getKSuiteData(id: Int): MyKSuiteData? = myKSuiteDatabase?.myKSuiteDataDao()?.findById(id) + + suspend fun upsertKSuiteData(kSuiteData: MyKSuiteData) { + currentMyKSuite = kSuiteData + myKSuiteDatabase?.myKSuiteDataDao()?.upsert(kSuiteData) + } + + suspend fun deleteKSuiteData(kSuiteData: MyKSuiteData) { + currentMyKSuite = null + myKSuiteDatabase?.myKSuiteDataDao()?.delete(kSuiteData) + } +} diff --git a/MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/data/MyKSuiteDatabase.kt b/MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/data/MyKSuiteDatabase.kt new file mode 100644 index 00000000..47ce2f68 --- /dev/null +++ b/MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/data/MyKSuiteDatabase.kt @@ -0,0 +1,54 @@ +/* + * Infomaniak Core - 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 . + */ +package com.infomaniak.core.myksuite.ui.data + +import android.content.Context +import androidx.room.Database +import androidx.room.Room +import androidx.room.RoomDatabase + +@Database( + entities = [MyKSuiteData::class], + version = 1, + exportSchema = true, +) +abstract class MyKSuiteDatabase : RoomDatabase() { + + abstract fun myKSuiteDataDao(): MyKSuiteDataDao + + companion object { + + @Volatile + private var INSTANCE: MyKSuiteDatabase? = null + + fun getDatabase(context: Context): MyKSuiteDatabase { + return INSTANCE ?: synchronized(this) { + val instance = Room.databaseBuilder( + context = context.applicationContext, + klass = MyKSuiteDatabase::class.java, + name = "my_ksuite_database", + ).apply { + fallbackToDestructiveMigration() + }.build() + + INSTANCE = instance + instance + } + } + } +} diff --git a/MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/network/kSuiteDrive.kt b/MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/data/kSuiteDrive.kt similarity index 95% rename from MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/network/kSuiteDrive.kt rename to MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/data/kSuiteDrive.kt index 6bd32e4b..c31690bc 100644 --- a/MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/network/kSuiteDrive.kt +++ b/MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/data/kSuiteDrive.kt @@ -15,7 +15,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package com.infomaniak.core.myksuite.ui.network +package com.infomaniak.core.myksuite.ui.data import androidx.room.ColumnInfo import kotlinx.serialization.SerialName diff --git a/MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/network/kSuiteFreeMail.kt b/MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/data/kSuiteMail.kt similarity index 94% rename from MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/network/kSuiteFreeMail.kt rename to MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/data/kSuiteMail.kt index 9d32f6aa..7d39fcdc 100644 --- a/MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/network/kSuiteFreeMail.kt +++ b/MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/data/kSuiteMail.kt @@ -15,14 +15,14 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package com.infomaniak.core.myksuite.ui.network +package com.infomaniak.core.myksuite.ui.data import androidx.room.ColumnInfo import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @Serializable -data class KSuiteFreeMail( +data class KSuiteMail( val id: Int, val email: String, @SerialName("daily_limit_sent") From 39ff633fd660011c0e34c67d4e2c292ce2af7d39 Mon Sep 17 00:00:00 2001 From: Fabian DEVEL Date: Fri, 7 Feb 2025 11:32:44 +0100 Subject: [PATCH 5/6] feat(MyKSuiteApiModel): Update models and add userId to fetch it from the db --- .../1.json | 48 ++++++++++++------- .../core/myksuite/ui/data/KSuitePack.kt | 13 ++++- .../core/myksuite/ui/data/MyKSuiteData.kt | 19 ++++++-- .../core/myksuite/ui/data/MyKSuiteDataDao.kt | 3 ++ .../myksuite/ui/data/MyKSuiteDataManager.kt | 20 +++++--- .../core/myksuite/ui/data/kSuiteMail.kt | 3 +- 6 files changed, 76 insertions(+), 30 deletions(-) diff --git a/MykSuite/schemas/com.infomaniak.core.myksuite.ui.data.MyKSuiteDatabase/1.json b/MykSuite/schemas/com.infomaniak.core.myksuite.ui.data.MyKSuiteDatabase/1.json index 1e1f903e..21cabad0 100644 --- a/MykSuite/schemas/com.infomaniak.core.myksuite.ui.data.MyKSuiteDatabase/1.json +++ b/MykSuite/schemas/com.infomaniak.core.myksuite.ui.data.MyKSuiteDatabase/1.json @@ -2,11 +2,11 @@ "formatVersion": 1, "database": { "version": 1, - "identityHash": "86b21a614c09732158d40111fcd5cdc6", + "identityHash": "7b5e43bd9cc17b034cf90891e63090d7", "entities": [ { "tableName": "MyKSuiteData", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER NOT NULL, `status` TEXT NOT NULL, `pack_id` INTEGER NOT NULL, `trialExpiryAt` INTEGER, `is_free` INTEGER NOT NULL, `has_auto_renew` INTEGER NOT NULL, `canTrial` INTEGER NOT NULL, `k_suite_pack_id` INTEGER, `k_suite_pack_name` TEXT, `k_suite_pack_drive_storage` INTEGER, `k_suite_pack_mail_storage` INTEGER, `k_suite_pack_mail_daily_limit_send` INTEGER, `k_suite_pack_is_max_storage_offer` INTEGER, `drive_id` INTEGER, `drive_name` TEXT, `drive_size` INTEGER, `drive_used_size` INTEGER, `mail_id` INTEGER, `mail_email` TEXT, `mail_daily_limit_sent` INTEGER, `mail_storage_size_limit` INTEGER, `mail_used_size` INTEGER, PRIMARY KEY(`id`))", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER NOT NULL, `status` TEXT NOT NULL, `pack_id` INTEGER NOT NULL, `trialExpiryAt` INTEGER, `is_free` INTEGER NOT NULL, `has_auto_renew` INTEGER NOT NULL, `canTrial` INTEGER NOT NULL, `user_id` INTEGER NOT NULL, `k_suite_pack_id` INTEGER NOT NULL, `k_suite_pack_name` TEXT NOT NULL, `k_suite_pack_drive_storage` INTEGER NOT NULL, `k_suite_pack_mail_storage` INTEGER NOT NULL, `k_suite_pack_mail_daily_limit_send` INTEGER NOT NULL, `k_suite_pack_is_max_storage_offer` INTEGER NOT NULL, `drive_id` INTEGER NOT NULL, `drive_name` TEXT NOT NULL, `drive_size` INTEGER NOT NULL, `drive_used_size` INTEGER NOT NULL, `mail_id` INTEGER NOT NULL, `mail_email` TEXT NOT NULL, `mail_daily_limit_sent` INTEGER NOT NULL, `mail_storage_size_limit` INTEGER NOT NULL, `mail_used_size` INTEGER NOT NULL, `mail_mailboxId` INTEGER NOT NULL, PRIMARY KEY(`id`))", "fields": [ { "fieldPath": "id", @@ -50,95 +50,107 @@ "affinity": "INTEGER", "notNull": true }, + { + "fieldPath": "userId", + "columnName": "user_id", + "affinity": "INTEGER", + "notNull": true + }, { "fieldPath": "kSuitePack.id", "columnName": "k_suite_pack_id", "affinity": "INTEGER", - "notNull": false + "notNull": true }, { "fieldPath": "kSuitePack.name", "columnName": "k_suite_pack_name", "affinity": "TEXT", - "notNull": false + "notNull": true }, { "fieldPath": "kSuitePack.driveStorage", "columnName": "k_suite_pack_drive_storage", "affinity": "INTEGER", - "notNull": false + "notNull": true }, { "fieldPath": "kSuitePack.mailStorage", "columnName": "k_suite_pack_mail_storage", "affinity": "INTEGER", - "notNull": false + "notNull": true }, { "fieldPath": "kSuitePack.mailDailyLimitSend", "columnName": "k_suite_pack_mail_daily_limit_send", "affinity": "INTEGER", - "notNull": false + "notNull": true }, { "fieldPath": "kSuitePack.isMaxStorageOffer", "columnName": "k_suite_pack_is_max_storage_offer", "affinity": "INTEGER", - "notNull": false + "notNull": true }, { "fieldPath": "drive.id", "columnName": "drive_id", "affinity": "INTEGER", - "notNull": false + "notNull": true }, { "fieldPath": "drive.name", "columnName": "drive_name", "affinity": "TEXT", - "notNull": false + "notNull": true }, { "fieldPath": "drive.size", "columnName": "drive_size", "affinity": "INTEGER", - "notNull": false + "notNull": true }, { "fieldPath": "drive.usedSize", "columnName": "drive_used_size", "affinity": "INTEGER", - "notNull": false + "notNull": true }, { "fieldPath": "mail.id", "columnName": "mail_id", "affinity": "INTEGER", - "notNull": false + "notNull": true }, { "fieldPath": "mail.email", "columnName": "mail_email", "affinity": "TEXT", - "notNull": false + "notNull": true }, { "fieldPath": "mail.dailyLimitSent", "columnName": "mail_daily_limit_sent", "affinity": "INTEGER", - "notNull": false + "notNull": true }, { "fieldPath": "mail.storageSizeLimit", "columnName": "mail_storage_size_limit", "affinity": "INTEGER", - "notNull": false + "notNull": true }, { "fieldPath": "mail.usedSize", "columnName": "mail_used_size", "affinity": "INTEGER", - "notNull": false + "notNull": true + }, + { + "fieldPath": "mail.mailboxId", + "columnName": "mail_mailboxId", + "affinity": "INTEGER", + "notNull": true } ], "primaryKey": { @@ -154,7 +166,7 @@ "views": [], "setupQueries": [ "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)", - "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '86b21a614c09732158d40111fcd5cdc6')" + "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '7b5e43bd9cc17b034cf90891e63090d7')" ] } } \ No newline at end of file diff --git a/MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/data/KSuitePack.kt b/MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/data/KSuitePack.kt index f5d07c9d..36447910 100644 --- a/MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/data/KSuitePack.kt +++ b/MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/data/KSuitePack.kt @@ -17,7 +17,9 @@ */ package com.infomaniak.core.myksuite.ui.data +import androidx.annotation.StringRes import androidx.room.ColumnInfo +import com.infomaniak.core.myksuite.R import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @@ -37,4 +39,13 @@ data class KSuitePack( @SerialName("is_max_storage_offer") @ColumnInfo("is_max_storage_offer") val isMaxStorageOffer: Boolean = false, -) +) { + + val type get() = runCatching { enumValueOf(name.uppercase()) }.getOrNull() + + enum class KSuitePackType(@StringRes val displayNameRes: Int) { + MY_KSUITE(R.string.myKSuiteName), + MY_KSUITE_PLUS(R.string.myKSuitePlusName), + MY_KSUITE_PLUS_DRIVE_SOLO(R.string.myKSuitePlusName), + } +} diff --git a/MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/data/MyKSuiteData.kt b/MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/data/MyKSuiteData.kt index bd9ac78d..01291977 100644 --- a/MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/data/MyKSuiteData.kt +++ b/MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/data/MyKSuiteData.kt @@ -23,6 +23,7 @@ import androidx.room.Entity import androidx.room.PrimaryKey import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable +import kotlinx.serialization.Transient @Serializable @Entity @@ -34,19 +35,29 @@ data class MyKSuiteData( val kSuitePackId: Int, @SerialName("pack") @Embedded("k_suite_pack_") - val kSuitePack: KSuitePack? = null, + val kSuitePack: KSuitePack, @SerialName("trial_expiry_at") val trialExpiryAt: Long? = null, @SerialName("is_free") @ColumnInfo("is_free") val isFree: Boolean, @Embedded("drive_") - val drive: KSuiteDrive? = null, + val drive: KSuiteDrive, @Embedded("mail_") - val mail: KSuiteMail? = null, + val mail: KSuiteMail, @SerialName("has_auto_renew") @ColumnInfo("has_auto_renew") val hasAutoRenew: Boolean, @SerialName("can_trial") val canTrial: Boolean, -) +) { + + @Transient + @ColumnInfo("user_id") + var userId: Int = 0 + + val isMyKSuite get() = kSuitePack.type == KSuitePack.KSuitePackType.MY_KSUITE + val isMyKSuitePlus + get() = kSuitePack.type == KSuitePack.KSuitePackType.MY_KSUITE_PLUS || + kSuitePack.type == KSuitePack.KSuitePackType.MY_KSUITE_PLUS_DRIVE_SOLO +} diff --git a/MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/data/MyKSuiteDataDao.kt b/MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/data/MyKSuiteDataDao.kt index f2a3a7c0..2e3b2c30 100644 --- a/MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/data/MyKSuiteDataDao.kt +++ b/MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/data/MyKSuiteDataDao.kt @@ -31,6 +31,9 @@ interface MyKSuiteDataDao { @Query("SELECT * FROM MyKSuiteData WHERE id = :id LIMIT 1") suspend fun findById(id: Int): MyKSuiteData? + @Query("SELECT * FROM MyKSuiteData WHERE user_id = :userId LIMIT 1") + suspend fun findByUserId(userId: Int): MyKSuiteData? + @Upsert suspend fun upsert(data: MyKSuiteData) diff --git a/MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/data/MyKSuiteDataManager.kt b/MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/data/MyKSuiteDataManager.kt index 8f0c9b25..944a5045 100644 --- a/MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/data/MyKSuiteDataManager.kt +++ b/MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/data/MyKSuiteDataManager.kt @@ -21,8 +21,9 @@ import android.content.Context abstract class MyKSuiteDataManager { - abstract var currentMyKSuiteId: Int - abstract var currentMyKSuite: MyKSuiteData? + abstract var myKSuiteId: Int + abstract var myKSuite: MyKSuiteData? + abstract val userId: Int private var myKSuiteDatabase: MyKSuiteDatabase? = null @@ -30,15 +31,22 @@ abstract class MyKSuiteDataManager { myKSuiteDatabase = MyKSuiteDatabase.getDatabase(appContext) } - suspend fun getKSuiteData(id: Int): MyKSuiteData? = myKSuiteDatabase?.myKSuiteDataDao()?.findById(id) + suspend fun requestKSuiteData(id: Int? = null) { + myKSuite = id?.let { getKSuiteData(it) } ?: getKSuiteDataByUser() + } suspend fun upsertKSuiteData(kSuiteData: MyKSuiteData) { - currentMyKSuite = kSuiteData - myKSuiteDatabase?.myKSuiteDataDao()?.upsert(kSuiteData) + myKSuite = kSuiteData + myKSuiteDatabase?.myKSuiteDataDao()?.upsert(kSuiteData.apply { userId = this@MyKSuiteDataManager.userId }) } suspend fun deleteKSuiteData(kSuiteData: MyKSuiteData) { - currentMyKSuite = null + myKSuite = null myKSuiteDatabase?.myKSuiteDataDao()?.delete(kSuiteData) } + + // TODO remove if not useful + private suspend fun getKSuiteData(id: Int) = myKSuiteDatabase?.myKSuiteDataDao()?.findById(id) + + private suspend fun getKSuiteDataByUser() = myKSuiteDatabase?.myKSuiteDataDao()?.findByUserId(userId) } diff --git a/MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/data/kSuiteMail.kt b/MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/data/kSuiteMail.kt index 7d39fcdc..fc72c841 100644 --- a/MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/data/kSuiteMail.kt +++ b/MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/data/kSuiteMail.kt @@ -34,5 +34,6 @@ data class KSuiteMail( @SerialName("used_size") @ColumnInfo("used_size") val usedSize: Long, + @SerialName("mailbox_id") + val mailboxId: Int, ) - From 1714450d2165c3b6981f4f655b1e9be850a763cd Mon Sep 17 00:00:00 2001 From: Fabian DEVEL Date: Wed, 19 Feb 2025 08:02:26 +0100 Subject: [PATCH 6/6] chore(MyKSuiteApiModel): Clean code --- MykSuite/build.gradle.kts | 2 +- .../java/com/infomaniak/core/myksuite/ui/data/MyKSuiteData.kt | 2 ++ .../com/infomaniak/core/myksuite/ui/data/MyKSuiteDataManager.kt | 1 - 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/MykSuite/build.gradle.kts b/MykSuite/build.gradle.kts index f7c1a3df..5070ae57 100644 --- a/MykSuite/build.gradle.kts +++ b/MykSuite/build.gradle.kts @@ -2,9 +2,9 @@ plugins { id("com.android.library") alias(core.plugins.kotlin.android) alias(core.plugins.compose.compiler) + alias(core.plugins.ksp) kotlin("plugin.parcelize") kotlin("plugin.serialization") version core.versions.kotlin - alias(core.plugins.ksp) id("androidx.navigation.safeargs.kotlin") } diff --git a/MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/data/MyKSuiteData.kt b/MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/data/MyKSuiteData.kt index 01291977..9d50bb6e 100644 --- a/MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/data/MyKSuiteData.kt +++ b/MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/data/MyKSuiteData.kt @@ -37,6 +37,7 @@ data class MyKSuiteData( @Embedded("k_suite_pack_") val kSuitePack: KSuitePack, @SerialName("trial_expiry_at") + @ColumnInfo("trial_expiry_at") val trialExpiryAt: Long? = null, @SerialName("is_free") @ColumnInfo("is_free") @@ -49,6 +50,7 @@ data class MyKSuiteData( @ColumnInfo("has_auto_renew") val hasAutoRenew: Boolean, @SerialName("can_trial") + @ColumnInfo("can_trial") val canTrial: Boolean, ) { diff --git a/MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/data/MyKSuiteDataManager.kt b/MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/data/MyKSuiteDataManager.kt index 944a5045..b4d5e9b1 100644 --- a/MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/data/MyKSuiteDataManager.kt +++ b/MykSuite/src/main/java/com/infomaniak/core/myksuite/ui/data/MyKSuiteDataManager.kt @@ -45,7 +45,6 @@ abstract class MyKSuiteDataManager { myKSuiteDatabase?.myKSuiteDataDao()?.delete(kSuiteData) } - // TODO remove if not useful private suspend fun getKSuiteData(id: Int) = myKSuiteDatabase?.myKSuiteDataDao()?.findById(id) private suspend fun getKSuiteDataByUser() = myKSuiteDatabase?.myKSuiteDataDao()?.findByUserId(userId)