From b5035e09b01fc13f4597d283e906cd56acaa2d5f Mon Sep 17 00:00:00 2001 From: daniele-verducci Date: Wed, 4 Nov 2026 17:58:49 +0100 Subject: [PATCH 1/2] Avoid picker navigation to affect main file list's one Signed-off-by: daniele-verducci --- .../nextcloud/client/di/ComponentsModule.kt | 4 +++ .../android/ui/activity/FilePickerActivity.kt | 3 +- .../ui/activity/FolderPickerActivity.kt | 3 +- .../android/ui/fragment/OCFileListFragment.kt | 6 ++-- .../ui/fragment/PickerFileListFragment.kt | 29 +++++++++++++++++++ 5 files changed, 40 insertions(+), 5 deletions(-) create mode 100644 app/src/main/java/com/owncloud/android/ui/fragment/PickerFileListFragment.kt diff --git a/app/src/main/java/com/nextcloud/client/di/ComponentsModule.kt b/app/src/main/java/com/nextcloud/client/di/ComponentsModule.kt index 9612adc09060..35c111139e9e 100644 --- a/app/src/main/java/com/nextcloud/client/di/ComponentsModule.kt +++ b/app/src/main/java/com/nextcloud/client/di/ComponentsModule.kt @@ -114,6 +114,7 @@ import com.owncloud.android.ui.fragment.GalleryFragmentBottomSheetDialog import com.owncloud.android.ui.fragment.GroupfolderListFragment import com.owncloud.android.ui.fragment.OCFileListBottomSheetDialog import com.owncloud.android.ui.fragment.OCFileListFragment +import com.owncloud.android.ui.fragment.PickerFileListFragment import com.owncloud.android.ui.fragment.SharedListFragment import com.owncloud.android.ui.fragment.UnifiedSearchFragment import com.owncloud.android.ui.fragment.albums.AlbumItemsFragment @@ -475,6 +476,9 @@ internal interface ComponentsModule { @ContributesAndroidInjector fun groupfolderListFragment(): GroupfolderListFragment + @ContributesAndroidInjector + fun pickerFileListFragment(): PickerFileListFragment + @ContributesAndroidInjector fun launcherActivity(): LauncherActivity diff --git a/app/src/main/java/com/owncloud/android/ui/activity/FilePickerActivity.kt b/app/src/main/java/com/owncloud/android/ui/activity/FilePickerActivity.kt index 050331b99a8d..2861a564c4b7 100644 --- a/app/src/main/java/com/owncloud/android/ui/activity/FilePickerActivity.kt +++ b/app/src/main/java/com/owncloud/android/ui/activity/FilePickerActivity.kt @@ -10,6 +10,7 @@ package com.owncloud.android.ui.activity import android.os.Bundle import com.owncloud.android.R import com.owncloud.android.ui.fragment.OCFileListFragment +import com.owncloud.android.ui.fragment.PickerFileListFragment /** * File picker of remote files @@ -17,7 +18,7 @@ import com.owncloud.android.ui.fragment.OCFileListFragment class FilePickerActivity : FolderPickerActivity() { override fun createFragments() { - val listOfFiles = OCFileListFragment() + val listOfFiles = PickerFileListFragment() val args = Bundle() args.putBoolean(OCFileListFragment.ARG_ONLY_FOLDERS_CLICKABLE, true) args.putBoolean(OCFileListFragment.ARG_HIDE_FAB, true) diff --git a/app/src/main/java/com/owncloud/android/ui/activity/FolderPickerActivity.kt b/app/src/main/java/com/owncloud/android/ui/activity/FolderPickerActivity.kt index 06a65f6f1aa5..909085ec6bfd 100644 --- a/app/src/main/java/com/owncloud/android/ui/activity/FolderPickerActivity.kt +++ b/app/src/main/java/com/owncloud/android/ui/activity/FolderPickerActivity.kt @@ -47,6 +47,7 @@ import com.owncloud.android.ui.events.SearchEvent import com.owncloud.android.ui.fragment.EmptyListState import com.owncloud.android.ui.fragment.FileFragment import com.owncloud.android.ui.fragment.OCFileListFragment +import com.owncloud.android.ui.fragment.PickerFileListFragment import com.owncloud.android.ui.navigation.model.ActionBarStyle import com.owncloud.android.utils.DataHolderUtil import com.owncloud.android.utils.ErrorMessageAdapter @@ -198,7 +199,7 @@ open class FolderPickerActivity : get() = this protected open fun createFragments() { - val listOfFiles = OCFileListFragment() + val listOfFiles = PickerFileListFragment() val bundle = Bundle().apply { putBoolean(OCFileListFragment.ARG_ONLY_FOLDERS_CLICKABLE, true) diff --git a/app/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.kt b/app/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.kt index 2229ddb3ff82..6e65c847f423 100644 --- a/app/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.kt +++ b/app/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.kt @@ -1070,15 +1070,15 @@ open class OCFileListFragment : browseToFolder(root, FIRST_POSITION) } - fun setFileDepth(file: OCFile?) { + open fun setFileDepth(file: OCFile?) { currentFileDepth = file.getDepth() } - fun resetFileDepth() { + open fun resetFileDepth() { currentFileDepth = OCFileDepth.Root } - val fileDepth: OCFileDepth? + open val fileDepth: OCFileDepth? get() = currentFileDepth //endregion diff --git a/app/src/main/java/com/owncloud/android/ui/fragment/PickerFileListFragment.kt b/app/src/main/java/com/owncloud/android/ui/fragment/PickerFileListFragment.kt new file mode 100644 index 000000000000..73d3ba024c62 --- /dev/null +++ b/app/src/main/java/com/owncloud/android/ui/fragment/PickerFileListFragment.kt @@ -0,0 +1,29 @@ +/* + * Nextcloud - Android Client + * + * SPDX-FileCopyrightText: 2026 Daniele Verducci + * SPDX-FileCopyrightText: 2026 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ +package com.owncloud.android.ui.fragment + +import com.nextcloud.utils.extensions.getDepth +import com.owncloud.android.datamodel.OCFile +import com.owncloud.android.datamodel.OCFileDepth + +/** + * An OCFileListFragment that stores the fileDepth on its own instance, + * differently from OCFileListFragment, that stores it in a static field. + * To be used for file picker navigation, to avoid changing main list's one. + */ +class PickerFileListFragment : OCFileListFragment() { + override var fileDepth: OCFileDepth? = OCFileDepth.Root + + override fun setFileDepth(file: OCFile?) { + fileDepth = file.getDepth() + } + + override fun resetFileDepth() { + fileDepth = OCFileDepth.Root + } +} From 6163caa60074f018975dda869d0a19f79867528e Mon Sep 17 00:00:00 2001 From: daniele-verducci Date: Thu, 5 Nov 2026 11:13:54 +0100 Subject: [PATCH 2/2] Better fix for picker navigation affecting all file list fragments Signed-off-by: daniele-verducci --- .../nextcloud/client/di/ComponentsModule.kt | 4 --- .../android/ui/activity/FilePickerActivity.kt | 3 +- .../ui/activity/FolderPickerActivity.kt | 3 +- .../android/ui/fragment/OCFileListFragment.kt | 21 ++++++++------ .../ui/fragment/PickerFileListFragment.kt | 29 ------------------- 5 files changed, 14 insertions(+), 46 deletions(-) delete mode 100644 app/src/main/java/com/owncloud/android/ui/fragment/PickerFileListFragment.kt diff --git a/app/src/main/java/com/nextcloud/client/di/ComponentsModule.kt b/app/src/main/java/com/nextcloud/client/di/ComponentsModule.kt index 35c111139e9e..9612adc09060 100644 --- a/app/src/main/java/com/nextcloud/client/di/ComponentsModule.kt +++ b/app/src/main/java/com/nextcloud/client/di/ComponentsModule.kt @@ -114,7 +114,6 @@ import com.owncloud.android.ui.fragment.GalleryFragmentBottomSheetDialog import com.owncloud.android.ui.fragment.GroupfolderListFragment import com.owncloud.android.ui.fragment.OCFileListBottomSheetDialog import com.owncloud.android.ui.fragment.OCFileListFragment -import com.owncloud.android.ui.fragment.PickerFileListFragment import com.owncloud.android.ui.fragment.SharedListFragment import com.owncloud.android.ui.fragment.UnifiedSearchFragment import com.owncloud.android.ui.fragment.albums.AlbumItemsFragment @@ -476,9 +475,6 @@ internal interface ComponentsModule { @ContributesAndroidInjector fun groupfolderListFragment(): GroupfolderListFragment - @ContributesAndroidInjector - fun pickerFileListFragment(): PickerFileListFragment - @ContributesAndroidInjector fun launcherActivity(): LauncherActivity diff --git a/app/src/main/java/com/owncloud/android/ui/activity/FilePickerActivity.kt b/app/src/main/java/com/owncloud/android/ui/activity/FilePickerActivity.kt index 2861a564c4b7..050331b99a8d 100644 --- a/app/src/main/java/com/owncloud/android/ui/activity/FilePickerActivity.kt +++ b/app/src/main/java/com/owncloud/android/ui/activity/FilePickerActivity.kt @@ -10,7 +10,6 @@ package com.owncloud.android.ui.activity import android.os.Bundle import com.owncloud.android.R import com.owncloud.android.ui.fragment.OCFileListFragment -import com.owncloud.android.ui.fragment.PickerFileListFragment /** * File picker of remote files @@ -18,7 +17,7 @@ import com.owncloud.android.ui.fragment.PickerFileListFragment class FilePickerActivity : FolderPickerActivity() { override fun createFragments() { - val listOfFiles = PickerFileListFragment() + val listOfFiles = OCFileListFragment() val args = Bundle() args.putBoolean(OCFileListFragment.ARG_ONLY_FOLDERS_CLICKABLE, true) args.putBoolean(OCFileListFragment.ARG_HIDE_FAB, true) diff --git a/app/src/main/java/com/owncloud/android/ui/activity/FolderPickerActivity.kt b/app/src/main/java/com/owncloud/android/ui/activity/FolderPickerActivity.kt index 909085ec6bfd..06a65f6f1aa5 100644 --- a/app/src/main/java/com/owncloud/android/ui/activity/FolderPickerActivity.kt +++ b/app/src/main/java/com/owncloud/android/ui/activity/FolderPickerActivity.kt @@ -47,7 +47,6 @@ import com.owncloud.android.ui.events.SearchEvent import com.owncloud.android.ui.fragment.EmptyListState import com.owncloud.android.ui.fragment.FileFragment import com.owncloud.android.ui.fragment.OCFileListFragment -import com.owncloud.android.ui.fragment.PickerFileListFragment import com.owncloud.android.ui.navigation.model.ActionBarStyle import com.owncloud.android.utils.DataHolderUtil import com.owncloud.android.utils.ErrorMessageAdapter @@ -199,7 +198,7 @@ open class FolderPickerActivity : get() = this protected open fun createFragments() { - val listOfFiles = PickerFileListFragment() + val listOfFiles = OCFileListFragment() val bundle = Bundle().apply { putBoolean(OCFileListFragment.ARG_ONLY_FOLDERS_CLICKABLE, true) diff --git a/app/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.kt b/app/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.kt index 6e65c847f423..10a1bbebee36 100644 --- a/app/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.kt +++ b/app/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.kt @@ -60,6 +60,7 @@ import com.nextcloud.utils.e2ee.E2EEActionResolver import com.nextcloud.utils.e2ee.E2EEDialogPresenter import com.nextcloud.utils.extensions.getDepth import com.nextcloud.utils.extensions.getParcelableArgument +import com.nextcloud.utils.extensions.getSerializableArgument import com.nextcloud.utils.extensions.isDialogFragmentReady import com.nextcloud.utils.extensions.isWebViewAvailable import com.nextcloud.utils.extensions.listenEncryptionDialogResult @@ -186,6 +187,9 @@ open class OCFileListFragment : var currentFile: OCFile? = null protected set + var fileDepth: OCFileDepth? = OCFileDepth.Root + private set + var adapter: OCFileListAdapter? = null protected set @@ -254,6 +258,7 @@ open class OCFileListFragment : val state = savedInstanceState ?: arguments loadSearchState(state) currentFile = state.getParcelableArgument(KEY_FILE, OCFile::class.java) + savedInstanceState?.let { fileDepth = it.getSerializableArgument(KEY_FILE_DEPTH, OCFileDepth::class.java) } isSearchFragment = activeSearchEvent != null folderEncryption = FolderEncryption(this) encryptedClickHandler = EncryptedFolderClickHandler(this) @@ -331,6 +336,7 @@ open class OCFileListFragment : super.onSaveInstanceState(outState) currentFile.logFileSize(TAG) outState.putParcelable(KEY_FILE, currentFile) + outState.putSerializable(KEY_FILE_DEPTH, fileDepth) if (isSearchFragment) { outState.putParcelable(KEY_CURRENT_SEARCH_TYPE, currentSearchType) activeSearchEvent?.let { outState.putParcelable(SEARCH_EVENT, it) } @@ -1070,16 +1076,13 @@ open class OCFileListFragment : browseToFolder(root, FIRST_POSITION) } - open fun setFileDepth(file: OCFile?) { - currentFileDepth = file.getDepth() + fun setFileDepth(file: OCFile?) { + fileDepth = file.getDepth() } - open fun resetFileDepth() { - currentFileDepth = OCFileDepth.Root + fun resetFileDepth() { + fileDepth = OCFileDepth.Root } - - open val fileDepth: OCFileDepth? - get() = currentFileDepth //endregion //region Directory listing @@ -1133,6 +1136,7 @@ open class OCFileListFragment : } currentFile = directoryToList + setFileDepth(directoryToList) updateUiForCurrentFolder() } @@ -1518,6 +1522,7 @@ open class OCFileListFragment : const val SEARCH_EVENT = "SEARCH_EVENT" const val KEY_CURRENT_SEARCH_TYPE = "CURRENT_SEARCH_TYPE" private val KEY_FILE = "$MY_PACKAGE.extra.FILE" + private val KEY_FILE_DEPTH = "$MY_PACKAGE.extra.FILE_DEPTH" private const val DIALOG_CREATE_FOLDER = "DIALOG_CREATE_FOLDER" private const val DIALOG_CREATE_DOCUMENT = "DIALOG_CREATE_DOCUMENT" @@ -1550,8 +1555,6 @@ open class OCFileListFragment : private val scanIntentExternalApp = Intent(SCAN_TO_PDF_ACTION) - private var currentFileDepth: OCFileDepth? = OCFileDepth.Root - var isMultipleFileSelectedForCopyOrMove = false } } diff --git a/app/src/main/java/com/owncloud/android/ui/fragment/PickerFileListFragment.kt b/app/src/main/java/com/owncloud/android/ui/fragment/PickerFileListFragment.kt deleted file mode 100644 index 73d3ba024c62..000000000000 --- a/app/src/main/java/com/owncloud/android/ui/fragment/PickerFileListFragment.kt +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Nextcloud - Android Client - * - * SPDX-FileCopyrightText: 2026 Daniele Verducci - * SPDX-FileCopyrightText: 2026 Nextcloud GmbH and Nextcloud contributors - * SPDX-License-Identifier: AGPL-3.0-or-later - */ -package com.owncloud.android.ui.fragment - -import com.nextcloud.utils.extensions.getDepth -import com.owncloud.android.datamodel.OCFile -import com.owncloud.android.datamodel.OCFileDepth - -/** - * An OCFileListFragment that stores the fileDepth on its own instance, - * differently from OCFileListFragment, that stores it in a static field. - * To be used for file picker navigation, to avoid changing main list's one. - */ -class PickerFileListFragment : OCFileListFragment() { - override var fileDepth: OCFileDepth? = OCFileDepth.Root - - override fun setFileDepth(file: OCFile?) { - fileDepth = file.getDepth() - } - - override fun resetFileDepth() { - fileDepth = OCFileDepth.Root - } -}