Add fallback for external installers

Signed-off-by: Aayush Gupta <aayushgupta219@gmail.com>
This commit is contained in:
Aayush Gupta
2023-05-19 00:35:45 +05:30
parent 28a6758087
commit 40eae4da75
2 changed files with 60 additions and 47 deletions

View File

@@ -21,10 +21,13 @@ package com.aurora.store.data.installer
import android.content.Context
import android.content.pm.PackageInstaller
import android.os.Build
import com.aurora.extensions.isLAndAbove
import com.aurora.store.BuildConfig
import com.aurora.store.R
import com.aurora.store.util.PackageUtil
import com.aurora.store.util.Preferences
import com.aurora.store.util.Preferences.PREFERENCE_INSTALLER_ID
import com.topjohnwu.superuser.Shell
open class AppInstaller private constructor(var context: Context) {
@@ -47,6 +50,31 @@ open class AppInstaller private constructor(var context: Context) {
}
return instance!!
}
fun hasRootAccess(): Boolean {
return Shell.getShell().isRoot
}
fun hasAuroraService(context: Context): Boolean {
val isInstalled = PackageUtil.isInstalled(
context,
ServiceInstaller.PRIVILEGED_EXTENSION_PACKAGE_NAME
)
val isCorrectVersionInstalled =
PackageUtil.isInstalled(
context,
ServiceInstaller.PRIVILEGED_EXTENSION_PACKAGE_NAME,
if (BuildConfig.VERSION_CODE < 31) 8 else 9
)
return isInstalled && isCorrectVersionInstalled
}
fun hasAppManager(context: Context): Boolean {
return PackageUtil.isInstalled(context, AMInstaller.AM_PACKAGE_NAME) or
PackageUtil.isInstalled(context, AMInstaller.AM_DEBUG_PACKAGE_NAME)
}
}
val choiceAndInstaller = HashMap<Int, IInstaller>()
@@ -68,29 +96,45 @@ open class AppInstaller private constructor(var context: Context) {
installer
}
2 -> {
val installer = RootInstaller(context)
val installer = if (hasRootAccess()) {
RootInstaller(context)
} else {
getDefaultInstaller(context)
}
choiceAndInstaller[prefValue] = installer
installer
}
3 -> {
val installer = ServiceInstaller(context)
val installer = if (hasAuroraService(context)) {
ServiceInstaller(context)
} else {
getDefaultInstaller(context)
}
choiceAndInstaller[prefValue] = installer
installer
}
4 -> {
val installer = AMInstaller(context)
val installer = if (hasAppManager(context)) {
AMInstaller(context)
} else {
getDefaultInstaller(context)
}
choiceAndInstaller[prefValue] = installer
installer
}
else -> if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
val installer = SessionInstaller(context)
choiceAndInstaller[prefValue] = installer
installer
} else {
val installer = NativeInstaller(context)
else -> {
val installer = getDefaultInstaller(context)
choiceAndInstaller[prefValue] = installer
installer
}
}
}
private fun getDefaultInstaller(context: Context): InstallerBase {
return if (isLAndAbove()) {
SessionInstaller(context)
} else {
NativeInstaller(context)
}
}
}

View File

@@ -26,13 +26,12 @@ import android.view.ViewGroup
import com.aurora.extensions.isMIUI
import com.aurora.extensions.isMiuiOptimizationDisabled
import com.aurora.extensions.showDialog
import com.aurora.store.BuildConfig
import com.aurora.store.R
import com.aurora.store.data.installer.AMInstaller
import com.aurora.store.data.installer.ServiceInstaller
import com.aurora.store.data.installer.AppInstaller.Companion.hasAppManager
import com.aurora.store.data.installer.AppInstaller.Companion.hasRootAccess
import com.aurora.store.data.installer.AppInstaller.Companion.hasAuroraService
import com.aurora.store.data.model.Installer
import com.aurora.store.databinding.FragmentOnboardingInstallerBinding
import com.aurora.store.util.PackageUtil
import com.aurora.store.util.Preferences
import com.aurora.store.util.Preferences.PREFERENCE_INSTALLER_ID
import com.aurora.store.util.save
@@ -40,7 +39,6 @@ import com.aurora.store.view.epoxy.views.preference.InstallerViewModel_
import com.aurora.store.view.ui.commons.BaseFragment
import com.aurora.store.view.ui.sheets.DeviceMiuiSheet
import com.google.gson.reflect.TypeToken
import com.topjohnwu.superuser.Shell
import java.nio.charset.StandardCharsets
@@ -110,7 +108,7 @@ class InstallerFragment : BaseFragment() {
save(PREFERENCE_INSTALLER_ID, installerId)
}
2 -> {
if (checkRootAvailability()) {
if (hasRootAccess()) {
this.installerId = installerId
save(PREFERENCE_INSTALLER_ID, installerId)
} else {
@@ -121,7 +119,7 @@ class InstallerFragment : BaseFragment() {
}
}
3 -> {
if (checkServicesAvailability()) {
if (hasAuroraService(requireContext())) {
this.installerId = installerId
save(PREFERENCE_INSTALLER_ID, installerId)
} else {
@@ -132,7 +130,7 @@ class InstallerFragment : BaseFragment() {
}
}
4 -> {
if (checkAMAvailability()) {
if (hasAppManager(requireContext())) {
this.installerId = installerId
save(Preferences.PREFERENCE_INSTALLER_ID, installerId)
} else {
@@ -162,33 +160,4 @@ class InstallerFragment : BaseFragment() {
)
}
private fun checkRootAvailability(): Boolean {
return Shell.getShell().isRoot
}
private fun checkServicesAvailability(): Boolean {
val isInstalled = PackageUtil.isInstalled(
requireContext(),
ServiceInstaller.PRIVILEGED_EXTENSION_PACKAGE_NAME
)
val isCorrectVersionInstalled =
PackageUtil.isInstalled(
requireContext(),
ServiceInstaller.PRIVILEGED_EXTENSION_PACKAGE_NAME,
if (BuildConfig.VERSION_CODE < 31) 8 else 9
)
return isInstalled && isCorrectVersionInstalled
}
private fun checkAMAvailability(): Boolean {
return PackageUtil.isInstalled(
requireContext(),
AMInstaller.AM_PACKAGE_NAME
) or PackageUtil.isInstalled(
requireContext(),
AMInstaller.AM_DEBUG_PACKAGE_NAME
)
}
}