From 7bbc12c7c9e5310dbe6b1e425cb3b975d74ecaba Mon Sep 17 00:00:00 2001 From: agnostic-apollo Date: Sat, 23 Oct 2021 22:41:08 +0500 Subject: [PATCH] Fixed: Get file basename from Uri path when opening files in termux if failed to get it ContentResolver and EXTRA_TITLE --- .../TermuxFileReceiverActivity.java | 1 + .../java/com/termux/shared/data/UriUtils.java | 24 +++++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/app/src/main/java/com/termux/filepicker/TermuxFileReceiverActivity.java b/app/src/main/java/com/termux/filepicker/TermuxFileReceiverActivity.java index d9af2c31..b9022a0e 100644 --- a/app/src/main/java/com/termux/filepicker/TermuxFileReceiverActivity.java +++ b/app/src/main/java/com/termux/filepicker/TermuxFileReceiverActivity.java @@ -142,6 +142,7 @@ public class TermuxFileReceiverActivity extends Activity { } if (attachmentFileName == null) attachmentFileName = subjectFromIntent; + if (attachmentFileName == null) attachmentFileName = UriUtils.getUriFileBasename(uri, true); InputStream in = getContentResolver().openInputStream(uri); promptNameAndSave(in, attachmentFileName); diff --git a/termux-shared/src/main/java/com/termux/shared/data/UriUtils.java b/termux-shared/src/main/java/com/termux/shared/data/UriUtils.java index 01aa6c72..4149d45d 100644 --- a/termux-shared/src/main/java/com/termux/shared/data/UriUtils.java +++ b/termux-shared/src/main/java/com/termux/shared/data/UriUtils.java @@ -5,6 +5,8 @@ import android.net.Uri; import androidx.annotation.NonNull; +import com.termux.shared.file.FileUtils; + public class UriUtils { /** @@ -30,6 +32,28 @@ public class UriUtils { return path + (DataUtils.isNullOrEmpty(fragment) ? "" : "#" + fragment); } + /** + * Get the file basename from a {@link Uri}. The file basename is anything after last forward + * slash "/" in the path, or the path itself if its not found. + * + * @param uri The {@link Uri} to get basename from. + * @param withFragment If the {@link Uri} fragment should be included in basename. + * @return Returns the file basename if found, otherwise {@code null}. + */ + public static String getUriFileBasename(Uri uri, boolean withFragment) { + if (uri == null) return null; + + String path; + if (withFragment) { + path = getUriFilePath(uri); + } else { + path = uri.getPath(); + if (DataUtils.isNullOrEmpty(path)) return null; + } + + return FileUtils.getFileBasename(path); + } + /** * Get {@link ContentResolver#SCHEME_FILE} {@link Uri} for path. *