mirror of
https://github.com/IllusionMan1212/lyrics-grabbr.git
synced 2026-10-24 02:12:27 +00:00
feat: whitelist for notification listening
This commit is contained in:
@@ -1,5 +1,8 @@
|
||||
package com.illusionman1212.lyricsgrabbr.viewmodels
|
||||
|
||||
import android.content.Context
|
||||
import android.content.pm.PackageManager
|
||||
import android.graphics.drawable.Drawable
|
||||
import androidx.lifecycle.ViewModel
|
||||
import androidx.lifecycle.ViewModelProvider
|
||||
import androidx.lifecycle.ViewModelProvider.AndroidViewModelFactory.Companion.APPLICATION_KEY
|
||||
@@ -14,13 +17,21 @@ import kotlinx.coroutines.flow.MutableStateFlow
|
||||
import kotlinx.coroutines.flow.asStateFlow
|
||||
import kotlinx.coroutines.flow.collectLatest
|
||||
import kotlinx.coroutines.flow.first
|
||||
import kotlinx.coroutines.flow.update
|
||||
import kotlinx.coroutines.launch
|
||||
|
||||
data class AppInfo(
|
||||
val displayName: String,
|
||||
val icon: Drawable,
|
||||
var isWhitelisted: Boolean,
|
||||
)
|
||||
|
||||
data class SettingsState(
|
||||
val appTheme: Int = Theme.SYSTEM.ordinal,
|
||||
val applications: MutableMap<String, AppInfo> = mutableMapOf(),
|
||||
)
|
||||
|
||||
class SettingsViewModel(private val settingsPrefsRepo: SettingsPreferencesRepository): ViewModel() {
|
||||
class SettingsViewModel(private val settingsPrefsRepo: SettingsPreferencesRepository, context: Context): ViewModel() {
|
||||
private val _uiState = MutableStateFlow(SettingsState())
|
||||
val uiState = _uiState.asStateFlow()
|
||||
|
||||
@@ -34,7 +45,56 @@ class SettingsViewModel(private val settingsPrefsRepo: SettingsPreferencesReposi
|
||||
}
|
||||
}
|
||||
|
||||
private suspend fun getWhitelistedApps(): Set<String> {
|
||||
return settingsPrefsRepo.preferences.first().whitelist
|
||||
}
|
||||
|
||||
private fun getPackages(context: Context) {
|
||||
if (uiState.value.applications.isNotEmpty()) return
|
||||
|
||||
viewModelScope.launch(Dispatchers.IO) {
|
||||
val pm = context.packageManager
|
||||
val packages = pm.getInstalledApplications(PackageManager.GET_META_DATA)
|
||||
.filter { it.packageName != context.packageName && pm.getLaunchIntentForPackage(it.packageName) != null }
|
||||
.sortedWith(compareBy(String.CASE_INSENSITIVE_ORDER) { it.loadLabel(pm).toString() })
|
||||
|
||||
val apps: MutableMap<String, AppInfo> = mutableMapOf()
|
||||
val whitelistedApps = getWhitelistedApps()
|
||||
|
||||
packages.forEach { pkg ->
|
||||
val label = pkg.loadLabel(pm)
|
||||
val icon = pkg.loadIcon(pm)
|
||||
apps[pkg.packageName] = AppInfo(
|
||||
displayName = label.toString(),
|
||||
icon = icon,
|
||||
isWhitelisted = pkg.packageName in whitelistedApps
|
||||
)
|
||||
}
|
||||
_uiState.update {
|
||||
SettingsState(
|
||||
appTheme = uiState.value.appTheme,
|
||||
applications = apps,
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun addToWhitelist(packageName: String) {
|
||||
viewModelScope.launch(Dispatchers.IO) {
|
||||
_uiState.value.applications[packageName]?.let { it.isWhitelisted = true }
|
||||
settingsPrefsRepo.addToWhitelist(packageName)
|
||||
}
|
||||
}
|
||||
|
||||
fun removeFromWhitelist(packageName: String) {
|
||||
viewModelScope.launch(Dispatchers.IO) {
|
||||
_uiState.value.applications[packageName]?.let { it.isWhitelisted = false }
|
||||
settingsPrefsRepo.removeFromWhitelist(packageName)
|
||||
}
|
||||
}
|
||||
|
||||
init {
|
||||
getPackages(context)
|
||||
viewModelScope.launch {
|
||||
settingsPrefsRepo.preferences.collectLatest {
|
||||
_uiState.value = _uiState.value.copy(
|
||||
@@ -48,7 +108,7 @@ class SettingsViewModel(private val settingsPrefsRepo: SettingsPreferencesReposi
|
||||
val Factory: ViewModelProvider.Factory = viewModelFactory {
|
||||
initializer {
|
||||
val application = (this[APPLICATION_KEY] as LGApp)
|
||||
SettingsViewModel(application.settingsPreferencesRepository)
|
||||
SettingsViewModel(application.settingsPreferencesRepository, application.applicationContext)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user