From dbc12d7445a3fc0d9ea085efa8ea48003a0254bf Mon Sep 17 00:00:00 2001 From: Evengard Date: Wed, 31 May 2023 12:26:47 +0000 Subject: [PATCH] Implementing installation of dependent libraries before installing the main package --- app/build.gradle | 2 +- .../store/data/service/UpdateService.kt | 15 ++++++++++++ .../java/com/aurora/store/util/PackageUtil.kt | 24 +++++++++++++++++++ 3 files changed, 40 insertions(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 58179dc95..58c10ee2d 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -171,7 +171,7 @@ dependencies { implementation "com.github.topjohnwu.libsu:core:5.0.5" //Love <3 - implementation "com.gitlab.AuroraOSS:gplayapi:3.1.2" + implementation "com.gitlab.AuroraOSS:gplayapi:3.1.3" //Browser implementation 'androidx.browser:browser:1.5.0' diff --git a/app/src/main/java/com/aurora/store/data/service/UpdateService.kt b/app/src/main/java/com/aurora/store/data/service/UpdateService.kt index 6b316b4b3..70a664609 100644 --- a/app/src/main/java/com/aurora/store/data/service/UpdateService.kt +++ b/app/src/main/java/com/aurora/store/data/service/UpdateService.kt @@ -9,6 +9,7 @@ import androidx.core.content.ContextCompat import androidx.lifecycle.LifecycleService import androidx.lifecycle.MutableLiveData import com.aurora.Constants +import com.aurora.extensions.isOAndAbove import com.aurora.extensions.stackTraceToString import com.aurora.gplayapi.data.models.App import com.aurora.gplayapi.data.models.AuthData @@ -24,6 +25,7 @@ import com.aurora.store.data.model.UpdateFile import com.aurora.store.data.network.HttpClient import com.aurora.store.data.providers.AuthProvider import com.aurora.store.util.Log +import com.aurora.store.util.PackageUtil.isSharedLibraryInstalled import com.tonyodev.fetch2.* import com.tonyodev.fetch2core.DownloadBlock import com.tonyodev.fetch2core.FetchObserver @@ -481,6 +483,19 @@ class UpdateService: LifecycleService() { app.offerType ) + if (app.dependencies.dependentLibraries.isNotEmpty() && isOAndAbove()) { + app.dependencies.dependentLibraries.forEach { + if (!isSharedLibraryInstalled(this, it.packageName, it.versionCode)) { + updateApp(it, removeExisiting) + while (containsInInstalling(it.packageName) || + !isSharedLibraryInstalled(this, it.packageName, it.versionCode) + ) { + Thread.sleep(1000) + } + } + } + } + files.filter { it.url.isNotEmpty() } .map { RequestBuilder.buildRequest(this, app, it) } .toList() 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 ab6a6de37..8b8738de1 100644 --- a/app/src/main/java/com/aurora/store/util/PackageUtil.kt +++ b/app/src/main/java/com/aurora/store/util/PackageUtil.kt @@ -25,10 +25,13 @@ import android.content.IntentFilter import android.content.pm.PackageInfo import android.content.pm.PackageManager import android.content.pm.PackageManager.PackageInfoFlags +import android.content.pm.SharedLibraryInfo import android.content.res.Configuration import android.os.Build import androidx.core.content.pm.PackageInfoCompat +import com.aurora.extensions.isOAndAbove import com.aurora.extensions.isTAndAbove +import okhttp3.internal.immutableListOf object PackageUtil { @@ -51,6 +54,17 @@ object PackageUtil { } } + fun isSharedLibraryInstalled(context: Context, packageName: String, versionCode: Int): Boolean { + if (isOAndAbove()) { + val sharedLibraries = getAllSharedLibraries(context) + return sharedLibraries.any { + it.name == packageName && it.version == versionCode + } + } else { + return false + } + } + fun isUpdatable(context: Context, packageName: String, versionCode: Long): Boolean { return try { val packageInfo = getPackageInfo(context, packageName) @@ -106,6 +120,16 @@ object PackageUtil { } } + private fun getAllSharedLibraries(context: Context, flags: Int = 0): List { + return if (isTAndAbove()) { + context.packageManager.getSharedLibraries(PackageInfoFlags.of(flags.toLong())) + } else if (isOAndAbove()) { + context.packageManager.getSharedLibraries(flags) + } else { + emptyList() + } + } + fun getAllPackages(context: Context): List { val packageInfoSet: MutableList = mutableListOf() val packageManager: PackageManager = context.packageManager