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 package com.aurora.extensions
import android.content.pm.PackageManager import android.content.pm.PackageManager
import android.os.Build
import androidx.annotation.RequiresApi
import com.aurora.store.BuildConfig import com.aurora.store.BuildConfig
fun PackageManager.getInstallerPackageNameCompat(packageName: String): String? { /**
return if (isRAndAbove) { * Gets the name of package responsible for installing/updating given package
getInstallSourceInfo(packageName).installingPackageName */
} else {
@Suppress("DEPRECATION")
return getInstallerPackageName(packageName)
}
}
@RequiresApi(Build.VERSION_CODES.S)
fun PackageManager.getUpdateOwnerPackageNameCompat(packageName: String): String? { fun PackageManager.getUpdateOwnerPackageNameCompat(packageName: String): String? {
// https://developer.android.com/reference/android/content/pm/PackageInstaller.SessionParams#setRequireUserAction(int) // Self-updates can be managed by ourselves
val installSourceInfo = getInstallSourceInfo(packageName) if (packageName == BuildConfig.APPLICATION_ID) return BuildConfig.APPLICATION_ID
return when { return when {
isUAndAbove -> { isUAndAbove -> {
// If update ownership is null, we can still silently update it if we installed it // If update ownership is null, we can still silently update it if we installed it
val installSourceInfo = getInstallSourceInfo(packageName)
installSourceInfo.updateOwnerPackageName ?: installSourceInfo.installingPackageName 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.content.Context
import android.util.Log import android.util.Log
import androidx.core.content.getSystemService import androidx.core.content.getSystemService
import androidx.core.content.pm.PackageInfoCompat
import androidx.hilt.work.HiltWorker import androidx.hilt.work.HiltWorker
import androidx.work.ForegroundInfo import androidx.work.ForegroundInfo
import androidx.work.WorkerParameters import androidx.work.WorkerParameters
@@ -73,6 +72,15 @@ class UpdateWorker @AssistedInject constructor(
!CertUtil.isAppGalleryApp(appContext, BuildConfig.APPLICATION_ID) && !CertUtil.isAppGalleryApp(appContext, BuildConfig.APPLICATION_ID) &&
buildType != BuildType.DEBUG 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 private val isExtendedUpdateEnabled: Boolean
get() = Preferences.getBoolean(appContext, Preferences.PREFERENCE_UPDATES_EXTENDED) get() = Preferences.getBoolean(appContext, Preferences.PREFERENCE_UPDATES_EXTENDED)
@@ -149,20 +157,23 @@ class UpdateWorker @AssistedInject constructor(
*/ */
private suspend fun checkUpdates(): List<Update> { private suspend fun checkUpdates(): List<Update> {
return withContext(Dispatchers.IO) { return withContext(Dispatchers.IO) {
val packageInfoMap = PackageUtil.getPackageInfoMap(appContext) val packages = PackageUtil.getAllValidPackages(appContext)
val updates = packageInfoMap.keys.let { packages -> .filterNot { blacklistProvider.isBlacklisted(it.packageName) }
val filteredPackages = packages.filter { !blacklistProvider.isBlacklisted(it) } .filter { if (!isExtendedUpdateEnabled) it.applicationInfo!!.enabled else true }
appDetailsHelper.getAppByPackageName(filteredPackages)
.filter { it.displayName.isNotEmpty() } // Filter out packages based on user's preferences
.map { it.isInstalled = true; it } val filteredPackages = if (isAuroraOnlyFilterEnabled) {
}.filter { packages.filter { CertUtil.isAuroraStoreApp(appContext, it.packageName) }
val packageInfo = packageInfoMap[it.packageName] } else {
if (packageInfo != null) { packages
it.versionCode.toLong() > PackageInfoCompat.getLongVersionCode(packageInfo) .filterNot { if (isFDroidFilterEnabled) CertUtil.isFDroidApp(appContext, it.packageName) else false }
} else { .filterNot { if (isGoogleFilterEnabled) CertUtil.isGoogleApp(it.packageName) else false }
false }
}
}.toMutableList() 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) } 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.Base64
import android.util.Log import android.util.Log
import com.aurora.extensions.generateX509Certificate import com.aurora.extensions.generateX509Certificate
import com.aurora.extensions.getInstallerPackageNameCompat import com.aurora.extensions.getUpdateOwnerPackageNameCompat
import com.aurora.extensions.isPAndAbove import com.aurora.extensions.isPAndAbove
import com.aurora.store.data.model.Algorithm import com.aurora.store.data.model.Algorithm
import com.aurora.store.util.PackageUtil.getPackageInfo import com.aurora.store.util.PackageUtil.getPackageInfo
@@ -41,8 +41,27 @@ object CertUtil {
} }
fun isAppGalleryApp(context: Context, packageName: String): Boolean { fun isAppGalleryApp(context: Context, packageName: String): Boolean {
val appGalleryPackageName = "com.huawei.appmarket" return context.packageManager.getUpdateOwnerPackageNameCompat(packageName) == "com.huawei.appmarket"
return context.packageManager.getInstallerPackageNameCompat(packageName) == appGalleryPackageName }
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> { fun getEncodedCertificateHashes(context: Context, packageName: String): List<String> {
@@ -81,7 +100,7 @@ object CertUtil {
"org.fdroid.basic", "org.fdroid.fdroid", "org.fdroid.fdroid.privileged" "org.fdroid.basic", "org.fdroid.fdroid", "org.fdroid.fdroid.privileged"
) )
return fdroidPackages.contains( 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.annotation.RequiresApi
import androidx.core.content.pm.PackageInfoCompat import androidx.core.content.pm.PackageInfoCompat
import androidx.core.graphics.drawable.toBitmap import androidx.core.graphics.drawable.toBitmap
import com.aurora.extensions.getInstallerPackageNameCompat
import com.aurora.extensions.isOAndAbove import com.aurora.extensions.isOAndAbove
import com.aurora.extensions.isPAndAbove import com.aurora.extensions.isPAndAbove
import com.aurora.extensions.isTAndAbove 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 { fun getFilter(): IntentFilter {
val filter = IntentFilter() val filter = IntentFilter()
filter.addDataScheme("package") filter.addDataScheme("package")

View File

@@ -212,7 +212,7 @@
<string name="pref_download_directory_error">"Selected path is not writable"</string> <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_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_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_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_summary">Downloaded APKs will be deleted immediately after installation</string>
<string name="pref_install_delete_title">"Delete APK post-install"</string> <string name="pref_install_delete_title">"Delete APK post-install"</string>