fix: resolve proper filename when saving a shared file (#86)

* Fix filename when saving a shared file

Previously, the code used the last path component of the content URI,
but that isn't necessarily the filename -- it can be a numeric ID.

Switch to the helper function getFilenameFromContentUri(), which uses
ContentResolver to read the DISPLAY_NAME column. (If that fails, we
fall back to the last component of the content URI as before, because
we don't have anything better to use.)

Also improve the way the MIME type is determined. Previously it was
just based on the file extension. Switch to first query the
ContentResolver, then try the type of the Intent (which is supposed to
be set to the MIME type of the data for ACTION_SEND, but may be set to
"*/*" if the type is unknown), and only then fall back to using the
file extension.

Fixes #37.

* style: shorten lines

---------

Co-authored-by: Naveen Singh <36371707+naveensingh@users.noreply.github.com>
Co-authored-by: Naveen Singh <snaveen935@gmail.com>
This commit is contained in:
Tom Levy
2025-05-21 18:33:10 +12:00
committed by GitHub
parent 97dcf30b47
commit 19f0a2ad35

View File

@@ -35,10 +35,13 @@ class SaveAsActivity : SimpleActivity() {
}
}
val source = intent.getParcelableExtra<Uri>(Intent.EXTRA_STREAM)
val mimeType = source!!.toString().getMimeType()
val source = intent.getParcelableExtra<Uri>(Intent.EXTRA_STREAM)!!
val filename = getFilenameFromContentUri(source)
?: source.toString().getFilenameFromPath()
val mimeType = contentResolver.getType(source)
?: intent.type?.takeIf { it != "*/*" }
?: filename.getMimeType()
val inputStream = contentResolver.openInputStream(source)
val filename = source.toString().getFilenameFromPath()
val destinationPath = "$destination/$filename"
val outputStream = getFileOutputStreamSync(destinationPath, mimeType, null)!!