data: installer: Localize installer information
Signed-off-by: Aayush Gupta <aayushgupta219@gmail.com>
This commit is contained in:
@@ -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+"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
@@ -2,6 +2,8 @@ package com.aurora.store.data.installer
|
|||||||
|
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.content.Intent
|
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.data.room.download.Download
|
||||||
import com.aurora.store.util.Log
|
import com.aurora.store.util.Log
|
||||||
import com.aurora.store.util.PackageUtil.isSharedLibraryInstalled
|
import com.aurora.store.util.PackageUtil.isSharedLibraryInstalled
|
||||||
@@ -15,6 +17,15 @@ class AMInstaller(context: Context) : InstallerBase(context) {
|
|||||||
companion object {
|
companion object {
|
||||||
const val AM_PACKAGE_NAME = "io.github.muntashirakon.AppManager"
|
const val AM_PACKAGE_NAME = "io.github.muntashirakon.AppManager"
|
||||||
const val AM_DEBUG_PACKAGE_NAME = "io.github.muntashirakon.AppManager.debug"
|
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) {
|
override fun install(download: Download) {
|
||||||
|
|||||||
@@ -23,6 +23,8 @@ import android.content.Context
|
|||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
import android.net.Uri
|
import android.net.Uri
|
||||||
import android.os.Build
|
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.data.room.download.Download
|
||||||
import com.aurora.store.util.Log
|
import com.aurora.store.util.Log
|
||||||
import java.io.File
|
import java.io.File
|
||||||
@@ -30,6 +32,18 @@ import java.io.File
|
|||||||
@Deprecated("Deprecated in favour of SessionInstaller")
|
@Deprecated("Deprecated in favour of SessionInstaller")
|
||||||
class NativeInstaller(context: Context) : InstallerBase(context) {
|
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) {
|
override fun install(download: Download) {
|
||||||
if (isAlreadyQueued(download.packageName)) {
|
if (isAlreadyQueued(download.packageName)) {
|
||||||
Log.i("${download.packageName} already queued")
|
Log.i("${download.packageName} already queued")
|
||||||
|
|||||||
@@ -22,6 +22,7 @@ package com.aurora.store.data.installer
|
|||||||
import android.content.Context
|
import android.content.Context
|
||||||
import com.aurora.store.R
|
import com.aurora.store.R
|
||||||
import com.aurora.store.data.event.InstallerEvent
|
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.data.room.download.Download
|
||||||
import com.aurora.store.util.Log
|
import com.aurora.store.util.Log
|
||||||
import com.aurora.store.util.PackageUtil.isSharedLibraryInstalled
|
import com.aurora.store.util.PackageUtil.isSharedLibraryInstalled
|
||||||
@@ -31,6 +32,18 @@ import java.util.regex.Pattern
|
|||||||
|
|
||||||
class RootInstaller(context: Context) : InstallerBase(context) {
|
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) {
|
override fun install(download: Download) {
|
||||||
if (isAlreadyQueued(download.packageName)) {
|
if (isAlreadyQueued(download.packageName)) {
|
||||||
Log.i("${download.packageName} already queued")
|
Log.i("${download.packageName} already queued")
|
||||||
|
|||||||
@@ -37,6 +37,7 @@ import com.aurora.store.BuildConfig
|
|||||||
import com.aurora.store.R
|
import com.aurora.store.R
|
||||||
import com.aurora.store.data.event.BusEvent
|
import com.aurora.store.data.event.BusEvent
|
||||||
import com.aurora.store.data.event.InstallerEvent
|
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.data.room.download.Download
|
||||||
import com.aurora.store.util.Log
|
import com.aurora.store.util.Log
|
||||||
import com.aurora.store.util.PackageUtil
|
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 ACTION_INSTALL_REPLACE_EXISTING = 2
|
||||||
const val PRIVILEGED_EXTENSION_PACKAGE_NAME = "com.aurora.services"
|
const val PRIVILEGED_EXTENSION_PACKAGE_NAME = "com.aurora.services"
|
||||||
const val PRIVILEGED_EXTENSION_SERVICE_INTENT = "com.aurora.services.IPrivilegedService"
|
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) {
|
override fun install(download: Download) {
|
||||||
|
|||||||
@@ -35,6 +35,8 @@ import com.aurora.extensions.isSAndAbove
|
|||||||
import com.aurora.extensions.isTAndAbove
|
import com.aurora.extensions.isTAndAbove
|
||||||
import com.aurora.extensions.isUAndAbove
|
import com.aurora.extensions.isUAndAbove
|
||||||
import com.aurora.extensions.runOnUiThread
|
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.receiver.InstallerStatusReceiver
|
||||||
import com.aurora.store.data.room.download.Download
|
import com.aurora.store.data.room.download.Download
|
||||||
import com.aurora.store.util.Log
|
import com.aurora.store.util.Log
|
||||||
@@ -48,6 +50,18 @@ class SessionInstaller(context: Context) : InstallerBase(context) {
|
|||||||
private val packageInstaller = context.packageManager.packageInstaller
|
private val packageInstaller = context.packageManager.packageInstaller
|
||||||
private val sessionIdMap = mutableMapOf<Int, String>()
|
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) {
|
override fun install(download: Download) {
|
||||||
if (isAlreadyQueued(download.packageName)) {
|
if (isAlreadyQueued(download.packageName)) {
|
||||||
Log.i("${download.packageName} already queued")
|
Log.i("${download.packageName} already queued")
|
||||||
|
|||||||
@@ -31,6 +31,7 @@ import androidx.annotation.RequiresApi
|
|||||||
import com.aurora.extensions.isOAndAbove
|
import com.aurora.extensions.isOAndAbove
|
||||||
import com.aurora.extensions.isSAndAbove
|
import com.aurora.extensions.isSAndAbove
|
||||||
import com.aurora.store.R
|
import com.aurora.store.R
|
||||||
|
import com.aurora.store.data.model.Installer
|
||||||
import com.aurora.store.data.receiver.InstallerStatusReceiver
|
import com.aurora.store.data.receiver.InstallerStatusReceiver
|
||||||
import com.aurora.store.data.room.download.Download
|
import com.aurora.store.data.room.download.Download
|
||||||
import com.aurora.store.util.Log
|
import com.aurora.store.util.Log
|
||||||
@@ -44,6 +45,15 @@ class ShizukuInstaller(context: Context) : InstallerBase(context) {
|
|||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
const val SHIZUKU_PACKAGE_NAME = "moe.shizuku.privileged.api"
|
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)
|
// Taken from LSPatch (https://github.com/LSPosed/LSPatch)
|
||||||
|
|||||||
@@ -23,8 +23,7 @@ data class Installer(
|
|||||||
var id: Int,
|
var id: Int,
|
||||||
var title: String,
|
var title: String,
|
||||||
var subtitle: String,
|
var subtitle: String,
|
||||||
var description: String,
|
var description: String
|
||||||
var url: String
|
|
||||||
) {
|
) {
|
||||||
override fun equals(other: Any?): Boolean {
|
override fun equals(other: Any?): Boolean {
|
||||||
return when (other) {
|
return when (other) {
|
||||||
|
|||||||
@@ -28,10 +28,14 @@ import com.aurora.extensions.isMiuiOptimizationDisabled
|
|||||||
import com.aurora.extensions.isOAndAbove
|
import com.aurora.extensions.isOAndAbove
|
||||||
import com.aurora.extensions.showDialog
|
import com.aurora.extensions.showDialog
|
||||||
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.AppInstaller.Companion.hasAppManager
|
||||||
import com.aurora.store.data.installer.AppInstaller.Companion.hasRootAccess
|
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.hasShizukuOrSui
|
||||||
import com.aurora.store.data.installer.AppInstaller.Companion.hasShizukuPerm
|
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.data.model.Installer
|
||||||
import com.aurora.store.databinding.FragmentOnboardingInstallerBinding
|
import com.aurora.store.databinding.FragmentOnboardingInstallerBinding
|
||||||
import com.aurora.store.util.Log
|
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.util.save
|
||||||
import com.aurora.store.view.epoxy.views.preference.InstallerViewModel_
|
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.google.gson.reflect.TypeToken
|
|
||||||
import dagger.hilt.android.AndroidEntryPoint
|
import dagger.hilt.android.AndroidEntryPoint
|
||||||
import rikka.shizuku.Shizuku
|
import rikka.shizuku.Shizuku
|
||||||
import rikka.sui.Sui
|
import rikka.sui.Sui
|
||||||
import java.nio.charset.StandardCharsets
|
|
||||||
|
|
||||||
@AndroidEntryPoint
|
@AndroidEntryPoint
|
||||||
class InstallerFragment : BaseFragment(R.layout.fragment_onboarding_installer) {
|
class InstallerFragment : BaseFragment(R.layout.fragment_onboarding_installer) {
|
||||||
@@ -93,7 +95,7 @@ class InstallerFragment : BaseFragment(R.layout.fragment_onboarding_installer) {
|
|||||||
// RecyclerView
|
// RecyclerView
|
||||||
binding.epoxyRecycler.withModels {
|
binding.epoxyRecycler.withModels {
|
||||||
setFilterDuplicates(true)
|
setFilterDuplicates(true)
|
||||||
loadInstallersFromAssets().forEach {
|
getRecommendedInstallers().forEach {
|
||||||
add(
|
add(
|
||||||
InstallerViewModel_()
|
InstallerViewModel_()
|
||||||
.id(it.id)
|
.id(it.id)
|
||||||
@@ -188,17 +190,18 @@ class InstallerFragment : BaseFragment(R.layout.fragment_onboarding_installer) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun loadInstallersFromAssets(): List<Installer> {
|
private fun getRecommendedInstallers(): List<Installer> {
|
||||||
val inputStream = requireContext().assets.open("installers.json")
|
val installers = mutableListOf(
|
||||||
val bytes = ByteArray(inputStream.available())
|
SessionInstaller.getInstallerInfo(requireContext()),
|
||||||
inputStream.read(bytes)
|
RootInstaller.getInstallerInfo(requireContext()),
|
||||||
inputStream.close()
|
AMInstaller.getInstallerInfo(requireContext())
|
||||||
|
|
||||||
val json = String(bytes, StandardCharsets.UTF_8)
|
|
||||||
return gson.fromJson<MutableList<Installer>?>(
|
|
||||||
json,
|
|
||||||
object : TypeToken<MutableList<Installer?>?>() {}.type
|
|
||||||
)
|
)
|
||||||
|
|
||||||
|
if (isOAndAbove()) {
|
||||||
|
installers.add(ShizukuInstaller.getInstallerInfo(requireContext()))
|
||||||
|
}
|
||||||
|
|
||||||
|
return installers
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -401,4 +401,23 @@
|
|||||||
<string name="failed_apk_export">Failed to export APKs</string>
|
<string name="failed_apk_export">Failed to export APKs</string>
|
||||||
<string name="action_manage">Manage</string>
|
<string name="action_manage">Manage</string>
|
||||||
<string name="failed_app_link">Unsupported, please try associating links manually</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>
|
</resources>
|
||||||
|
|||||||
Reference in New Issue
Block a user