diff --git a/app/src/main/java/com/owncloud/android/datamodel/ThumbnailsCacheManager.java b/app/src/main/java/com/owncloud/android/datamodel/ThumbnailsCacheManager.java index d7bc63ba84..50e34ff841 100644 --- a/app/src/main/java/com/owncloud/android/datamodel/ThumbnailsCacheManager.java +++ b/app/src/main/java/com/owncloud/android/datamodel/ThumbnailsCacheManager.java @@ -260,24 +260,6 @@ public final class ThumbnailsCacheManager { return null; } - public static class GalleryImageGenerationTaskObject { - private final OCFile file; - private final String imageKey; - - public GalleryImageGenerationTaskObject(OCFile file, String imageKey) { - this.file = file; - this.imageKey = imageKey; - } - - private OCFile getFile() { - return file; - } - - private String getImageKey() { - return imageKey; - } - } - public static class GalleryImageGenerationTask extends AsyncTask { private final User user; private final FileDataStorageManager storageManager; diff --git a/app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java b/app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java index 2a0a4e7f13..26ab837e89 100644 --- a/app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java +++ b/app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java @@ -171,7 +171,6 @@ public class FileDisplayActivity extends FileActivity implements FileFragment.Co public static final String RESTART = "RESTART"; public static final String ALL_FILES = "ALL_FILES"; public static final String LIST_GROUPFOLDERS = "LIST_GROUPFOLDERS"; - public static final String PHOTO_SEARCH = "PHOTO_SEARCH"; public static final int SINGLE_USER_SIZE = 1; public static final String OPEN_FILE = "NC_OPEN_FILE"; @@ -205,7 +204,6 @@ public class FileDisplayActivity extends FileActivity implements FileFragment.Co public static final int REQUEST_CODE__SELECT_FILES_FROM_FILE_SYSTEM = REQUEST_CODE__LAST_SHARED + 2; public static final int REQUEST_CODE__MOVE_OR_COPY_FILES = REQUEST_CODE__LAST_SHARED + 3; public static final int REQUEST_CODE__UPLOAD_FROM_CAMERA = REQUEST_CODE__LAST_SHARED + 5; - public static final int REQUEST_CODE__UPLOAD_SCAN_DOC_FROM_CAMERA = REQUEST_CODE__LAST_SHARED + 6; protected static final long DELAY_TO_REQUEST_REFRESH_OPERATION_LATER = DELAY_TO_REQUEST_OPERATIONS_LATER + 350; @@ -254,6 +252,7 @@ public class FileDisplayActivity extends FileActivity implements FileFragment.Co @Override protected void onCreate(Bundle savedInstanceState) { + Log_OC.v(TAG, "onCreate() start"); // Set the default theme to replace the launch screen theme. setTheme(R.style.Theme_ownCloud_Toolbar_Drawer); @@ -611,6 +610,28 @@ public class FileDisplayActivity extends FileActivity implements FileFragment.Co transaction.commit(); } + private OCFileListFragment getOCFileListFragmentFromFile() { + final Fragment leftFragment = getLeftFragment(); + OCFileListFragment listOfFiles = null; + if (leftFragment instanceof OCFileListFragment) { + listOfFiles = (OCFileListFragment) leftFragment; + } else { + listOfFiles = new OCFileListFragment(); + Bundle args = new Bundle(); + args.putBoolean(OCFileListFragment.ARG_ALLOW_CONTEXTUAL_ACTIONS, true); + listOfFiles.setArguments(args); + setLeftFragment(listOfFiles); + getSupportFragmentManager().executePendingTransactions(); + } + return listOfFiles; + } + + public void showFileActions(OCFile file) { + dismissLoadingDialog(); + OCFileListFragment listOfFiles = getOCFileListFragmentFromFile(); + browseUp(listOfFiles); + listOfFiles.onOverflowIconClicked(file, null); + } public @androidx.annotation.Nullable Fragment getLeftFragment() { return getSupportFragmentManager().findFragmentByTag(FileDisplayActivity.TAG_LIST_OF_FILES); @@ -626,7 +647,6 @@ public class FileDisplayActivity extends FileActivity implements FileFragment.Co return null; } - protected void resetTitleBarAndScrolling() { updateActionBarTitleAndHomeButton(null); resetScrolling(true); @@ -782,6 +802,7 @@ public class FileDisplayActivity extends FileActivity implements FileFragment.Co @Override public boolean onOptionsItemSelected(MenuItem item) { boolean retval = true; + int itemId = item.getItemId(); if (itemId == android.R.id.home) { @@ -876,24 +897,11 @@ public class FileDisplayActivity extends FileActivity implements FileFragment.Co remotePaths[j] = remotePathBase + relativePath; } - int behaviour; - switch (resultCode) { - case UploadFilesActivity.RESULT_OK_AND_MOVE: - behaviour = FileUploader.LOCAL_BEHAVIOUR_MOVE; - break; - - case UploadFilesActivity.RESULT_OK_AND_DELETE: - behaviour = FileUploader.LOCAL_BEHAVIOUR_DELETE; - break; - - case UploadFilesActivity.RESULT_OK_AND_DO_NOTHING: - behaviour = FileUploader.LOCAL_BEHAVIOUR_FORGET; - break; - - default: - behaviour = FileUploader.LOCAL_BEHAVIOUR_FORGET; - break; - } + int behaviour = switch (resultCode) { + case UploadFilesActivity.RESULT_OK_AND_MOVE -> FileUploader.LOCAL_BEHAVIOUR_MOVE; + case UploadFilesActivity.RESULT_OK_AND_DELETE -> FileUploader.LOCAL_BEHAVIOUR_DELETE; + default -> FileUploader.LOCAL_BEHAVIOUR_FORGET; + }; FileUploader.uploadNewFile(this, getUser().orElseThrow(RuntimeException::new), filePaths, remotePaths, null, // MIME type will be detected from file name behaviour, true, UploadFileOperation.CREATED_BY_USER, false, false, NameCollisionPolicy.ASK_USER); @@ -940,6 +948,11 @@ public class FileDisplayActivity extends FileActivity implements FileFragment.Co } } + private Boolean isRootDirectory() { + OCFile currentDir = getCurrentDir(); + return (currentDir == null || currentDir.getParentId() == FileDataStorageManager.ROOT_PARENT_ID); + } + /* * BackPressed priority/hierarchy: * 1. close search view if opened @@ -959,8 +972,7 @@ public class FileDisplayActivity extends FileActivity implements FileFragment.Co resetSearchAction(); } else if (isDrawerOpen) { super.onBackPressed(); - } else if (leftFragment instanceof OCFileListFragment) { - OCFileListFragment listOfFiles = (OCFileListFragment) leftFragment; + } else if (leftFragment instanceof OCFileListFragment listOfFiles) { // all closed OCFile currentDir = getCurrentDir(); @@ -974,18 +986,6 @@ public class FileDisplayActivity extends FileActivity implements FileFragment.Co } } - /** - * Use this method when want to pop the fragment on back press. It resets Scrolling (See - * {@link #resetScrolling(boolean) with true} and pop the visibility for sortListGroup (See - * {@link #setSortListGroup(boolean, boolean)}. At last call to super.onBackPressed() - */ - private void popBack() { - // pop back fragment - resetScrolling(true); - popSortListGroupVisibility(); - super.onBackPressed(); - } - private void browseUp(OCFileListFragment listOfFiles) { listOfFiles.onBrowseUp(); setFile(listOfFiles.getCurrentFile()); @@ -995,9 +995,6 @@ public class FileDisplayActivity extends FileActivity implements FileFragment.Co setDrawerAllFiles(); } - /** - * It resets the Search Action (call when search is open) - */ private void resetSearchAction() { Fragment leftFragment = getLeftFragment(); if (isSearchOpen() && searchView != null) { @@ -1005,8 +1002,7 @@ public class FileDisplayActivity extends FileActivity implements FileFragment.Co searchView.onActionViewCollapsed(); searchView.clearFocus(); - if (isRoot(getCurrentDir()) && leftFragment instanceof OCFileListFragment) { - OCFileListFragment listOfFiles = (OCFileListFragment) leftFragment; + if (isRoot(getCurrentDir()) && leftFragment instanceof OCFileListFragment listOfFiles) { // Remove the list to the original state ArrayList listOfHiddenFiles = listOfFiles.getAdapter().listOfHiddenFiles; @@ -1022,6 +1018,18 @@ public class FileDisplayActivity extends FileActivity implements FileFragment.Co } } + /** + * Use this method when want to pop the fragment on back press. It resets Scrolling (See + * {@link #resetScrolling(boolean) with true} and pop the visibility for sortListGroup (See + * {@link #setSortListGroup(boolean, boolean)}. At last call to super.onBackPressed() + */ + private void popBack() { + // pop back fragment + resetScrolling(true); + popSortListGroupVisibility(); + super.onBackPressed(); + } + @Override protected void onSaveInstanceState(@NonNull Bundle outState) { // responsibility of restore is preferred in onCreate() before than in @@ -1369,7 +1377,7 @@ public class FileDisplayActivity extends FileActivity implements FileFragment.Co if (uploadWasFine) { OCFile ocFile = getFile(); if (PreviewImageFragment.canBePreviewed(ocFile)) { - startImagePreview(getFile(), true); + startImagePreview(getFile(),true); } else if (PreviewTextFileFragment.canBePreviewed(ocFile)) { startTextPreview(ocFile, true); } @@ -1979,11 +1987,6 @@ public class FileDisplayActivity extends FileActivity implements FileFragment.Co requestForDownload(mWaitingToSend, downloadBehaviour, packageName, activityName); } - /** - * Opens the image gallery showing the image {@link OCFile} received as parameter. - * - * @param file Image {@link OCFile} to show. - */ public void startImagePreview(OCFile file, boolean showPreview) { Intent showDetailsIntent = new Intent(this, PreviewImageActivity.class); showDetailsIntent.putExtra(EXTRA_FILE, file); @@ -1997,22 +2000,20 @@ public class FileDisplayActivity extends FileActivity implements FileFragment.Co } } - /** - * Opens the image gallery showing the image {@link OCFile} received as parameter. - * - * @param file Image {@link OCFile} to show. - */ public void startImagePreview(OCFile file, VirtualFolderType type, boolean showPreview) { Intent showDetailsIntent = new Intent(this, PreviewImageActivity.class); showDetailsIntent.putExtra(PreviewImageActivity.EXTRA_FILE, file); - + showDetailsIntent.putExtra(EXTRA_LIVE_PHOTO_FILE, file.livePhotoVideo); showDetailsIntent.putExtra(EXTRA_USER, getUser().orElseThrow(RuntimeException::new)); showDetailsIntent.putExtra(PreviewImageActivity.EXTRA_VIRTUAL_TYPE, type); if (showPreview) { startActivity(showDetailsIntent); } else { - FileOperationsHelper fileOperationsHelper = new FileOperationsHelper(this, getUserAccountManager(), connectivityService, editorUtils); + FileOperationsHelper fileOperationsHelper = new FileOperationsHelper(this, + getUserAccountManager(), + connectivityService, + editorUtils); fileOperationsHelper.startSyncForFileAndIntent(file, showDetailsIntent); } } @@ -2441,21 +2442,10 @@ public class FileDisplayActivity extends FileActivity implements FileFragment.Co binding.fabMain.setVisibility(visibility); } - public void showFile(String message) { + public void showFile(OCFile selectedFile, String message) { dismissLoadingDialog(); - final Fragment leftFragment = getLeftFragment(); - OCFileListFragment listOfFiles = null; - if (leftFragment instanceof OCFileListFragment) { - listOfFiles = (OCFileListFragment) leftFragment; - } else { - listOfFiles = new OCFileListFragment(); - Bundle args = new Bundle(); - args.putBoolean(OCFileListFragment.ARG_ALLOW_CONTEXTUAL_ACTIONS, true); - listOfFiles.setArguments(args); - setLeftFragment(listOfFiles); - getSupportFragmentManager().executePendingTransactions(); - } + OCFileListFragment listOfFiles = getOCFileListFragmentFromFile(); if (TextUtils.isEmpty(message)) { OCFile temp = getFile(); @@ -2465,6 +2455,10 @@ public class FileDisplayActivity extends FileActivity implements FileFragment.Co } else { DisplayUtils.showSnackMessage(listOfFiles.getView(), message); } + + if (selectedFile != null) { + listOfFiles.onItemClicked(selectedFile); + } } /** diff --git a/app/src/main/java/com/owncloud/android/ui/adapter/OCFileListAdapter.java b/app/src/main/java/com/owncloud/android/ui/adapter/OCFileListAdapter.java index b3795d3bc7..00c9868ed4 100644 --- a/app/src/main/java/com/owncloud/android/ui/adapter/OCFileListAdapter.java +++ b/app/src/main/java/com/owncloud/android/ui/adapter/OCFileListAdapter.java @@ -89,6 +89,7 @@ import java.util.Date; import java.util.List; import java.util.Locale; import java.util.Set; +import java.util.UUID; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -134,6 +135,9 @@ public class OCFileListAdapter extends RecyclerView.Adapter 0) { + newPosition = position - 1; + } + + if (newPosition >= mFiles.size()) { + return null; + } + + return mFiles.get(newPosition); + } + + @Override + public int getItemViewType(int position) { + if (shouldShowHeader() && position == 0) { + return VIEWTYPE_HEADER; + } + + if (shouldShowHeader() && position == mFiles.size() + 1 || + (!shouldShowHeader() && position == mFiles.size())) { + return VIEWTYPE_FOOTER; + } + + OCFile item = getItem(position); + if (item == null) { + return VIEWTYPE_ITEM; + } + + if (MimeTypeUtil.isImageOrVideo(item)) { + return VIEWTYPE_IMAGE; } else { - return mFiles.size() + 1; // for footer + return VIEWTYPE_ITEM; } } @@ -607,21 +657,6 @@ public class OCFileListAdapter extends RecyclerView.Adapter 0) { - newPosition = position - 1; - } - - if (newPosition >= mFiles.size()) { - return null; - } - - return mFiles.get(newPosition); - } - public boolean shouldShowHeader() { if (currentDirectory == null) { return false; @@ -638,34 +673,6 @@ public class OCFileListAdapter extends RecyclerView.Adapter { private final String fileId; private final FileDataStorageManager storageManager; private final FileDisplayActivity fileDisplayActivity; + private OCFile ocFile; public FetchRemoteFileTask(User user, String fileId, @@ -84,7 +85,7 @@ public class FetchRemoteFileTask extends AsyncTask { RemoteFile remoteFile = (RemoteFile) result.getData().get(0); - OCFile ocFile = FileStorageUtils.fillOCFile(remoteFile); + ocFile = FileStorageUtils.fillOCFile(remoteFile); FileStorageUtils.searchForLocalFileInDefaultPath(ocFile, user.getAccountName()); ocFile = storageManager.saveFileWithParent(ocFile, fileDisplayActivity); @@ -118,6 +119,6 @@ public class FetchRemoteFileTask extends AsyncTask { protected void onPostExecute(String message) { super.onPostExecute(message); - fileDisplayActivity.showFile(message); + fileDisplayActivity.showFile(ocFile, message); } } 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 0ede3220dc..d3a3fc2b7e 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 @@ -47,6 +47,7 @@ import com.owncloud.android.datamodel.OCFile import com.owncloud.android.lib.common.SearchResultEntry import com.owncloud.android.lib.common.utils.Log_OC import com.owncloud.android.ui.activity.FileDisplayActivity +import com.owncloud.android.ui.adapter.UnifiedSearchItemViewHolder import com.owncloud.android.ui.adapter.UnifiedSearchListAdapter import com.owncloud.android.ui.fragment.util.PairMediatorLiveData import com.owncloud.android.ui.interfaces.UnifiedSearchListInterface @@ -63,7 +64,12 @@ import javax.inject.Inject * Starts query to all capable unified search providers and displays them Opens result in our app, redirect to other * apps, if installed, or opens browser */ -class UnifiedSearchFragment : Fragment(), Injectable, UnifiedSearchListInterface, SearchView.OnQueryTextListener { +class UnifiedSearchFragment : + Fragment(), + Injectable, + UnifiedSearchListInterface, + SearchView.OnQueryTextListener, + UnifiedSearchItemViewHolder.FilesAction { private lateinit var adapter: UnifiedSearchListAdapter private var _binding: ListFragmentBinding? = null private val binding get() = _binding!! @@ -106,6 +112,8 @@ class UnifiedSearchFragment : Fragment(), Injectable, UnifiedSearchListInterface private var listOfHiddenFiles = ArrayList() + private var showMoreActions = false + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) vm = ViewModelProvider(this, vmFactory)[UnifiedSearchViewModel::class.java] @@ -200,7 +208,7 @@ class UnifiedSearchFragment : Fragment(), Injectable, UnifiedSearchListInterface startActivity(browserIntent) } vm.file.observe(this) { - showFile(it) + showFile(it, showMoreActions) } } @@ -210,6 +218,21 @@ class UnifiedSearchFragment : Fragment(), Injectable, UnifiedSearchListInterface } } + private fun showFile(file: OCFile, showFileActions: Boolean) { + activity.let { + if (activity is FileDisplayActivity) { + val fda = activity as FileDisplayActivity + fda.file = file + + if (showFileActions) { + fda.showFileActions(file) + } else { + fda.showFile(file, "") + } + } + } + } + private fun setupFileDisplayActivity() { (activity as? FileDisplayActivity)?.run { setMainFabVisible(false) @@ -222,6 +245,7 @@ class UnifiedSearchFragment : Fragment(), Injectable, UnifiedSearchListInterface adapter = UnifiedSearchListAdapter( storageManager, this, + this, currentAccountProvider.user, clientFactory, requireContext(), @@ -233,14 +257,8 @@ class UnifiedSearchFragment : Fragment(), Injectable, UnifiedSearchListInterface binding.listRoot.adapter = adapter } - private fun showFile(file: OCFile) { - (activity as? FileDisplayActivity)?.let { - it.file = file - it.showFile("") - } - } - override fun onSearchResultClicked(searchResultEntry: SearchResultEntry) { + showMoreActions = false vm.openResult(searchResultEntry) } @@ -277,4 +295,9 @@ class UnifiedSearchFragment : Fragment(), Injectable, UnifiedSearchListInterface super.onDestroyView() _binding = null } + + override fun showFilesAction(searchResultEntry: SearchResultEntry) { + showMoreActions = true + vm.openResult(searchResultEntry) + } } diff --git a/app/src/main/res/layout/unified_search_item.xml b/app/src/main/res/layout/unified_search_item.xml index e0f15d5934..3a28ec6e70 100755 --- a/app/src/main/res/layout/unified_search_item.xml +++ b/app/src/main/res/layout/unified_search_item.xml @@ -107,5 +107,18 @@ tools:text="in TestFolder" /> + + +