From 0fdd3e7b0224dfe7480217a82e5b396fa650bfbc Mon Sep 17 00:00:00 2001 From: alperozturk96 Date: Thu, 29 Jan 2026 15:13:16 +0100 Subject: [PATCH 1/9] fix(file-list): when user opens file from unified search and press back Signed-off-by: alperozturk96 --- .../ui/activity/FileDisplayActivity.kt | 102 ++++++++++-------- .../ui/adapter/UnifiedSearchItemViewHolder.kt | 1 + .../ui/fragment/OCFileListFragment.java | 11 ++ .../ui/fragment/UnifiedSearchFragment.kt | 6 +- .../ui/preview/PreviewImageActivity.kt | 15 ++- 5 files changed, 88 insertions(+), 47 deletions(-) diff --git a/app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt b/app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt index 79925570bbac..26fba87e8fce 100644 --- a/app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt +++ b/app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt @@ -278,6 +278,7 @@ class FileDisplayActivity : observeWorkerState() startMetadataSyncForRoot() handleBackPress() + registerUnifiedSearchReceiver() } private fun loadSavedInstanceState(savedInstanceState: Bundle?) { @@ -731,7 +732,13 @@ class FileDisplayActivity : val transaction = fragmentManager.beginTransaction() transaction.addToBackStack(null) transaction.replace(R.id.left_fragment_container, fragment, TAG_LIST_OF_FILES) - transaction.commit() + + if (fragmentManager.isStateSaved) { + transaction.commitAllowingStateLoss() + } else { + transaction.commit() + } + callback.onComplete(true) } else { callback.onComplete(false) @@ -1953,7 +1960,7 @@ class FileDisplayActivity : else -> VirtualFolderType.NONE } - startImagePreview(file, type, file.isDown) + startImagePreview(file, file.isDown, type) } else { startImagePreview(file, file.isDown) } @@ -2482,44 +2489,33 @@ class FileDisplayActivity : } } - fun startImagePreview(file: OCFile, showPreview: Boolean) { - val showDetailsIntent = Intent(this, PreviewImageActivity::class.java) - showDetailsIntent.putExtra(EXTRA_FILE, file) - showDetailsIntent.putExtra(EXTRA_LIVE_PHOTO_FILE, file.livePhotoVideo) - showDetailsIntent.putExtra( - EXTRA_USER, - user.orElseThrow(Supplier { RuntimeException() }) - ) - if (showPreview) { - startActivity(showDetailsIntent) - } else { - val fileOperationsHelper = - FileOperationsHelper(this, userAccountManager, connectivityService, editorUtils) - fileOperationsHelper.startSyncForFileAndIntent(file, showDetailsIntent) + fun startImagePreview(file: OCFile, preview: Boolean, type: VirtualFolderType? = null) { + val optionalUser = user + if (optionalUser.isEmpty) { + Log_OC.e(TAG, "user is empty cannot preview image") + return } - } - fun startImagePreview(file: OCFile, type: VirtualFolderType?, showPreview: Boolean) { - val showDetailsIntent = Intent(this, PreviewImageActivity::class.java) - showDetailsIntent.putExtra(EXTRA_FILE, file) - showDetailsIntent.putExtra(EXTRA_LIVE_PHOTO_FILE, file.livePhotoVideo) - showDetailsIntent.putExtra( - EXTRA_USER, - user.orElseThrow(Supplier { RuntimeException() }) - ) - showDetailsIntent.putExtra(PreviewImageActivity.EXTRA_VIRTUAL_TYPE, type) + val intent = Intent(this, PreviewImageActivity::class.java).apply { + putExtra(EXTRA_FILE, file) + putExtra(EXTRA_LIVE_PHOTO_FILE, file.livePhotoVideo) + putExtra(EXTRA_USER, optionalUser.get()) + putExtra(PreviewImageActivity.EXTRA_VIRTUAL_TYPE, type) + putExtra(PreviewImageActivity.EXTRA_LAST_SEARCH_QUERY, listOfFilesFragment?.lastSearchQuery) + } - if (showPreview) { - startActivity(showDetailsIntent) - } else { - val fileOperationsHelper = FileOperationsHelper( - this, - userAccountManager, - connectivityService, - editorUtils - ) - fileOperationsHelper.startSyncForFileAndIntent(file, showDetailsIntent) + if (preview) { + startActivity(intent) + return } + + val operation = FileOperationsHelper( + this, + userAccountManager, + connectivityService, + editorUtils + ) + operation.startSyncForFileAndIntent(file, intent) } /** @@ -2782,8 +2778,8 @@ class FileDisplayActivity : val virtualType = bundle.get(PreviewImageActivity.EXTRA_VIRTUAL_TYPE) as VirtualFolderType? startImagePreview( file, - virtualType, - true + true, + virtualType ) } else { startImagePreview(file, true) @@ -3043,23 +3039,41 @@ class FileDisplayActivity : binding.fabMain.visibility = visibility } - fun showFile(selectedFile: OCFile?, message: String?) { + private fun registerUnifiedSearchReceiver() { + val filter = IntentFilter(UNIFIED_SEARCH_EVENT_ACTION) + LocalBroadcastManager.getInstance(this).registerReceiver(unifiedSearchReceiver, filter) + } + + private val unifiedSearchReceiver: BroadcastReceiver = object : BroadcastReceiver() { + override fun onReceive(context: Context, intent: Intent) { + val query = intent.getStringExtra(PreviewImageActivity.EXTRA_LAST_SEARCH_QUERY) ?: return + Handler(Looper.getMainLooper()).post { + if (!isFinishing && !isDestroyed) { + performUnifiedSearch(query, null) + } + } + } + } + + @JvmOverloads + fun showFile(selectedFile: OCFile?, message: String?, lastSearchQuery: String? = null) { dismissLoadingDialog() getOCFileListFragmentFromFile(object : TransactionInterface { override fun onOCFileListFragmentComplete(listOfFiles: OCFileListFragment) { - if (TextUtils.isEmpty(message)) { + if (message?.isEmpty() == true) { val temp = file file = getCurrentDir() listOfFiles.listDirectory(getCurrentDir(), temp, MainApp.isOnlyOnDevice()) updateActionBarTitleAndHomeButton(null) } else { - val view = listOfFiles.view - if (view != null) { - DisplayUtils.showSnackMessage(view, message) + listOfFiles.view?.let { + DisplayUtils.showSnackMessage(it, message) } } + if (selectedFile != null) { + listOfFiles.setLastSearchQuery(lastSearchQuery) listOfFiles.onItemClicked(selectedFile) } } @@ -3124,6 +3138,8 @@ class FileDisplayActivity : const val ACTION_DETAILS: String = "com.owncloud.android.ui.activity.action.DETAILS" + const val UNIFIED_SEARCH_EVENT_ACTION = "PHOTO_SEARCH_EVENT" + @JvmField val REQUEST_CODE__SELECT_CONTENT_FROM_APPS: Int = REQUEST_CODE__LAST_SHARED + 1 diff --git a/app/src/main/java/com/owncloud/android/ui/adapter/UnifiedSearchItemViewHolder.kt b/app/src/main/java/com/owncloud/android/ui/adapter/UnifiedSearchItemViewHolder.kt index fcc8f4661f39..1a4d62cd48e1 100644 --- a/app/src/main/java/com/owncloud/android/ui/adapter/UnifiedSearchItemViewHolder.kt +++ b/app/src/main/java/com/owncloud/android/ui/adapter/UnifiedSearchItemViewHolder.kt @@ -54,6 +54,7 @@ class UnifiedSearchItemViewHolder( val entryType = entry.getType() viewThemeUtils.platform.colorImageView(binding.thumbnail, ColorRole.PRIMARY) + GlideHelper.loadIntoImageView( context, nextcloudClient, diff --git a/app/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java b/app/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java index cfe5f17f3f57..50117a3447c5 100644 --- a/app/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java +++ b/app/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java @@ -127,6 +127,7 @@ import java.util.Iterator; import java.util.List; import java.util.Objects; +import java.util.Optional; import java.util.Set; import javax.inject.Inject; @@ -225,6 +226,7 @@ public class OCFileListFragment extends ExtendedListFragment implements protected String mLimitToMimeType; private FloatingActionButton mFabMain; public static boolean isMultipleFileSelectedForCopyOrMove = false; + private String lastSearchQuery = null; @Inject DeviceInfo deviceInfo; @@ -253,6 +255,15 @@ public void onCreate(Bundle savedInstanceState) { searchFragment = currentSearchType != null && isSearchEventSet(searchEvent); } + public void setLastSearchQuery(@Nullable String value) { + lastSearchQuery = value; + } + + @Nullable + public String getLastSearchQuery() { + return lastSearchQuery; + } + @Override public void onResume() { // Don't handle search events if we're coming back from back stack diff --git a/app/src/main/java/com/owncloud/android/ui/fragment/UnifiedSearchFragment.kt b/app/src/main/java/com/owncloud/android/ui/fragment/UnifiedSearchFragment.kt index 74f9248640e3..734d18093d83 100644 --- a/app/src/main/java/com/owncloud/android/ui/fragment/UnifiedSearchFragment.kt +++ b/app/src/main/java/com/owncloud/android/ui/fragment/UnifiedSearchFragment.kt @@ -209,7 +209,7 @@ class UnifiedSearchFragment : // Because this fragment is opened with TextView onClick on the previous screen maxWidth = Integer.MAX_VALUE viewThemeUtils.androidx.themeToolbarSearchView(this) - setQuery(vm.query.value ?: initialQuery, false) + setQuery(getLastSearchQuery(), false) setOnQueryTextListener(this@UnifiedSearchFragment) isIconified = false clearFocus() @@ -362,12 +362,14 @@ class UnifiedSearchFragment : if (showFileActions) { fda.showFileActions(file) } else { - fda.showFile(file, "") + fda.showFile(file, "", getLastSearchQuery()) } } } } + private fun getLastSearchQuery(): String? = vm.query.value ?: initialQuery + private fun setupAdapter() { val syncedFolderProvider = SyncedFolderProvider(requireContext().contentResolver, appPreferences, clock) val gridLayoutManager = GridLayoutManager(requireContext(), 1) diff --git a/app/src/main/java/com/owncloud/android/ui/preview/PreviewImageActivity.kt b/app/src/main/java/com/owncloud/android/ui/preview/PreviewImageActivity.kt index 3ebde7fb9324..6144440bca4b 100644 --- a/app/src/main/java/com/owncloud/android/ui/preview/PreviewImageActivity.kt +++ b/app/src/main/java/com/owncloud/android/ui/preview/PreviewImageActivity.kt @@ -249,8 +249,17 @@ class PreviewImageActivity : } private fun sendRefreshSearchEventBroadcast() { - val intent = Intent(GalleryFragment.REFRESH_SEARCH_EVENT_RECEIVER) - LocalBroadcastManager.getInstance(this).sendBroadcast(intent) + val broadcastManager = LocalBroadcastManager.getInstance(this) + + val photoSearchIntent = Intent(GalleryFragment.REFRESH_SEARCH_EVENT_RECEIVER) + broadcastManager.sendBroadcast(photoSearchIntent) + + intent.getStringExtra(EXTRA_LAST_SEARCH_QUERY)?.let { + val unifiedSearchIntent = Intent(FileDisplayActivity.UNIFIED_SEARCH_EVENT_ACTION).apply { + putExtra(EXTRA_LAST_SEARCH_QUERY, it) + } + broadcastManager.sendBroadcast(unifiedSearchIntent) + } } public override fun onStart() { @@ -591,6 +600,8 @@ class PreviewImageActivity : companion object { val TAG: String = PreviewImageActivity::class.java.simpleName const val EXTRA_VIRTUAL_TYPE: String = "EXTRA_VIRTUAL_TYPE" + const val EXTRA_LAST_SEARCH_QUERY: String = "EXTRA_LAST_SEARCH_QUERY" + private const val KEY_WAITING_FOR_BINDER = "WAITING_FOR_BINDER" private const val KEY_SYSTEM_VISIBLE = "TRUE" From 76796f2f918e6156c4e24f4b46cf295890447cce Mon Sep 17 00:00:00 2001 From: alperozturk96 Date: Thu, 29 Jan 2026 15:17:20 +0100 Subject: [PATCH 2/9] fix(unified-search-list-adapter): async initialization Signed-off-by: alperozturk96 --- .../ui/adapter/UnifiedSearchItemViewHolder.kt | 33 +++++++---- .../ui/adapter/UnifiedSearchListAdapter.kt | 6 +- .../ui/fragment/UnifiedSearchFragment.kt | 59 ++++++++----------- 3 files changed, 49 insertions(+), 49 deletions(-) diff --git a/app/src/main/java/com/owncloud/android/ui/adapter/UnifiedSearchItemViewHolder.kt b/app/src/main/java/com/owncloud/android/ui/adapter/UnifiedSearchItemViewHolder.kt index 1a4d62cd48e1..abb398bd4dd9 100644 --- a/app/src/main/java/com/owncloud/android/ui/adapter/UnifiedSearchItemViewHolder.kt +++ b/app/src/main/java/com/owncloud/android/ui/adapter/UnifiedSearchItemViewHolder.kt @@ -9,29 +9,35 @@ package com.owncloud.android.ui.adapter import android.content.Context import android.view.View +import androidx.lifecycle.lifecycleScope import com.afollestad.sectionedrecyclerview.SectionedViewHolder import com.nextcloud.android.common.ui.theme.utils.ColorRole -import com.nextcloud.common.NextcloudClient import com.nextcloud.model.SearchResultEntryType import com.nextcloud.utils.CalendarEventManager import com.nextcloud.utils.ContactManager import com.nextcloud.utils.GlideHelper import com.nextcloud.utils.extensions.getType +import com.nextcloud.utils.extensions.getTypedActivity import com.owncloud.android.databinding.UnifiedSearchItemBinding import com.owncloud.android.datamodel.FileDataStorageManager import com.owncloud.android.lib.common.SearchResultEntry +import com.owncloud.android.ui.activity.FileActivity +import com.owncloud.android.ui.fragment.UnifiedSearchFragment import com.owncloud.android.ui.interfaces.UnifiedSearchListInterface import com.owncloud.android.utils.theme.ViewThemeUtils +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext @Suppress("LongParameterList") class UnifiedSearchItemViewHolder( + private val fragment: UnifiedSearchFragment, private val supportsOpeningCalendarContactsLocally: Boolean, val binding: UnifiedSearchItemBinding, private val storageManager: FileDataStorageManager, private val listInterface: UnifiedSearchListInterface, private val filesAction: FilesAction, val context: Context, - private val nextcloudClient: NextcloudClient, private val viewThemeUtils: ViewThemeUtils ) : SectionedViewHolder(binding.root) { @@ -55,14 +61,21 @@ class UnifiedSearchItemViewHolder( val entryType = entry.getType() viewThemeUtils.platform.colorImageView(binding.thumbnail, ColorRole.PRIMARY) - GlideHelper.loadIntoImageView( - context, - nextcloudClient, - entry.thumbnailUrl, - binding.thumbnail, - entryType.iconId(), - circleCrop = entry.rounded - ) + fragment.lifecycleScope.launch(Dispatchers.IO) { + val client = + fragment.getTypedActivity(FileActivity::class.java)?.clientRepository?.getNextcloudClient() ?: return@launch + + withContext(Dispatchers.Main) { + GlideHelper.loadIntoImageView( + context, + client, + entry.thumbnailUrl, + binding.thumbnail, + entryType.iconId(), + circleCrop = entry.rounded + ) + } + } if (entry.isFile) { binding.more.visibility = View.VISIBLE diff --git a/app/src/main/java/com/owncloud/android/ui/adapter/UnifiedSearchListAdapter.kt b/app/src/main/java/com/owncloud/android/ui/adapter/UnifiedSearchListAdapter.kt index 6e5b0c6a4f20..46dedad2d5a3 100644 --- a/app/src/main/java/com/owncloud/android/ui/adapter/UnifiedSearchListAdapter.kt +++ b/app/src/main/java/com/owncloud/android/ui/adapter/UnifiedSearchListAdapter.kt @@ -17,7 +17,6 @@ import com.afollestad.sectionedrecyclerview.SectionedRecyclerViewAdapter import com.afollestad.sectionedrecyclerview.SectionedViewHolder import com.nextcloud.client.account.User import com.nextcloud.client.preferences.AppPreferences -import com.nextcloud.common.NextcloudClient import com.owncloud.android.R import com.owncloud.android.databinding.UnifiedSearchCurrentDirectoryItemBinding import com.owncloud.android.databinding.UnifiedSearchEmptyBinding @@ -28,6 +27,7 @@ import com.owncloud.android.datamodel.FileDataStorageManager import com.owncloud.android.datamodel.OCFile import com.owncloud.android.datamodel.SyncedFolderProvider import com.owncloud.android.datamodel.ThumbnailsCacheManager +import com.owncloud.android.ui.fragment.UnifiedSearchFragment import com.owncloud.android.ui.interfaces.UnifiedSearchCurrentDirItemAction import com.owncloud.android.ui.interfaces.UnifiedSearchListInterface import com.owncloud.android.ui.unifiedsearch.UnifiedSearchSection @@ -39,6 +39,7 @@ import com.owncloud.android.utils.theme.ViewThemeUtils */ @Suppress("LongParameterList") class UnifiedSearchListAdapter( + private val fragment: UnifiedSearchFragment, private val supportsOpeningCalendarContactsLocally: Boolean, private val storageManager: FileDataStorageManager, private val listInterface: UnifiedSearchListInterface, @@ -48,7 +49,6 @@ class UnifiedSearchListAdapter( private val viewThemeUtils: ViewThemeUtils, private val appPreferences: AppPreferences, private val syncedFolderProvider: SyncedFolderProvider, - private val nextcloudClient: NextcloudClient, private val currentDirItemAction: UnifiedSearchCurrentDirItemAction ) : SectionedRecyclerViewAdapter() { companion object { @@ -85,13 +85,13 @@ class UnifiedSearchListAdapter( false ) UnifiedSearchItemViewHolder( + fragment, supportsOpeningCalendarContactsLocally, binding, storageManager, listInterface, filesAction, context, - nextcloudClient, viewThemeUtils ) } diff --git a/app/src/main/java/com/owncloud/android/ui/fragment/UnifiedSearchFragment.kt b/app/src/main/java/com/owncloud/android/ui/fragment/UnifiedSearchFragment.kt index 734d18093d83..3e609dd361b8 100644 --- a/app/src/main/java/com/owncloud/android/ui/fragment/UnifiedSearchFragment.kt +++ b/app/src/main/java/com/owncloud/android/ui/fragment/UnifiedSearchFragment.kt @@ -26,7 +26,6 @@ import androidx.appcompat.widget.SearchView import androidx.core.view.updatePadding import androidx.fragment.app.Fragment import androidx.lifecycle.ViewModelProvider -import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.GridLayoutManager import com.nextcloud.client.account.CurrentAccountProvider import com.nextcloud.client.account.UserAccountManager @@ -36,7 +35,6 @@ import com.nextcloud.client.di.Injectable import com.nextcloud.client.di.ViewModelFactory import com.nextcloud.client.network.ClientFactory import com.nextcloud.client.preferences.AppPreferences -import com.nextcloud.utils.extensions.getTypedActivity import com.nextcloud.utils.extensions.searchFilesByName import com.nextcloud.utils.extensions.typedActivity import com.owncloud.android.R @@ -47,7 +45,6 @@ import com.owncloud.android.datamodel.SyncedFolderProvider import com.owncloud.android.lib.common.SearchResultEntry import com.owncloud.android.lib.common.utils.Log_OC import com.owncloud.android.lib.resources.status.NextcloudVersion -import com.owncloud.android.ui.activity.FileActivity import com.owncloud.android.ui.activity.FileDisplayActivity import com.owncloud.android.ui.adapter.UnifiedSearchItemViewHolder import com.owncloud.android.ui.adapter.UnifiedSearchListAdapter @@ -62,9 +59,6 @@ import com.owncloud.android.ui.unifiedsearch.filterOutHiddenFiles import com.owncloud.android.utils.DisplayUtils import com.owncloud.android.utils.PermissionUtil import com.owncloud.android.utils.theme.ViewThemeUtils -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.launch -import kotlinx.coroutines.withContext import javax.inject.Inject /** @@ -374,37 +368,30 @@ class UnifiedSearchFragment : val syncedFolderProvider = SyncedFolderProvider(requireContext().contentResolver, appPreferences, clock) val gridLayoutManager = GridLayoutManager(requireContext(), 1) - lifecycleScope.launch(Dispatchers.IO) { - val client = - getTypedActivity(FileActivity::class.java)?.clientRepository?.getNextcloudClient() ?: return@launch - - withContext(Dispatchers.Main) { - adapter = UnifiedSearchListAdapter( - supportsOpeningCalendarContactsLocally(), - storageManager, - this@UnifiedSearchFragment, - this@UnifiedSearchFragment, - currentAccountProvider.user, - requireContext(), - viewThemeUtils, - appPreferences, - syncedFolderProvider, - client, - this@UnifiedSearchFragment - ) + adapter = UnifiedSearchListAdapter( + this@UnifiedSearchFragment, + supportsOpeningCalendarContactsLocally(), + storageManager, + this@UnifiedSearchFragment, + this@UnifiedSearchFragment, + currentAccountProvider.user, + requireContext(), + viewThemeUtils, + appPreferences, + syncedFolderProvider, + this@UnifiedSearchFragment + ) + + adapter.shouldShowFooters(true) + adapter.setLayoutManager(gridLayoutManager) + binding.listRoot.layoutManager = gridLayoutManager + binding.listRoot.adapter = adapter + searchInCurrentDirectory(initialQuery ?: "") - adapter.shouldShowFooters(true) - adapter.setLayoutManager(gridLayoutManager) - binding.listRoot.layoutManager = gridLayoutManager - binding.listRoot.adapter = adapter - searchInCurrentDirectory(initialQuery ?: "") - - setUpViewModel() - if (!initialQuery.isNullOrEmpty()) { - vm.setQuery(initialQuery!!) - vm.initialQuery() - } - } + setUpViewModel() + if (!initialQuery.isNullOrEmpty()) { + vm.setQuery(initialQuery!!) + vm.initialQuery() } } From dcea2dcf010e1cd165583080b11d2ad0b94f48e9 Mon Sep 17 00:00:00 2001 From: alperozturk96 Date: Thu, 29 Jan 2026 15:23:45 +0100 Subject: [PATCH 3/9] fix(unified-search-receiver): action Signed-off-by: alperozturk96 --- .../com/owncloud/android/ui/activity/FileDisplayActivity.kt | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt b/app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt index 26fba87e8fce..e42c21a9fe08 100644 --- a/app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt +++ b/app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt @@ -3047,11 +3047,7 @@ class FileDisplayActivity : private val unifiedSearchReceiver: BroadcastReceiver = object : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { val query = intent.getStringExtra(PreviewImageActivity.EXTRA_LAST_SEARCH_QUERY) ?: return - Handler(Looper.getMainLooper()).post { - if (!isFinishing && !isDestroyed) { - performUnifiedSearch(query, null) - } - } + performUnifiedSearch(query, null) } } From 238ad99f0f8ec60dea1976649210aaa406cf85ba Mon Sep 17 00:00:00 2001 From: alperozturk96 Date: Thu, 29 Jan 2026 16:13:23 +0100 Subject: [PATCH 4/9] fix crash Signed-off-by: alperozturk96 --- .../owncloud/android/ui/activity/FileActivity.java | 2 -- .../android/ui/activity/FileDisplayActivity.kt | 14 ++++++++++++-- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/owncloud/android/ui/activity/FileActivity.java b/app/src/main/java/com/owncloud/android/ui/activity/FileActivity.java index 47e079c1f67e..59d864819ad2 100644 --- a/app/src/main/java/com/owncloud/android/ui/activity/FileActivity.java +++ b/app/src/main/java/com/owncloud/android/ui/activity/FileActivity.java @@ -569,7 +569,6 @@ public void showLoadingDialog(String message) { } FragmentManager fragmentManager = getSupportFragmentManager(); - fragmentManager.executePendingTransactions(); Fragment existingDialog = fragmentManager.findFragmentByTag(DIALOG_WAIT_TAG); if (existingDialog instanceof LoadingDialog loadingDialog) { @@ -602,7 +601,6 @@ public void dismissLoadingDialog() { } FragmentManager fragmentManager = getSupportFragmentManager(); - fragmentManager.executePendingTransactions(); Fragment fragment = fragmentManager.findFragmentByTag(DIALOG_WAIT_TAG); if (fragment instanceof LoadingDialog loadingDialogFragment) { diff --git a/app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt b/app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt index e42c21a9fe08..0ac06981adad 100644 --- a/app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt +++ b/app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt @@ -1287,7 +1287,9 @@ class FileDisplayActivity : searchView?.setQuery("", false) searchView?.onActionViewCollapsed() - if (isRoot(getCurrentDir()) && leftFragment is OCFileListFragment) { + val isRoot = isRoot(getCurrentDir()) + + if (isRoot && leftFragment is OCFileListFragment) { // Remove the list to the original state leftFragment.adapter?.let { adapter -> val listOfHiddenFiles = adapter.listOfHiddenFiles @@ -1300,6 +1302,13 @@ class FileDisplayActivity : if (leftFragment is UnifiedSearchFragment) { showSortListGroup(false) supportFragmentManager.popBackStack() + supportFragmentManager.popBackStack() + + if (isRoot) { + setupHomeSearchToolbarWithSortAndListButtons() + } else { + setupToolbar() + } } } @@ -3047,6 +3056,7 @@ class FileDisplayActivity : private val unifiedSearchReceiver: BroadcastReceiver = object : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { val query = intent.getStringExtra(PreviewImageActivity.EXTRA_LAST_SEARCH_QUERY) ?: return + listOfFilesFragment?.lastSearchQuery = null performUnifiedSearch(query, null) } } @@ -3069,7 +3079,7 @@ class FileDisplayActivity : } if (selectedFile != null) { - listOfFiles.setLastSearchQuery(lastSearchQuery) + listOfFiles.lastSearchQuery = lastSearchQuery listOfFiles.onItemClicked(selectedFile) } } From 65fea4822399b6b62d0c761a754953ec55ee81bf Mon Sep 17 00:00:00 2001 From: alperozturk96 Date: Thu, 29 Jan 2026 16:14:10 +0100 Subject: [PATCH 5/9] fix crash Signed-off-by: alperozturk96 --- .../owncloud/android/ui/adapter/UnifiedSearchItemViewHolder.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/owncloud/android/ui/adapter/UnifiedSearchItemViewHolder.kt b/app/src/main/java/com/owncloud/android/ui/adapter/UnifiedSearchItemViewHolder.kt index abb398bd4dd9..0d2e648e84f4 100644 --- a/app/src/main/java/com/owncloud/android/ui/adapter/UnifiedSearchItemViewHolder.kt +++ b/app/src/main/java/com/owncloud/android/ui/adapter/UnifiedSearchItemViewHolder.kt @@ -63,7 +63,8 @@ class UnifiedSearchItemViewHolder( fragment.lifecycleScope.launch(Dispatchers.IO) { val client = - fragment.getTypedActivity(FileActivity::class.java)?.clientRepository?.getNextcloudClient() ?: return@launch + fragment.getTypedActivity(FileActivity::class.java)?.clientRepository?.getNextcloudClient() + ?: return@launch withContext(Dispatchers.Main) { GlideHelper.loadIntoImageView( From 74ab81ab9e5336127d391b9760e7ce8fb997cad2 Mon Sep 17 00:00:00 2001 From: alperozturk96 Date: Thu, 29 Jan 2026 16:20:50 +0100 Subject: [PATCH 6/9] fix crash Signed-off-by: alperozturk96 --- .../java/com/owncloud/android/ui/activity/FileActivity.java | 2 ++ .../com/owncloud/android/ui/activity/FileDisplayActivity.kt | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/owncloud/android/ui/activity/FileActivity.java b/app/src/main/java/com/owncloud/android/ui/activity/FileActivity.java index 59d864819ad2..47e079c1f67e 100644 --- a/app/src/main/java/com/owncloud/android/ui/activity/FileActivity.java +++ b/app/src/main/java/com/owncloud/android/ui/activity/FileActivity.java @@ -569,6 +569,7 @@ public void showLoadingDialog(String message) { } FragmentManager fragmentManager = getSupportFragmentManager(); + fragmentManager.executePendingTransactions(); Fragment existingDialog = fragmentManager.findFragmentByTag(DIALOG_WAIT_TAG); if (existingDialog instanceof LoadingDialog loadingDialog) { @@ -601,6 +602,7 @@ public void dismissLoadingDialog() { } FragmentManager fragmentManager = getSupportFragmentManager(); + fragmentManager.executePendingTransactions(); Fragment fragment = fragmentManager.findFragmentByTag(DIALOG_WAIT_TAG); if (fragment instanceof LoadingDialog loadingDialogFragment) { diff --git a/app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt b/app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt index 0ac06981adad..d920f9d0f531 100644 --- a/app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt +++ b/app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt @@ -3063,10 +3063,10 @@ class FileDisplayActivity : @JvmOverloads fun showFile(selectedFile: OCFile?, message: String?, lastSearchQuery: String? = null) { - dismissLoadingDialog() - getOCFileListFragmentFromFile(object : TransactionInterface { override fun onOCFileListFragmentComplete(listOfFiles: OCFileListFragment) { + dismissLoadingDialog() + if (message?.isEmpty() == true) { val temp = file file = getCurrentDir() From 18f52a7b1852172074e4aa63d50d06c87001b451 Mon Sep 17 00:00:00 2001 From: alperozturk96 Date: Thu, 29 Jan 2026 16:22:51 +0100 Subject: [PATCH 7/9] add docs Signed-off-by: alperozturk96 --- .../com/owncloud/android/ui/activity/FileDisplayActivity.kt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt b/app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt index d920f9d0f531..c70bff49e532 100644 --- a/app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt +++ b/app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt @@ -1301,9 +1301,12 @@ class FileDisplayActivity : if (leftFragment is UnifiedSearchFragment) { showSortListGroup(false) + + // one pop or POP_BACK_STACK_INCLUSIVE is not showing the OCFileListFragment with correct state supportFragmentManager.popBackStack() supportFragmentManager.popBackStack() + // needed to set correct action bar style if (isRoot) { setupHomeSearchToolbarWithSortAndListButtons() } else { From 4579835513ac95e31970e5631bd8043cbbefe9b1 Mon Sep 17 00:00:00 2001 From: alperozturk96 Date: Fri, 30 Jan 2026 10:28:06 +0100 Subject: [PATCH 8/9] fixes Signed-off-by: alperozturk96 --- .../com/owncloud/android/ui/activity/FileDisplayActivity.kt | 4 +--- .../com/owncloud/android/ui/preview/PreviewImageActivity.kt | 2 -- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt b/app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt index c70bff49e532..df5c184aa0ca 100644 --- a/app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt +++ b/app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt @@ -1301,9 +1301,6 @@ class FileDisplayActivity : if (leftFragment is UnifiedSearchFragment) { showSortListGroup(false) - - // one pop or POP_BACK_STACK_INCLUSIVE is not showing the OCFileListFragment with correct state - supportFragmentManager.popBackStack() supportFragmentManager.popBackStack() // needed to set correct action bar style @@ -3058,6 +3055,7 @@ class FileDisplayActivity : private val unifiedSearchReceiver: BroadcastReceiver = object : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { + Log_OC.d(TAG, "unified search receiver called") val query = intent.getStringExtra(PreviewImageActivity.EXTRA_LAST_SEARCH_QUERY) ?: return listOfFilesFragment?.lastSearchQuery = null performUnifiedSearch(query, null) diff --git a/app/src/main/java/com/owncloud/android/ui/preview/PreviewImageActivity.kt b/app/src/main/java/com/owncloud/android/ui/preview/PreviewImageActivity.kt index 6144440bca4b..96d4b6a8f67c 100644 --- a/app/src/main/java/com/owncloud/android/ui/preview/PreviewImageActivity.kt +++ b/app/src/main/java/com/owncloud/android/ui/preview/PreviewImageActivity.kt @@ -237,8 +237,6 @@ class PreviewImageActivity : return super.onOptionsItemSelected(item) } - sendRefreshSearchEventBroadcast() - if (isDrawerOpen) { closeDrawer() } else { From e2636833a7327186500ef97309678e6b2c323cc2 Mon Sep 17 00:00:00 2001 From: alperozturk96 Date: Fri, 30 Jan 2026 10:45:09 +0100 Subject: [PATCH 9/9] fixes Signed-off-by: alperozturk96 --- .../ui/adapter/UnifiedSearchItemViewHolder.kt | 38 +++++++++++++------ .../ui/fragment/OCFileListFragment.java | 1 - 2 files changed, 26 insertions(+), 13 deletions(-) diff --git a/app/src/main/java/com/owncloud/android/ui/adapter/UnifiedSearchItemViewHolder.kt b/app/src/main/java/com/owncloud/android/ui/adapter/UnifiedSearchItemViewHolder.kt index 0d2e648e84f4..75c25168e9ad 100644 --- a/app/src/main/java/com/owncloud/android/ui/adapter/UnifiedSearchItemViewHolder.kt +++ b/app/src/main/java/com/owncloud/android/ui/adapter/UnifiedSearchItemViewHolder.kt @@ -12,6 +12,7 @@ import android.view.View import androidx.lifecycle.lifecycleScope import com.afollestad.sectionedrecyclerview.SectionedViewHolder import com.nextcloud.android.common.ui.theme.utils.ColorRole +import com.nextcloud.common.NextcloudClient import com.nextcloud.model.SearchResultEntryType import com.nextcloud.utils.CalendarEventManager import com.nextcloud.utils.ContactManager @@ -47,6 +48,7 @@ class UnifiedSearchItemViewHolder( private val contactManager = ContactManager(context) private val calendarEventManager = CalendarEventManager(context) + private var cachedClient: NextcloudClient? = null fun bind(entry: SearchResultEntry) { binding.title.text = entry.title @@ -61,20 +63,21 @@ class UnifiedSearchItemViewHolder( val entryType = entry.getType() viewThemeUtils.platform.colorImageView(binding.thumbnail, ColorRole.PRIMARY) - fragment.lifecycleScope.launch(Dispatchers.IO) { - val client = - fragment.getTypedActivity(FileActivity::class.java)?.clientRepository?.getNextcloudClient() + val client = cachedClient + if (client != null) { + loadThumbnailUrl(client, entry, entryType) + } else { + fragment.lifecycleScope.launch(Dispatchers.IO) { + val newClient = fragment.getTypedActivity(FileActivity::class.java) + ?.clientRepository + ?.getNextcloudClient() ?: return@launch - withContext(Dispatchers.Main) { - GlideHelper.loadIntoImageView( - context, - client, - entry.thumbnailUrl, - binding.thumbnail, - entryType.iconId(), - circleCrop = entry.rounded - ) + cachedClient = newClient + + withContext(Dispatchers.Main) { + loadThumbnailUrl(newClient, entry, entryType) + } } } @@ -92,6 +95,17 @@ class UnifiedSearchItemViewHolder( } } + private fun loadThumbnailUrl(client: NextcloudClient, entry: SearchResultEntry, entryType: SearchResultEntryType) { + GlideHelper.loadIntoImageView( + context, + client, + entry.thumbnailUrl, + binding.thumbnail, + entryType.iconId(), + circleCrop = entry.rounded + ) + } + private fun searchEntryOnClick(entry: SearchResultEntry, entryType: SearchResultEntryType) { if (supportsOpeningCalendarContactsLocally) { when (entryType) { diff --git a/app/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java b/app/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java index 50117a3447c5..41acedf12331 100644 --- a/app/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java +++ b/app/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java @@ -127,7 +127,6 @@ import java.util.Iterator; import java.util.List; import java.util.Objects; -import java.util.Optional; import java.util.Set; import javax.inject.Inject;