From 726f08a7105995f2dbd96158e3c83841eb132755 Mon Sep 17 00:00:00 2001 From: Fabian DEVEL Date: Fri, 21 Feb 2025 13:43:42 +0100 Subject: [PATCH 1/7] feat(Dashboard): Rearrange settings, fix some small padding issues and open Dashboard --- .idea/navEditor.xml | 48 +- .../ui/menu/settings/SettingsFragment.kt | 33 ++ app/src/main/res/layout/fragment_settings.xml | 494 ++++++++++-------- 3 files changed, 334 insertions(+), 241 deletions(-) diff --git a/.idea/navEditor.xml b/.idea/navEditor.xml index 11226bbe99..a4094ca280 100644 --- a/.idea/navEditor.xml +++ b/.idea/navEditor.xml @@ -303,18 +303,6 @@ - - - - - - - @@ -443,18 +431,6 @@ - - - - - - - @@ -875,6 +851,18 @@ + + + + + + + @@ -1143,18 +1131,6 @@ - - - - - - - diff --git a/app/src/main/java/com/infomaniak/drive/ui/menu/settings/SettingsFragment.kt b/app/src/main/java/com/infomaniak/drive/ui/menu/settings/SettingsFragment.kt index a12013aff1..eb259e7b1a 100644 --- a/app/src/main/java/com/infomaniak/drive/ui/menu/settings/SettingsFragment.kt +++ b/app/src/main/java/com/infomaniak/drive/ui/menu/settings/SettingsFragment.kt @@ -28,6 +28,10 @@ import androidx.core.view.isVisible import androidx.fragment.app.Fragment import androidx.navigation.fragment.findNavController import com.google.android.material.dialog.MaterialAlertDialogBuilder +import com.infomaniak.core.myksuite.ui.components.MyKSuiteTier +import com.infomaniak.core.myksuite.ui.screens.MyKSuiteDashboardScreenData +import com.infomaniak.core.myksuite.ui.screens.components.KSuiteProductsWithQuotas +import com.infomaniak.core.myksuite.ui.utils.MyKSuiteUiUtils.openMyKSuiteDashboard import com.infomaniak.drive.MatomoDrive.toFloat import com.infomaniak.drive.MatomoDrive.trackEvent import com.infomaniak.drive.R @@ -42,6 +46,7 @@ import com.infomaniak.lib.applock.LockActivity import com.infomaniak.lib.core.utils.openAppNotificationSettings import com.infomaniak.lib.core.utils.safeBinding import com.infomaniak.lib.core.utils.safeNavigate +import java.util.Date class SettingsFragment : Fragment() { @@ -69,6 +74,34 @@ class SettingsFragment : Fragment() { requireActivity().launchAllUpload(drivePermissions) } + AccountUtils.getCurrentDrive()?.let { drive -> + myKSuiteSettingsTitle.setText(if (drive.isFreeTier) R.string.myKSuiteName else R.string.myKSuitePlusName) + } + + dashboardSettings.setOnClickListener { + trackSettingsEvent("openMyKSuiteDashboard") + findNavController().openMyKSuiteDashboard( + MyKSuiteDashboardScreenData( + myKSuiteTier = MyKSuiteTier.Plus, + email = "", + dailySendingLimit = "500", + kSuiteProductsWithQuotas = listOf( + KSuiteProductsWithQuotas.Drive( + driveUsedSize = "0", + driveMaxSize = "1 To", + driveProgress = 0.5f, + ), + KSuiteProductsWithQuotas.Mail( + mailUsedSize = "0", + mailMaxSize = "1 To", + mailProgress = 0.5f, + ), + ), + trialExpiryAt = Date().time, + ) + ) + } + syncPicture.setOnClickListener { safeNavigate(R.id.syncSettingsActivity) } diff --git a/app/src/main/res/layout/fragment_settings.xml b/app/src/main/res/layout/fragment_settings.xml index dfaa6d2138..92f57daf0f 100644 --- a/app/src/main/res/layout/fragment_settings.xml +++ b/app/src/main/res/layout/fragment_settings.xml @@ -45,233 +45,317 @@ android:layout_height="match_parent" app:layout_behavior="@string/appbar_scrolling_view_behavior"> - + android:layout_height="match_parent" + android:layout_marginVertical="@dimen/marginStandard" + android:orientation="vertical"> - - - - - - - - - - - - - + android:layout_height="wrap_content" + android:layout_marginHorizontal="@dimen/marginStandard" + android:layout_marginBottom="@dimen/marginStandardMedium" + tools:text="@string/myKSuiteName" /> - - - - - - - + - + android:layout_height="match_parent" + android:orientation="vertical"> - - - - + tools:text="ellen.ripley@ik.me" /> - - - - - + - - - - - + android:background="?selectableItemBackground" + android:padding="20dp"> + + + + + + + + + + + + + - + android:layout_height="match_parent" + android:orientation="vertical"> - - - + + + + + + + + + + - - + + + + + + + + + + - - - - - - - - + + + + + + + + + + - - + + + + + + + + + + - - - - + android:background="?selectableItemBackground" + android:paddingHorizontal="@dimen/marginStandard" + android:paddingTop="@dimen/marginStandardSmall" + android:paddingBottom="@dimen/marginStandard"> + + + + + + + + + + + + + + + + + + + + + From 22d967ab60e6d561bcb72c45aa7d315346c9c540 Mon Sep 17 00:00:00 2001 From: Fabian DEVEL Date: Fri, 21 Feb 2025 14:52:12 +0100 Subject: [PATCH 2/7] feat(Dashboard): Add the database, fetch of data and logic to populate the Dashboard --- .../com/infomaniak/drive/MainApplication.kt | 3 + .../drive/data/api/ApiRepository.kt | 10 ++++ .../com/infomaniak/drive/ui/MainActivity.kt | 1 + .../com/infomaniak/drive/ui/MainViewModel.kt | 4 ++ .../ui/menu/settings/SettingsFragment.kt | 58 +++++++++---------- .../infomaniak/drive/utils/AccountUtils.kt | 1 + .../drive/utils/MyKSuiteDataUtils.kt | 57 ++++++++++++++++++ app/src/main/res/layout/fragment_settings.xml | 1 + 8 files changed, 104 insertions(+), 31 deletions(-) create mode 100644 app/src/main/java/com/infomaniak/drive/utils/MyKSuiteDataUtils.kt diff --git a/app/src/main/java/com/infomaniak/drive/MainApplication.kt b/app/src/main/java/com/infomaniak/drive/MainApplication.kt index 36c7327cbc..a22ec0338d 100644 --- a/app/src/main/java/com/infomaniak/drive/MainApplication.kt +++ b/app/src/main/java/com/infomaniak/drive/MainApplication.kt @@ -44,6 +44,7 @@ import com.infomaniak.drive.data.models.UiSettings import com.infomaniak.drive.data.services.MqttClientWrapper import com.infomaniak.drive.ui.LaunchActivity import com.infomaniak.drive.utils.AccountUtils +import com.infomaniak.drive.utils.MyKSuiteDataUtils import com.infomaniak.drive.utils.NotificationUtils.buildGeneralNotification import com.infomaniak.drive.utils.NotificationUtils.initNotificationChannel import com.infomaniak.drive.utils.NotificationUtils.notifyCompat @@ -146,6 +147,8 @@ class MainApplication : Application(), ImageLoaderFactory, DefaultLifecycleObser ) HttpClient.init(tokenInterceptorListener) MqttClientWrapper.init(applicationContext) + + MyKSuiteDataUtils.initDatabase(this) } override fun onStart(owner: LifecycleOwner) { diff --git a/app/src/main/java/com/infomaniak/drive/data/api/ApiRepository.kt b/app/src/main/java/com/infomaniak/drive/data/api/ApiRepository.kt index 2a49a54f87..4eb52dc298 100644 --- a/app/src/main/java/com/infomaniak/drive/data/api/ApiRepository.kt +++ b/app/src/main/java/com/infomaniak/drive/data/api/ApiRepository.kt @@ -19,6 +19,7 @@ package com.infomaniak.drive.data.api import androidx.collection.arrayMapOf import com.google.gson.JsonElement +import com.infomaniak.core.myksuite.ui.data.MyKSuiteData import com.infomaniak.drive.data.api.UploadTask.Companion.ConflictOption import com.infomaniak.drive.data.models.* import com.infomaniak.drive.data.models.ArchiveUUID.ArchiveBody @@ -509,6 +510,15 @@ object ApiRepository : ApiRepositoryCore() { return callApi(ApiRoutes.cancelExternalImport(driveId, importId), PUT) } + fun getMyKSuiteData(okHttpClient: OkHttpClient): ApiResponse { + return callApi( + url = com.infomaniak.core.myksuite.ui.network.ApiRoutes.myKSuiteData(), + method = ApiController.ApiMethod.GET, + okHttpClient = okHttpClient, + useKotlinxSerialization = true, + ) + } + private fun pagination(page: Int, perPage: Int = PER_PAGE) = "page=$page&per_page=$perPage" private fun loadCursor(cursor: String?, perPage: Int = PER_PAGE): String { diff --git a/app/src/main/java/com/infomaniak/drive/ui/MainActivity.kt b/app/src/main/java/com/infomaniak/drive/ui/MainActivity.kt index 3a72897a45..58bf627cac 100644 --- a/app/src/main/java/com/infomaniak/drive/ui/MainActivity.kt +++ b/app/src/main/java/com/infomaniak/drive/ui/MainActivity.kt @@ -204,6 +204,7 @@ class MainActivity : BaseActivity() { override fun onStart() { super.onStart() mainViewModel.loadRootFiles() + mainViewModel.fetchMyKSuiteData() handleDeletionOfUploadedPhotos() } diff --git a/app/src/main/java/com/infomaniak/drive/ui/MainViewModel.kt b/app/src/main/java/com/infomaniak/drive/ui/MainViewModel.kt index 7a536b4550..653f0b5dad 100644 --- a/app/src/main/java/com/infomaniak/drive/ui/MainViewModel.kt +++ b/app/src/main/java/com/infomaniak/drive/ui/MainViewModel.kt @@ -638,6 +638,10 @@ class MainViewModel( withContext(Dispatchers.Main) { onUserSwitched() } } + fun fetchMyKSuiteData() = viewModelScope.launch(Dispatchers.IO) { + MyKSuiteDataUtils.fetchMyKSuiteData() + } + override fun onCleared() { realm.close() super.onCleared() diff --git a/app/src/main/java/com/infomaniak/drive/ui/menu/settings/SettingsFragment.kt b/app/src/main/java/com/infomaniak/drive/ui/menu/settings/SettingsFragment.kt index eb259e7b1a..d669e96396 100644 --- a/app/src/main/java/com/infomaniak/drive/ui/menu/settings/SettingsFragment.kt +++ b/app/src/main/java/com/infomaniak/drive/ui/menu/settings/SettingsFragment.kt @@ -28,9 +28,7 @@ import androidx.core.view.isVisible import androidx.fragment.app.Fragment import androidx.navigation.fragment.findNavController import com.google.android.material.dialog.MaterialAlertDialogBuilder -import com.infomaniak.core.myksuite.ui.components.MyKSuiteTier -import com.infomaniak.core.myksuite.ui.screens.MyKSuiteDashboardScreenData -import com.infomaniak.core.myksuite.ui.screens.components.KSuiteProductsWithQuotas +import com.infomaniak.core.myksuite.ui.utils.MyKSuiteUiUtils import com.infomaniak.core.myksuite.ui.utils.MyKSuiteUiUtils.openMyKSuiteDashboard import com.infomaniak.drive.MatomoDrive.toFloat import com.infomaniak.drive.MatomoDrive.trackEvent @@ -40,13 +38,13 @@ import com.infomaniak.drive.data.models.UiSettings import com.infomaniak.drive.databinding.FragmentSettingsBinding import com.infomaniak.drive.utils.AccountUtils import com.infomaniak.drive.utils.DrivePermissions +import com.infomaniak.drive.utils.MyKSuiteDataUtils import com.infomaniak.drive.utils.SyncUtils.launchAllUpload import com.infomaniak.drive.utils.SyncUtils.syncImmediately import com.infomaniak.lib.applock.LockActivity import com.infomaniak.lib.core.utils.openAppNotificationSettings import com.infomaniak.lib.core.utils.safeBinding import com.infomaniak.lib.core.utils.safeNavigate -import java.util.Date class SettingsFragment : Fragment() { @@ -74,33 +72,7 @@ class SettingsFragment : Fragment() { requireActivity().launchAllUpload(drivePermissions) } - AccountUtils.getCurrentDrive()?.let { drive -> - myKSuiteSettingsTitle.setText(if (drive.isFreeTier) R.string.myKSuiteName else R.string.myKSuitePlusName) - } - - dashboardSettings.setOnClickListener { - trackSettingsEvent("openMyKSuiteDashboard") - findNavController().openMyKSuiteDashboard( - MyKSuiteDashboardScreenData( - myKSuiteTier = MyKSuiteTier.Plus, - email = "", - dailySendingLimit = "500", - kSuiteProductsWithQuotas = listOf( - KSuiteProductsWithQuotas.Drive( - driveUsedSize = "0", - driveMaxSize = "1 To", - driveProgress = 0.5f, - ), - KSuiteProductsWithQuotas.Mail( - mailUsedSize = "0", - mailMaxSize = "1 To", - mailProgress = 0.5f, - ), - ), - trialExpiryAt = Date().time, - ) - ) - } + setupMyKSuiteLayout() syncPicture.setOnClickListener { safeNavigate(R.id.syncSettingsActivity) @@ -129,6 +101,30 @@ class SettingsFragment : Fragment() { } } + private fun toggleMyKSuiteLayoutVisibility(isVisible: Boolean) { + binding.myKSuiteSettingsTitle.isVisible = isVisible + binding.myKSuiteLayout.isVisible = isVisible + } + + private fun setupMyKSuiteLayout() = with(binding) { + toggleMyKSuiteLayoutVisibility(MyKSuiteDataUtils.myKSuite != null) + + MyKSuiteDataUtils.myKSuite?.let { myKSuiteData -> + + myKSuiteSettingsEmail.text = myKSuiteData.mail.email + + AccountUtils.getCurrentDrive()?.let { drive -> + myKSuiteSettingsTitle.setText(if (drive.isFreeTier) R.string.myKSuiteName else R.string.myKSuitePlusName) + } + + dashboardSettings.setOnClickListener { + trackSettingsEvent("openMyKSuiteDashboard") + val data = MyKSuiteUiUtils.getDashboardData(requireContext(), myKSuiteData, AccountUtils.currentUser?.avatar) + findNavController().openMyKSuiteDashboard(data) + } + } + } + private fun openThemeSettings() { val items = arrayOf( getString(R.string.themeSettingsLightLabel), diff --git a/app/src/main/java/com/infomaniak/drive/utils/AccountUtils.kt b/app/src/main/java/com/infomaniak/drive/utils/AccountUtils.kt index d5103c2004..ced6ba4971 100644 --- a/app/src/main/java/com/infomaniak/drive/utils/AccountUtils.kt +++ b/app/src/main/java/com/infomaniak/drive/utils/AccountUtils.kt @@ -203,6 +203,7 @@ object AccountUtils : CredentialManager() { } } + MyKSuiteDataUtils.deleteData(user.id) removeUser(context, user) } diff --git a/app/src/main/java/com/infomaniak/drive/utils/MyKSuiteDataUtils.kt b/app/src/main/java/com/infomaniak/drive/utils/MyKSuiteDataUtils.kt new file mode 100644 index 0000000000..9463f3f759 --- /dev/null +++ b/app/src/main/java/com/infomaniak/drive/utils/MyKSuiteDataUtils.kt @@ -0,0 +1,57 @@ +/* + * Infomaniak kDrive - 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.drive.utils + +import com.infomaniak.core.myksuite.ui.data.MyKSuiteData +import com.infomaniak.core.myksuite.ui.data.MyKSuiteDataManager +import com.infomaniak.lib.core.networking.HttpClient +import com.infomaniak.lib.core.utils.SentryLog +import com.infomaniak.drive.data.api.ApiRepository +import kotlinx.serialization.ExperimentalSerializationApi +import kotlinx.serialization.MissingFieldException +import kotlin.coroutines.cancellation.CancellationException + +object MyKSuiteDataUtils : MyKSuiteDataManager() { + + private val TAG = MyKSuiteDataUtils::class.simpleName.toString() + + override val currentUserId get() = AccountUtils.currentUserId + + override var myKSuite: MyKSuiteData? = null + + suspend fun fetchMyKSuiteData(): MyKSuiteData? = 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) + } + } + } + + return@runCatching apiResponse.data + }.getOrElse { exception -> + if (exception is CancellationException) throw exception + SentryLog.d(TAG, "Exception during myKSuite data fetch", exception) + null + } +} diff --git a/app/src/main/res/layout/fragment_settings.xml b/app/src/main/res/layout/fragment_settings.xml index 92f57daf0f..e92aea5124 100644 --- a/app/src/main/res/layout/fragment_settings.xml +++ b/app/src/main/res/layout/fragment_settings.xml @@ -61,6 +61,7 @@ tools:text="@string/myKSuiteName" /> Date: Mon, 24 Feb 2025 08:01:40 +0100 Subject: [PATCH 3/7] feat(Dashboard): Add kSuiteViewModel and fix navigation bar color for dashboard --- Core | 2 +- .../com/infomaniak/drive/ui/MainActivity.kt | 5 +-- .../com/infomaniak/drive/ui/MainViewModel.kt | 4 --- .../infomaniak/drive/ui/MyKSuiteViewModel.kt | 35 +++++++++++++++++++ .../drive/utils/MyKSuiteDataUtils.kt | 4 +-- 5 files changed, 41 insertions(+), 9 deletions(-) create mode 100644 app/src/main/java/com/infomaniak/drive/ui/MyKSuiteViewModel.kt diff --git a/Core b/Core index db4e2a0bcb..a21cf0bd64 160000 --- a/Core +++ b/Core @@ -1 +1 @@ -Subproject commit db4e2a0bcbc07befef8d5093d858949abba8b8ed +Subproject commit a21cf0bd64b87bcb28885246e1d745471f0be23a diff --git a/app/src/main/java/com/infomaniak/drive/ui/MainActivity.kt b/app/src/main/java/com/infomaniak/drive/ui/MainActivity.kt index 58bf627cac..223246660e 100644 --- a/app/src/main/java/com/infomaniak/drive/ui/MainActivity.kt +++ b/app/src/main/java/com/infomaniak/drive/ui/MainActivity.kt @@ -108,6 +108,7 @@ class MainActivity : BaseActivity() { private val binding by lazy { ActivityMainBinding.inflate(layoutInflater) } private val mainViewModel: MainViewModel by viewModels() + private val myKSuiteViewModel: MyKSuiteViewModel by viewModels() private val navigationArgs: MainActivityArgs? by lazy { intent?.extras?.let { MainActivityArgs.fromBundle(it) } } private val uiSettings by lazy { UiSettings(this) } private val navController by lazy { setupNavController() } @@ -204,7 +205,7 @@ class MainActivity : BaseActivity() { override fun onStart() { super.onStart() mainViewModel.loadRootFiles() - mainViewModel.fetchMyKSuiteData() + myKSuiteViewModel.refreshMyKSuite() handleDeletionOfUploadedPhotos() } @@ -440,7 +441,7 @@ class MainActivity : BaseActivity() { } when (destination.id) { - R.id.fileDetailsFragment -> { + R.id.fileDetailsFragment, com.infomaniak.core.myksuite.R.id.myKSuiteDashboardFragment -> { setColorNavigationBar(true) } R.id.fileShareLinkSettingsFragment -> { diff --git a/app/src/main/java/com/infomaniak/drive/ui/MainViewModel.kt b/app/src/main/java/com/infomaniak/drive/ui/MainViewModel.kt index 653f0b5dad..7a536b4550 100644 --- a/app/src/main/java/com/infomaniak/drive/ui/MainViewModel.kt +++ b/app/src/main/java/com/infomaniak/drive/ui/MainViewModel.kt @@ -638,10 +638,6 @@ class MainViewModel( withContext(Dispatchers.Main) { onUserSwitched() } } - fun fetchMyKSuiteData() = viewModelScope.launch(Dispatchers.IO) { - MyKSuiteDataUtils.fetchMyKSuiteData() - } - override fun onCleared() { realm.close() super.onCleared() diff --git a/app/src/main/java/com/infomaniak/drive/ui/MyKSuiteViewModel.kt b/app/src/main/java/com/infomaniak/drive/ui/MyKSuiteViewModel.kt new file mode 100644 index 0000000000..bb9b5b3408 --- /dev/null +++ b/app/src/main/java/com/infomaniak/drive/ui/MyKSuiteViewModel.kt @@ -0,0 +1,35 @@ +/* + * Infomaniak kDrive - 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.drive.ui + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.infomaniak.core.myksuite.ui.data.MyKSuiteData +import com.infomaniak.drive.utils.MyKSuiteDataUtils +import com.infomaniak.lib.core.utils.SingleLiveEvent +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch + +class MyKSuiteViewModel : ViewModel() { + + val myKSuiteDataResult = SingleLiveEvent() + + fun refreshMyKSuite() = viewModelScope.launch(Dispatchers.IO) { + myKSuiteDataResult.postValue(MyKSuiteDataUtils.fetchMyKSuiteData()) + } +} diff --git a/app/src/main/java/com/infomaniak/drive/utils/MyKSuiteDataUtils.kt b/app/src/main/java/com/infomaniak/drive/utils/MyKSuiteDataUtils.kt index 9463f3f759..460985c6f8 100644 --- a/app/src/main/java/com/infomaniak/drive/utils/MyKSuiteDataUtils.kt +++ b/app/src/main/java/com/infomaniak/drive/utils/MyKSuiteDataUtils.kt @@ -19,9 +19,9 @@ package com.infomaniak.drive.utils import com.infomaniak.core.myksuite.ui.data.MyKSuiteData import com.infomaniak.core.myksuite.ui.data.MyKSuiteDataManager +import com.infomaniak.drive.data.api.ApiRepository import com.infomaniak.lib.core.networking.HttpClient import com.infomaniak.lib.core.utils.SentryLog -import com.infomaniak.drive.data.api.ApiRepository import kotlinx.serialization.ExperimentalSerializationApi import kotlinx.serialization.MissingFieldException import kotlin.coroutines.cancellation.CancellationException @@ -34,7 +34,7 @@ object MyKSuiteDataUtils : MyKSuiteDataManager() { override var myKSuite: MyKSuiteData? = null - suspend fun fetchMyKSuiteData(): MyKSuiteData? = runCatching { + override suspend fun fetchMyKSuiteData(): MyKSuiteData? = runCatching { MyKSuiteDataUtils.requestKSuiteData() val apiResponse = ApiRepository.getMyKSuiteData(HttpClient.okHttpClient) if (apiResponse.data != null) { From a62746e7c1dc05871e92df6e1f4ad1c4c8d144d7 Mon Sep 17 00:00:00 2001 From: Fabian DEVEL Date: Mon, 24 Feb 2025 08:53:18 +0100 Subject: [PATCH 4/7] feat(Dashboard): Update dynamically the dashboard when navigating to it --- Core | 2 +- .../menu/settings/KSuiteDashboardFragment.kt | 48 +++++++++++++++++++ .../ui/menu/settings/SettingsFragment.kt | 15 ++++-- .../main/res/navigation/main_navigation.xml | 8 ++++ 4 files changed, 69 insertions(+), 4 deletions(-) create mode 100644 app/src/main/java/com/infomaniak/drive/ui/menu/settings/KSuiteDashboardFragment.kt diff --git a/Core b/Core index a21cf0bd64..1697ca2893 160000 --- a/Core +++ b/Core @@ -1 +1 @@ -Subproject commit a21cf0bd64b87bcb28885246e1d745471f0be23a +Subproject commit 1697ca289384604cc55d46cc4d9209f6bba440a7 diff --git a/app/src/main/java/com/infomaniak/drive/ui/menu/settings/KSuiteDashboardFragment.kt b/app/src/main/java/com/infomaniak/drive/ui/menu/settings/KSuiteDashboardFragment.kt new file mode 100644 index 0000000000..d1d556b14a --- /dev/null +++ b/app/src/main/java/com/infomaniak/drive/ui/menu/settings/KSuiteDashboardFragment.kt @@ -0,0 +1,48 @@ +/* + * Infomaniak kDrive - 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.drive.ui.menu.settings + +import android.os.Bundle +import android.view.View +import androidx.fragment.app.viewModels +import com.infomaniak.core.myksuite.ui.utils.MyKSuiteUiUtils.getDashboardData +import com.infomaniak.core.myksuite.ui.views.MyKSuiteDashboardFragment +import com.infomaniak.drive.ui.MyKSuiteViewModel +import com.infomaniak.drive.utils.AccountUtils + +class KSuiteDashboardFragment : MyKSuiteDashboardFragment() { + + private val myKSuiteViewModel: MyKSuiteViewModel by viewModels() + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + myKSuiteViewModel.refreshMyKSuite() + myKSuiteViewModel.myKSuiteDataResult.observe(viewLifecycleOwner) { myKSuiteData -> + if (myKSuiteData == null) return@observe + + resetContent( + dashboardData = getDashboardData( + context = requireContext(), + myKSuiteData = myKSuiteData, + avatarUri = AccountUtils.currentUser?.avatar ?: "", + ) + ) + } + } +} diff --git a/app/src/main/java/com/infomaniak/drive/ui/menu/settings/SettingsFragment.kt b/app/src/main/java/com/infomaniak/drive/ui/menu/settings/SettingsFragment.kt index d669e96396..5a189c9d3a 100644 --- a/app/src/main/java/com/infomaniak/drive/ui/menu/settings/SettingsFragment.kt +++ b/app/src/main/java/com/infomaniak/drive/ui/menu/settings/SettingsFragment.kt @@ -26,10 +26,12 @@ import androidx.collection.arrayMapOf import androidx.core.view.isGone import androidx.core.view.isVisible import androidx.fragment.app.Fragment +import androidx.navigation.NavController import androidx.navigation.fragment.findNavController import com.google.android.material.dialog.MaterialAlertDialogBuilder +import com.infomaniak.core.myksuite.ui.data.MyKSuiteData import com.infomaniak.core.myksuite.ui.utils.MyKSuiteUiUtils -import com.infomaniak.core.myksuite.ui.utils.MyKSuiteUiUtils.openMyKSuiteDashboard +import com.infomaniak.core.myksuite.ui.views.MyKSuiteDashboardFragmentArgs import com.infomaniak.drive.MatomoDrive.toFloat import com.infomaniak.drive.MatomoDrive.trackEvent import com.infomaniak.drive.R @@ -119,12 +121,19 @@ class SettingsFragment : Fragment() { dashboardSettings.setOnClickListener { trackSettingsEvent("openMyKSuiteDashboard") - val data = MyKSuiteUiUtils.getDashboardData(requireContext(), myKSuiteData, AccountUtils.currentUser?.avatar) - findNavController().openMyKSuiteDashboard(data) + findNavController().openMyKSuiteDashboard(myKSuiteData) } } } + private fun NavController.openMyKSuiteDashboard(myKSuiteData: MyKSuiteData) { + val data = MyKSuiteUiUtils.getDashboardData(requireContext(), myKSuiteData, AccountUtils.currentUser?.avatar) + navigate( + resId = R.id.myKSuiteDashboardFragment, + args = MyKSuiteDashboardFragmentArgs(dashboardData = data).toBundle(), + ) + } + private fun openThemeSettings() { val items = arrayOf( getString(R.string.themeSettingsLightLabel), diff --git a/app/src/main/res/navigation/main_navigation.xml b/app/src/main/res/navigation/main_navigation.xml index 6cd6cfa919..1b58b334a2 100644 --- a/app/src/main/res/navigation/main_navigation.xml +++ b/app/src/main/res/navigation/main_navigation.xml @@ -1051,4 +1051,12 @@ app:destination="@id/fileListFragment" /> + + + From 4691f3e4d17de7cf11927ddb2c2be0e98ba8280e Mon Sep 17 00:00:00 2001 From: Fabian DEVEL Date: Mon, 24 Feb 2025 09:09:23 +0100 Subject: [PATCH 5/7] feat(Dashboard): Add animation to enter fragment --- .../drive/ui/menu/settings/SettingsFragment.kt | 11 +++-------- app/src/main/res/navigation/main_navigation.xml | 5 +++++ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/com/infomaniak/drive/ui/menu/settings/SettingsFragment.kt b/app/src/main/java/com/infomaniak/drive/ui/menu/settings/SettingsFragment.kt index 5a189c9d3a..22e21db488 100644 --- a/app/src/main/java/com/infomaniak/drive/ui/menu/settings/SettingsFragment.kt +++ b/app/src/main/java/com/infomaniak/drive/ui/menu/settings/SettingsFragment.kt @@ -26,12 +26,10 @@ import androidx.collection.arrayMapOf import androidx.core.view.isGone import androidx.core.view.isVisible import androidx.fragment.app.Fragment -import androidx.navigation.NavController import androidx.navigation.fragment.findNavController import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.infomaniak.core.myksuite.ui.data.MyKSuiteData import com.infomaniak.core.myksuite.ui.utils.MyKSuiteUiUtils -import com.infomaniak.core.myksuite.ui.views.MyKSuiteDashboardFragmentArgs import com.infomaniak.drive.MatomoDrive.toFloat import com.infomaniak.drive.MatomoDrive.trackEvent import com.infomaniak.drive.R @@ -121,17 +119,14 @@ class SettingsFragment : Fragment() { dashboardSettings.setOnClickListener { trackSettingsEvent("openMyKSuiteDashboard") - findNavController().openMyKSuiteDashboard(myKSuiteData) + openMyKSuiteDashboard(myKSuiteData) } } } - private fun NavController.openMyKSuiteDashboard(myKSuiteData: MyKSuiteData) { + private fun openMyKSuiteDashboard(myKSuiteData: MyKSuiteData) { val data = MyKSuiteUiUtils.getDashboardData(requireContext(), myKSuiteData, AccountUtils.currentUser?.avatar) - navigate( - resId = R.id.myKSuiteDashboardFragment, - args = MyKSuiteDashboardFragmentArgs(dashboardData = data).toBundle(), - ) + safeNavigate(directions = SettingsFragmentDirections.actionSettingsFragmentToMyKSuiteDashboardFragment(data)) } private fun openThemeSettings() { diff --git a/app/src/main/res/navigation/main_navigation.xml b/app/src/main/res/navigation/main_navigation.xml index 1b58b334a2..b8959e9f8a 100644 --- a/app/src/main/res/navigation/main_navigation.xml +++ b/app/src/main/res/navigation/main_navigation.xml @@ -509,6 +509,11 @@ + Date: Mon, 24 Feb 2025 09:25:05 +0100 Subject: [PATCH 6/7] chore(DynamicDashboard): Update core --- Core | 2 +- .../main/java/com/infomaniak/drive/ui/MyKSuiteViewModel.kt | 2 +- .../drive/ui/menu/settings/KSuiteDashboardFragment.kt | 4 ++-- .../main/java/com/infomaniak/drive/utils/MyKSuiteDataUtils.kt | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Core b/Core index 1697ca2893..db4e2a0bcb 160000 --- a/Core +++ b/Core @@ -1 +1 @@ -Subproject commit 1697ca289384604cc55d46cc4d9209f6bba440a7 +Subproject commit db4e2a0bcbc07befef8d5093d858949abba8b8ed diff --git a/app/src/main/java/com/infomaniak/drive/ui/MyKSuiteViewModel.kt b/app/src/main/java/com/infomaniak/drive/ui/MyKSuiteViewModel.kt index bb9b5b3408..dd134ae079 100644 --- a/app/src/main/java/com/infomaniak/drive/ui/MyKSuiteViewModel.kt +++ b/app/src/main/java/com/infomaniak/drive/ui/MyKSuiteViewModel.kt @@ -30,6 +30,6 @@ class MyKSuiteViewModel : ViewModel() { val myKSuiteDataResult = SingleLiveEvent() fun refreshMyKSuite() = viewModelScope.launch(Dispatchers.IO) { - myKSuiteDataResult.postValue(MyKSuiteDataUtils.fetchMyKSuiteData()) + myKSuiteDataResult.postValue(MyKSuiteDataUtils.fetchData()) } } diff --git a/app/src/main/java/com/infomaniak/drive/ui/menu/settings/KSuiteDashboardFragment.kt b/app/src/main/java/com/infomaniak/drive/ui/menu/settings/KSuiteDashboardFragment.kt index d1d556b14a..efc406c699 100644 --- a/app/src/main/java/com/infomaniak/drive/ui/menu/settings/KSuiteDashboardFragment.kt +++ b/app/src/main/java/com/infomaniak/drive/ui/menu/settings/KSuiteDashboardFragment.kt @@ -20,7 +20,7 @@ package com.infomaniak.drive.ui.menu.settings import android.os.Bundle import android.view.View import androidx.fragment.app.viewModels -import com.infomaniak.core.myksuite.ui.utils.MyKSuiteUiUtils.getDashboardData +import com.infomaniak.core.myksuite.ui.utils.MyKSuiteUiUtils import com.infomaniak.core.myksuite.ui.views.MyKSuiteDashboardFragment import com.infomaniak.drive.ui.MyKSuiteViewModel import com.infomaniak.drive.utils.AccountUtils @@ -37,7 +37,7 @@ class KSuiteDashboardFragment : MyKSuiteDashboardFragment() { if (myKSuiteData == null) return@observe resetContent( - dashboardData = getDashboardData( + dashboardData = MyKSuiteUiUtils.getDashboardData( context = requireContext(), myKSuiteData = myKSuiteData, avatarUri = AccountUtils.currentUser?.avatar ?: "", diff --git a/app/src/main/java/com/infomaniak/drive/utils/MyKSuiteDataUtils.kt b/app/src/main/java/com/infomaniak/drive/utils/MyKSuiteDataUtils.kt index 460985c6f8..1f87351f72 100644 --- a/app/src/main/java/com/infomaniak/drive/utils/MyKSuiteDataUtils.kt +++ b/app/src/main/java/com/infomaniak/drive/utils/MyKSuiteDataUtils.kt @@ -34,7 +34,7 @@ object MyKSuiteDataUtils : MyKSuiteDataManager() { override var myKSuite: MyKSuiteData? = null - override suspend fun fetchMyKSuiteData(): MyKSuiteData? = runCatching { + override suspend fun fetchData(): MyKSuiteData? = runCatching { MyKSuiteDataUtils.requestKSuiteData() val apiResponse = ApiRepository.getMyKSuiteData(HttpClient.okHttpClient) if (apiResponse.data != null) { From 6c8a34d8ff3a093f6535bf3eebf01eecbcb23f36 Mon Sep 17 00:00:00 2001 From: Fabian DEVEL Date: Mon, 24 Feb 2025 14:31:59 +0100 Subject: [PATCH 7/7] chore(DynamicDashboard): Apply suggestions --- .../main/java/com/infomaniak/drive/data/api/ApiRepository.kt | 3 ++- app/src/main/java/com/infomaniak/drive/ui/MainActivity.kt | 3 ++- .../main/java/com/infomaniak/drive/ui/MyKSuiteViewModel.kt | 4 ++-- .../drive/ui/menu/settings/KSuiteDashboardFragment.kt | 2 -- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/com/infomaniak/drive/data/api/ApiRepository.kt b/app/src/main/java/com/infomaniak/drive/data/api/ApiRepository.kt index 4eb52dc298..d44ffe7393 100644 --- a/app/src/main/java/com/infomaniak/drive/data/api/ApiRepository.kt +++ b/app/src/main/java/com/infomaniak/drive/data/api/ApiRepository.kt @@ -45,6 +45,7 @@ import com.infomaniak.lib.core.models.ApiResponse import com.infomaniak.lib.core.models.ApiResponseStatus import com.infomaniak.lib.core.networking.HttpClient import okhttp3.OkHttpClient +import com.infomaniak.core.myksuite.ui.network.ApiRoutes as MyKSuiteApiRoutes object ApiRepository : ApiRepositoryCore() { @@ -512,7 +513,7 @@ object ApiRepository : ApiRepositoryCore() { fun getMyKSuiteData(okHttpClient: OkHttpClient): ApiResponse { return callApi( - url = com.infomaniak.core.myksuite.ui.network.ApiRoutes.myKSuiteData(), + url = MyKSuiteApiRoutes.myKSuiteData(), method = ApiController.ApiMethod.GET, okHttpClient = okHttpClient, useKotlinxSerialization = true, diff --git a/app/src/main/java/com/infomaniak/drive/ui/MainActivity.kt b/app/src/main/java/com/infomaniak/drive/ui/MainActivity.kt index 223246660e..90ac206263 100644 --- a/app/src/main/java/com/infomaniak/drive/ui/MainActivity.kt +++ b/app/src/main/java/com/infomaniak/drive/ui/MainActivity.kt @@ -102,6 +102,7 @@ import com.infomaniak.lib.stores.updatemanagers.InAppUpdateManager import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext +import com.infomaniak.core.myksuite.R as RMyKSuite class MainActivity : BaseActivity() { @@ -441,7 +442,7 @@ class MainActivity : BaseActivity() { } when (destination.id) { - R.id.fileDetailsFragment, com.infomaniak.core.myksuite.R.id.myKSuiteDashboardFragment -> { + R.id.fileDetailsFragment, RMyKSuite.id.myKSuiteDashboardFragment -> { setColorNavigationBar(true) } R.id.fileShareLinkSettingsFragment -> { diff --git a/app/src/main/java/com/infomaniak/drive/ui/MyKSuiteViewModel.kt b/app/src/main/java/com/infomaniak/drive/ui/MyKSuiteViewModel.kt index dd134ae079..1470e65d2f 100644 --- a/app/src/main/java/com/infomaniak/drive/ui/MyKSuiteViewModel.kt +++ b/app/src/main/java/com/infomaniak/drive/ui/MyKSuiteViewModel.kt @@ -27,9 +27,9 @@ import kotlinx.coroutines.launch class MyKSuiteViewModel : ViewModel() { - val myKSuiteDataResult = SingleLiveEvent() + val myKSuiteDataResult = SingleLiveEvent() fun refreshMyKSuite() = viewModelScope.launch(Dispatchers.IO) { - myKSuiteDataResult.postValue(MyKSuiteDataUtils.fetchData()) + MyKSuiteDataUtils.fetchData()?.let(myKSuiteDataResult::postValue) } } diff --git a/app/src/main/java/com/infomaniak/drive/ui/menu/settings/KSuiteDashboardFragment.kt b/app/src/main/java/com/infomaniak/drive/ui/menu/settings/KSuiteDashboardFragment.kt index efc406c699..8934822b27 100644 --- a/app/src/main/java/com/infomaniak/drive/ui/menu/settings/KSuiteDashboardFragment.kt +++ b/app/src/main/java/com/infomaniak/drive/ui/menu/settings/KSuiteDashboardFragment.kt @@ -34,8 +34,6 @@ class KSuiteDashboardFragment : MyKSuiteDashboardFragment() { myKSuiteViewModel.refreshMyKSuite() myKSuiteViewModel.myKSuiteDataResult.observe(viewLifecycleOwner) { myKSuiteData -> - if (myKSuiteData == null) return@observe - resetContent( dashboardData = MyKSuiteUiUtils.getDashboardData( context = requireContext(),