Merge branch 'am_installer' into 'master'
Am installer See merge request AuroraOSS/AuroraStore!139
This commit is contained in:
@@ -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)
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
)
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user