From d284d011054d6c330b772d8c6932dbb4ea97b15b Mon Sep 17 00:00:00 2001 From: Fernando Sanz Date: Fri, 18 Mar 2022 08:54:46 +0100 Subject: [PATCH 01/16] Intent launched correctly --- owncloudApp/src/main/AndroidManifest.xml | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/owncloudApp/src/main/AndroidManifest.xml b/owncloudApp/src/main/AndroidManifest.xml index ba709a1c1f0..bbe7bef7d4b 100644 --- a/owncloudApp/src/main/AndroidManifest.xml +++ b/owncloudApp/src/main/AndroidManifest.xml @@ -90,7 +90,19 @@ + android:windowSoftInputMode="adjustPan"> + + + + + + + + + Date: Fri, 18 Mar 2022 13:14:49 +0100 Subject: [PATCH 02/16] Some improvements with intent filter --- owncloudApp/src/main/AndroidManifest.xml | 4 ++-- owncloudApp/src/main/res/values/setup.xml | 3 +++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/owncloudApp/src/main/AndroidManifest.xml b/owncloudApp/src/main/AndroidManifest.xml index bbe7bef7d4b..3ebad99a9b9 100644 --- a/owncloudApp/src/main/AndroidManifest.xml +++ b/owncloudApp/src/main/AndroidManifest.xml @@ -98,8 +98,8 @@ diff --git a/owncloudApp/src/main/res/values/setup.xml b/owncloudApp/src/main/res/values/setup.xml index 02dc17f0344..ff797e7db79 100644 --- a/owncloudApp/src/main/res/values/setup.xml +++ b/owncloudApp/src/main/res/values/setup.xml @@ -120,4 +120,7 @@ true + + * + From 758c9775300d95539a74aa2bf65f77f37d1c7663 Mon Sep 17 00:00:00 2001 From: Fernando Sanz Date: Fri, 18 Mar 2022 14:32:56 +0100 Subject: [PATCH 03/16] Intent controlled without any account configured previously --- .../com/owncloud/android/extensions/ActivityExt.kt | 8 ++++++++ .../android/ui/activity/FileDisplayActivity.kt | 11 +++++++++++ owncloudApp/src/main/res/values/strings.xml | 3 +++ 3 files changed, 22 insertions(+) diff --git a/owncloudApp/src/main/java/com/owncloud/android/extensions/ActivityExt.kt b/owncloudApp/src/main/java/com/owncloud/android/extensions/ActivityExt.kt index 815f48d1ef2..a23f49818bb 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/extensions/ActivityExt.kt +++ b/owncloudApp/src/main/java/com/owncloud/android/extensions/ActivityExt.kt @@ -70,6 +70,14 @@ fun Activity.showMessageInSnackbar( Snackbar.make(findViewById(layoutId), message, duration).show() } +fun Activity.showMessageInToast( + message: CharSequence, + duration: Int = Toast.LENGTH_LONG +) { + Toast.makeText(this, message, duration).show() +} + + fun Activity.showErrorInToast( genericErrorMessageId: Int, throwable: Throwable?, diff --git a/owncloudApp/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt b/owncloudApp/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt index 7afd278a38b..4371b9cc9b3 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt +++ b/owncloudApp/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt @@ -51,12 +51,14 @@ import com.owncloud.android.AppRater import com.owncloud.android.BuildConfig import com.owncloud.android.MainApp import com.owncloud.android.R +import com.owncloud.android.authentication.AccountUtils import com.owncloud.android.databinding.ActivityMainBinding import com.owncloud.android.datamodel.FileDataStorageManager import com.owncloud.android.datamodel.OCFile import com.owncloud.android.extensions.checkPasscodeEnforced import com.owncloud.android.extensions.manageOptionLockSelected import com.owncloud.android.extensions.showMessageInSnackbar +import com.owncloud.android.extensions.showMessageInToast import com.owncloud.android.files.services.FileDownloader import com.owncloud.android.files.services.FileDownloader.FileDownloaderBinder import com.owncloud.android.files.services.FileUploader @@ -153,6 +155,9 @@ class FileDisplayActivity : FileActivity(), FileFragment.ContainerActivity, OnEn localBroadcastManager = LocalBroadcastManager.getInstance(this) + val dataIntent: Uri? = intent.data + manageDataIntent(dataIntent) + /// Load of saved instance state if (savedInstanceState != null) { Timber.d(savedInstanceState.toString()) @@ -1647,6 +1652,12 @@ class FileDisplayActivity : FileActivity(), FileFragment.ContainerActivity, OnEn manageOptionLockSelected(type) } + private fun manageDataIntent(uri: Uri?) { + if (uri != null && AccountUtils.getAccounts(applicationContext).isEmpty()) { + showMessageInToast(getString(R.string.no_account_configured)) + } + } + companion object { private const val TAG_LIST_OF_FILES = "LIST_OF_FILES" private const val TAG_SECOND_FRAGMENT = "SECOND_FRAGMENT" diff --git a/owncloudApp/src/main/res/values/strings.xml b/owncloudApp/src/main/res/values/strings.xml index cd80b155e84..205db404af2 100644 --- a/owncloudApp/src/main/res/values/strings.xml +++ b/owncloudApp/src/main/res/values/strings.xml @@ -671,4 +671,7 @@ Proceed Release note icon + + No account configured previously + From 632d0630f7e928de341f10794b076a05780b95ad Mon Sep 17 00:00:00 2001 From: Fernando Sanz Date: Mon, 21 Mar 2022 10:35:18 +0100 Subject: [PATCH 04/16] Intent controlled without any file reachable --- .../android/datamodel/FileDataStorageManager.kt | 11 +++++++++-- .../android/ui/activity/FileDisplayActivity.kt | 15 ++++++++++++--- owncloudApp/src/main/res/values/strings.xml | 1 + 3 files changed, 22 insertions(+), 5 deletions(-) diff --git a/owncloudApp/src/main/java/com/owncloud/android/datamodel/FileDataStorageManager.kt b/owncloudApp/src/main/java/com/owncloud/android/datamodel/FileDataStorageManager.kt index 09ec5a4279c..efe80b763c2 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/datamodel/FileDataStorageManager.kt +++ b/owncloudApp/src/main/java/com/owncloud/android/datamodel/FileDataStorageManager.kt @@ -114,8 +114,6 @@ import java.io.FileOutputStream import java.io.IOException import java.io.InputStream import java.io.OutputStream -import java.util.ArrayList -import java.util.HashSet import java.util.Vector class FileDataStorageManager { @@ -311,6 +309,15 @@ class FileDataStorageManager { return file } + fun getFileByPrivateLink(privateLink: String): OCFile? { + val cursor = getFileCursorForValue(FILE_PRIVATE_LINK, privateLink) ?: return null + val file: OCFile? = if (cursor.moveToFirst()) { + createFileInstance(cursor) + } else null + cursor.close() + return file + } + fun fileExists(id: Long): Boolean = fileExists(_ID, id.toString()) fun fileExists(path: String): Boolean = fileExists(FILE_PATH, path) diff --git a/owncloudApp/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt b/owncloudApp/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt index 4371b9cc9b3..f31fc8d5acb 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt +++ b/owncloudApp/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt @@ -155,9 +155,6 @@ class FileDisplayActivity : FileActivity(), FileFragment.ContainerActivity, OnEn localBroadcastManager = LocalBroadcastManager.getInstance(this) - val dataIntent: Uri? = intent.data - manageDataIntent(dataIntent) - /// Load of saved instance state if (savedInstanceState != null) { Timber.d(savedInstanceState.toString()) @@ -226,6 +223,9 @@ class FileDisplayActivity : FileActivity(), FileFragment.ContainerActivity, OnEn override fun onPostCreate(savedInstanceState: Bundle?) { super.onPostCreate(savedInstanceState) + val dataIntent: Uri? = intent.data + manageDataIntent(dataIntent) + if (savedInstanceState == null) { createMinFragments() } @@ -1655,9 +1655,18 @@ class FileDisplayActivity : FileActivity(), FileFragment.ContainerActivity, OnEn private fun manageDataIntent(uri: Uri?) { if (uri != null && AccountUtils.getAccounts(applicationContext).isEmpty()) { showMessageInToast(getString(R.string.no_account_configured)) + } else if (uri != null) { + isFileDiscovered(uri).let { OCFile -> + if (OCFile != null) { + } else { + showMessageInToast(getString(R.string.no_file_found)) + } + } } } + private fun isFileDiscovered(uri: Uri?): OCFile? = storageManager.getFileByPrivateLink(uri.toString()) + companion object { private const val TAG_LIST_OF_FILES = "LIST_OF_FILES" private const val TAG_SECOND_FRAGMENT = "SECOND_FRAGMENT" diff --git a/owncloudApp/src/main/res/values/strings.xml b/owncloudApp/src/main/res/values/strings.xml index 205db404af2..1bf357b9542 100644 --- a/owncloudApp/src/main/res/values/strings.xml +++ b/owncloudApp/src/main/res/values/strings.xml @@ -673,5 +673,6 @@ No account configured previously + No file found From 942a10a562f82b143d6dfee91eb2239118552af9 Mon Sep 17 00:00:00 2001 From: Fernando Sanz Date: Tue, 22 Mar 2022 13:19:35 +0100 Subject: [PATCH 05/16] Intent works with folders and files (WIP) --- owncloudApp/src/main/AndroidManifest.xml | 5 ++++ .../datamodel/FileDataStorageManager.kt | 1 + .../owncloud/android/datamodel/OCFile.java | 28 +++++++++++++------ .../ui/activity/FileDisplayActivity.kt | 22 +++++++++++---- 4 files changed, 43 insertions(+), 13 deletions(-) diff --git a/owncloudApp/src/main/AndroidManifest.xml b/owncloudApp/src/main/AndroidManifest.xml index 3ebad99a9b9..0cd1adad9fc 100644 --- a/owncloudApp/src/main/AndroidManifest.xml +++ b/owncloudApp/src/main/AndroidManifest.xml @@ -101,6 +101,11 @@ android:host="@string/url_link_host" android:pathPrefix="/f/" android:scheme="https" /> + + diff --git a/owncloudApp/src/main/java/com/owncloud/android/datamodel/FileDataStorageManager.kt b/owncloudApp/src/main/java/com/owncloud/android/datamodel/FileDataStorageManager.kt index efe80b763c2..cb01f45edb8 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/datamodel/FileDataStorageManager.kt +++ b/owncloudApp/src/main/java/com/owncloud/android/datamodel/FileDataStorageManager.kt @@ -1113,6 +1113,7 @@ class FileDataStorageManager { isDownloading = it.getIntFromColumnOrThrow(FILE_IS_DOWNLOADING) == 1 etagInConflict = it.getStringFromColumnOrThrow(FILE_ETAG_IN_CONFLICT) privateLink = it.getStringFromColumnOrThrow(FILE_PRIVATE_LINK) + owner = it.getStringFromColumnOrThrow(FILE_ACCOUNT_OWNER) } } diff --git a/owncloudApp/src/main/java/com/owncloud/android/datamodel/OCFile.java b/owncloudApp/src/main/java/com/owncloud/android/datamodel/OCFile.java index 6c0fa4559a8..97de031d9f0 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/datamodel/OCFile.java +++ b/owncloudApp/src/main/java/com/owncloud/android/datamodel/OCFile.java @@ -116,6 +116,7 @@ public static AvailableOfflineStatus fromValue(int value) { private boolean mSharedByLink; private boolean mSharedWithSharee; private String mPrivateLink; + private String mOwner; /** * URI to the local path of the file contents, if stored in the device; cached after first call @@ -125,7 +126,7 @@ public static AvailableOfflineStatus fromValue(int value) { /** * Exportable URI to the local path of the file contents, if stored in the device. - * + *

* Cached after first call, until changed. */ private Uri mExposedFileUri; @@ -133,7 +134,7 @@ public static AvailableOfflineStatus fromValue(int value) { /** * Create new {@link OCFile} with given path. - * + *

* The path received must be URL-decoded. Path separator must be File.separator, and it must be the first * character in 'path'. * @@ -179,6 +180,7 @@ private OCFile(Parcel source) { mEtagInConflict = source.readString(); mSharedWithSharee = source.readInt() == 1; mPrivateLink = source.readString(); + mOwner = source.readString(); } @@ -206,6 +208,7 @@ public void writeToParcel(Parcel dest, int flags) { dest.writeString(mEtagInConflict); dest.writeInt(mSharedWithSharee ? 1 : 0); dest.writeString(mPrivateLink); + dest.writeString(mOwner); } /** @@ -352,7 +355,7 @@ public long getModificationTimestamp() { /** * Set a UNIX timestamp of the time the time the file was modified. - * + *

* To update with the value returned by the server in every synchronization of the properties * of this file. * @@ -374,7 +377,7 @@ public long getModificationTimestampAtLastSyncForData() { /** * Set a UNIX timestamp of the time the time the file was modified. - * + *

* To update with the value returned by the server in every synchronization of THE CONTENTS * of this file. * @@ -396,7 +399,7 @@ public String getFileName() { /** * Sets the name of the file - * + *

* Does nothing if the new name is null, empty or includes "/" ; or if the file is the root * directory */ @@ -507,6 +510,7 @@ public long getParentId() { /** * get remote path of parent file + * * @return remote path */ public String getParentRemotePath() { @@ -547,7 +551,7 @@ public AvailableOfflineStatus getAvailableOfflineStatus() { } /** - * @return 'True' when + * @return 'True' when */ public boolean isAvailableOffline() { return (mAvailableOfflineStatus != AvailableOfflineStatus.NOT_AVAILABLE_OFFLINE); @@ -651,8 +655,8 @@ public boolean isText() { } /** - * @param type Type to match in the file MIME type; it's MUST include the trailing "/" - * @return 'True' if the file MIME type matches the received parameter in the type part. + * @param type Type to match in the file MIME type; it's MUST include the trailing "/" + * @return 'True' if the file MIME type matches the received parameter in the type part. */ private boolean isOfType(String type) { return ( @@ -750,4 +754,12 @@ public void copyLocalPropertiesFrom(OCFile sourceFile) { setTreeEtag(sourceFile.getTreeEtag()); setEtagInConflict(sourceFile.getEtagInConflict()); } + + public String getOwner() { + return mOwner; + } + + public void setOwner(String owner) { + mOwner = (owner == null) ? "" : owner; + } } diff --git a/owncloudApp/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt b/owncloudApp/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt index f31fc8d5acb..9673ed902a6 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt +++ b/owncloudApp/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt @@ -223,13 +223,13 @@ class FileDisplayActivity : FileActivity(), FileFragment.ContainerActivity, OnEn override fun onPostCreate(savedInstanceState: Bundle?) { super.onPostCreate(savedInstanceState) - val dataIntent: Uri? = intent.data - manageDataIntent(dataIntent) - if (savedInstanceState == null) { createMinFragments() } + val dataIntent: Uri? = intent.data + manageDataIntent(dataIntent) + setBackgroundText() } @@ -299,7 +299,7 @@ class FileDisplayActivity : FileActivity(), FileFragment.ContainerActivity, OnEn private fun initFragmentsWithFile() { if (account != null && file != null) { /// First fragment - listOfFilesFragment?.listDirectory(currentDir) + listOfFilesFragment?.listDirectory(file) ?: Timber.e("Still have a chance to lose the initialization of list fragment >(") /// Second fragment @@ -420,7 +420,12 @@ class FileDisplayActivity : FileActivity(), FileFragment.ContainerActivity, OnEn fun refreshListOfFilesFragment(reloadData: Boolean) { val fileListFragment = listOfFilesFragment - fileListFragment?.listDirectory(reloadData) + if (intent.data == null) { + fileListFragment?.listDirectory(reloadData) + } else { + fileListFragment?.listDirectory(isFileDiscovered(intent.data)) + } + } override fun onCreateOptionsMenu(menu: Menu): Boolean { @@ -1658,6 +1663,7 @@ class FileDisplayActivity : FileActivity(), FileFragment.ContainerActivity, OnEn } else if (uri != null) { isFileDiscovered(uri).let { OCFile -> if (OCFile != null) { + openFile(OCFile) } else { showMessageInToast(getString(R.string.no_file_found)) } @@ -1667,6 +1673,12 @@ class FileDisplayActivity : FileActivity(), FileFragment.ContainerActivity, OnEn private fun isFileDiscovered(uri: Uri?): OCFile? = storageManager.getFileByPrivateLink(uri.toString()) + private fun openFile(file: OCFile) { + setFile(file) + setAccount(AccountUtils.getOwnCloudAccountByName(this, file.owner)) + initFragmentsWithFile() + } + companion object { private const val TAG_LIST_OF_FILES = "LIST_OF_FILES" private const val TAG_SECOND_FRAGMENT = "SECOND_FRAGMENT" From baf992fd3a903bb6f4e9db0f96aa48f2c9f92ff0 Mon Sep 17 00:00:00 2001 From: Fernando Sanz Date: Wed, 23 Mar 2022 08:53:14 +0100 Subject: [PATCH 06/16] Intent working in only one account mode --- .../com/owncloud/android/ui/activity/FileDisplayActivity.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/owncloudApp/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt b/owncloudApp/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt index 9673ed902a6..75f5c6ce7b1 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt +++ b/owncloudApp/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt @@ -1660,7 +1660,7 @@ class FileDisplayActivity : FileActivity(), FileFragment.ContainerActivity, OnEn private fun manageDataIntent(uri: Uri?) { if (uri != null && AccountUtils.getAccounts(applicationContext).isEmpty()) { showMessageInToast(getString(R.string.no_account_configured)) - } else if (uri != null) { + } else if (uri != null && AccountUtils.getAccounts(applicationContext).size == 1) { isFileDiscovered(uri).let { OCFile -> if (OCFile != null) { openFile(OCFile) From 882eff1dea4d5bc74666b73f40c6345bb52bd386 Mon Sep 17 00:00:00 2001 From: Fernando Sanz Date: Mon, 4 Apr 2022 08:08:39 +0200 Subject: [PATCH 07/16] Intent works with folders and files by displaying the file's detail --- .../android/ui/activity/FileDisplayActivity.kt | 12 +++++++++--- .../android/ui/helpers/FileOperationsHelper.java | 1 + 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/owncloudApp/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt b/owncloudApp/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt index 75f5c6ce7b1..a2b7cb522d2 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt +++ b/owncloudApp/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt @@ -1663,7 +1663,7 @@ class FileDisplayActivity : FileActivity(), FileFragment.ContainerActivity, OnEn } else if (uri != null && AccountUtils.getAccounts(applicationContext).size == 1) { isFileDiscovered(uri).let { OCFile -> if (OCFile != null) { - openFile(OCFile) + manageItem(OCFile) } else { showMessageInToast(getString(R.string.no_file_found)) } @@ -1673,10 +1673,16 @@ class FileDisplayActivity : FileActivity(), FileFragment.ContainerActivity, OnEn private fun isFileDiscovered(uri: Uri?): OCFile? = storageManager.getFileByPrivateLink(uri.toString()) - private fun openFile(file: OCFile) { + private fun manageItem(file: OCFile) { + onBrowsedDownTo(file) setFile(file) setAccount(AccountUtils.getOwnCloudAccountByName(this, file.owner)) - initFragmentsWithFile() + + if (PreviewImageFragment.canBePreviewed(file)) { + startImagePreview(file) + } else { + initFragmentsWithFile() + } } companion object { diff --git a/owncloudApp/src/main/java/com/owncloud/android/ui/helpers/FileOperationsHelper.java b/owncloudApp/src/main/java/com/owncloud/android/ui/helpers/FileOperationsHelper.java index 0ccae12d9f0..276e06a9d57 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/ui/helpers/FileOperationsHelper.java +++ b/owncloudApp/src/main/java/com/owncloud/android/ui/helpers/FileOperationsHelper.java @@ -224,6 +224,7 @@ public void syncFile(OCFile file) { intent.setAction(OperationsService.ACTION_SYNC_FILE); intent.putExtra(OperationsService.EXTRA_ACCOUNT, mFileActivity.getAccount()); intent.putExtra(OperationsService.EXTRA_REMOTE_PATH, file.getRemotePath()); + mWaitingForOpId = mFileActivity.getOperationsServiceBinder().queueNewOperation(intent); } else { From a5a45f0a68fbd8c7f5c88cc120f618396a841a43 Mon Sep 17 00:00:00 2001 From: Fernando Sanz Date: Tue, 5 Apr 2022 11:36:36 +0200 Subject: [PATCH 08/16] Controlled navigation when deleting a file locally via a deep link --- .../owncloud/android/ui/activity/FileActivity.java | 14 ++++++++++++++ .../android/ui/activity/FileDisplayActivity.kt | 4 +++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/owncloudApp/src/main/java/com/owncloud/android/ui/activity/FileActivity.java b/owncloudApp/src/main/java/com/owncloud/android/ui/activity/FileActivity.java index bccba2ebc95..b6eb34c9594 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/ui/activity/FileActivity.java +++ b/owncloudApp/src/main/java/com/owncloud/android/ui/activity/FileActivity.java @@ -73,6 +73,8 @@ public class FileActivity extends DrawerActivity public static final String EXTRA_ACCOUNT = "com.owncloud.android.ui.activity.ACCOUNT"; public static final String EXTRA_FROM_NOTIFICATION = "com.owncloud.android.ui.activity.FROM_NOTIFICATION"; + public static final String ALREADY_HANDLED_DEEP_LINK = + "com.owncloud.android.ui.activity.ALREADY_HANDLED_DEEP_LINK"; public static final String EXTRA_FILE_LIST_OPTION = "EXTRA_FILE_LIST_OPTION"; private static final String KEY_WAITING_FOR_OP_ID = "WAITING_FOR_OP_ID"; @@ -98,6 +100,8 @@ public class FileActivity extends DrawerActivity */ private boolean mFromNotification; + private boolean mAlreadyHandledDeepLink = false; + /** * Messages handler associated to the main thread and the life cycle of the activity */ @@ -131,6 +135,7 @@ protected void onCreate(Bundle savedInstanceState) { if (savedInstanceState != null) { mFile = savedInstanceState.getParcelable(FileActivity.EXTRA_FILE); mFromNotification = savedInstanceState.getBoolean(FileActivity.EXTRA_FROM_NOTIFICATION); + mAlreadyHandledDeepLink = savedInstanceState.getBoolean(FileActivity.ALREADY_HANDLED_DEEP_LINK); mFileOperationsHelper.setOpIdWaitingFor( savedInstanceState.getLong(KEY_WAITING_FOR_OP_ID, Long.MAX_VALUE) ); @@ -214,6 +219,7 @@ protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putParcelable(FileActivity.EXTRA_FILE, mFile); outState.putBoolean(FileActivity.EXTRA_FROM_NOTIFICATION, mFromNotification); + outState.putBoolean(FileActivity.ALREADY_HANDLED_DEEP_LINK, mAlreadyHandledDeepLink); outState.putLong(KEY_WAITING_FOR_OP_ID, mFileOperationsHelper.getOpIdWaitingFor()); if (getSupportActionBar() != null && getSupportActionBar().getTitle() != null) { // Null check in case the actionbar is used in ActionBar.NAVIGATION_MODE_LIST @@ -247,6 +253,14 @@ public boolean fromNotification() { return mFromNotification; } + public void setAlreadyHandledDeepLink(boolean alreadyHandledDeepLink) { + mAlreadyHandledDeepLink = alreadyHandledDeepLink; + } + + public boolean isAlreadyHandledDeepLink() { + return mAlreadyHandledDeepLink; + } + public OperationsServiceBinder getOperationsServiceBinder() { return mOperationsServiceBinder; } diff --git a/owncloudApp/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt b/owncloudApp/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt index a2b7cb522d2..9f451d3280d 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt +++ b/owncloudApp/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt @@ -420,7 +420,7 @@ class FileDisplayActivity : FileActivity(), FileFragment.ContainerActivity, OnEn fun refreshListOfFilesFragment(reloadData: Boolean) { val fileListFragment = listOfFilesFragment - if (intent.data == null) { + if (intent.data == null || isAlreadyHandledDeepLink) { fileListFragment?.listDirectory(reloadData) } else { fileListFragment?.listDirectory(isFileDiscovered(intent.data)) @@ -1683,6 +1683,8 @@ class FileDisplayActivity : FileActivity(), FileFragment.ContainerActivity, OnEn } else { initFragmentsWithFile() } + + isAlreadyHandledDeepLink = true } companion object { From 5703fb83e2506be48d76d101f8d112f3fa327d2f Mon Sep 17 00:00:00 2001 From: Fernando Sanz Date: Wed, 6 Apr 2022 13:16:23 +0200 Subject: [PATCH 09/16] CR suggestions --- owncloudApp/src/main/AndroidManifest.xml | 4 ++-- .../android/extensions/ActivityExt.kt | 8 ------- .../android/ui/activity/FileActivity.java | 6 ++--- .../ui/activity/FileDisplayActivity.kt | 23 ++++++++++--------- owncloudApp/src/main/res/values/setup.xml | 2 +- 5 files changed, 18 insertions(+), 25 deletions(-) diff --git a/owncloudApp/src/main/AndroidManifest.xml b/owncloudApp/src/main/AndroidManifest.xml index 0cd1adad9fc..c7fffa75973 100644 --- a/owncloudApp/src/main/AndroidManifest.xml +++ b/owncloudApp/src/main/AndroidManifest.xml @@ -98,12 +98,12 @@ diff --git a/owncloudApp/src/main/java/com/owncloud/android/extensions/ActivityExt.kt b/owncloudApp/src/main/java/com/owncloud/android/extensions/ActivityExt.kt index a23f49818bb..815f48d1ef2 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/extensions/ActivityExt.kt +++ b/owncloudApp/src/main/java/com/owncloud/android/extensions/ActivityExt.kt @@ -70,14 +70,6 @@ fun Activity.showMessageInSnackbar( Snackbar.make(findViewById(layoutId), message, duration).show() } -fun Activity.showMessageInToast( - message: CharSequence, - duration: Int = Toast.LENGTH_LONG -) { - Toast.makeText(this, message, duration).show() -} - - fun Activity.showErrorInToast( genericErrorMessageId: Int, throwable: Throwable?, diff --git a/owncloudApp/src/main/java/com/owncloud/android/ui/activity/FileActivity.java b/owncloudApp/src/main/java/com/owncloud/android/ui/activity/FileActivity.java index b6eb34c9594..44e78a1b56c 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/ui/activity/FileActivity.java +++ b/owncloudApp/src/main/java/com/owncloud/android/ui/activity/FileActivity.java @@ -73,7 +73,7 @@ public class FileActivity extends DrawerActivity public static final String EXTRA_ACCOUNT = "com.owncloud.android.ui.activity.ACCOUNT"; public static final String EXTRA_FROM_NOTIFICATION = "com.owncloud.android.ui.activity.FROM_NOTIFICATION"; - public static final String ALREADY_HANDLED_DEEP_LINK = + public static final String EXTRA_ALREADY_HANDLED_DEEP_LINK = "com.owncloud.android.ui.activity.ALREADY_HANDLED_DEEP_LINK"; public static final String EXTRA_FILE_LIST_OPTION = "EXTRA_FILE_LIST_OPTION"; @@ -135,7 +135,7 @@ protected void onCreate(Bundle savedInstanceState) { if (savedInstanceState != null) { mFile = savedInstanceState.getParcelable(FileActivity.EXTRA_FILE); mFromNotification = savedInstanceState.getBoolean(FileActivity.EXTRA_FROM_NOTIFICATION); - mAlreadyHandledDeepLink = savedInstanceState.getBoolean(FileActivity.ALREADY_HANDLED_DEEP_LINK); + mAlreadyHandledDeepLink = savedInstanceState.getBoolean(FileActivity.EXTRA_ALREADY_HANDLED_DEEP_LINK); mFileOperationsHelper.setOpIdWaitingFor( savedInstanceState.getLong(KEY_WAITING_FOR_OP_ID, Long.MAX_VALUE) ); @@ -219,7 +219,7 @@ protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putParcelable(FileActivity.EXTRA_FILE, mFile); outState.putBoolean(FileActivity.EXTRA_FROM_NOTIFICATION, mFromNotification); - outState.putBoolean(FileActivity.ALREADY_HANDLED_DEEP_LINK, mAlreadyHandledDeepLink); + outState.putBoolean(FileActivity.EXTRA_ALREADY_HANDLED_DEEP_LINK, mAlreadyHandledDeepLink); outState.putLong(KEY_WAITING_FOR_OP_ID, mFileOperationsHelper.getOpIdWaitingFor()); if (getSupportActionBar() != null && getSupportActionBar().getTitle() != null) { // Null check in case the actionbar is used in ActionBar.NAVIGATION_MODE_LIST diff --git a/owncloudApp/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt b/owncloudApp/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt index 9f451d3280d..bf48f0eebd5 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt +++ b/owncloudApp/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt @@ -58,7 +58,6 @@ import com.owncloud.android.datamodel.OCFile import com.owncloud.android.extensions.checkPasscodeEnforced import com.owncloud.android.extensions.manageOptionLockSelected import com.owncloud.android.extensions.showMessageInSnackbar -import com.owncloud.android.extensions.showMessageInToast import com.owncloud.android.files.services.FileDownloader import com.owncloud.android.files.services.FileDownloader.FileDownloaderBinder import com.owncloud.android.files.services.FileUploader @@ -228,7 +227,9 @@ class FileDisplayActivity : FileActivity(), FileFragment.ContainerActivity, OnEn } val dataIntent: Uri? = intent.data - manageDataIntent(dataIntent) + dataIntent?.let { + handleDeepLink(dataIntent) + } setBackgroundText() } @@ -299,7 +300,7 @@ class FileDisplayActivity : FileActivity(), FileFragment.ContainerActivity, OnEn private fun initFragmentsWithFile() { if (account != null && file != null) { /// First fragment - listOfFilesFragment?.listDirectory(file) + listOfFilesFragment?.listDirectory(currentDir) ?: Timber.e("Still have a chance to lose the initialization of list fragment >(") /// Second fragment @@ -423,7 +424,7 @@ class FileDisplayActivity : FileActivity(), FileFragment.ContainerActivity, OnEn if (intent.data == null || isAlreadyHandledDeepLink) { fileListFragment?.listDirectory(reloadData) } else { - fileListFragment?.listDirectory(isFileDiscovered(intent.data)) + fileListFragment?.listDirectory(getFileDiscovered(intent.data)) } } @@ -1657,21 +1658,21 @@ class FileDisplayActivity : FileActivity(), FileFragment.ContainerActivity, OnEn manageOptionLockSelected(type) } - private fun manageDataIntent(uri: Uri?) { + private fun handleDeepLink(uri: Uri?) { if (uri != null && AccountUtils.getAccounts(applicationContext).isEmpty()) { - showMessageInToast(getString(R.string.no_account_configured)) + showMessageInSnackbar(message = getString(R.string.no_account_configured)) } else if (uri != null && AccountUtils.getAccounts(applicationContext).size == 1) { - isFileDiscovered(uri).let { OCFile -> - if (OCFile != null) { - manageItem(OCFile) + getFileDiscovered(uri).let { oCFile -> + if (oCFile != null) { + manageItem(oCFile) } else { - showMessageInToast(getString(R.string.no_file_found)) + showMessageInSnackbar(message = getString(R.string.no_file_found)) } } } } - private fun isFileDiscovered(uri: Uri?): OCFile? = storageManager.getFileByPrivateLink(uri.toString()) + private fun getFileDiscovered(uri: Uri?): OCFile? = storageManager.getFileByPrivateLink(uri.toString()) private fun manageItem(file: OCFile) { onBrowsedDownTo(file) diff --git a/owncloudApp/src/main/res/values/setup.xml b/owncloudApp/src/main/res/values/setup.xml index ff797e7db79..16bfde52e58 100644 --- a/owncloudApp/src/main/res/values/setup.xml +++ b/owncloudApp/src/main/res/values/setup.xml @@ -121,6 +121,6 @@ true - * + * From b23fa6facef3fcb56f0196665f03214e879a97a7 Mon Sep 17 00:00:00 2001 From: Fernando Sanz Date: Wed, 13 Apr 2022 14:13:10 +0200 Subject: [PATCH 10/16] Fixed an issue when user tries to open a folder through DeepLink --- .../owncloud/android/ui/activity/FileDisplayActivity.kt | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/owncloudApp/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt b/owncloudApp/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt index bf48f0eebd5..71683a64096 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt +++ b/owncloudApp/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt @@ -1677,7 +1677,12 @@ class FileDisplayActivity : FileActivity(), FileFragment.ContainerActivity, OnEn private fun manageItem(file: OCFile) { onBrowsedDownTo(file) setFile(file) - setAccount(AccountUtils.getOwnCloudAccountByName(this, file.owner)) + account = AccountUtils.getOwnCloudAccountByName(this, file.owner) + + if(file.isFolder){ + refreshListOfFilesFragment(true) + return + } if (PreviewImageFragment.canBePreviewed(file)) { startImagePreview(file) From 5b542ab31d358186070f94f597aa5f84361fcba2 Mon Sep 17 00:00:00 2001 From: Fernando Sanz Date: Wed, 13 Apr 2022 14:46:05 +0200 Subject: [PATCH 11/16] ktlint fixes --- .../com/owncloud/android/ui/activity/FileDisplayActivity.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/owncloudApp/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt b/owncloudApp/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt index 71683a64096..c0dd4703bb6 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt +++ b/owncloudApp/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt @@ -1679,7 +1679,7 @@ class FileDisplayActivity : FileActivity(), FileFragment.ContainerActivity, OnEn setFile(file) account = AccountUtils.getOwnCloudAccountByName(this, file.owner) - if(file.isFolder){ + if (file.isFolder) { refreshListOfFilesFragment(true) return } From b06781f812b8c47c21235eaea723e81a2b18ca0d Mon Sep 17 00:00:00 2001 From: Fernando Sanz Date: Tue, 19 Apr 2022 10:39:21 +0200 Subject: [PATCH 12/16] The missing fields in the Manisfest's file have been added --- owncloudApp/src/main/AndroidManifest.xml | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/owncloudApp/src/main/AndroidManifest.xml b/owncloudApp/src/main/AndroidManifest.xml index c7fffa75973..70c98444ff8 100644 --- a/owncloudApp/src/main/AndroidManifest.xml +++ b/owncloudApp/src/main/AndroidManifest.xml @@ -80,8 +80,8 @@ + android:exported="true" + android:theme="@style/Theme.ownCloud.Splash"> @@ -89,6 +89,7 @@ @@ -113,8 +114,8 @@ android:name=".ui.activity.ReceiveExternalFilesActivity" android:configChanges="orientation|screenSize" android:excludeFromRecents="true" - android:taskAffinity="" - android:exported="true"> + android:exported="true" + android:taskAffinity=""> @@ -233,11 +234,11 @@ + android:windowSoftInputMode="adjustResize"> @@ -276,4 +277,4 @@ - \ No newline at end of file + From b2c42bbe8d60d5ccda1a2ce8a58a452b084df634 Mon Sep 17 00:00:00 2001 From: Fernando Sanz Date: Wed, 20 Apr 2022 12:04:43 +0200 Subject: [PATCH 13/16] Custom path prefix added --- owncloudApp/src/main/AndroidManifest.xml | 4 ++-- owncloudApp/src/main/res/values/setup.xml | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/owncloudApp/src/main/AndroidManifest.xml b/owncloudApp/src/main/AndroidManifest.xml index 70c98444ff8..4df13b7519a 100644 --- a/owncloudApp/src/main/AndroidManifest.xml +++ b/owncloudApp/src/main/AndroidManifest.xml @@ -100,12 +100,12 @@ diff --git a/owncloudApp/src/main/res/values/setup.xml b/owncloudApp/src/main/res/values/setup.xml index 16bfde52e58..4c72ef5b03b 100644 --- a/owncloudApp/src/main/res/values/setup.xml +++ b/owncloudApp/src/main/res/values/setup.xml @@ -122,5 +122,6 @@ * + /f/ From 536eaac83c3680d0a77b009030ed95e40e5833fb Mon Sep 17 00:00:00 2001 From: Fernando Sanz Date: Thu, 21 Apr 2022 09:46:22 +0200 Subject: [PATCH 14/16] Prevented image files from being previewed when a security method is configured. --- owncloudApp/src/main/java/com/owncloud/android/MainApp.kt | 3 ++- .../com/owncloud/android/ui/activity/FileDisplayActivity.kt | 5 +++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/owncloudApp/src/main/java/com/owncloud/android/MainApp.kt b/owncloudApp/src/main/java/com/owncloud/android/MainApp.kt index 9cb6c6ad38c..e65b7c5ed73 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/MainApp.kt +++ b/owncloudApp/src/main/java/com/owncloud/android/MainApp.kt @@ -1,4 +1,4 @@ -/* +/** * ownCloud Android client application * * @author masensio @@ -7,6 +7,7 @@ * @author Christian Schabesberger * @author David Crespo Ríos * @author Juan Carlos Garrote Gascón + * @author Fernando Sanz Velasco * Copyright (C) 2022 ownCloud GmbH. * * This program is free software: you can redistribute it and/or modify diff --git a/owncloudApp/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt b/owncloudApp/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt index c0dd4703bb6..4b5ee8bda44 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt +++ b/owncloudApp/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt @@ -7,8 +7,9 @@ * @author Christian Schabesberger * @author Shashvat Kedia * @author Abel García de Prada + * @author Fernando Sanz Velasco * Copyright (C) 2011 Bartek Przybylski - * Copyright (C) 2020 ownCloud GmbH. + * Copyright (C) 2022 ownCloud GmbH. * * * This program is free software: you can redistribute it and/or modify @@ -1685,7 +1686,7 @@ class FileDisplayActivity : FileActivity(), FileFragment.ContainerActivity, OnEn } if (PreviewImageFragment.canBePreviewed(file)) { - startImagePreview(file) + showDetails(file) } else { initFragmentsWithFile() } From f716b0c85300d2c79f369e3e2fa65e276ae32bd4 Mon Sep 17 00:00:00 2001 From: Fernando Sanz Date: Tue, 26 Apr 2022 14:22:56 +0200 Subject: [PATCH 15/16] Preview available when user clicks on thumbnail in file detail --- .../ui/fragment/FileDetailFragment.java | 26 +++++++++++++++++++ .../main/res/layout/file_details_fragment.xml | 2 +- 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/owncloudApp/src/main/java/com/owncloud/android/ui/fragment/FileDetailFragment.java b/owncloudApp/src/main/java/com/owncloud/android/ui/fragment/FileDetailFragment.java index 850ce3904f9..082711bfe5d 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/ui/fragment/FileDetailFragment.java +++ b/owncloudApp/src/main/java/com/owncloud/android/ui/fragment/FileDetailFragment.java @@ -53,6 +53,9 @@ import com.owncloud.android.ui.controller.TransferProgressController; import com.owncloud.android.ui.dialog.RemoveFilesDialogFragment; import com.owncloud.android.ui.dialog.RenameFileDialogFragment; +import com.owncloud.android.ui.preview.PreviewAudioFragment; +import com.owncloud.android.ui.preview.PreviewImageFragment; +import com.owncloud.android.ui.preview.PreviewTextFragment; import com.owncloud.android.utils.DisplayUtils; import com.owncloud.android.utils.MimetypeIconUtil; import com.owncloud.android.utils.PreferenceUtils; @@ -329,11 +332,33 @@ public void onClick(View v) { ((FileDisplayActivity) mContainerActivity).cancelTransference(getFile()); break; } + case R.id.fdIcon: { + displayFile(getFile()); + } default: Timber.e("Incorrect view clicked!"); } } + private void displayFile(OCFile file) { + if (PreviewImageFragment.canBePreviewed(file)) { + // preview image - it handles the sync, if needed + ((FileDisplayActivity) mContainerActivity).startImagePreview(file); + } else if (PreviewTextFragment.canBePreviewed(file)) { + ((FileDisplayActivity) mContainerActivity).startTextPreview(file); + mContainerActivity.getFileOperationsHelper().syncFile(file); + + } else if (PreviewAudioFragment.canBePreviewed(file)) { + // media preview + ((FileDisplayActivity) mContainerActivity).startAudioPreview(file, 0); + mContainerActivity.getFileOperationsHelper().syncFile(file); + + } else { + // sync file content, then open with external apps + ((FileDisplayActivity) mContainerActivity).startSyncThenOpen(file); + } + } + /** * Check if the fragment was created with an empty layout. An empty fragment can't show file details, must be * replaced. @@ -424,6 +449,7 @@ private void setFiletype(OCFile file) { } ImageView iv = getView().findViewById(R.id.fdIcon); + iv.setOnClickListener(this); if (iv != null) { Bitmap thumbnail; diff --git a/owncloudApp/src/main/res/layout/file_details_fragment.xml b/owncloudApp/src/main/res/layout/file_details_fragment.xml index 275fc2d8cf2..2d170bf6a2d 100644 --- a/owncloudApp/src/main/res/layout/file_details_fragment.xml +++ b/owncloudApp/src/main/res/layout/file_details_fragment.xml @@ -45,8 +45,8 @@ android:layout_width="0dp" android:layout_height="0dp" android:ellipsize="end" - android:paddingStart="@dimen/standard_margin" android:gravity="center_vertical" + android:paddingStart="@dimen/standard_margin" android:text="" android:textAppearance="?android:attr/textAppearanceLarge" app:layout_constraintBottom_toBottomOf="@id/fdIcon" From 696c71dcea601df1b0c6f893215ccf65c6a6666e Mon Sep 17 00:00:00 2001 From: Fernando Sanz Date: Tue, 3 May 2022 09:53:22 +0200 Subject: [PATCH 16/16] Crash with not accounts added and deep links fixed --- .../owncloud/android/ui/activity/FileDisplayActivity.kt | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/owncloudApp/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt b/owncloudApp/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt index 4b5ee8bda44..4363aaf927d 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt +++ b/owncloudApp/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt @@ -1673,7 +1673,13 @@ class FileDisplayActivity : FileActivity(), FileFragment.ContainerActivity, OnEn } } - private fun getFileDiscovered(uri: Uri?): OCFile? = storageManager.getFileByPrivateLink(uri.toString()) + private fun getFileDiscovered(uri: Uri?): OCFile? { + return if (storageManager != null) { + storageManager.getFileByPrivateLink(uri.toString()) + } else { + null + } + } private fun manageItem(file: OCFile) { onBrowsedDownTo(file)