diff --git a/app/src/main/java/com/aurora/extensions/PackageManager.kt b/app/src/main/java/com/aurora/extensions/PackageManager.kt index 5242e5a32..913946e1f 100644 --- a/app/src/main/java/com/aurora/extensions/PackageManager.kt +++ b/app/src/main/java/com/aurora/extensions/PackageManager.kt @@ -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) } } diff --git a/app/src/main/java/com/aurora/store/data/work/UpdateWorker.kt b/app/src/main/java/com/aurora/store/data/work/UpdateWorker.kt index 71daffa04..50843c4be 100644 --- a/app/src/main/java/com/aurora/store/data/work/UpdateWorker.kt +++ b/app/src/main/java/com/aurora/store/data/work/UpdateWorker.kt @@ -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 { 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) } diff --git a/app/src/main/java/com/aurora/store/util/CertUtil.kt b/app/src/main/java/com/aurora/store/util/CertUtil.kt index 195d97fbf..73b78178f 100644 --- a/app/src/main/java/com/aurora/store/util/CertUtil.kt +++ b/app/src/main/java/com/aurora/store/util/CertUtil.kt @@ -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 { @@ -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) ) } diff --git a/app/src/main/java/com/aurora/store/util/PackageUtil.kt b/app/src/main/java/com/aurora/store/util/PackageUtil.kt index 6a6a712bf..9fbb3df84 100644 --- a/app/src/main/java/com/aurora/store/util/PackageUtil.kt +++ b/app/src/main/java/com/aurora/store/util/PackageUtil.kt @@ -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 { - val packageInfoSet: MutableMap = mutableMapOf() - val packageManager: PackageManager = context.packageManager - val flags: Int = PackageManager.GET_META_DATA - var packageInfoList: List = 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") diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 39cfc38a6..9ba4d7937 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -212,7 +212,7 @@ "Selected path is not writable" "Don't check updates for apps downloaded or installed from F-Droid" "Filter F-Droid apps" - "Don't check updates for Google apps" + "Don't check updates for apps developed by Google" "Filter Google apps" Downloaded APKs will be deleted immediately after installation "Delete APK post-install"