@@ -10,6 +10,7 @@ import android.content.Intent
10
10
import android.net.Uri
11
11
import android.os.Handler
12
12
import android.os.Looper
13
+ import android.webkit.MimeTypeMap
13
14
import androidx.activity.result.ActivityResult
14
15
import app.tauri.Logger
15
16
import app.tauri.annotation.ActivityCallback
@@ -43,6 +44,7 @@ class MessageOptions {
43
44
@InvokeArg
44
45
class SaveFileDialogOptions {
45
46
var fileName: String? = null
47
+ lateinit var filters: Array <Filter >
46
48
}
47
49
48
50
@TauriPlugin
@@ -57,20 +59,7 @@ class DialogPlugin(private val activity: Activity): Plugin(activity) {
57
59
58
60
val intent = if (parsedTypes.isNotEmpty()) {
59
61
val intent = Intent (Intent .ACTION_PICK )
60
- intent.putExtra(Intent .EXTRA_MIME_TYPES , parsedTypes)
61
-
62
- var uniqueMimeType = true
63
- var mimeKind: String? = null
64
- for (mime in parsedTypes) {
65
- val kind = mime.split(" /" )[0 ]
66
- if (mimeKind == null ) {
67
- mimeKind = kind
68
- } else if (mimeKind != kind) {
69
- uniqueMimeType = false
70
- }
71
- }
72
-
73
- intent.type = if (uniqueMimeType) Intent .normalizeMimeType(" $mimeKind /*" ) else " */*"
62
+ setIntentMimeTypes(intent, parsedTypes)
74
63
intent
75
64
} else {
76
65
val intent = Intent (Intent .ACTION_GET_CONTENT )
@@ -130,12 +119,46 @@ class DialogPlugin(private val activity: Activity): Plugin(activity) {
130
119
private fun parseFiltersOption (filters : Array <Filter >): Array <String > {
131
120
val mimeTypes = mutableListOf<String >()
132
121
for (filter in filters) {
133
- for (mime in filter.extensions) {
134
- mimeTypes.add(if (mime == " text/csv" ) " text/comma-separated-values" else mime)
122
+ for (ext in filter.extensions) {
123
+ if (ext.contains(' /' )) {
124
+ mimeTypes.add(if (ext == " text/csv" ) " text/comma-separated-values" else ext)
125
+ } else {
126
+ MimeTypeMap .getSingleton().getMimeTypeFromExtension(ext)?.let {
127
+ mimeTypes.add(it)
128
+ }
129
+ }
135
130
}
136
131
}
137
132
return mimeTypes.toTypedArray()
138
133
}
134
+
135
+ private fun setIntentMimeTypes (intent : Intent , mimeTypes : Array <String >) {
136
+ if (mimeTypes.isNotEmpty()) {
137
+ var uniqueMimeKind = true
138
+ var mimeKind: String? = null
139
+ for (mime in mimeTypes) {
140
+ val kind = mime.split(" /" )[0 ]
141
+ if (mimeKind == null ) {
142
+ mimeKind = kind
143
+ } else if (mimeKind != kind) {
144
+ uniqueMimeKind = false
145
+ }
146
+ }
147
+
148
+ if (uniqueMimeKind) {
149
+ if (mimeTypes.size > 1 ) {
150
+ intent.putExtra(Intent .EXTRA_MIME_TYPES , mimeTypes)
151
+ intent.type = Intent .normalizeMimeType(" $mimeKind /*" )
152
+ } else {
153
+ intent.type = mimeTypes[0 ]
154
+ }
155
+ } else {
156
+ intent.type = " */*"
157
+ }
158
+ } else {
159
+ intent.type = " */*"
160
+ }
161
+ }
139
162
140
163
@Command
141
164
fun showMessageDialog (invoke : Invoke ) {
@@ -187,10 +210,12 @@ class DialogPlugin(private val activity: Activity): Plugin(activity) {
187
210
fun saveFileDialog (invoke : Invoke ) {
188
211
try {
189
212
val args = invoke.parseArgs(SaveFileDialogOptions ::class .java)
213
+ val parsedTypes = parseFiltersOption(args.filters)
190
214
191
215
val intent = Intent (Intent .ACTION_CREATE_DOCUMENT )
216
+ setIntentMimeTypes(intent, parsedTypes)
217
+
192
218
intent.addCategory(Intent .CATEGORY_OPENABLE )
193
- intent.setType(" text/plain" )
194
219
intent.putExtra(Intent .EXTRA_TITLE , args.fileName ? : " " )
195
220
startActivityForResult(invoke, intent, " saveFileDialogResult" )
196
221
} catch (ex: Exception ) {
0 commit comments