UpdateWorker: Merge and simplify logic for checking updates
Signed-off-by: Aayush Gupta <aayushgupta219@gmail.com>
This commit is contained in:
@@ -1,29 +1,27 @@
|
||||
package com.aurora.extensions
|
||||
|
||||
import android.content.pm.PackageManager
|
||||
import android.os.Build
|
||||
import androidx.annotation.RequiresApi
|
||||
import com.aurora.store.BuildConfig
|
||||
|
||||
fun PackageManager.getInstallerPackageNameCompat(packageName: String): String? {
|
||||
return if (isRAndAbove) {
|
||||
getInstallSourceInfo(packageName).installingPackageName
|
||||
} else {
|
||||
@Suppress("DEPRECATION")
|
||||
return getInstallerPackageName(packageName)
|
||||
}
|
||||
}
|
||||
|
||||
@RequiresApi(Build.VERSION_CODES.S)
|
||||
/**
|
||||
* Gets the name of package responsible for installing/updating given package
|
||||
*/
|
||||
fun PackageManager.getUpdateOwnerPackageNameCompat(packageName: String): String? {
|
||||
// https://developer.android.com/reference/android/content/pm/PackageInstaller.SessionParams#setRequireUserAction(int)
|
||||
val installSourceInfo = getInstallSourceInfo(packageName)
|
||||
// Self-updates can be managed by ourselves
|
||||
if (packageName == BuildConfig.APPLICATION_ID) return BuildConfig.APPLICATION_ID
|
||||
|
||||
return when {
|
||||
isUAndAbove -> {
|
||||
// If update ownership is null, we can still silently update it if we installed it
|
||||
val installSourceInfo = getInstallSourceInfo(packageName)
|
||||
installSourceInfo.updateOwnerPackageName ?: installSourceInfo.installingPackageName
|
||||
}
|
||||
isSAndAbove -> installSourceInfo.installingPackageName
|
||||
else -> if (packageName == BuildConfig.APPLICATION_ID) BuildConfig.APPLICATION_ID else null
|
||||
|
||||
isRAndAbove -> {
|
||||
val installSourceInfo = getInstallSourceInfo(packageName)
|
||||
installSourceInfo.installingPackageName
|
||||
}
|
||||
|
||||
else -> @Suppress("DEPRECATION") getInstallerPackageName(packageName)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,7 +4,6 @@ import android.app.NotificationManager
|
||||
import android.content.Context
|
||||
import android.util.Log
|
||||
import androidx.core.content.getSystemService
|
||||
import androidx.core.content.pm.PackageInfoCompat
|
||||
import androidx.hilt.work.HiltWorker
|
||||
import androidx.work.ForegroundInfo
|
||||
import androidx.work.WorkerParameters
|
||||
@@ -73,6 +72,15 @@ class UpdateWorker @AssistedInject constructor(
|
||||
!CertUtil.isAppGalleryApp(appContext, BuildConfig.APPLICATION_ID) &&
|
||||
buildType != BuildType.DEBUG
|
||||
|
||||
private val isAuroraOnlyFilterEnabled: Boolean
|
||||
get() = Preferences.getBoolean(appContext, Preferences.PREFERENCE_FILTER_AURORA_ONLY, false)
|
||||
|
||||
private val isGoogleFilterEnabled: Boolean
|
||||
get() = Preferences.getBoolean(appContext, Preferences.PREFERENCE_FILTER_GOOGLE)
|
||||
|
||||
private val isFDroidFilterEnabled: Boolean
|
||||
get() = Preferences.getBoolean(appContext, Preferences.PREFERENCE_FILTER_FDROID)
|
||||
|
||||
private val isExtendedUpdateEnabled: Boolean
|
||||
get() = Preferences.getBoolean(appContext, Preferences.PREFERENCE_UPDATES_EXTENDED)
|
||||
|
||||
@@ -149,20 +157,23 @@ class UpdateWorker @AssistedInject constructor(
|
||||
*/
|
||||
private suspend fun checkUpdates(): List<Update> {
|
||||
return withContext(Dispatchers.IO) {
|
||||
val packageInfoMap = PackageUtil.getPackageInfoMap(appContext)
|
||||
val updates = packageInfoMap.keys.let { packages ->
|
||||
val filteredPackages = packages.filter { !blacklistProvider.isBlacklisted(it) }
|
||||
appDetailsHelper.getAppByPackageName(filteredPackages)
|
||||
.filter { it.displayName.isNotEmpty() }
|
||||
.map { it.isInstalled = true; it }
|
||||
}.filter {
|
||||
val packageInfo = packageInfoMap[it.packageName]
|
||||
if (packageInfo != null) {
|
||||
it.versionCode.toLong() > PackageInfoCompat.getLongVersionCode(packageInfo)
|
||||
} else {
|
||||
false
|
||||
}
|
||||
}.toMutableList()
|
||||
val packages = PackageUtil.getAllValidPackages(appContext)
|
||||
.filterNot { blacklistProvider.isBlacklisted(it.packageName) }
|
||||
.filter { if (!isExtendedUpdateEnabled) it.applicationInfo!!.enabled else true }
|
||||
|
||||
// Filter out packages based on user's preferences
|
||||
val filteredPackages = if (isAuroraOnlyFilterEnabled) {
|
||||
packages.filter { CertUtil.isAuroraStoreApp(appContext, it.packageName) }
|
||||
} else {
|
||||
packages
|
||||
.filterNot { if (isFDroidFilterEnabled) CertUtil.isFDroidApp(appContext, it.packageName) else false }
|
||||
.filterNot { if (isGoogleFilterEnabled) CertUtil.isGoogleApp(it.packageName) else false }
|
||||
}
|
||||
|
||||
val updates = appDetailsHelper.getAppByPackageName(filteredPackages.map { it.packageName })
|
||||
.filter { it.displayName.isNotEmpty() }
|
||||
.filter { PackageUtil.isUpdatable(appContext, it.packageName, it.versionCode.toLong()) }
|
||||
.toMutableList()
|
||||
|
||||
if (canSelfUpdate) getSelfUpdate()?.let { updates.add(it) }
|
||||
|
||||
|
||||
@@ -25,7 +25,7 @@ import android.content.pm.PackageManager
|
||||
import android.util.Base64
|
||||
import android.util.Log
|
||||
import com.aurora.extensions.generateX509Certificate
|
||||
import com.aurora.extensions.getInstallerPackageNameCompat
|
||||
import com.aurora.extensions.getUpdateOwnerPackageNameCompat
|
||||
import com.aurora.extensions.isPAndAbove
|
||||
import com.aurora.store.data.model.Algorithm
|
||||
import com.aurora.store.util.PackageUtil.getPackageInfo
|
||||
@@ -41,8 +41,27 @@ object CertUtil {
|
||||
}
|
||||
|
||||
fun isAppGalleryApp(context: Context, packageName: String): Boolean {
|
||||
val appGalleryPackageName = "com.huawei.appmarket"
|
||||
return context.packageManager.getInstallerPackageNameCompat(packageName) == appGalleryPackageName
|
||||
return context.packageManager.getUpdateOwnerPackageNameCompat(packageName) == "com.huawei.appmarket"
|
||||
}
|
||||
|
||||
fun isGoogleApp(packageName: String): Boolean {
|
||||
return packageName.contains("com.google") || listOf(
|
||||
"com.chrome.beta",
|
||||
"com.chrome.canary",
|
||||
"com.chrome.dev",
|
||||
"com.android.chrome",
|
||||
"com.niksoftware.snapseed"
|
||||
).contains(packageName)
|
||||
}
|
||||
|
||||
fun isAuroraStoreApp(context: Context, packageName: String): Boolean {
|
||||
val packageInstaller = context.packageManager.getUpdateOwnerPackageNameCompat(packageName)
|
||||
return listOf(
|
||||
"com.aurora.store",
|
||||
"com.aurora.store.debug",
|
||||
"com.aurora.store.nightly",
|
||||
"com.aurora.services"
|
||||
).contains(packageInstaller)
|
||||
}
|
||||
|
||||
fun getEncodedCertificateHashes(context: Context, packageName: String): List<String> {
|
||||
@@ -81,7 +100,7 @@ object CertUtil {
|
||||
"org.fdroid.basic", "org.fdroid.fdroid", "org.fdroid.fdroid.privileged"
|
||||
)
|
||||
return fdroidPackages.contains(
|
||||
context.packageManager.getInstallerPackageNameCompat(packageName)
|
||||
context.packageManager.getUpdateOwnerPackageNameCompat(packageName)
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
@@ -34,7 +34,6 @@ import android.util.Log
|
||||
import androidx.annotation.RequiresApi
|
||||
import androidx.core.content.pm.PackageInfoCompat
|
||||
import androidx.core.graphics.drawable.toBitmap
|
||||
import com.aurora.extensions.getInstallerPackageNameCompat
|
||||
import com.aurora.extensions.isOAndAbove
|
||||
import com.aurora.extensions.isPAndAbove
|
||||
import com.aurora.extensions.isTAndAbove
|
||||
@@ -221,86 +220,6 @@ object PackageUtil {
|
||||
}
|
||||
}
|
||||
|
||||
fun getPackageInfoMap(context: Context): MutableMap<String, PackageInfo> {
|
||||
val packageInfoSet: MutableMap<String, PackageInfo> = mutableMapOf()
|
||||
val packageManager: PackageManager = context.packageManager
|
||||
val flags: Int = PackageManager.GET_META_DATA
|
||||
var packageInfoList: List<PackageInfo> = packageManager.getInstalledPackages(flags)
|
||||
|
||||
val isGoogleFilterEnabled = Preferences.getBoolean(
|
||||
context,
|
||||
Preferences.PREFERENCE_FILTER_GOOGLE
|
||||
)
|
||||
|
||||
val isAuroraOnlyUpdateEnabled = Preferences.getBoolean(
|
||||
context,
|
||||
Preferences.PREFERENCE_FILTER_AURORA_ONLY,
|
||||
false
|
||||
)
|
||||
|
||||
val isFDroidFilterEnabled = Preferences.getBoolean(
|
||||
context,
|
||||
Preferences.PREFERENCE_FILTER_FDROID
|
||||
)
|
||||
|
||||
val isExtendedUpdateEnabled = Preferences.getBoolean(
|
||||
context,
|
||||
Preferences.PREFERENCE_UPDATES_EXTENDED
|
||||
)
|
||||
|
||||
packageInfoList = packageInfoList.filter { it.isValidApp(packageManager) }
|
||||
|
||||
/*Filter google apps*/
|
||||
if (isGoogleFilterEnabled) {
|
||||
packageInfoList = packageInfoList
|
||||
.filter {
|
||||
!listOf(
|
||||
"com.chrome.beta",
|
||||
"com.chrome.canary",
|
||||
"com.chrome.dev",
|
||||
"com.android.chrome",
|
||||
"com.niksoftware.snapseed",
|
||||
"com.google.toontastic",
|
||||
).contains(it.packageName)
|
||||
}.filter {
|
||||
!it.packageName.contains("com.google")
|
||||
}
|
||||
}
|
||||
|
||||
/*Select only Aurora STore installed apps*/
|
||||
if (isAuroraOnlyUpdateEnabled) {
|
||||
packageInfoList = packageInfoList
|
||||
.filter {
|
||||
val packageInstaller =
|
||||
packageManager.getInstallerPackageNameCompat(it.packageName)
|
||||
listOf(
|
||||
"com.aurora.store",
|
||||
"com.aurora.store.debug",
|
||||
"com.aurora.store.nightly",
|
||||
"com.aurora.services"
|
||||
).contains(packageInstaller)
|
||||
}
|
||||
}
|
||||
|
||||
if (!isExtendedUpdateEnabled) {
|
||||
packageInfoList = packageInfoList.filter { it.applicationInfo!!.enabled }
|
||||
}
|
||||
|
||||
/*Filter F-Droid apps*/
|
||||
if (isFDroidFilterEnabled) {
|
||||
packageInfoList = packageInfoList.filter {
|
||||
!CertUtil.isFDroidApp(context, it.packageName)
|
||||
}
|
||||
}
|
||||
|
||||
packageInfoList.forEach {
|
||||
packageInfoSet[it.packageName] = it
|
||||
}
|
||||
|
||||
return packageInfoSet
|
||||
}
|
||||
|
||||
|
||||
fun getFilter(): IntentFilter {
|
||||
val filter = IntentFilter()
|
||||
filter.addDataScheme("package")
|
||||
|
||||
Reference in New Issue
Block a user