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.Context
import android.content.pm.PackageInstaller 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.R
import com.aurora.store.util.PackageUtil
import com.aurora.store.util.Preferences import com.aurora.store.util.Preferences
import com.aurora.store.util.Preferences.PREFERENCE_INSTALLER_ID import com.aurora.store.util.Preferences.PREFERENCE_INSTALLER_ID
import com.topjohnwu.superuser.Shell
open class AppInstaller private constructor(var context: Context) { open class AppInstaller private constructor(var context: Context) {
@@ -47,6 +50,31 @@ open class AppInstaller private constructor(var context: Context) {
} }
return instance!! 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>() val choiceAndInstaller = HashMap<Int, IInstaller>()
@@ -68,29 +96,45 @@ open class AppInstaller private constructor(var context: Context) {
installer installer
} }
2 -> { 2 -> {
val installer = RootInstaller(context) val installer = if (hasRootAccess()) {
RootInstaller(context)
} else {
getDefaultInstaller(context)
}
choiceAndInstaller[prefValue] = installer choiceAndInstaller[prefValue] = installer
installer installer
} }
3 -> { 3 -> {
val installer = ServiceInstaller(context) val installer = if (hasAuroraService(context)) {
ServiceInstaller(context)
} else {
getDefaultInstaller(context)
}
choiceAndInstaller[prefValue] = installer choiceAndInstaller[prefValue] = installer
installer installer
} }
4 -> { 4 -> {
val installer = AMInstaller(context) val installer = if (hasAppManager(context)) {
AMInstaller(context)
} else {
getDefaultInstaller(context)
}
choiceAndInstaller[prefValue] = installer choiceAndInstaller[prefValue] = installer
installer installer
} }
else -> if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { else -> {
val installer = SessionInstaller(context) val installer = getDefaultInstaller(context)
choiceAndInstaller[prefValue] = installer
installer
} else {
val installer = NativeInstaller(context)
choiceAndInstaller[prefValue] = installer choiceAndInstaller[prefValue] = installer
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.isMIUI
import com.aurora.extensions.isMiuiOptimizationDisabled import com.aurora.extensions.isMiuiOptimizationDisabled
import com.aurora.extensions.showDialog import com.aurora.extensions.showDialog
import com.aurora.store.BuildConfig
import com.aurora.store.R import com.aurora.store.R
import com.aurora.store.data.installer.AMInstaller import com.aurora.store.data.installer.AppInstaller.Companion.hasAppManager
import com.aurora.store.data.installer.ServiceInstaller 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.data.model.Installer
import com.aurora.store.databinding.FragmentOnboardingInstallerBinding import com.aurora.store.databinding.FragmentOnboardingInstallerBinding
import com.aurora.store.util.PackageUtil
import com.aurora.store.util.Preferences import com.aurora.store.util.Preferences
import com.aurora.store.util.Preferences.PREFERENCE_INSTALLER_ID import com.aurora.store.util.Preferences.PREFERENCE_INSTALLER_ID
import com.aurora.store.util.save 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.commons.BaseFragment
import com.aurora.store.view.ui.sheets.DeviceMiuiSheet import com.aurora.store.view.ui.sheets.DeviceMiuiSheet
import com.google.gson.reflect.TypeToken import com.google.gson.reflect.TypeToken
import com.topjohnwu.superuser.Shell
import java.nio.charset.StandardCharsets import java.nio.charset.StandardCharsets
@@ -110,7 +108,7 @@ class InstallerFragment : BaseFragment() {
save(PREFERENCE_INSTALLER_ID, installerId) save(PREFERENCE_INSTALLER_ID, installerId)
} }
2 -> { 2 -> {
if (checkRootAvailability()) { if (hasRootAccess()) {
this.installerId = installerId this.installerId = installerId
save(PREFERENCE_INSTALLER_ID, installerId) save(PREFERENCE_INSTALLER_ID, installerId)
} else { } else {
@@ -121,7 +119,7 @@ class InstallerFragment : BaseFragment() {
} }
} }
3 -> { 3 -> {
if (checkServicesAvailability()) { if (hasAuroraService(requireContext())) {
this.installerId = installerId this.installerId = installerId
save(PREFERENCE_INSTALLER_ID, installerId) save(PREFERENCE_INSTALLER_ID, installerId)
} else { } else {
@@ -132,7 +130,7 @@ class InstallerFragment : BaseFragment() {
} }
} }
4 -> { 4 -> {
if (checkAMAvailability()) { if (hasAppManager(requireContext())) {
this.installerId = installerId this.installerId = installerId
save(Preferences.PREFERENCE_INSTALLER_ID, installerId) save(Preferences.PREFERENCE_INSTALLER_ID, installerId)
} else { } 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
)
}
} }