UpdateWorker: Merge and simplify logic for checking updates

Signed-off-by: Aayush Gupta <aayushgupta219@gmail.com>
This commit is contained in:
Aayush Gupta
2024-11-21 13:18:38 +07:00
parent bc3e1b0d1b
commit 277198762b
5 changed files with 64 additions and 117 deletions

View File

@@ -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)
}
}

View File

@@ -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) }

View File

@@ -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)
)
}

View File

@@ -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")

View File

@@ -212,7 +212,7 @@
<string name="pref_download_directory_error">"Selected path is not writable"</string>
<string name="pref_filter_fdroid_summary">"Don't check updates for apps downloaded or installed from F-Droid"</string>
<string name="pref_filter_fdroid_title">"Filter F-Droid apps"</string>
<string name="pref_filter_google_summary">"Don't check updates for Google apps"</string>
<string name="pref_filter_google_summary">"Don't check updates for apps developed by Google"</string>
<string name="pref_filter_google_title">"Filter Google apps"</string>
<string name="pref_install_delete_summary">Downloaded APKs will be deleted immediately after installation</string>
<string name="pref_install_delete_title">"Delete APK post-install"</string>