@@ -2,6 +2,9 @@ package ai.mlc.mlcchat
2
2
3
3
import ai.mlc.mlcllm.ChatModule
4
4
import android.app.Application
5
+ import android.content.ClipData
6
+ import android.content.ClipboardManager
7
+ import android.content.Context
5
8
import android.os.Environment
6
9
import android.widget.Toast
7
10
import androidx.compose.runtime.mutableStateOf
@@ -23,6 +26,8 @@ class AppViewModel(application: Application) : AndroidViewModel(application) {
23
26
val modelList = emptyList<ModelState >().toMutableStateList()
24
27
val chatState = ChatState ()
25
28
val modelSampleList = emptyList<ModelRecord >().toMutableStateList()
29
+ private var showAlert = mutableStateOf(false )
30
+ private var alertMessage = mutableStateOf(" " )
26
31
private var appConfig = AppConfig (
27
32
emptyList(),
28
33
emptyList<ModelRecord >().toMutableList(),
@@ -44,25 +49,46 @@ class AppViewModel(application: Application) : AndroidViewModel(application) {
44
49
loadAppConfig()
45
50
}
46
51
52
+ fun supportedModelLibs (): List <String > {
53
+ return appConfig.modelLibs
54
+ }
55
+
56
+ fun isShowingAlert (): Boolean {
57
+ return showAlert.value
58
+ }
59
+
60
+ fun errorMessage (): String {
61
+ return alertMessage.value
62
+ }
63
+
64
+ fun dismissAlert () {
65
+ require(showAlert.value)
66
+ showAlert.value = false
67
+ }
68
+
69
+ fun copyError () {
70
+ require(showAlert.value)
71
+ val clipboard =
72
+ application.getSystemService(Context .CLIPBOARD_SERVICE ) as ClipboardManager
73
+ clipboard.setPrimaryClip(ClipData .newPlainText(" MLCChat" , errorMessage()))
74
+ }
75
+
76
+ private fun issueAlert (error : String ) {
77
+ showAlert.value = true
78
+ alertMessage.value = error
79
+ }
80
+
47
81
fun requestAddModel (url : String , localId : String? ) {
48
82
if (localId != null && localIdSet.contains(localId)) {
49
- Toast .makeText(
50
- application,
51
- " localId: $localId has been occupied" ,
52
- Toast .LENGTH_SHORT
53
- ).show()
83
+ issueAlert(" localId: $localId has been occupied" )
54
84
} else {
55
85
downloadModelConfig(if (url.endsWith(" /" )) url else " $url /" , localId, false )
56
86
}
57
87
}
58
88
59
89
fun requestDeleteModel (localId : String ) {
60
90
deleteModel(localId)
61
- Toast .makeText(
62
- application,
63
- " Model: $localId has been deleted" ,
64
- Toast .LENGTH_SHORT
65
- ).show()
91
+ issueAlert(" Model: $localId has been deleted" )
66
92
}
67
93
68
94
@@ -133,11 +159,7 @@ class AppViewModel(application: Application) : AndroidViewModel(application) {
133
159
private fun isModelConfigAllowed (modelConfig : ModelConfig ): Boolean {
134
160
if (appConfig.modelLibs.contains(modelConfig.modelLib)) return true ;
135
161
viewModelScope.launch {
136
- Toast .makeText(
137
- application,
138
- " Model lib ${modelConfig.modelLib} is not supported." ,
139
- Toast .LENGTH_SHORT
140
- ).show()
162
+ issueAlert(" Model lib ${modelConfig.modelLib} is not supported." )
141
163
}
142
164
return false
143
165
}
@@ -169,11 +191,7 @@ class AppViewModel(application: Application) : AndroidViewModel(application) {
169
191
}
170
192
if (localIdSet.contains(modelConfig.localId)) {
171
193
tempFile.delete()
172
- Toast .makeText(
173
- application,
174
- " ${modelConfig.localId} has been used, please consider another local ID" ,
175
- Toast .LENGTH_SHORT
176
- ).show()
194
+ issueAlert(" ${modelConfig.localId} has been used, please consider another local ID" )
177
195
return @launch
178
196
}
179
197
if (! isModelConfigAllowed(modelConfig)) {
@@ -188,21 +206,13 @@ class AppViewModel(application: Application) : AndroidViewModel(application) {
188
206
addModelConfig(modelConfig, modelUrl, isBuiltin)
189
207
} catch (e: Exception ) {
190
208
viewModelScope.launch {
191
- Toast .makeText(
192
- application,
193
- " Add model failed: ${e.localizedMessage} " ,
194
- Toast .LENGTH_SHORT
195
- ).show()
209
+ issueAlert(" Add model failed: ${e.localizedMessage} " )
196
210
}
197
211
}
198
212
}
199
213
} catch (e: Exception ) {
200
214
viewModelScope.launch {
201
- Toast .makeText(
202
- application,
203
- " Download model config failed: ${e.localizedMessage} " ,
204
- Toast .LENGTH_SHORT
205
- ).show()
215
+ issueAlert(" Download model config failed: ${e.localizedMessage} " )
206
216
}
207
217
}
208
218
0 commit comments