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 d571072ba7..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 @@ -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 @@ -72,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 } } } @@ -92,10 +90,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 @@ -103,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 -> @@ -168,6 +164,8 @@ class SyncSettingsActivity : BaseActivity() { SelectSaveDateBottomSheetDialog().show(supportFragmentManager, "SyncSettingsSelectSaveDateBottomSheetDialog") } + syncDatePicker.setOnClickListener { showSyncDatePicker() } + syncPeriodicity.setOnClickListener { SelectIntervalTypeBottomSheetDialog().show(supportFragmentManager, "SyncSettingsSelectIntervalTypeBottomSheetDialog") } @@ -178,17 +176,38 @@ class SyncSettingsActivity : BaseActivity() { } } + 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.syncFolderId.value ?: -1, + ).toBundle() + ) + selectFolderResultLauncher.launch(this) + } + } + } + private fun observeAllUsers() { AccountUtils.getAllUsers().observe(this@SyncSettingsActivity) { users -> 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 + } } } } @@ -219,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 @@ -295,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 } @@ -316,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 @@ -326,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 } @@ -347,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) @@ -379,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.syncFolderId.value!!, + syncVideo = syncVideoSwitch.isChecked, + createDatedSubFolders = createDatedSubFoldersSwitch.isChecked, + deleteAfterSync = deletePicturesAfterSyncSwitch.isChecked + ) + } + private fun showSyncDatePicker() { val calendarConstraints = CalendarConstraints.Builder() .setEnd(Date().time) @@ -402,13 +425,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..51f7c81559 --- /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 syncFolderId = MutableLiveData() + + fun init(intervalTypeValue: IntervalType, syncFolderId: Int?) { + this.syncFolderId.value = syncFolderId + syncIntervalType.value = intervalTypeValue + saveOldPictures.value = SavePicturesDate.SINCE_NOW + } +}