diff --git a/app/src/main/java/com/amaze/filemanager/ui/Extensions.kt b/app/src/main/java/com/amaze/filemanager/ui/Extensions.kt
index 658d76e072..8b2b0f8013 100644
--- a/app/src/main/java/com/amaze/filemanager/ui/Extensions.kt
+++ b/app/src/main/java/com/amaze/filemanager/ui/Extensions.kt
@@ -112,3 +112,14 @@ fun View.showFade(duration: Long) {
this.animate().alpha(1f).duration = duration
this.visibility = View.VISIBLE
}
+
+/**
+ * Extension function to check for activity in package manager before triggering code
+ */
+fun Intent.runIfDocumentsUIExists(context: Context, callback: Runnable) {
+ if (this.resolveActivity(context.packageManager) != null) {
+ callback.run()
+ } else {
+ AppConfig.toast(context, R.string.no_app_found_intent)
+ }
+}
diff --git a/app/src/main/java/com/amaze/filemanager/ui/fragments/FtpServerFragment.kt b/app/src/main/java/com/amaze/filemanager/ui/fragments/FtpServerFragment.kt
index 9f3dde5b9e..4e12699f06 100644
--- a/app/src/main/java/com/amaze/filemanager/ui/fragments/FtpServerFragment.kt
+++ b/app/src/main/java/com/amaze/filemanager/ui/fragments/FtpServerFragment.kt
@@ -78,6 +78,7 @@ import com.amaze.filemanager.databinding.FragmentFtpBinding
import com.amaze.filemanager.filesystem.files.FileUtils
import com.amaze.filemanager.ui.activities.MainActivity
import com.amaze.filemanager.ui.notifications.FtpNotification
+import com.amaze.filemanager.ui.runIfDocumentsUIExists
import com.amaze.filemanager.ui.theme.AppTheme
import com.amaze.filemanager.utils.OneCharacterCharSequence
import com.amaze.filemanager.utils.PasswordUtil
@@ -224,9 +225,13 @@ class FtpServerFragment : Fragment(R.layout.fragment_ftp) {
}
R.id.ftp_path -> {
if (shouldUseSafFileSystem()) {
- activityResultHandlerOnFtpServerPathUpdate.launch(
- Intent(Intent.ACTION_OPEN_DOCUMENT_TREE)
- )
+ val intent = Intent(Intent.ACTION_OPEN_DOCUMENT_TREE)
+
+ intent.runIfDocumentsUIExists(mainActivity) {
+ activityResultHandlerOnFtpServerPathUpdate.launch(
+ intent
+ )
+ }
} else {
val dialogBuilder = FolderChooserDialog.Builder(requireActivity())
dialogBuilder
@@ -449,28 +454,33 @@ class FtpServerFragment : Fragment(R.layout.fragment_ftp) {
.positiveColor(accentColor)
.negativeText(R.string.cancel)
.negativeColor(accentColor)
- .onPositive { dialog, _ ->
- activityResultHandlerOnFtpServerPathGrantedSafAccess.launch(
- Intent(Intent.ACTION_OPEN_DOCUMENT_TREE).also {
- if (SDK_INT >= O &&
- directoryUri.startsWith(defaultPathFromPreferences)
- ) {
- it.putExtra(
- EXTRA_INITIAL_URI,
- DocumentsContract.buildDocumentUri(
- "com.android.externalstorage.documents",
- "primary:" +
- directoryUri
- .substringAfter(
- defaultPathFromPreferences
- )
+ .onPositive(fun(dialog: MaterialDialog, _: DialogAction) {
+ val intent = Intent(Intent.ACTION_OPEN_DOCUMENT_TREE)
+
+ intent.runIfDocumentsUIExists(mainActivity) {
+ activityResultHandlerOnFtpServerPathGrantedSafAccess.launch(
+ intent.also {
+ if (SDK_INT >= O &&
+ directoryUri.startsWith(defaultPathFromPreferences)
+ ) {
+ it.putExtra(
+ EXTRA_INITIAL_URI,
+ DocumentsContract.buildDocumentUri(
+ "com.android.externalstorage.documents",
+ "primary:" +
+ directoryUri
+ .substringAfter(
+ defaultPathFromPreferences
+ )
+ )
)
- )
+ }
}
- }
- )
+ )
+ }
+
dialog.dismiss()
- }.build().show()
+ }).build().show()
}
} else {
callback.invoke()
diff --git a/app/src/main/java/com/amaze/filemanager/ui/fragments/MainFragment.java b/app/src/main/java/com/amaze/filemanager/ui/fragments/MainFragment.java
index a24a472d70..a04ae74723 100644
--- a/app/src/main/java/com/amaze/filemanager/ui/fragments/MainFragment.java
+++ b/app/src/main/java/com/amaze/filemanager/ui/fragments/MainFragment.java
@@ -64,6 +64,7 @@
import com.amaze.filemanager.filesystem.files.EncryptDecryptUtils;
import com.amaze.filemanager.filesystem.files.FileListSorter;
import com.amaze.filemanager.filesystem.files.FileUtils;
+import com.amaze.filemanager.ui.ExtensionsKt;
import com.amaze.filemanager.ui.activities.MainActivity;
import com.amaze.filemanager.ui.activities.MainActivityViewModel;
import com.amaze.filemanager.ui.dialogs.GeneralDialogCreation;
@@ -657,7 +658,11 @@ private OpenMode loadPathInQ(String actualPath, String providedPath, OpenMode pr
d.getActionButton(DialogAction.POSITIVE)
.setOnClickListener(
v -> {
- handleDocumentUriForRestrictedDirectories.launch(intent);
+ ExtensionsKt.runIfDocumentsUIExists(
+ intent,
+ requireMainActivity(),
+ () -> handleDocumentUriForRestrictedDirectories.launch(intent));
+
d.dismiss();
});
d.show();
diff --git a/app/src/main/java/com/amaze/filemanager/ui/views/drawer/Drawer.java b/app/src/main/java/com/amaze/filemanager/ui/views/drawer/Drawer.java
index 6a94b26a87..c55fb95000 100644
--- a/app/src/main/java/com/amaze/filemanager/ui/views/drawer/Drawer.java
+++ b/app/src/main/java/com/amaze/filemanager/ui/views/drawer/Drawer.java
@@ -47,6 +47,7 @@
import com.amaze.filemanager.filesystem.RootHelper;
import com.amaze.filemanager.filesystem.cloud.CloudUtil;
import com.amaze.filemanager.filesystem.files.FileUtils;
+import com.amaze.filemanager.ui.ExtensionsKt;
import com.amaze.filemanager.ui.activities.AboutActivity;
import com.amaze.filemanager.ui.activities.MainActivity;
import com.amaze.filemanager.ui.activities.PreferencesActivity;
@@ -845,7 +846,14 @@ public boolean onNavigationItemSelected(@NonNull MenuItem item) {
.setOnClickListener(
(v) -> {
Intent safIntent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
- mainActivity.startActivityForResult(safIntent, MainActivity.REQUEST_CODE_SAF);
+
+ ExtensionsKt.runIfDocumentsUIExists(
+ safIntent,
+ mainActivity,
+ () ->
+ mainActivity.startActivityForResult(
+ safIntent, MainActivity.REQUEST_CODE_SAF));
+
dialog.dismiss();
});
dialog.show();
diff --git a/app/src/main/java/com/amaze/filemanager/utils/MainActivityHelper.java b/app/src/main/java/com/amaze/filemanager/utils/MainActivityHelper.java
index 276c306c03..85996942b3 100644
--- a/app/src/main/java/com/amaze/filemanager/utils/MainActivityHelper.java
+++ b/app/src/main/java/com/amaze/filemanager/utils/MainActivityHelper.java
@@ -58,6 +58,7 @@
import com.amaze.filemanager.filesystem.files.CryptUtil;
import com.amaze.filemanager.filesystem.files.FileUtils;
import com.amaze.filemanager.filesystem.ftp.NetCopyClientUtils;
+import com.amaze.filemanager.ui.ExtensionsKt;
import com.amaze.filemanager.ui.activities.MainActivity;
import com.amaze.filemanager.ui.dialogs.GeneralDialogCreation;
import com.amaze.filemanager.ui.fragments.MainFragment;
@@ -67,6 +68,7 @@
import com.amaze.filemanager.ui.views.WarnableTextInputValidator;
import com.leinardi.android.speeddial.SpeedDialView;
+import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
@@ -327,9 +329,13 @@ public void guideDialogForLEXA(String path, int requestCode) {
y.show();
}
+ @SuppressLint("InlinedApi")
private void triggerStorageAccessFramework(int requestCode) {
+
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
- mainActivity.startActivityForResult(intent, requestCode);
+
+ ExtensionsKt.runIfDocumentsUIExists(
+ intent, mainActivity, () -> mainActivity.startActivityForResult(intent, requestCode));
}
public void rename(
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index c8d6303e05..eb6d37215f 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -789,9 +789,10 @@ You only need to do this once, until the next time you select a new location for
FTP
Secure FTP
Unavailable
+ "%s\n%s free of %s
Amaze Cloud Plugin not supported with F-Droid version. Please use Play Store version of Amaze.
Disable player intent filters
Disables Amaze inbuilt media players from file chooser
- "%s\n%s free of %s
+ No app found to handle this intent. Do you have DocumentsUI installed?