From 5612263e0456e185a6e4c0e9cd60a3dd1fe1af69 Mon Sep 17 00:00:00 2001 From: Aayush Gupta Date: Wed, 3 Apr 2024 21:23:00 +0530 Subject: [PATCH] data: installer: Localize installer information Signed-off-by: Aayush Gupta --- app/src/main/assets/installers.json | 27 ----------------- .../store/data/installer/AMInstaller.kt | 11 +++++++ .../store/data/installer/NativeInstaller.kt | 14 +++++++++ .../store/data/installer/RootInstaller.kt | 13 +++++++++ .../store/data/installer/ServiceInstaller.kt | 10 +++++++ .../store/data/installer/SessionInstaller.kt | 14 +++++++++ .../store/data/installer/ShizukuInstaller.kt | 10 +++++++ .../com/aurora/store/data/model/Installer.kt | 3 +- .../view/ui/onboarding/InstallerFragment.kt | 29 ++++++++++--------- app/src/main/res/values/strings.xml | 19 ++++++++++++ 10 files changed, 108 insertions(+), 42 deletions(-) delete mode 100755 app/src/main/assets/installers.json diff --git a/app/src/main/assets/installers.json b/app/src/main/assets/installers.json deleted file mode 100755 index d5b7468b5..000000000 --- a/app/src/main/assets/installers.json +++ /dev/null @@ -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+" - } -] diff --git a/app/src/main/java/com/aurora/store/data/installer/AMInstaller.kt b/app/src/main/java/com/aurora/store/data/installer/AMInstaller.kt index 4457595f3..4912f2f8e 100644 --- a/app/src/main/java/com/aurora/store/data/installer/AMInstaller.kt +++ b/app/src/main/java/com/aurora/store/data/installer/AMInstaller.kt @@ -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) { diff --git a/app/src/main/java/com/aurora/store/data/installer/NativeInstaller.kt b/app/src/main/java/com/aurora/store/data/installer/NativeInstaller.kt index 34c66c433..247ac27f4 100644 --- a/app/src/main/java/com/aurora/store/data/installer/NativeInstaller.kt +++ b/app/src/main/java/com/aurora/store/data/installer/NativeInstaller.kt @@ -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") diff --git a/app/src/main/java/com/aurora/store/data/installer/RootInstaller.kt b/app/src/main/java/com/aurora/store/data/installer/RootInstaller.kt index 969d8a111..81bbd25ec 100644 --- a/app/src/main/java/com/aurora/store/data/installer/RootInstaller.kt +++ b/app/src/main/java/com/aurora/store/data/installer/RootInstaller.kt @@ -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") diff --git a/app/src/main/java/com/aurora/store/data/installer/ServiceInstaller.kt b/app/src/main/java/com/aurora/store/data/installer/ServiceInstaller.kt index 7ea552d5a..db63fc1e9 100644 --- a/app/src/main/java/com/aurora/store/data/installer/ServiceInstaller.kt +++ b/app/src/main/java/com/aurora/store/data/installer/ServiceInstaller.kt @@ -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) { diff --git a/app/src/main/java/com/aurora/store/data/installer/SessionInstaller.kt b/app/src/main/java/com/aurora/store/data/installer/SessionInstaller.kt index a04b06400..e21fcbf58 100644 --- a/app/src/main/java/com/aurora/store/data/installer/SessionInstaller.kt +++ b/app/src/main/java/com/aurora/store/data/installer/SessionInstaller.kt @@ -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() + 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") diff --git a/app/src/main/java/com/aurora/store/data/installer/ShizukuInstaller.kt b/app/src/main/java/com/aurora/store/data/installer/ShizukuInstaller.kt index 27c0a8e54..4f3b6db9e 100644 --- a/app/src/main/java/com/aurora/store/data/installer/ShizukuInstaller.kt +++ b/app/src/main/java/com/aurora/store/data/installer/ShizukuInstaller.kt @@ -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) diff --git a/app/src/main/java/com/aurora/store/data/model/Installer.kt b/app/src/main/java/com/aurora/store/data/model/Installer.kt index 64105b826..402b9b2a6 100644 --- a/app/src/main/java/com/aurora/store/data/model/Installer.kt +++ b/app/src/main/java/com/aurora/store/data/model/Installer.kt @@ -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) { diff --git a/app/src/main/java/com/aurora/store/view/ui/onboarding/InstallerFragment.kt b/app/src/main/java/com/aurora/store/view/ui/onboarding/InstallerFragment.kt index cf0214dfc..52f438681 100644 --- a/app/src/main/java/com/aurora/store/view/ui/onboarding/InstallerFragment.kt +++ b/app/src/main/java/com/aurora/store/view/ui/onboarding/InstallerFragment.kt @@ -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 { - 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?>( - json, - object : TypeToken?>() {}.type + private fun getRecommendedInstallers(): List { + val installers = mutableListOf( + SessionInstaller.getInstallerInfo(requireContext()), + RootInstaller.getInstallerInfo(requireContext()), + AMInstaller.getInstallerInfo(requireContext()) ) + + if (isOAndAbove()) { + installers.add(ShizukuInstaller.getInstallerInfo(requireContext())) + } + + return installers } } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 3ff493933..ec1821c07 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -401,4 +401,23 @@ Failed to export APKs Manage Unsupported, please try associating links manually + + + Session based installer for bundled/split APKs + Recommended, in-built and supports all Android versions + + Shell based installer using root permissions + Requires root/superuser privileges, supports all Android versions. + + Intent based installer, available on all devices + Best suited for devices running below Android 4.4 + + Installer for background installations + Requires Aurora Services to be installed as a privileged-system app + + Full-featured open source package manager + Requires App Manager, need adb/root mode to install when miui optimization is on + + Using system APIs directly with adb/root privileges + Requires Shizuku or Sui, needs to be setup and permission granted