Merge branch 'am_installer' into 'master'

Am installer

See merge request AuroraOSS/AuroraStore!139
This commit is contained in:
Rahul Patel
2021-12-18 17:12:31 +00:00
7 changed files with 134 additions and 0 deletions

View File

@@ -0,0 +1,75 @@
package com.aurora.store.data.installer
import android.content.Context
import android.content.Intent
import androidx.core.content.FileProvider
import com.aurora.store.util.Log
import java.io.*
import java.util.zip.ZipEntry
import java.util.zip.ZipOutputStream
class AMInstaller(context: Context) : InstallerBase(context) {
companion object {
const val AM_PACKAGE_NAME = "io.github.muntashirakon.AppManager"
const val AM_DEBUG_PACKAGE_NAME = "io.github.muntashirakon.AppManager.debug"
}
override fun install(packageName: String, files: List<Any>) {
if (isAlreadyQueued(packageName)) {
Log.i("$packageName already queued")
} else {
Log.i("Received AM install request for $packageName")
val fileList = files.map {
when (it) {
is File -> it.absolutePath
is String -> File(it).absolutePath
else -> {
throw Exception("Invalid data, expecting listOf() File or String")
}
}
}
when {
fileList.size == 1 -> {
xInstall(packageName, File(fileList.first()))
}
fileList.size > 1 -> {
val apks = zipFile(fileList)
xInstall(packageName, apks)
}
else -> {
throw Exception("Invalid data, expecting non empty fileList")
}
}
}
}
private fun xInstall(packageName: String, file: File) {
val intent: Intent = Intent(Intent.ACTION_VIEW)
intent.setDataAndType(
FileProvider.getUriForFile(
context,
context.applicationContext.packageName + ".fileProvider",
file
), "application/octet-stream"
);
intent.flags =
Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION or Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION
context.startActivity(intent)
}
@Suppress("RECEIVER_NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS")
private fun zipFile(files: List<String>): File {
val outPath = File(files.first()).parentFile.absolutePath + "/bundle.apks"
val out = ZipOutputStream(BufferedOutputStream(FileOutputStream(outPath)))
for (file in files) {
val fi = FileInputStream(file)
val origin = BufferedInputStream(fi)
val entry = ZipEntry(file.substring(file.lastIndexOf("/")))
out.putNextEntry(entry)
origin.copyTo(out, 1024)
origin.close()
}
out.close()
return File(outPath)
}
}

View File

@@ -77,6 +77,11 @@ open class AppInstaller private constructor(var context: Context) {
choiceAndInstaller[prefValue] = installer
installer
}
4 -> {
val installer = AMInstaller(context)
choiceAndInstaller[prefValue] = installer
installer
}
else -> if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
val installer = SessionInstaller(context)
choiceAndInstaller[prefValue] = installer

View File

@@ -28,6 +28,7 @@ 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.model.Installer
import com.aurora.store.databinding.FragmentOnboardingInstallerBinding
@@ -130,6 +131,17 @@ class InstallerFragment : BaseFragment() {
)
}
}
4 -> {
if (checkAMAvailability()) {
this.installerId = installerId
save(Preferences.PREFERENCE_INSTALLER_ID, installerId)
} else {
showDialog(
R.string.action_installations,
R.string.installer_am_unavailable
)
}
}
else -> {
this.installerId = installerId
save(PREFERENCE_INSTALLER_ID, installerId)
@@ -169,4 +181,14 @@ class InstallerFragment : BaseFragment() {
return isInstalled && isCorrectVersionInstalled
}
private fun checkAMAvailability(): Boolean {
return PackageUtil.isInstalled(
requireContext(),
AMInstaller.AM_PACKAGE_NAME
) or PackageUtil.isInstalled(
requireContext(),
AMInstaller.AM_DEBUG_PACKAGE_NAME
)
}
}

View File

@@ -28,6 +28,7 @@ import com.aurora.extensions.showDialog
import com.aurora.extensions.toast
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.util.CommonUtil
import com.aurora.store.util.PackageUtil
@@ -88,6 +89,17 @@ class InstallationPreference : PreferenceFragmentCompat() {
)
false
}
} else if (selectedId == 4) {
if (checkAMAvailability()) {
save(Preferences.PREFERENCE_INSTALLER_ID, selectedId)
true
} else {
showDialog(
R.string.action_installations,
R.string.installer_am_unavailable
)
false
}
} else {
save(Preferences.PREFERENCE_INSTALLER_ID, selectedId)
true
@@ -115,4 +127,14 @@ class InstallationPreference : PreferenceFragmentCompat() {
return isInstalled && isCorrectVersionInstalled
}
private fun checkAMAvailability(): Boolean {
return PackageUtil.isInstalled(
requireContext(),
AMInstaller.AM_PACKAGE_NAME
) or PackageUtil.isInstalled(
requireContext(),
AMInstaller.AM_DEBUG_PACKAGE_NAME
)
}
}