data: installer: Localize installer information

Signed-off-by: Aayush Gupta <aayushgupta219@gmail.com>
This commit is contained in:
Aayush Gupta
2024-04-03 21:23:00 +05:30
parent f0fd8c6f73
commit 5612263e04
10 changed files with 108 additions and 42 deletions

View File

@@ -1,27 +0,0 @@
[
{
"id": "0",
"title": "Session installer",
"subtitle": "Session based installer for bundled/split APKs",
"description": "Recommended, in-built and supports all Android versions",
"url": "https://developer.android.com/reference/android/content/pm/PackageInstaller.Session"
},
{
"id": "2",
"title": "Root installer",
"subtitle": "Installer for background installations",
"description": "Requires root, supports all Android versions."
},
{
"id": "4",
"title": "AM Installer",
"subtitle": "Install using App Manager",
"description": "You must have App Manager. Need adb/root mode to install when miui optimization is on."
},
{
"id": "5",
"title": "Shizuku Installer",
"subtitle": "Install using Shizuku",
"description": "Requires an active Shizuku installation, supports Android 8.0+"
}
]

View File

@@ -2,6 +2,8 @@ package com.aurora.store.data.installer
import android.content.Context
import android.content.Intent
import com.aurora.store.R
import com.aurora.store.data.model.Installer
import com.aurora.store.data.room.download.Download
import com.aurora.store.util.Log
import com.aurora.store.util.PackageUtil.isSharedLibraryInstalled
@@ -15,6 +17,15 @@ 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"
fun getInstallerInfo(context: Context): Installer {
return Installer(
id = 4,
title = context.getString(R.string.pref_install_mode_am),
subtitle = context.getString(R.string.am_installer_subtitle),
description = context.getString(R.string.am_installer_desc)
)
}
}
override fun install(download: Download) {

View File

@@ -23,6 +23,8 @@ import android.content.Context
import android.content.Intent
import android.net.Uri
import android.os.Build
import com.aurora.store.R
import com.aurora.store.data.model.Installer
import com.aurora.store.data.room.download.Download
import com.aurora.store.util.Log
import java.io.File
@@ -30,6 +32,18 @@ import java.io.File
@Deprecated("Deprecated in favour of SessionInstaller")
class NativeInstaller(context: Context) : InstallerBase(context) {
companion object {
fun getInstallerInfo(context: Context): Installer {
return Installer(
id = 1,
title = context.getString(R.string.pref_install_mode_native),
subtitle = context.getString(R.string.native_installer_subtitle),
description = context.getString(R.string.native_installer_desc)
)
}
}
override fun install(download: Download) {
if (isAlreadyQueued(download.packageName)) {
Log.i("${download.packageName} already queued")

View File

@@ -22,6 +22,7 @@ package com.aurora.store.data.installer
import android.content.Context
import com.aurora.store.R
import com.aurora.store.data.event.InstallerEvent
import com.aurora.store.data.model.Installer
import com.aurora.store.data.room.download.Download
import com.aurora.store.util.Log
import com.aurora.store.util.PackageUtil.isSharedLibraryInstalled
@@ -31,6 +32,18 @@ import java.util.regex.Pattern
class RootInstaller(context: Context) : InstallerBase(context) {
companion object {
fun getInstallerInfo(context: Context): Installer {
return Installer(
id = 2,
title = context.getString(R.string.pref_install_mode_root),
subtitle = context.getString(R.string.root_installer_subtitle),
description = context.getString(R.string.root_installer_desc)
)
}
}
override fun install(download: Download) {
if (isAlreadyQueued(download.packageName)) {
Log.i("${download.packageName} already queued")

View File

@@ -37,6 +37,7 @@ import com.aurora.store.BuildConfig
import com.aurora.store.R
import com.aurora.store.data.event.BusEvent
import com.aurora.store.data.event.InstallerEvent
import com.aurora.store.data.model.Installer
import com.aurora.store.data.room.download.Download
import com.aurora.store.util.Log
import com.aurora.store.util.PackageUtil
@@ -57,6 +58,15 @@ class ServiceInstaller(context: Context) : InstallerBase(context) {
const val ACTION_INSTALL_REPLACE_EXISTING = 2
const val PRIVILEGED_EXTENSION_PACKAGE_NAME = "com.aurora.services"
const val PRIVILEGED_EXTENSION_SERVICE_INTENT = "com.aurora.services.IPrivilegedService"
fun getInstallerInfo(context: Context): Installer {
return Installer(
id = 3,
title = context.getString(R.string.pref_install_mode_services),
subtitle = context.getString(R.string.services_installer_subtitle),
description = context.getString(R.string.services_installer_desc)
)
}
}
override fun install(download: Download) {

View File

@@ -35,6 +35,8 @@ import com.aurora.extensions.isSAndAbove
import com.aurora.extensions.isTAndAbove
import com.aurora.extensions.isUAndAbove
import com.aurora.extensions.runOnUiThread
import com.aurora.store.R
import com.aurora.store.data.model.Installer
import com.aurora.store.data.receiver.InstallerStatusReceiver
import com.aurora.store.data.room.download.Download
import com.aurora.store.util.Log
@@ -48,6 +50,18 @@ class SessionInstaller(context: Context) : InstallerBase(context) {
private val packageInstaller = context.packageManager.packageInstaller
private val sessionIdMap = mutableMapOf<Int, String>()
companion object {
fun getInstallerInfo(context: Context): Installer {
return Installer(
id = 0,
title = context.getString(R.string.pref_install_mode_session),
subtitle = context.getString(R.string.session_installer_subtitle),
description = context.getString(R.string.session_installer_desc)
)
}
}
override fun install(download: Download) {
if (isAlreadyQueued(download.packageName)) {
Log.i("${download.packageName} already queued")

View File

@@ -31,6 +31,7 @@ import androidx.annotation.RequiresApi
import com.aurora.extensions.isOAndAbove
import com.aurora.extensions.isSAndAbove
import com.aurora.store.R
import com.aurora.store.data.model.Installer
import com.aurora.store.data.receiver.InstallerStatusReceiver
import com.aurora.store.data.room.download.Download
import com.aurora.store.util.Log
@@ -44,6 +45,15 @@ class ShizukuInstaller(context: Context) : InstallerBase(context) {
companion object {
const val SHIZUKU_PACKAGE_NAME = "moe.shizuku.privileged.api"
fun getInstallerInfo(context: Context): Installer {
return Installer(
id = 5,
title = context.getString(R.string.pref_install_mode_shizuku),
subtitle = context.getString(R.string.shizuku_installer_subtitle),
description = context.getString(R.string.shizuku_installer_desc)
)
}
}
// Taken from LSPatch (https://github.com/LSPosed/LSPatch)

View File

@@ -23,8 +23,7 @@ data class Installer(
var id: Int,
var title: String,
var subtitle: String,
var description: String,
var url: String
var description: String
) {
override fun equals(other: Any?): Boolean {
return when (other) {

View File

@@ -28,10 +28,14 @@ import com.aurora.extensions.isMiuiOptimizationDisabled
import com.aurora.extensions.isOAndAbove
import com.aurora.extensions.showDialog
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.AppInstaller.Companion.hasRootAccess
import com.aurora.store.data.installer.AppInstaller.Companion.hasShizukuOrSui
import com.aurora.store.data.installer.AppInstaller.Companion.hasShizukuPerm
import com.aurora.store.data.installer.RootInstaller
import com.aurora.store.data.installer.SessionInstaller
import com.aurora.store.data.installer.ShizukuInstaller
import com.aurora.store.data.model.Installer
import com.aurora.store.databinding.FragmentOnboardingInstallerBinding
import com.aurora.store.util.Log
@@ -40,11 +44,9 @@ import com.aurora.store.util.Preferences.PREFERENCE_INSTALLER_ID
import com.aurora.store.util.save
import com.aurora.store.view.epoxy.views.preference.InstallerViewModel_
import com.aurora.store.view.ui.commons.BaseFragment
import com.google.gson.reflect.TypeToken
import dagger.hilt.android.AndroidEntryPoint
import rikka.shizuku.Shizuku
import rikka.sui.Sui
import java.nio.charset.StandardCharsets
@AndroidEntryPoint
class InstallerFragment : BaseFragment(R.layout.fragment_onboarding_installer) {
@@ -93,7 +95,7 @@ class InstallerFragment : BaseFragment(R.layout.fragment_onboarding_installer) {
// RecyclerView
binding.epoxyRecycler.withModels {
setFilterDuplicates(true)
loadInstallersFromAssets().forEach {
getRecommendedInstallers().forEach {
add(
InstallerViewModel_()
.id(it.id)
@@ -188,17 +190,18 @@ class InstallerFragment : BaseFragment(R.layout.fragment_onboarding_installer) {
}
}
private fun loadInstallersFromAssets(): List<Installer> {
val inputStream = requireContext().assets.open("installers.json")
val bytes = ByteArray(inputStream.available())
inputStream.read(bytes)
inputStream.close()
val json = String(bytes, StandardCharsets.UTF_8)
return gson.fromJson<MutableList<Installer>?>(
json,
object : TypeToken<MutableList<Installer?>?>() {}.type
private fun getRecommendedInstallers(): List<Installer> {
val installers = mutableListOf(
SessionInstaller.getInstallerInfo(requireContext()),
RootInstaller.getInstallerInfo(requireContext()),
AMInstaller.getInstallerInfo(requireContext())
)
if (isOAndAbove()) {
installers.add(ShizukuInstaller.getInstallerInfo(requireContext()))
}
return installers
}
}

View File

@@ -401,4 +401,23 @@
<string name="failed_apk_export">Failed to export APKs</string>
<string name="action_manage">Manage</string>
<string name="failed_app_link">Unsupported, please try associating links manually</string>
<!-- InstallerFragment -->
<string name="session_installer_subtitle">Session based installer for bundled/split APKs</string>
<string name="session_installer_desc">Recommended, in-built and supports all Android versions</string>
<string name="root_installer_subtitle">Shell based installer using root permissions</string>
<string name="root_installer_desc">Requires root/superuser privileges, supports all Android versions.</string>
<string name="native_installer_subtitle">Intent based installer, available on all devices</string>
<string name="native_installer_desc">Best suited for devices running below Android 4.4</string>
<string name="services_installer_subtitle">Installer for background installations</string>
<string name="services_installer_desc">Requires Aurora Services to be installed as a privileged-system app</string>
<string name="am_installer_subtitle">Full-featured open source package manager</string>
<string name="am_installer_desc">Requires App Manager, need adb/root mode to install when miui optimization is on</string>
<string name="shizuku_installer_subtitle">Using system APIs directly with adb/root privileges</string>
<string name="shizuku_installer_desc">Requires Shizuku or Sui, needs to be setup and permission granted</string>
</resources>