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
|
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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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]
|
|
||||||
if (packageInfo != null) {
|
|
||||||
it.versionCode.toLong() > PackageInfoCompat.getLongVersionCode(packageInfo)
|
|
||||||
} else {
|
} else {
|
||||||
false
|
packages
|
||||||
|
.filterNot { if (isFDroidFilterEnabled) CertUtil.isFDroidApp(appContext, it.packageName) else false }
|
||||||
|
.filterNot { if (isGoogleFilterEnabled) CertUtil.isGoogleApp(it.packageName) else 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) }
|
||||||
|
|
||||||
|
|||||||
@@ -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)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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")
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
Reference in New Issue
Block a user