@@ -66,12 +66,12 @@ object ModelDownloadManager {
6666 )
6767
6868 fun isModelDownloaded (context : Context , model : ModelOption = GenerativeAiViewModelFactory .getCurrentModel()): Boolean {
69- val required = getRequiredFiles (context, model)
70- return required.isNotEmpty() && required.all { it. exists() && it .length() > 0 }
69+ val modelFile = getModelFile (context, model)
70+ return modelFile != null && modelFile. exists() && modelFile .length() > 0
7171 }
7272
7373 fun getModelFile (context : Context , model : ModelOption = GenerativeAiViewModelFactory .getCurrentModel()): File ? {
74- val modelFilename = model.offlineModelFilename ? : return null
74+ val modelFilename = resolveInstalledModelFilename(context, model) ? : model.offlineModelFilename ? : return null
7575 val externalFilesDir = context.getExternalFilesDir(null )
7676 return if (externalFilesDir != null ) {
7777 File (externalFilesDir, modelFilename)
@@ -83,26 +83,30 @@ object ModelDownloadManager {
8383
8484 private fun getRequiredFiles (context : Context , model : ModelOption ): List <File > {
8585 val externalFilesDir = context.getExternalFilesDir(null ) ? : return emptyList()
86- val requiredNames = if (model.offlineRequiredFilenames.isNotEmpty()) {
86+ val activeModelFilename = resolveInstalledModelFilename(context, model)
87+ val requiredNames = if (model == ModelOption .QWEN3_5_4B_OFFLINE && activeModelFilename == " model_quantized.litertlm" ) {
88+ listOf (" model_quantized.litertlm" , " sentencepiece.model" )
89+ } else if (model.offlineRequiredFilenames.isNotEmpty()) {
8790 model.offlineRequiredFilenames
8891 } else {
8992 listOfNotNull(model.offlineModelFilename)
9093 }
9194 return requiredNames.map { File (externalFilesDir, it) }
9295 }
9396
94- fun getMissingRequiredFiles (context : Context , model : ModelOption ): List <String > {
95- val externalFilesDir = context.getExternalFilesDir(null ) ? : return model.offlineRequiredFilenames
96- val requiredNames = if (model.offlineRequiredFilenames.isNotEmpty()) {
97- model.offlineRequiredFilenames
98- } else {
99- listOfNotNull(model.offlineModelFilename)
100- }
101- return requiredNames.filter { name ->
97+ private fun resolveInstalledModelFilename (context : Context , model : ModelOption ): String? {
98+ val externalFilesDir = context.getExternalFilesDir(null ) ? : return null
99+ val candidates = listOfNotNull(model.offlineModelFilename) + model.offlineAlternateModelFilenames
100+ return candidates.firstOrNull { name ->
102101 val f = File (externalFilesDir, name)
103- ! f.exists() || f.length() <= 0
102+ f.exists() && f.length() > 0
104103 }
105104 }
105+
106+ fun getMissingRequiredFiles (context : Context , model : ModelOption ): List <String > {
107+ val requiredFiles = getRequiredFiles(context, model)
108+ return requiredFiles.filter { ! it.exists() || it.length() <= 0 }.map { it.name }
109+ }
106110
107111 private fun createNotificationChannel (context : Context ) {
108112 if (Build .VERSION .SDK_INT >= Build .VERSION_CODES .O ) {
0 commit comments