diff --git a/app/build.gradle.kts b/app/build.gradle.kts index b5732c3253..664c402bcb 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -42,7 +42,7 @@ android { setProperty("archivesBaseName", "kdrive-$versionName ($versionCode)") testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" - buildConfigField("String", "CLIENT_ID", "\"9473D73C-C20F-4971-9E10-D957C563FA68\"") + buildConfigField("String", "CLIENT_ID", "\"6B9A260B-EE8C-46C9-8B4F-61B2169B31ED\"") buildConfigField("String", "BUGTRACKER_DRIVE_BUCKET_ID", "\"app_drive\"") buildConfigField("String", "BUGTRACKER_DRIVE_PROJECT_NAME", "\"drive\"") diff --git a/app/src/androidTest/java/com/infomaniak/drive/FileControllerTest.kt b/app/src/androidTest/java/com/infomaniak/drive/FileControllerTest.kt index 9668bb157a..413167ed18 100644 --- a/app/src/androidTest/java/com/infomaniak/drive/FileControllerTest.kt +++ b/app/src/androidTest/java/com/infomaniak/drive/FileControllerTest.kt @@ -1,6 +1,6 @@ /* * Infomaniak kDrive - Android - * Copyright (C) 2024 Infomaniak Network SA + * Copyright (C) 2024-2026 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 @@ -299,11 +299,11 @@ class FileControllerTest : KDriveTest() { FileController.saveRemoteFileToDb(remoteFile, userDrive, okHttpClient) assertNotNull( - FileController.getFileById(remoteFile.id, userDrive), + FileController.getFileByUidOrId(remoteFile.id, userDrive), "the saved remote file must be stored in realm", ) - val localParent = FileController.getFileById(folder.id, userDrive) + val localParent = FileController.getFileByUidOrId(folder.id, userDrive) assertNotNull(localParent, "the ancestor folder must be fetched and stored in realm") assertNotNull( diff --git a/app/src/main/java/com/infomaniak/drive/data/cache/FileController.kt b/app/src/main/java/com/infomaniak/drive/data/cache/FileController.kt index 4d11e46e68..2e7a75b4a6 100644 --- a/app/src/main/java/com/infomaniak/drive/data/cache/FileController.kt +++ b/app/src/main/java/com/infomaniak/drive/data/cache/FileController.kt @@ -157,14 +157,28 @@ object FileController { return customRealm?.let(block) ?: getRealmInstance(userDrive).use(block) } - fun getFileById(fileId: Int, userDrive: UserDrive? = null): File? { - return getRealmInstance(userDrive).use { realm -> + fun getFileByUidOrId(fileId: Int, userDrive: UserDrive? = null): File? { + return userDrive?.let { getFileByUid(fileId, userDrive = it) } ?: getFileById(fileId) + } + + private fun getFileById(fileId: Int): File? { + return getRealmInstance().use { realm -> realm.where(File::class.java).equalTo(File::id.name, fileId).findFirst()?.let { realm.copyFromRealm(it, 1) } } } + private fun getFileByUid(fileId: Int, userDrive: UserDrive): File? { + val uid = "${fileId}_${userDrive.driveId}" + return getRealmInstance(userDrive).use { realm -> + realm.where(File::class.java) + .equalTo(File::uid.name, uid) + .findFirst() + ?.let { realm.copyFromRealm(it, 1) } + } + } + suspend fun hasFile(fileId: Int, userDrive: UserDrive? = null): Boolean = forRealm(userDrive) { where(File::class.java) .equalTo(File::id.name, fileId) @@ -313,7 +327,7 @@ object FileController { if (filesToDelete.isEmpty()) return val file = filesToDelete.removeAt(0) - val children = getFileById(file.id, userDrive)?.children ?: emptyList() + val children = getFileByUidOrId(file.id, userDrive)?.children ?: emptyList() filesToDelete.addAll(children) file.deleteCaches(context) diff --git a/app/src/main/java/com/infomaniak/drive/data/documentprovider/CloudStorageProvider.kt b/app/src/main/java/com/infomaniak/drive/data/documentprovider/CloudStorageProvider.kt index da93ceef1e..a3284f5622 100644 --- a/app/src/main/java/com/infomaniak/drive/data/documentprovider/CloudStorageProvider.kt +++ b/app/src/main/java/com/infomaniak/drive/data/documentprovider/CloudStorageProvider.kt @@ -359,7 +359,7 @@ class CloudStorageProvider : DocumentsProvider() { val accessMode = ParcelFileDescriptor.parseMode(mode) val fileId = getFileIdFromDocumentId(documentId) val userDrive = createUserDrive(documentId) - val localFile = FileController.getFileById(fileId, userDrive) + val localFile = FileController.getFileByUidOrId(fileId, userDrive) val updatedFile = runCatching { getRemoteFile(localFile, fileId, userDrive.driveId) diff --git a/app/src/main/java/com/infomaniak/drive/data/models/deeplink/DeeplinkType.kt b/app/src/main/java/com/infomaniak/drive/data/models/deeplink/DeeplinkType.kt index c7ec9de8e9..4f777e06a0 100644 --- a/app/src/main/java/com/infomaniak/drive/data/models/deeplink/DeeplinkType.kt +++ b/app/src/main/java/com/infomaniak/drive/data/models/deeplink/DeeplinkType.kt @@ -215,7 +215,7 @@ sealed interface DeeplinkType : Parcelable { val deeplinkTargetFile = getDrives(sharedWithMe = withSharedDrives).firstNotNullOfOrNull { userDrive -> newUserId = userDrive.userId - FileController.getFileById(fileId, userDrive = userDrive) + FileController.getFileByUidOrId(fileId, userDrive = userDrive) } return deeplinkTargetFile?.let { file -> diff --git a/app/src/main/java/com/infomaniak/drive/data/services/BulkDownloadWorker.kt b/app/src/main/java/com/infomaniak/drive/data/services/BulkDownloadWorker.kt index 68caed49f8..bd8e810302 100644 --- a/app/src/main/java/com/infomaniak/drive/data/services/BulkDownloadWorker.kt +++ b/app/src/main/java/com/infomaniak/drive/data/services/BulkDownloadWorker.kt @@ -1,6 +1,6 @@ /* * Infomaniak kDrive - Android - * Copyright (C) 2024-2025 Infomaniak Network SA + * Copyright (C) 2024-2026 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 @@ -35,7 +35,7 @@ class BulkDownloadWorker(context: Context, workerParams: WorkerParameters) : Bas private val folderId: Int by lazy { inputData.getInt(FOLDER_ID, 0) } private val files: List by lazy { FileController.getFolderOfflineFilesId(folderId = folderId, sortType = UiSettings(context).sortType) - .map { FileController.getFileById(it, userDrive)!! } + .map { FileController.getFileByUidOrId(it, userDrive)!! } } private val userDrive: UserDrive by lazy { diff --git a/app/src/main/java/com/infomaniak/drive/data/services/DownloadWorker.kt b/app/src/main/java/com/infomaniak/drive/data/services/DownloadWorker.kt index dbaae86c57..e9a18d42ee 100644 --- a/app/src/main/java/com/infomaniak/drive/data/services/DownloadWorker.kt +++ b/app/src/main/java/com/infomaniak/drive/data/services/DownloadWorker.kt @@ -1,6 +1,6 @@ /* * Infomaniak kDrive - Android - * Copyright (C) 2022-2025 Infomaniak Network SA + * Copyright (C) 2022-2026 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 @@ -30,7 +30,7 @@ import com.infomaniak.drive.utils.NotificationUtils.cancelNotification class DownloadWorker(context: Context, workerParams: WorkerParameters) : BaseDownloadWorker(context, workerParams) { private val fileId: Int by lazy { inputData.getInt(FILE_ID, 0) } - private val file: File? by lazy { FileController.getFileById(fileId) } + private val file: File? by lazy { FileController.getFileByUidOrId(fileId) } private val fileName: String by lazy { inputData.getString(FILE_NAME) ?: "" } private val userDrive: UserDrive by lazy { UserDrive( @@ -47,7 +47,7 @@ class DownloadWorker(context: Context, workerParams: WorkerParameters) : BaseDow ) } - override fun downloadNotification(): DownloadNotification? { + override fun downloadNotification(): DownloadNotification { return DownloadNotification(id = fileId, notification = downloadProgressNotification) } 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 736f4e4f7b..e1da7c3e80 100644 --- a/app/src/main/java/com/infomaniak/drive/ui/MainViewModel.kt +++ b/app/src/main/java/com/infomaniak/drive/ui/MainViewModel.kt @@ -208,7 +208,7 @@ class MainViewModel( // Emit destination folder id viewModelScope.launch(Dispatchers.IO) { - val file = FileController.getFileById(fileId, userDrive) + val file = FileController.getFileByUidOrId(fileId, userDrive) ?: FileController.getFileDetails(fileId, userDrive = userDrive) ?: return@launch navigateFileListTo.postValue(FileListNavigationType.Folder(file)) @@ -216,7 +216,7 @@ class MainViewModel( } fun loadCurrentFolder(folderId: Int, userDrive: UserDrive) = viewModelScope.launch(Dispatchers.IO) { - postCurrentFolder(FileController.getFileById(folderId, userDrive)) + postCurrentFolder(FileController.getFileByUidOrId(folderId, userDrive)) } fun createMultiSelectMediator(): MediatorLiveData = @@ -602,7 +602,7 @@ class MainViewModel( private fun initCurrentFolderFromRealm() { val savedFolderId: Int? = savedStateHandle[SAVED_STATE_FOLDER_ID_KEY] if (currentFolder.value == null && savedFolderId != null) { - FileController.getFileById(savedFolderId)?.let { + FileController.getFileByUidOrId(savedFolderId)?.let { _currentFolder.value = it saveCurrentFolder() } diff --git a/app/src/main/java/com/infomaniak/drive/ui/SaveExternalFilesActivity.kt b/app/src/main/java/com/infomaniak/drive/ui/SaveExternalFilesActivity.kt index c3a7f40e2a..d00108e078 100644 --- a/app/src/main/java/com/infomaniak/drive/ui/SaveExternalFilesActivity.kt +++ b/app/src/main/java/com/infomaniak/drive/ui/SaveExternalFilesActivity.kt @@ -279,7 +279,7 @@ class SaveExternalFilesActivity : BaseActivity() { ) driveIdSharedWithMe = FileController.getSharedDrive(userDrive.userId, folderId)?.driveId - FileController.getFileById(folderId, userDrive) ?: FileController.getFileById( + FileController.getFileByUidOrId(folderId, userDrive) ?: FileController.getFileByUidOrId( fileId = folderId, userDrive = UserDrive( userId = selectedUserId.value!!, diff --git a/app/src/main/java/com/infomaniak/drive/ui/bottomSheetDialogs/FileInfoActionsBottomSheetDialog.kt b/app/src/main/java/com/infomaniak/drive/ui/bottomSheetDialogs/FileInfoActionsBottomSheetDialog.kt index 38cf7b6ed6..df6e98a9ee 100644 --- a/app/src/main/java/com/infomaniak/drive/ui/bottomSheetDialogs/FileInfoActionsBottomSheetDialog.kt +++ b/app/src/main/java/com/infomaniak/drive/ui/bottomSheetDialogs/FileInfoActionsBottomSheetDialog.kt @@ -96,7 +96,7 @@ class FileInfoActionsBottomSheetDialog : EdgeToEdgeBottomSheetDialog(), FileInfo override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - currentFile = FileController.getFileById(navigationArgs.fileId, navigationArgs.userDrive) ?: run { + currentFile = FileController.getFileByUidOrId(navigationArgs.fileId, navigationArgs.userDrive) ?: run { findNavController().popBackStack() return } diff --git a/app/src/main/java/com/infomaniak/drive/ui/bottomSheetDialogs/NotSupportedExtensionBottomSheetDialog.kt b/app/src/main/java/com/infomaniak/drive/ui/bottomSheetDialogs/NotSupportedExtensionBottomSheetDialog.kt index ea9d1061cd..79dcb890a1 100644 --- a/app/src/main/java/com/infomaniak/drive/ui/bottomSheetDialogs/NotSupportedExtensionBottomSheetDialog.kt +++ b/app/src/main/java/com/infomaniak/drive/ui/bottomSheetDialogs/NotSupportedExtensionBottomSheetDialog.kt @@ -1,6 +1,6 @@ /* * Infomaniak kDrive - Android - * Copyright (C) 2022-2024 Infomaniak Network SA + * Copyright (C) 2022-2026 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 @@ -43,7 +43,7 @@ class NotSupportedExtensionBottomSheetDialog : InformationBottomSheetDialog() { override fun onViewCreated(view: View, savedInstanceState: Bundle?): Unit = with(binding) { super.onViewCreated(view, savedInstanceState) - FileController.getFileById(navigationArgs.fileId, userDrive)?.let { currentFile -> + FileController.getFileByUidOrId(navigationArgs.fileId, userDrive)?.let { currentFile -> title.text = getString(R.string.notSupportedExtensionTitle, currentFile.getFileExtension()) description.text = getString(R.string.notSupportedExtensionDescription, currentFile.name) diff --git a/app/src/main/java/com/infomaniak/drive/ui/deeplink/DeeplinkHandler.kt b/app/src/main/java/com/infomaniak/drive/ui/deeplink/DeeplinkHandler.kt index 49ac4b5346..66e579866d 100644 --- a/app/src/main/java/com/infomaniak/drive/ui/deeplink/DeeplinkHandler.kt +++ b/app/src/main/java/com/infomaniak/drive/ui/deeplink/DeeplinkHandler.kt @@ -89,7 +89,7 @@ class DeeplinkHandler(registryOwner: SavedStateRegistryOwner) : SavedStateRegist activity.lifecycleScope.launch(context = Dispatchers.IO) { DriveInfosController.getDrive(userId = userId, driveId = driveId, maintenance = false) ?.ensureRightUser() - ?.run { FileController.getFileById(fileId = fileId, userDrive = UserDrive(userId = userId, driveId = id)) } + ?.run { FileController.getFileByUidOrId(fileId = fileId, userDrive = UserDrive(userId = userId, driveId = id)) } ?.let { Dispatchers.Main { activity.openOnlyOfficeActivity(it) } } } } diff --git a/app/src/main/java/com/infomaniak/drive/ui/dropbox/ConvertToDropboxFragment.kt b/app/src/main/java/com/infomaniak/drive/ui/dropbox/ConvertToDropboxFragment.kt index cd684bc798..9dfee11f06 100644 --- a/app/src/main/java/com/infomaniak/drive/ui/dropbox/ConvertToDropboxFragment.kt +++ b/app/src/main/java/com/infomaniak/drive/ui/dropbox/ConvertToDropboxFragment.kt @@ -1,6 +1,6 @@ /* * Infomaniak kDrive - Android - * Copyright (C) 2022-2025 Infomaniak Network SA + * Copyright (C) 2022-2026 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 @@ -47,7 +47,7 @@ class ConvertToDropboxFragment : ManageDropboxFragment() { shareLinkCardView.isGone = true disableButton.isGone = true - val file = FileController.getFileById(navigationArgs.fileId) ?: return + val file = FileController.getFileByUidOrId(navigationArgs.fileId) ?: return updateUi(file) diff --git a/app/src/main/java/com/infomaniak/drive/ui/dropbox/ManageDropboxFragment.kt b/app/src/main/java/com/infomaniak/drive/ui/dropbox/ManageDropboxFragment.kt index 7b2f384c0b..a55fb7c9fa 100644 --- a/app/src/main/java/com/infomaniak/drive/ui/dropbox/ManageDropboxFragment.kt +++ b/app/src/main/java/com/infomaniak/drive/ui/dropbox/ManageDropboxFragment.kt @@ -1,6 +1,6 @@ /* * Infomaniak kDrive - Android - * Copyright (C) 2022-2025 Infomaniak Network SA + * Copyright (C) 2022-2026 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 @@ -92,7 +92,7 @@ open class ManageDropboxFragment : Fragment() { disableButton.isEnabled = false saveButton.isEnabled = false - FileController.getFileById(navigationArgs.fileId)?.let { file -> + FileController.getFileByUidOrId(navigationArgs.fileId)?.let { file -> disableButton.isEnabled = true if (isManageDropBox) { diff --git a/app/src/main/java/com/infomaniak/drive/ui/fileList/DownloadProgressViewModel.kt b/app/src/main/java/com/infomaniak/drive/ui/fileList/DownloadProgressViewModel.kt index 0b0afd9cc9..3c45515ca9 100644 --- a/app/src/main/java/com/infomaniak/drive/ui/fileList/DownloadProgressViewModel.kt +++ b/app/src/main/java/com/infomaniak/drive/ui/fileList/DownloadProgressViewModel.kt @@ -1,6 +1,6 @@ /* * Infomaniak kDrive - Android - * Copyright (C) 2024-2025 Infomaniak Network SA + * Copyright (C) 2024-2026 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 @@ -40,7 +40,7 @@ class DownloadProgressViewModel : ViewModel() { val localFile = SingleLiveEvent() fun getLocalFile(fileId: Int, userDrive: UserDrive) { - localFile.value = FileController.getFileById(fileId, userDrive) + localFile.value = FileController.getFileByUidOrId(fileId, userDrive) } fun downloadFile(context: Context, file: File, userDrive: UserDrive) = viewModelScope.launch(Dispatchers.IO) { diff --git a/app/src/main/java/com/infomaniak/drive/ui/fileList/FileListFragment.kt b/app/src/main/java/com/infomaniak/drive/ui/fileList/FileListFragment.kt index 3bf01ae633..e29e8331f1 100644 --- a/app/src/main/java/com/infomaniak/drive/ui/fileList/FileListFragment.kt +++ b/app/src/main/java/com/infomaniak/drive/ui/fileList/FileListFragment.kt @@ -205,7 +205,7 @@ open class FileListFragment : MultiSelectFragment( is DeeplinkFilePath.FilePreviewInFolder -> fileType.folderId else -> navigationArgs.folderId } - folderName = fileType?.let { FileController.getFileById(folderId, userDrive)?.name } ?: navigationArgs.folderName + folderName = fileType?.let { FileController.getFileByUidOrId(folderId, userDrive)?.name } ?: navigationArgs.folderName } override fun initMultiSelectLayout(): MultiSelectLayoutBinding? = binding.multiSelectLayout @@ -384,7 +384,7 @@ open class FileListFragment : MultiSelectFragment( lifecycleScope.launchWhenResumed { with(requireActivity() as SelectFolderActivity) { showSaveButton() - val currentFolderRights = FileController.getFileById(folderId, userDrive)?.rights ?: Rights() + val currentFolderRights = FileController.getFileByUidOrId(folderId, userDrive)?.rights ?: Rights() val enable = folderId != selectFolderViewModel.disableSelectedFolderId && (currentFolderRights.canMoveInto || currentFolderRights.canCreateFile) enableSaveButton(enable) @@ -654,7 +654,7 @@ open class FileListFragment : MultiSelectFragment( activitiesRefreshTimer.cancel() isLoadingActivities = true mainViewModel.currentFolder.value?.let { localCurrentFolder -> - FileController.getFileById(localCurrentFolder.id, userDrive)?.let { updatedFolder -> + FileController.getFileByUidOrId(localCurrentFolder.id, userDrive)?.let { updatedFolder -> downloadFolderActivities(updatedFolder) activitiesRefreshTimer.start() } ?: run { activitiesRefreshTimer.start() } diff --git a/app/src/main/java/com/infomaniak/drive/ui/fileList/FileListViewModel.kt b/app/src/main/java/com/infomaniak/drive/ui/fileList/FileListViewModel.kt index 72ad1567a5..ef56e28b8d 100644 --- a/app/src/main/java/com/infomaniak/drive/ui/fileList/FileListViewModel.kt +++ b/app/src/main/java/com/infomaniak/drive/ui/fileList/FileListViewModel.kt @@ -361,7 +361,7 @@ class FileListViewModel(application: Application) : AndroidViewModel(application } fun shouldDisplaySubtitle(folderId: Int, userDrive: UserDrive?): Boolean { - val folder = FileController.getFileById(folderId, userDrive) ?: return false + val folder = FileController.getFileByUidOrId(folderId, userDrive) ?: return false return folder.getVisibilityType() == File.VisibilityType.IS_TEAM_SPACE } diff --git a/app/src/main/java/com/infomaniak/drive/ui/fileList/SelectFolderActivity.kt b/app/src/main/java/com/infomaniak/drive/ui/fileList/SelectFolderActivity.kt index bad2bcf8b7..55be005dd4 100644 --- a/app/src/main/java/com/infomaniak/drive/ui/fileList/SelectFolderActivity.kt +++ b/app/src/main/java/com/infomaniak/drive/ui/fileList/SelectFolderActivity.kt @@ -192,7 +192,7 @@ class SelectFolderActivity : BaseActivity() { val selectedFolderName = if (folderId == ROOT_ID) { currentDrive?.name } else { - FileController.getFileById(folderId, userDrive)?.name + FileController.getFileByUidOrId(folderId, userDrive)?.name } return selectedFolderName ?: "/" } diff --git a/app/src/main/java/com/infomaniak/drive/ui/fileList/SelectFolderFragment.kt b/app/src/main/java/com/infomaniak/drive/ui/fileList/SelectFolderFragment.kt index de55f9234a..9fe4d6a372 100644 --- a/app/src/main/java/com/infomaniak/drive/ui/fileList/SelectFolderFragment.kt +++ b/app/src/main/java/com/infomaniak/drive/ui/fileList/SelectFolderFragment.kt @@ -1,6 +1,6 @@ /* * Infomaniak kDrive - Android - * Copyright (C) 2022-2025 Infomaniak Network SA + * Copyright (C) 2022-2026 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 @@ -57,7 +57,7 @@ class SelectFolderFragment : FileListFragment() { toolbar.menu.findItem(R.id.addFolderItem).apply { setOnMenuItemClickListener { val selectFolderActivity = requireActivity() as? SelectFolderActivity - if (FileController.getFileById(folderId, userDrive)?.rights?.canCreateDirectory == true) { + if (FileController.getFileByUidOrId(folderId, userDrive)?.rights?.canCreateDirectory == true) { selectFolderActivity?.hideSaveButton() trackNewElementEvent(MatomoName.CreateFolderOnTheFly) safeNavigate( @@ -96,7 +96,7 @@ class SelectFolderFragment : FileListFragment() { lifecycleScope.launchWhenResumed { with(requireActivity() as SelectFolderActivity) { showSaveButton() - val currentFolderRights = FileController.getFileById(folderId, userDrive)?.rights ?: Rights() + val currentFolderRights = FileController.getFileByUidOrId(folderId, userDrive)?.rights ?: Rights() val enable = folderId != selectFolderViewModel.disableSelectedFolderId && (currentFolderRights.canMoveInto || currentFolderRights.canCreateFile) enableSaveButton(enable) diff --git a/app/src/main/java/com/infomaniak/drive/ui/fileList/SharedWithMeViewModel.kt b/app/src/main/java/com/infomaniak/drive/ui/fileList/SharedWithMeViewModel.kt index 7a1a37a942..6e6a563c04 100644 --- a/app/src/main/java/com/infomaniak/drive/ui/fileList/SharedWithMeViewModel.kt +++ b/app/src/main/java/com/infomaniak/drive/ui/fileList/SharedWithMeViewModel.kt @@ -1,6 +1,6 @@ /* * Infomaniak kDrive - Android - * Copyright (C) 2024 Infomaniak Network SA + * Copyright (C) 2024-2026 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 @@ -65,7 +65,7 @@ class SharedWithMeViewModel : ViewModel() { FileController.createSharedWithMeFolderIfNeeded(userDrive) } - val folderIsNotEmpty = FileController.getFileById(folderId, userDrive)?.children?.isNotEmpty() == true + val folderIsNotEmpty = FileController.getFileByUidOrId(folderId, userDrive)?.children?.isNotEmpty() == true if (folderIsNotEmpty) notifyUiToLoadData() if (!isNewSort) { diff --git a/app/src/main/java/com/infomaniak/drive/ui/fileList/UploadInProgressViewModel.kt b/app/src/main/java/com/infomaniak/drive/ui/fileList/UploadInProgressViewModel.kt index 0c68a4af69..5f79410aed 100644 --- a/app/src/main/java/com/infomaniak/drive/ui/fileList/UploadInProgressViewModel.kt +++ b/app/src/main/java/com/infomaniak/drive/ui/fileList/UploadInProgressViewModel.kt @@ -49,7 +49,7 @@ class UploadInProgressViewModel(application: Application) : AndroidViewModel(app private val getFolderJob = Job() fun getFolder(folderId: Int, userDrive: UserDrive) = liveData(getFolderJob + Dispatchers.IO) { - val localFolder = FileController.getFileById(folderId, userDrive) + val localFolder = FileController.getFileByUidOrId(folderId, userDrive) var remoteFolder: File? = null if (localFolder == null) { @@ -156,7 +156,7 @@ class UploadInProgressViewModel(application: Application) : AndroidViewModel(app } private fun createFolderFile(fileId: Int, userDrive: UserDrive): File? { - val folder = FileController.getFileById(fileId, userDrive) + val folder = FileController.getFileByUidOrId(fileId, userDrive) ?: FileController.getFileDetails(fileId, userDrive) ?: return null diff --git a/app/src/main/java/com/infomaniak/drive/ui/fileList/fileDetails/CreateOrEditCategoryViewModel.kt b/app/src/main/java/com/infomaniak/drive/ui/fileList/fileDetails/CreateOrEditCategoryViewModel.kt index 90e8be7328..37e0057b50 100644 --- a/app/src/main/java/com/infomaniak/drive/ui/fileList/fileDetails/CreateOrEditCategoryViewModel.kt +++ b/app/src/main/java/com/infomaniak/drive/ui/fileList/fileDetails/CreateOrEditCategoryViewModel.kt @@ -1,6 +1,6 @@ /* * Infomaniak kDrive - Android - * Copyright (C) 2022-2024 Infomaniak Network SA + * Copyright (C) 2022-2026 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 @@ -33,7 +33,7 @@ class CreateOrEditCategoryViewModel : ViewModel() { val driveId: Int by lazy { selectedFiles.first().driveId } fun init(filesId: IntArray?): LiveData = liveData(Dispatchers.IO) { - selectedFiles = filesId?.toList()?.mapNotNull { fileId -> FileController.getFileById(fileId) } ?: emptyList() + selectedFiles = filesId?.toList()?.mapNotNull { fileId -> FileController.getFileByUidOrId(fileId) } ?: emptyList() emit(selectedFiles.isEmpty()) } diff --git a/app/src/main/java/com/infomaniak/drive/ui/fileList/fileDetails/FileDetailsFragment.kt b/app/src/main/java/com/infomaniak/drive/ui/fileList/fileDetails/FileDetailsFragment.kt index d5da0279f5..d909934d6e 100644 --- a/app/src/main/java/com/infomaniak/drive/ui/fileList/fileDetails/FileDetailsFragment.kt +++ b/app/src/main/java/com/infomaniak/drive/ui/fileList/fileDetails/FileDetailsFragment.kt @@ -1,6 +1,6 @@ /* * Infomaniak kDrive - Android - * Copyright (C) 2022-2025 Infomaniak Network SA + * Copyright (C) 2022-2026 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 @@ -35,9 +35,9 @@ import com.google.android.material.appbar.CollapsingToolbarLayout import com.google.android.material.button.MaterialButton import com.infomaniak.core.common.extensions.isNightModeEnabled import com.infomaniak.core.common.extensions.lightStatusBar +import com.infomaniak.core.common.utils.format import com.infomaniak.core.legacy.utils.context import com.infomaniak.core.legacy.utils.safeBinding -import com.infomaniak.core.common.utils.format import com.infomaniak.core.ui.view.extension.setMargins import com.infomaniak.drive.R import com.infomaniak.drive.data.api.ApiRoutes @@ -68,7 +68,7 @@ class FileDetailsFragment : FileDetailsSubFragment() { binding.toolbar.setNavigationOnClickListener { findNavController().popBackStack() } - FileController.getFileById(fileId, userDrive)?.let(::setFile) + FileController.getFileByUidOrId(fileId, userDrive)?.let(::setFile) mainViewModel.getFileDetails(fileId, userDrive).observe(viewLifecycleOwner) { fileResponse -> fileResponse?.let(::setFile) diff --git a/app/src/main/java/com/infomaniak/drive/ui/fileList/fileDetails/SelectCategoriesViewModel.kt b/app/src/main/java/com/infomaniak/drive/ui/fileList/fileDetails/SelectCategoriesViewModel.kt index e9c0acbd88..bef95b996a 100644 --- a/app/src/main/java/com/infomaniak/drive/ui/fileList/fileDetails/SelectCategoriesViewModel.kt +++ b/app/src/main/java/com/infomaniak/drive/ui/fileList/fileDetails/SelectCategoriesViewModel.kt @@ -1,6 +1,6 @@ /* * Infomaniak kDrive - Android - * Copyright (C) 2022-2024 Infomaniak Network SA + * Copyright (C) 2022-2026 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 @@ -52,7 +52,7 @@ class SelectCategoriesViewModel : ViewModel() { CategoryRights() } else { selectedFiles = filesIds?.toList()?.mapNotNull { fileId -> - FileController.getFileById(fileId, userDrive) + FileController.getFileByUidOrId(fileId, userDrive) } ?: emptyList() if (selectedFiles.isEmpty()) { diff --git a/app/src/main/java/com/infomaniak/drive/ui/fileList/fileShare/FileShareViewModel.kt b/app/src/main/java/com/infomaniak/drive/ui/fileList/fileShare/FileShareViewModel.kt index 6c25847dc8..aae0e4fa85 100644 --- a/app/src/main/java/com/infomaniak/drive/ui/fileList/fileShare/FileShareViewModel.kt +++ b/app/src/main/java/com/infomaniak/drive/ui/fileList/fileShare/FileShareViewModel.kt @@ -1,6 +1,6 @@ /* * Infomaniak kDrive - Android - * Copyright (C) 2022-2024 Infomaniak Network SA + * Copyright (C) 2022-2026 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 @@ -42,7 +42,7 @@ class FileShareViewModel : ViewModel() { fun fetchCurrentFile(fileId: Int) = liveData(Dispatchers.IO) { emit( - FileController.getFileById(fileId) + FileController.getFileByUidOrId(fileId) ?: ApiRepository.getFileDetails(File(id = fileId, driveId = AccountUtils.currentDriveId)).data ) } diff --git a/app/src/main/java/com/infomaniak/drive/ui/fileList/preview/PreviewFragment.kt b/app/src/main/java/com/infomaniak/drive/ui/fileList/preview/PreviewFragment.kt index 91d27d22fb..e51e38b517 100644 --- a/app/src/main/java/com/infomaniak/drive/ui/fileList/preview/PreviewFragment.kt +++ b/app/src/main/java/com/infomaniak/drive/ui/fileList/preview/PreviewFragment.kt @@ -1,6 +1,6 @@ /* * Infomaniak kDrive - Android - * Copyright (C) 2022-2025 Infomaniak Network SA + * Copyright (C) 2022-2026 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 @@ -55,7 +55,7 @@ open class PreviewFragment : Fragment() { } private fun getCurrentFile(fileId: Int): File? = runCatching { - FileController.getFileById(fileId, previewSliderViewModel.userDrive) ?: mainViewModel.currentPreviewFileList[fileId] + FileController.getFileByUidOrId(fileId, previewSliderViewModel.userDrive) ?: mainViewModel.currentPreviewFileList[fileId] }.getOrElse { exception -> exception.printStackTrace() Sentry.captureException(exception) { scope -> diff --git a/app/src/main/java/com/infomaniak/drive/ui/fileList/preview/PreviewSliderFragment.kt b/app/src/main/java/com/infomaniak/drive/ui/fileList/preview/PreviewSliderFragment.kt index 41c370ce02..2e8b197c2b 100644 --- a/app/src/main/java/com/infomaniak/drive/ui/fileList/preview/PreviewSliderFragment.kt +++ b/app/src/main/java/com/infomaniak/drive/ui/fileList/preview/PreviewSliderFragment.kt @@ -87,7 +87,7 @@ class PreviewSliderFragment : BasePreviewSliderFragment(), FileInfoActionsView.O if (previewSliderViewModel.currentPreview == null) { userDrive = UserDrive(driveId = navigationArgs.driveId, sharedWithMe = navigationArgs.isSharedWithMe) - currentFile = FileController.getFileById(navigationArgs.fileId, userDrive) + currentFile = FileController.getFileByUidOrId(navigationArgs.fileId, userDrive) ?: mainViewModel.currentPreviewFileList[navigationArgs.fileId] ?: throw Exception("No current preview found") previewSliderViewModel.currentPreview = currentFile diff --git a/app/src/main/java/com/infomaniak/drive/ui/fileList/preview/playback/PlaybackViewModel.kt b/app/src/main/java/com/infomaniak/drive/ui/fileList/preview/playback/PlaybackViewModel.kt index 325e0ac9a9..8abbce267b 100644 --- a/app/src/main/java/com/infomaniak/drive/ui/fileList/preview/playback/PlaybackViewModel.kt +++ b/app/src/main/java/com/infomaniak/drive/ui/fileList/preview/playback/PlaybackViewModel.kt @@ -65,7 +65,7 @@ class PlaybackViewModel(application: Application) : AndroidViewModel(application } private suspend fun loadDriveFile(fileId: Int): File? = runCatching { - FileController.getFileById(fileId, userDrive) ?: withContext(Dispatchers.IO) { + FileController.getFileByUidOrId(fileId, userDrive) ?: withContext(Dispatchers.IO) { val okHttpClient = AccountUtils.getHttpClient(userDrive.userId) FileController.getRemoteFile(fileId, userDrive.driveId, okHttpClient)?.also { remoteFile -> FileController.saveRemoteFileToDb(remoteFile, userDrive, okHttpClient) diff --git a/app/src/main/java/com/infomaniak/drive/ui/menu/SharedWithMeFragment.kt b/app/src/main/java/com/infomaniak/drive/ui/menu/SharedWithMeFragment.kt index 69311cda49..d163bd0fe6 100644 --- a/app/src/main/java/com/infomaniak/drive/ui/menu/SharedWithMeFragment.kt +++ b/app/src/main/java/com/infomaniak/drive/ui/menu/SharedWithMeFragment.kt @@ -123,7 +123,7 @@ class SharedWithMeFragment : FileSubTypeListFragment() { } override fun previewFile(fileId: Int) { - FileController.getFileById(fileId, userDrive)?.let { file -> + FileController.getFileByUidOrId(fileId, userDrive)?.let { file -> openFileOrFolder(file) fileListViewModel.isPreviewManaged = true } @@ -146,7 +146,8 @@ class SharedWithMeFragment : FileSubTypeListFragment() { } private fun canShowButton(): Boolean { - val currentFolderRights = FileController.getFileById(folderId, userDrive)?.rights ?: Rights() + val currentFolderRights = FileController.getFileByUidOrId(folderId, userDrive)?.rights ?: Rights() + val isFromExternalOrCurrentDrive = navigationArgs.fromSaveExternal || userDrive?.driveId == AccountUtils.currentDriveId return folderId != selectFolderViewModel.disableSelectedFolderId && (currentFolderRights.canMoveInto || currentFolderRights.canCreateFile) 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 2cb73f5cae..c4e3979c15 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 @@ -34,10 +34,10 @@ import androidx.lifecycle.lifecycleScope import com.google.android.material.datepicker.CalendarConstraints import com.google.android.material.datepicker.DateValidatorPointBackward import com.google.android.material.datepicker.MaterialDatePicker +import com.infomaniak.core.common.extensions.isNightModeEnabled import com.infomaniak.core.common.utils.FORMAT_DATE_CLEAR_MONTH import com.infomaniak.core.common.utils.format import com.infomaniak.core.common.utils.startOfTheDay -import com.infomaniak.core.common.extensions.isNightModeEnabled import com.infomaniak.core.legacy.utils.context import com.infomaniak.core.legacy.utils.startAppSettingsConfig import com.infomaniak.core.legacy.utils.whenResultIsOk @@ -311,7 +311,7 @@ class SyncSettingsActivity : BaseActivity() { val selectedUserId = selectDriveViewModel.selectedUserId.value val selectedDriveId = selectDriveViewModel.selectedDrive.value?.id if (syncFolderId != null && selectedUserId != null && selectedDriveId != null) { - FileController.getFileById(syncFolderId, UserDrive(selectedUserId, selectedDriveId))?.let { + FileController.getFileByUidOrId(syncFolderId, UserDrive(selectedUserId, selectedDriveId))?.let { selectPath.setIconColor(it.color?.toColorInt() ?: context.getColor(R.color.folderDefaultColor)) selectPath.title = it.name changeSaveButtonStatus() diff --git a/app/src/main/java/com/infomaniak/drive/ui/selectPermission/SelectPermissionViewModel.kt b/app/src/main/java/com/infomaniak/drive/ui/selectPermission/SelectPermissionViewModel.kt index d8da7045fb..d0f916ca36 100644 --- a/app/src/main/java/com/infomaniak/drive/ui/selectPermission/SelectPermissionViewModel.kt +++ b/app/src/main/java/com/infomaniak/drive/ui/selectPermission/SelectPermissionViewModel.kt @@ -33,7 +33,7 @@ internal class SelectPermissionViewModel(savedStateHandle: SavedStateHandle) : V private val args = SelectPermissionBottomSheetDialogArgs.fromSavedStateHandle(savedStateHandle) val currentFileFlow = flow { - emit(FileController.getFileById(args.currentFileId)) + emit(FileController.getFileByUidOrId(args.currentFileId)) } fun editFileShareLinkOfficePermission(canEdit: Boolean) = liveData(Dispatchers.IO) {