@@ -20,6 +20,7 @@ import com.wstxda.switchai.utils.Constants.CAT_RECENTLY_USED_ASSISTANTS_KEY
2020import com.wstxda.switchai.utils.Constants.CAT_MAX_RECENTLY_USED
2121import com.wstxda.switchai.utils.Constants.PREFS_NAME
2222import com.wstxda.switchai.ui.utils.AssistantResourcesManager
23+ import com.wstxda.switchai.logic.isPackageInstalled
2324
2425class AssistantSelectorViewModel (application : Application ) : AndroidViewModel(application),
2526 SharedPreferences .OnSharedPreferenceChangeListener {
@@ -123,6 +124,7 @@ class AssistantSelectorViewModel(application: Application) : AndroidViewModel(ap
123124 val resources = context.resources
124125
125126 val assistantsMap = DigitalAssistantMap .assistantsMap
127+ val assistantPackages = DigitalAssistantMap .assistantsPackages
126128
127129 val defaultVisibleAssistants =
128130 resources.getStringArray(R .array.assistant_visibility_values).toSet()
@@ -134,16 +136,25 @@ class AssistantSelectorViewModel(application: Application) : AndroidViewModel(ap
134136 assistantsMap.filterKeys { it in visibleAssistantKeys }.map { (key, _) ->
135137 val name = assistantResourcesManager.getAssistantName(key)
136138 val finalIconResId = assistantResourcesManager.getAssistantIcon(key)
139+ val packageName = assistantPackages[key] ? : " "
140+ val isInstalled = isPackageInstalled(context, packageName)
137141
138142 AssistantItem (
139- key, name, finalIconResId, isPinned = false , lastUsedTimestamp = 0L
143+ key,
144+ name,
145+ finalIconResId,
146+ isInstalled = isInstalled,
147+ isPinned = false ,
148+ lastUsedTimestamp = 0L
140149 )
141150 }
142151
152+ val (installedAssistants, notInstalledAssistants) = allVisibleAssistantDetails.partition { it.isInstalled }
153+
143154 val finalRecyclerViewItems = mutableListOf<AssistantSelectorRecyclerView >()
144155
145156 val pinnedItems = mutableListOf<AssistantSelectorRecyclerView .AssistantSelector >()
146- allVisibleAssistantDetails .filter { it.key in pinnedAssistantKeys }.forEach { item ->
157+ installedAssistants .filter { it.key in pinnedAssistantKeys }.forEach { item ->
147158 pinnedItems.add(AssistantSelectorRecyclerView .AssistantSelector (item.copy(isPinned = true )))
148159 }
149160 if (pinnedItems.isNotEmpty()) {
@@ -160,7 +171,7 @@ class AssistantSelectorViewModel(application: Application) : AndroidViewModel(ap
160171 val recentItems = mutableListOf<AssistantSelectorRecyclerView .AssistantSelector >()
161172 recentlyUsedAssistants.forEach { (key, timestamp) ->
162173 if (visibleAssistantKeys.contains(key) && ! pinnedAssistantKeys.contains(key)) {
163- allVisibleAssistantDetails .find { it.key == key }?.let { item ->
174+ installedAssistants .find { it.key == key }?.let { item ->
164175 recentItems.add(
165176 AssistantSelectorRecyclerView .AssistantSelector (
166177 item.copy(
@@ -183,7 +194,7 @@ class AssistantSelectorViewModel(application: Application) : AndroidViewModel(ap
183194 }
184195
185196 val otherItems = mutableListOf<AssistantSelectorRecyclerView .AssistantSelector >()
186- allVisibleAssistantDetails .forEach { item ->
197+ installedAssistants .forEach { item ->
187198 val isPinned = pinnedAssistantKeys.contains(item.key)
188199 val isRecent = recentlyUsedAssistants.any { it.first == item.key }
189200 if (! isPinned && ! isRecent) {
@@ -202,6 +213,19 @@ class AssistantSelectorViewModel(application: Application) : AndroidViewModel(ap
202213 finalRecyclerViewItems.addAll(otherItems)
203214 }
204215
216+ if (notInstalledAssistants.isNotEmpty()) {
217+ finalRecyclerViewItems.add(
218+ AssistantSelectorRecyclerView .CategoryHeader (
219+ context.getString(
220+ R .string.assistant_category_not_installed
221+ )
222+ )
223+ )
224+ finalRecyclerViewItems.addAll(notInstalledAssistants.map {
225+ AssistantSelectorRecyclerView .AssistantSelector (it)
226+ })
227+ }
228+
205229 _assistantItems .value = finalRecyclerViewItems
206230 }
207231
0 commit comments