diff --git a/app/src/main/java/com/aurora/store/data/providers/BlacklistProvider.kt b/app/src/main/java/com/aurora/store/data/providers/BlacklistProvider.kt index f9b7dddba..18b84ad87 100644 --- a/app/src/main/java/com/aurora/store/data/providers/BlacklistProvider.kt +++ b/app/src/main/java/com/aurora/store/data/providers/BlacklistProvider.kt @@ -23,81 +23,69 @@ import android.content.Context import android.content.SharedPreferences import androidx.preference.PreferenceManager import com.aurora.extensions.isNAndAbove -import com.aurora.store.data.SingletonHolder import com.aurora.store.util.Preferences import com.google.gson.Gson -import com.google.gson.GsonBuilder import com.google.gson.reflect.TypeToken +import dagger.hilt.android.qualifiers.ApplicationContext import java.io.File -import java.lang.reflect.Modifier +import javax.inject.Inject +import javax.inject.Singleton -class BlacklistProvider private constructor(var context: Context) { +@Singleton +class BlacklistProvider @Inject constructor( + private val gson: Gson, + @ApplicationContext val context: Context, +) { - companion object : SingletonHolder(::BlacklistProvider) { - const val PREFERENCE_BLACKLIST = "PREFERENCE_BLACKLIST" + private val PREFERENCE_BLACKLIST = "PREFERENCE_BLACKLIST" + + var blacklist: MutableSet + set(value) = Preferences.putString(context, PREFERENCE_BLACKLIST, gson.toJson(value)) + get() { + return try { + val rawBlacklist = if (isNAndAbove()) { + val refMethod = Context::class.java.getDeclaredMethod( + "getSharedPreferences", + File::class.java, + Int::class.java + ) + val refSharedPreferences = refMethod.invoke( + context, + File("/product/etc/com.aurora.store/blacklist.xml"), + Context.MODE_PRIVATE + ) as SharedPreferences + + PreferenceManager.getDefaultSharedPreferences(context) + .getString( + PREFERENCE_BLACKLIST, + refSharedPreferences.getString(PREFERENCE_BLACKLIST, "") + ) + } else { + Preferences.getString(context, PREFERENCE_BLACKLIST) + } + if (rawBlacklist!!.isEmpty()) + mutableSetOf() + else + gson.fromJson(rawBlacklist, object : TypeToken?>() {}.type) + } catch (e: Exception) { + mutableSetOf() + } + } + + fun isBlacklisted(packageName: String): Boolean { + return blacklist.contains(packageName) } - private var gson: Gson = GsonBuilder() - .excludeFieldsWithModifiers(Modifier.TRANSIENT) - .create() - fun getBlackList(): MutableSet { - return try { - val rawBlacklist = if (isNAndAbove()) { - val refMethod = Context::class.java.getDeclaredMethod( - "getSharedPreferences", - File::class.java, - Int::class.java - ) - val refSharedPreferences = refMethod.invoke( - context, - File("/product/etc/com.aurora.store/blacklist.xml"), - Context.MODE_PRIVATE - ) as SharedPreferences - - PreferenceManager.getDefaultSharedPreferences(context) - .getString( - PREFERENCE_BLACKLIST, - refSharedPreferences.getString(PREFERENCE_BLACKLIST, "") - ) - } else { - Preferences.getString(context, PREFERENCE_BLACKLIST) - } - if (rawBlacklist!!.isEmpty()) - mutableSetOf() - else - gson.fromJson(rawBlacklist, object : TypeToken?>() {}.type) - } catch (e: Exception) { - mutableSetOf() + fun blacklist(packageName: String) { + blacklist = blacklist.apply { + add(packageName) } } - fun isBlacklisted(packageName: String): Boolean { - return getBlackList().contains(packageName) - } - - fun blacklist(packageName: String) { - blacklist(setOf(packageName)) - } - fun whitelist(packageName: String) { - whitelist(setOf(packageName)) - } - - fun blacklist(packageNames: Set) { - val oldBlackList: MutableSet = getBlackList() - oldBlackList.addAll(packageNames) - save(oldBlackList) - } - - fun whitelist(packageNames: Set) { - val oldBlackList: MutableSet = getBlackList() - oldBlackList.removeAll(packageNames) - save(oldBlackList) - } - - @Synchronized - fun save(blacklist: Set) { - Preferences.putString(context, PREFERENCE_BLACKLIST, gson.toJson(blacklist)) + blacklist = blacklist.apply { + remove(packageName) + } } } diff --git a/app/src/main/java/com/aurora/store/util/AppUtil.kt b/app/src/main/java/com/aurora/store/util/AppUtil.kt index e00cfc73c..e24306a8a 100644 --- a/app/src/main/java/com/aurora/store/util/AppUtil.kt +++ b/app/src/main/java/com/aurora/store/util/AppUtil.kt @@ -20,7 +20,6 @@ import dagger.hilt.android.qualifiers.ApplicationContext import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.map -import kotlinx.coroutines.flow.shareIn import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.withContext import javax.inject.Inject @@ -29,6 +28,7 @@ class AppUtil @Inject constructor( private val gson: Gson, private val authProvider: AuthProvider, private val updateDao: UpdateDao, + private val blacklistProvider: BlacklistProvider, @ApplicationContext private val context: Context ) { @@ -73,12 +73,11 @@ class AppUtil @Inject constructor( packageInfoMap: MutableMap? = null ): List { return withContext(Dispatchers.IO) { - val blackList = BlacklistProvider.with(context).getBlackList() val appDetailsHelper = AppDetailsHelper(authProvider.authData!!) .using(HttpClient.getPreferredClient(context)) (packageInfoMap ?: PackageUtil.getPackageInfoMap(context)).keys.let { packages -> - val filtersPackages = packages.filter { !blackList.contains(it) } + val filtersPackages = packages.filter { !blacklistProvider.isBlacklisted(it) } appDetailsHelper.getAppByPackageName(filtersPackages) .filter { it.displayName.isNotEmpty() } diff --git a/app/src/main/java/com/aurora/store/view/ui/commons/BlacklistFragment.kt b/app/src/main/java/com/aurora/store/view/ui/commons/BlacklistFragment.kt index b16e8d8a2..8fdf1b4df 100644 --- a/app/src/main/java/com/aurora/store/view/ui/commons/BlacklistFragment.kt +++ b/app/src/main/java/com/aurora/store/view/ui/commons/BlacklistFragment.kt @@ -29,7 +29,6 @@ import com.aurora.gplayapi.data.models.App import com.aurora.store.AuroraApp import com.aurora.store.R import com.aurora.store.data.event.BusEvent -import com.aurora.store.data.providers.BlacklistProvider import com.aurora.store.databinding.FragmentGenericWithToolbarBinding import com.aurora.store.view.epoxy.views.BlackListViewModel_ import com.aurora.store.view.epoxy.views.shimmer.AppListViewShimmerModel_ @@ -41,13 +40,9 @@ import kotlinx.coroutines.launch class BlacklistFragment : BaseFragment() { private val viewModel: BlacklistViewModel by viewModels() - private lateinit var blacklistProvider: BlacklistProvider - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - blacklistProvider = BlacklistProvider.with(requireContext()) - viewLifecycleOwner.lifecycleScope.launch { viewModel.blackListedApps.collect { updateController(it) @@ -64,7 +59,7 @@ class BlacklistFragment : BaseFragment() { override fun onPause() { super.onPause() - blacklistProvider.save(viewModel.selected) + viewModel.blacklistProvider.blacklist = viewModel.selected } private fun updateController(blackList: List?) { @@ -79,7 +74,9 @@ class BlacklistFragment : BaseFragment() { } } else { blackList - .sortedByDescending { app -> blacklistProvider.isBlacklisted(app.packageName) } + .sortedByDescending { app -> + viewModel.blacklistProvider.isBlacklisted(app.packageName) + } .forEach { add( BlackListViewModel_() diff --git a/app/src/main/java/com/aurora/store/view/ui/sheets/AppMenuSheet.kt b/app/src/main/java/com/aurora/store/view/ui/sheets/AppMenuSheet.kt index 778d856cb..d80761402 100644 --- a/app/src/main/java/com/aurora/store/view/ui/sheets/AppMenuSheet.kt +++ b/app/src/main/java/com/aurora/store/view/ui/sheets/AppMenuSheet.kt @@ -37,6 +37,7 @@ import com.aurora.store.databinding.SheetAppMenuBinding import com.aurora.store.util.PackageUtil import com.aurora.store.viewmodel.sheets.SheetsViewModel import dagger.hilt.android.AndroidEntryPoint +import javax.inject.Inject @AndroidEntryPoint class AppMenuSheet : BaseDialogSheet() { @@ -45,6 +46,9 @@ class AppMenuSheet : BaseDialogSheet() { const val TAG = "APP_MENU_SHEET" } + @Inject + lateinit var blacklistProvider: BlacklistProvider + private val viewModel: SheetsViewModel by viewModels() private val args: AppMenuSheetArgs by navArgs() @@ -63,7 +67,6 @@ class AppMenuSheet : BaseDialogSheet() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - val blacklistProvider = BlacklistProvider.with(requireContext()) val isBlacklisted: Boolean = blacklistProvider.isBlacklisted(args.app.packageName) with(binding.navigationView) { diff --git a/app/src/main/java/com/aurora/store/viewmodel/all/BlacklistViewModel.kt b/app/src/main/java/com/aurora/store/viewmodel/all/BlacklistViewModel.kt index d1c211a47..006b85333 100644 --- a/app/src/main/java/com/aurora/store/viewmodel/all/BlacklistViewModel.kt +++ b/app/src/main/java/com/aurora/store/viewmodel/all/BlacklistViewModel.kt @@ -42,10 +42,10 @@ import javax.inject.Inject @HiltViewModel @SuppressLint("StaticFieldLeak") // false positive, see https://github.com/google/dagger/issues/3253 class BlacklistViewModel @Inject constructor( + val blacklistProvider: BlacklistProvider, @ApplicationContext private val context: Context, authProvider: AuthProvider ) : ViewModel() { - private val blacklistProvider: BlacklistProvider = BlacklistProvider.with(context) private val appDetailsHelper = AppDetailsHelper(authProvider.authData!!) .using(HttpClient.getPreferredClient(context)) @@ -55,7 +55,7 @@ class BlacklistViewModel @Inject constructor( var selected: MutableSet = mutableSetOf() init { - selected = blacklistProvider.getBlackList() + selected = blacklistProvider.blacklist fetchApps() }