From 41377c6a9f0e6ed5bbf6e7e9b3266b8d040a2c29 Mon Sep 17 00:00:00 2001 From: Abdourahamane Boinaidi Date: Fri, 4 Oct 2024 08:59:16 +0200 Subject: [PATCH 1/5] fix: The selected syncFolder is sometimes deselected automatically --- .../drive/ui/menu/settings/SyncSettingsActivity.kt | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/infomaniak/drive/ui/menu/settings/SyncSettingsActivity.kt b/app/src/main/java/com/infomaniak/drive/ui/menu/settings/SyncSettingsActivity.kt index d571072ba7..daa4edcb29 100644 --- a/app/src/main/java/com/infomaniak/drive/ui/menu/settings/SyncSettingsActivity.kt +++ b/app/src/main/java/com/infomaniak/drive/ui/menu/settings/SyncSettingsActivity.kt @@ -183,12 +183,18 @@ class SyncSettingsActivity : BaseActivity() { if (users.size > 1) { activeSelectDrive() } else { - val currentUserDrives = DriveInfosController.getDrives(AccountUtils.currentUserId) + val currentUserId = AccountUtils.currentUserId + val currentUserDrives = DriveInfosController.getDrives(currentUserId) if (currentUserDrives.size > 1) { activeSelectDrive() } else { - selectDriveViewModel.selectedUserId.value = AccountUtils.currentUserId - selectDriveViewModel.selectedDrive.value = currentUserDrives.firstOrNull() + val firstDrive = currentUserDrives.firstOrNull() + if (selectDriveViewModel.selectedUserId.value != currentUserId) { + selectDriveViewModel.selectedUserId.value = currentUserId + } + if (selectDriveViewModel.selectedDrive.value != firstDrive) { + selectDriveViewModel.selectedDrive.value = firstDrive + } } } } From 9c03d8b9784fa66513bf9bdbbe4a1b30e4bb8806 Mon Sep 17 00:00:00 2001 From: Abdourahamane Boinaidi Date: Fri, 4 Oct 2024 13:10:03 +0200 Subject: [PATCH 2/5] refactor: Refactor init user and drive --- .../drive/ui/menu/settings/SyncSettingsActivity.kt | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/infomaniak/drive/ui/menu/settings/SyncSettingsActivity.kt b/app/src/main/java/com/infomaniak/drive/ui/menu/settings/SyncSettingsActivity.kt index daa4edcb29..9b6110b785 100644 --- a/app/src/main/java/com/infomaniak/drive/ui/menu/settings/SyncSettingsActivity.kt +++ b/app/src/main/java/com/infomaniak/drive/ui/menu/settings/SyncSettingsActivity.kt @@ -92,10 +92,7 @@ class SyncSettingsActivity : BaseActivity() { oldSyncSettings = UploadFile.getAppSyncSettings() - selectDriveViewModel.apply { - selectedUserId.value = oldSyncSettings?.userId ?: AccountUtils.currentUserId - selectedDrive.value = oldSyncSettings?.run { DriveInfosController.getDrive(userId, driveId) } - } + initUserAndDrive() val oldIntervalTypeValue = oldSyncSettings?.getIntervalType() ?: IntervalType.IMMEDIATELY val oldSyncVideoValue = oldSyncSettings?.syncVideo ?: true @@ -178,6 +175,15 @@ class SyncSettingsActivity : BaseActivity() { } } + private fun initUserAndDrive() { + selectDriveViewModel.apply { + val userId = oldSyncSettings?.userId ?: AccountUtils.currentUserId + val drive = oldSyncSettings?.run { DriveInfosController.getDrive(userId, driveId) } + if (selectedUserId.value != userId) selectedUserId.value = userId + if (selectedDrive.value != drive) selectedDrive.value = drive + } + } + private fun observeAllUsers() { AccountUtils.getAllUsers().observe(this@SyncSettingsActivity) { users -> if (users.size > 1) { From e3acb992ebcfc464a64bb329c37a1fae01fa984a Mon Sep 17 00:00:00 2001 From: Abdourahamane Boinaidi Date: Fri, 4 Oct 2024 13:33:43 +0200 Subject: [PATCH 3/5] refactor: Move SyncSettingsViewModel to it's own file --- .../SelectIntervalTypeBottomSheetDialog.kt | 2 +- .../SelectSaveDateBottomSheetDialog.kt | 2 +- .../ui/menu/settings/SyncSettingsActivity.kt | 7 ---- .../ui/menu/settings/SyncSettingsViewModel.kt | 37 +++++++++++++++++++ 4 files changed, 39 insertions(+), 9 deletions(-) create mode 100644 app/src/main/java/com/infomaniak/drive/ui/menu/settings/SyncSettingsViewModel.kt diff --git a/app/src/main/java/com/infomaniak/drive/ui/menu/settings/SelectIntervalTypeBottomSheetDialog.kt b/app/src/main/java/com/infomaniak/drive/ui/menu/settings/SelectIntervalTypeBottomSheetDialog.kt index b2029101b8..b2e2f5afd7 100644 --- a/app/src/main/java/com/infomaniak/drive/ui/menu/settings/SelectIntervalTypeBottomSheetDialog.kt +++ b/app/src/main/java/com/infomaniak/drive/ui/menu/settings/SelectIntervalTypeBottomSheetDialog.kt @@ -25,7 +25,7 @@ import com.infomaniak.drive.views.SelectBottomSheetDialog class SelectIntervalTypeBottomSheetDialog : SelectBottomSheetDialog() { - private val syncSettingsViewModel: SyncSettingsActivity.SyncSettingsViewModel by activityViewModels() + private val syncSettingsViewModel: SyncSettingsViewModel by activityViewModels() override fun onViewCreated(view: View, savedInstanceState: Bundle?) = with(binding) { super.onViewCreated(view, savedInstanceState) diff --git a/app/src/main/java/com/infomaniak/drive/ui/menu/settings/SelectSaveDateBottomSheetDialog.kt b/app/src/main/java/com/infomaniak/drive/ui/menu/settings/SelectSaveDateBottomSheetDialog.kt index 82fe8a51e1..1ac581ee8d 100644 --- a/app/src/main/java/com/infomaniak/drive/ui/menu/settings/SelectSaveDateBottomSheetDialog.kt +++ b/app/src/main/java/com/infomaniak/drive/ui/menu/settings/SelectSaveDateBottomSheetDialog.kt @@ -25,7 +25,7 @@ import com.infomaniak.drive.views.SelectBottomSheetDialog class SelectSaveDateBottomSheetDialog : SelectBottomSheetDialog() { - private val syncSettingsViewModel: SyncSettingsActivity.SyncSettingsViewModel by activityViewModels() + private val syncSettingsViewModel: SyncSettingsViewModel by activityViewModels() override fun onViewCreated(view: View, savedInstanceState: Bundle?) = with(binding) { super.onViewCreated(view, savedInstanceState) diff --git a/app/src/main/java/com/infomaniak/drive/ui/menu/settings/SyncSettingsActivity.kt b/app/src/main/java/com/infomaniak/drive/ui/menu/settings/SyncSettingsActivity.kt index 9b6110b785..b7682fcbee 100644 --- a/app/src/main/java/com/infomaniak/drive/ui/menu/settings/SyncSettingsActivity.kt +++ b/app/src/main/java/com/infomaniak/drive/ui/menu/settings/SyncSettingsActivity.kt @@ -414,13 +414,6 @@ class SyncSettingsActivity : BaseActivity() { } } - class SyncSettingsViewModel : ViewModel() { - val customDate = MutableLiveData() - val saveOldPictures = MutableLiveData() - val syncIntervalType = MutableLiveData() - val syncFolder = MutableLiveData() - } - private fun trackPhotoSyncEvent(name: String, value: Boolean? = null) { trackEvent("photoSync", name, value = value?.toFloat()) } diff --git a/app/src/main/java/com/infomaniak/drive/ui/menu/settings/SyncSettingsViewModel.kt b/app/src/main/java/com/infomaniak/drive/ui/menu/settings/SyncSettingsViewModel.kt new file mode 100644 index 0000000000..455efe0479 --- /dev/null +++ b/app/src/main/java/com/infomaniak/drive/ui/menu/settings/SyncSettingsViewModel.kt @@ -0,0 +1,37 @@ +/* + * Infomaniak kDrive - Android + * Copyright (C) 2022-2024 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 androidx.lifecycle.MutableLiveData +import androidx.lifecycle.ViewModel +import com.infomaniak.drive.data.models.SyncSettings.IntervalType +import com.infomaniak.drive.data.models.SyncSettings.SavePicturesDate +import java.util.Date + +class SyncSettingsViewModel : ViewModel() { + val customDate = MutableLiveData() + val saveOldPictures = MutableLiveData() + val syncIntervalType = MutableLiveData() + val syncFolder = MutableLiveData() + + fun init(intervalTypeValue: IntervalType, syncFolderId: Int?) { + syncIntervalType.value = intervalTypeValue + syncFolder.value = syncFolderId + saveOldPictures.value = SavePicturesDate.SINCE_NOW + } +} From 3dbeb11754b258d3d389baaca6aada0fb8e69126 Mon Sep 17 00:00:00 2001 From: Abdourahamane Boinaidi Date: Fri, 4 Oct 2024 13:34:24 +0200 Subject: [PATCH 4/5] refactor: Reduce complexity form onCreate --- .../ui/menu/settings/SyncSettingsActivity.kt | 101 ++++++++++-------- 1 file changed, 56 insertions(+), 45 deletions(-) diff --git a/app/src/main/java/com/infomaniak/drive/ui/menu/settings/SyncSettingsActivity.kt b/app/src/main/java/com/infomaniak/drive/ui/menu/settings/SyncSettingsActivity.kt index b7682fcbee..15c097953e 100644 --- a/app/src/main/java/com/infomaniak/drive/ui/menu/settings/SyncSettingsActivity.kt +++ b/app/src/main/java/com/infomaniak/drive/ui/menu/settings/SyncSettingsActivity.kt @@ -27,8 +27,6 @@ import androidx.activity.viewModels import androidx.core.content.ContextCompat import androidx.core.view.isGone import androidx.core.view.isVisible -import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.ViewModel import androidx.lifecycle.lifecycleScope import com.google.android.material.datepicker.CalendarConstraints import com.google.android.material.datepicker.DateValidatorPointBackward @@ -100,39 +98,40 @@ class SyncSettingsActivity : BaseActivity() { val oldDeleteAfterSyncValue = oldSyncSettings?.deleteAfterSync ?: false val oldSaveOldPicturesValue = SavePicturesDate.SINCE_NOW - syncSettingsViewModel.apply { - syncIntervalType.value = oldIntervalTypeValue - syncFolder.value = oldSyncSettings?.syncFolder - saveOldPictures.value = SavePicturesDate.SINCE_NOW - } + syncSettingsViewModel.init(intervalTypeValue = oldIntervalTypeValue, syncFolderId = oldSyncSettings?.syncFolder) + + setupListeners(permission, oldSyncVideoValue, oldCreateDatedSubFoldersValue, oldDeleteAfterSyncValue) + + syncVideoSwitch.isChecked = oldSyncVideoValue + createDatedSubFoldersSwitch.isChecked = oldCreateDatedSubFoldersValue + deletePicturesAfterSyncSwitch.isChecked = oldDeleteAfterSyncValue observeAllUsers() observeCustomDate() observeSelectedDrive() - selectPath.setOnClickListener { - Intent(this@SyncSettingsActivity, SelectFolderActivity::class.java).apply { - putExtras( - SelectFolderActivityArgs( - userId = selectDriveViewModel.selectedUserId.value!!, - driveId = selectDriveViewModel.selectedDrive.value?.id!!, - folderId = syncSettingsViewModel.syncFolder.value ?: -1, - ).toBundle() - ) - selectFolderResultLauncher.launch(this) - } - } - observeSyncFolder() observeSaveOldPictures(oldSaveOldPicturesValue) - syncDatePicker.setOnClickListener { showSyncDatePicker() } - observeSyncIntervalType(oldIntervalTypeValue) + } - syncVideoSwitch.isChecked = oldSyncVideoValue - createDatedSubFoldersSwitch.isChecked = oldCreateDatedSubFoldersValue - deletePicturesAfterSyncSwitch.isChecked = oldDeleteAfterSyncValue + private fun initUserAndDrive() { + selectDriveViewModel.apply { + val userId = oldSyncSettings?.userId ?: AccountUtils.currentUserId + val drive = oldSyncSettings?.run { DriveInfosController.getDrive(userId, driveId) } + if (selectedUserId.value != userId) selectedUserId.value = userId + if (selectedDrive.value != drive) selectedDrive.value = drive + } + } + + private fun ActivitySyncSettingsBinding.setupListeners( + permission: DrivePermissions, + oldSyncVideoValue: Boolean, + oldCreateDatedSubFoldersValue: Boolean, + oldDeleteAfterSyncValue: Boolean, + ) { + setupSelectFolderListener() activateSync.setOnClickListener { activateSyncSwitch.isChecked = !activateSyncSwitch.isChecked } activateSyncSwitch.setOnCheckedChangeListener { _, isChecked -> @@ -165,6 +164,8 @@ class SyncSettingsActivity : BaseActivity() { SelectSaveDateBottomSheetDialog().show(supportFragmentManager, "SyncSettingsSelectSaveDateBottomSheetDialog") } + syncDatePicker.setOnClickListener { showSyncDatePicker() } + syncPeriodicity.setOnClickListener { SelectIntervalTypeBottomSheetDialog().show(supportFragmentManager, "SyncSettingsSelectIntervalTypeBottomSheetDialog") } @@ -175,12 +176,18 @@ class SyncSettingsActivity : BaseActivity() { } } - private fun initUserAndDrive() { - selectDriveViewModel.apply { - val userId = oldSyncSettings?.userId ?: AccountUtils.currentUserId - val drive = oldSyncSettings?.run { DriveInfosController.getDrive(userId, driveId) } - if (selectedUserId.value != userId) selectedUserId.value = userId - if (selectedDrive.value != drive) selectedDrive.value = drive + private fun ActivitySyncSettingsBinding.setupSelectFolderListener() { + selectPath.setOnClickListener { + Intent(this@SyncSettingsActivity, SelectFolderActivity::class.java).apply { + putExtras( + SelectFolderActivityArgs( + userId = selectDriveViewModel.selectedUserId.value!!, + driveId = selectDriveViewModel.selectedDrive.value?.id!!, + folderId = syncSettingsViewModel.syncFolder.value ?: -1, + ).toBundle() + ) + selectFolderResultLauncher.launch(this) + } } } @@ -359,21 +366,8 @@ class SyncSettingsActivity : BaseActivity() { private fun saveSettings() = with(binding) { saveButton.showProgressCatching() lifecycleScope.launch(Dispatchers.IO) { - val date = when (syncSettingsViewModel.saveOldPictures.value!!) { - SavePicturesDate.SINCE_NOW -> Date() - SavePicturesDate.SINCE_FOREVER -> Date(0) - SavePicturesDate.SINCE_DATE -> syncSettingsViewModel.customDate.value ?: Date() - } if (activateSyncSwitch.isChecked) { - val syncSettings = SyncSettings( - userId = selectDriveViewModel.selectedUserId.value!!, - driveId = selectDriveViewModel.selectedDrive.value!!.id, - lastSync = date, - syncFolder = syncSettingsViewModel.syncFolder.value!!, - syncVideo = syncVideoSwitch.isChecked, - createDatedSubFolders = createDatedSubFoldersSwitch.isChecked, - deleteAfterSync = deletePicturesAfterSyncSwitch.isChecked - ) + val syncSettings = generateSyncSettings() trackPhotoSyncEvents(syncSettings) syncSettings.setIntervalType(syncSettingsViewModel.syncIntervalType.value!!) UploadFile.setAppSyncSettings(syncSettings) @@ -391,6 +385,23 @@ class SyncSettingsActivity : BaseActivity() { } } + private fun generateSyncSettings(): SyncSettings = with(binding) { + val date = when (syncSettingsViewModel.saveOldPictures.value!!) { + SavePicturesDate.SINCE_NOW -> Date() + SavePicturesDate.SINCE_FOREVER -> Date(0) + SavePicturesDate.SINCE_DATE -> syncSettingsViewModel.customDate.value ?: Date() + } + return SyncSettings( + userId = selectDriveViewModel.selectedUserId.value!!, + driveId = selectDriveViewModel.selectedDrive.value!!.id, + lastSync = date, + syncFolder = syncSettingsViewModel.syncFolder.value!!, + syncVideo = syncVideoSwitch.isChecked, + createDatedSubFolders = createDatedSubFoldersSwitch.isChecked, + deleteAfterSync = deletePicturesAfterSyncSwitch.isChecked + ) + } + private fun showSyncDatePicker() { val calendarConstraints = CalendarConstraints.Builder() .setEnd(Date().time) From 34cd7c3b4d3fdc6fb3c361335b660b6ada4214cf Mon Sep 17 00:00:00 2001 From: Abdourahamane Boinaidi Date: Fri, 4 Oct 2024 13:46:31 +0200 Subject: [PATCH 5/5] refactor: Rename syncFolder into syncFolderId --- .../ui/menu/settings/SyncSettingsActivity.kt | 18 +++++++++--------- .../ui/menu/settings/SyncSettingsViewModel.kt | 4 ++-- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/com/infomaniak/drive/ui/menu/settings/SyncSettingsActivity.kt b/app/src/main/java/com/infomaniak/drive/ui/menu/settings/SyncSettingsActivity.kt index 15c097953e..4214f06b9a 100644 --- a/app/src/main/java/com/infomaniak/drive/ui/menu/settings/SyncSettingsActivity.kt +++ b/app/src/main/java/com/infomaniak/drive/ui/menu/settings/SyncSettingsActivity.kt @@ -70,7 +70,7 @@ class SyncSettingsActivity : BaseActivity() { private val selectFolderResultLauncher = registerForActivityResult(StartActivityForResult()) { it.whenResultIsOk { data -> data?.extras?.let { bundle -> - syncSettingsViewModel.syncFolder.value = SelectFolderActivityArgs.fromBundle(bundle).folderId + syncSettingsViewModel.syncFolderId.value = SelectFolderActivityArgs.fromBundle(bundle).folderId } } } @@ -183,7 +183,7 @@ class SyncSettingsActivity : BaseActivity() { SelectFolderActivityArgs( userId = selectDriveViewModel.selectedUserId.value!!, driveId = selectDriveViewModel.selectedDrive.value?.id!!, - folderId = syncSettingsViewModel.syncFolder.value ?: -1, + folderId = syncSettingsViewModel.syncFolderId.value ?: -1, ).toBundle() ) selectFolderResultLauncher.launch(this) @@ -238,16 +238,16 @@ class SyncSettingsActivity : BaseActivity() { } if (selectDriveViewModel.selectedUserId.value != oldSyncSettings?.userId || selectDriveViewModel.selectedDrive.value?.id != oldSyncSettings?.driveId || - syncSettingsViewModel.syncFolder.value != oldSyncSettings?.syncFolder + syncSettingsViewModel.syncFolderId.value != oldSyncSettings?.syncFolder ) { - syncSettingsViewModel.syncFolder.value = null + syncSettingsViewModel.syncFolderId.value = null } changeSaveButtonStatus() } } private fun observeSyncFolder() = with(binding) { - syncSettingsViewModel.syncFolder.observe(this@SyncSettingsActivity) { syncFolderId -> + syncSettingsViewModel.syncFolderId.observe(this@SyncSettingsActivity) { syncFolderId -> val selectedUserId = selectDriveViewModel.selectedUserId.value val selectedDriveId = selectDriveViewModel.selectedDrive.value?.id @@ -314,7 +314,7 @@ class SyncSettingsActivity : BaseActivity() { } private fun saveSettingVisibility(isVisible: Boolean) = with(binding) { - mediaFoldersSettingsVisibility(isVisible && syncSettingsViewModel.syncFolder.value != null) + mediaFoldersSettingsVisibility(isVisible && syncSettingsViewModel.syncFolderId.value != null) saveSettingsTitle.isVisible = isVisible saveSettingsLayout.isVisible = isVisible } @@ -335,7 +335,7 @@ class SyncSettingsActivity : BaseActivity() { val isEdited = (editNumber > 0) || (selectDriveViewModel.selectedUserId.value != oldSyncSettings?.userId) || (selectDriveViewModel.selectedDrive.value?.id != oldSyncSettings?.driveId) - || (syncSettingsViewModel.syncFolder.value != oldSyncSettings?.syncFolder) + || (syncSettingsViewModel.syncFolderId.value != oldSyncSettings?.syncFolder) || (syncSettingsViewModel.saveOldPictures.value != SavePicturesDate.SINCE_NOW) || allSyncedFoldersCount > 0 saveButton.isVisible = isEdited @@ -345,7 +345,7 @@ class SyncSettingsActivity : BaseActivity() { saveButton.isEnabled = isEdited && (selectDriveViewModel.selectedUserId.value != null) && (selectDriveViewModel.selectedDrive.value != null) - && (syncSettingsViewModel.syncFolder.value != null) + && (syncSettingsViewModel.syncFolderId.value != null) && allSyncedFoldersCount > 0 } @@ -395,7 +395,7 @@ class SyncSettingsActivity : BaseActivity() { userId = selectDriveViewModel.selectedUserId.value!!, driveId = selectDriveViewModel.selectedDrive.value!!.id, lastSync = date, - syncFolder = syncSettingsViewModel.syncFolder.value!!, + syncFolder = syncSettingsViewModel.syncFolderId.value!!, syncVideo = syncVideoSwitch.isChecked, createDatedSubFolders = createDatedSubFoldersSwitch.isChecked, deleteAfterSync = deletePicturesAfterSyncSwitch.isChecked diff --git a/app/src/main/java/com/infomaniak/drive/ui/menu/settings/SyncSettingsViewModel.kt b/app/src/main/java/com/infomaniak/drive/ui/menu/settings/SyncSettingsViewModel.kt index 455efe0479..51f7c81559 100644 --- a/app/src/main/java/com/infomaniak/drive/ui/menu/settings/SyncSettingsViewModel.kt +++ b/app/src/main/java/com/infomaniak/drive/ui/menu/settings/SyncSettingsViewModel.kt @@ -27,11 +27,11 @@ class SyncSettingsViewModel : ViewModel() { val customDate = MutableLiveData() val saveOldPictures = MutableLiveData() val syncIntervalType = MutableLiveData() - val syncFolder = MutableLiveData() + val syncFolderId = MutableLiveData() fun init(intervalTypeValue: IntervalType, syncFolderId: Int?) { + this.syncFolderId.value = syncFolderId syncIntervalType.value = intervalTypeValue - syncFolder.value = syncFolderId saveOldPictures.value = SavePicturesDate.SINCE_NOW } }