@ -10,6 +10,7 @@ import android.content.Intent
import android.net.Uri
import android.os.Handler
import android.os.Looper
import android.webkit.MimeTypeMap
import androidx.activity.result.ActivityResult
import app.tauri.Logger
import app.tauri.annotation.ActivityCallback
@ -43,6 +44,7 @@ class MessageOptions {
@InvokeArg
class SaveFileDialogOptions {
var fileName : String ? = null
lateinit var filters : Array < Filter >
}
@TauriPlugin
@ -57,20 +59,7 @@ class DialogPlugin(private val activity: Activity): Plugin(activity) {
val intent = if ( parsedTypes . isNotEmpty ( ) ) {
val intent = Intent ( Intent . ACTION _PICK )
intent . putExtra ( Intent . EXTRA _MIME _TYPES , parsedTypes )
var uniqueMimeType = true
var mimeKind : String ? = null
for ( mime in parsedTypes ) {
val kind = mime . split ( " / " ) [ 0 ]
if ( mimeKind == null ) {
mimeKind = kind
} else if ( mimeKind != kind ) {
uniqueMimeType = false
}
}
intent . type = if ( uniqueMimeType ) Intent . normalizeMimeType ( " $mimeKind /* " ) else " */* "
setIntentMimeTypes ( intent , parsedTypes )
intent
} else {
val intent = Intent ( Intent . ACTION _GET _CONTENT )
@ -130,12 +119,46 @@ class DialogPlugin(private val activity: Activity): Plugin(activity) {
private fun parseFiltersOption ( filters : Array < Filter > ) : Array < String > {
val mimeTypes = mutableListOf < String > ( )
for ( filter in filters ) {
for ( mime in filter . extensions ) {
mimeTypes . add ( if ( mime == " text/csv " ) " text/comma-separated-values " else mime )
for ( ext in filter . extensions ) {
if ( ext . contains ( '/' ) ) {
mimeTypes . add ( if ( ext == " text/csv " ) " text/comma-separated-values " else ext )
} else {
MimeTypeMap . getSingleton ( ) . getMimeTypeFromExtension ( ext ) ?. let {
mimeTypes . add ( it )
}
}
}
}
return mimeTypes . toTypedArray ( )
}
private fun setIntentMimeTypes ( intent : Intent , mimeTypes : Array < String > ) {
if ( mimeTypes . isNotEmpty ( ) ) {
var uniqueMimeKind = true
var mimeKind : String ? = null
for ( mime in mimeTypes ) {
val kind = mime . split ( " / " ) [ 0 ]
if ( mimeKind == null ) {
mimeKind = kind
} else if ( mimeKind != kind ) {
uniqueMimeKind = false
}
}
if ( uniqueMimeKind ) {
if ( mimeTypes . size > 1 ) {
intent . putExtra ( Intent . EXTRA _MIME _TYPES , mimeTypes )
intent . type = Intent . normalizeMimeType ( " $mimeKind /* " )
} else {
intent . type = mimeTypes [ 0 ]
}
} else {
intent . type = " */* "
}
} else {
intent . type = " */* "
}
}
@Command
fun showMessageDialog ( invoke : Invoke ) {
@ -187,10 +210,12 @@ class DialogPlugin(private val activity: Activity): Plugin(activity) {
fun saveFileDialog ( invoke : Invoke ) {
try {
val args = invoke . parseArgs ( SaveFileDialogOptions :: class . java )
val parsedTypes = parseFiltersOption ( args . filters )
val intent = Intent ( Intent . ACTION _CREATE _DOCUMENT )
setIntentMimeTypes ( intent , parsedTypes )
intent . addCategory ( Intent . CATEGORY _OPENABLE )
intent . setType ( " text/plain " )
intent . putExtra ( Intent . EXTRA _TITLE , args . fileName ?: " " )
startActivityForResult ( invoke , intent , " saveFileDialogResult " )
} catch ( ex : Exception ) {