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.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)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -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
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user