Add fallback for external installers
Signed-off-by: Aayush Gupta <aayushgupta219@gmail.com>
This commit is contained in:
@@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user