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?