InstallerFragment: Relocate to settings instead of onboarding

* This makes onboarding minimal and only required screens are shown
* SessionInstaller is the recommended choice, user who needs a different can configure in settings
* Instead of showing minimal list, show installer fragment that contains more information
* Also show all installers like before

Signed-off-by: Aayush Gupta <aayushgupta219@gmail.com>
This commit is contained in:
Aayush Gupta
2024-05-08 15:44:15 +05:30
parent 72ae9f5ec0
commit 196f9d00c5
57 changed files with 81 additions and 282 deletions

View File

@@ -66,15 +66,14 @@ class OnboardingFragment : Fragment(R.layout.fragment_onboarding) {
override fun createFragment(position: Int): Fragment {
when (position) {
0 -> return WelcomeFragment()
1 -> return InstallerFragment()
2 -> return AppLinksFragment()
3 -> return PermissionsFragment()
1 -> return AppLinksFragment()
2 -> return PermissionsFragment()
}
return Fragment()
}
override fun getItemCount(): Int {
return 4
return 3
}
}
@@ -123,9 +122,9 @@ class OnboardingFragment : Fragment(R.layout.fragment_onboarding) {
fun refreshButtonState() {
binding.btnBackward.isEnabled = lastPosition != 0
binding.btnForward.isEnabled = lastPosition != 3
binding.btnForward.isEnabled = lastPosition != 2
if (lastPosition == 3) {
if (lastPosition == 2) {
binding.btnForward.text = getString(R.string.action_finish)
binding.btnForward.isEnabled = true
binding.btnForward.setOnClickListener {

View File

@@ -22,56 +22,45 @@ package com.aurora.store.view.ui.preferences
import android.app.admin.DevicePolicyManager
import android.content.Context
import android.content.DialogInterface
import android.content.pm.PackageManager
import android.os.Bundle
import android.view.View
import androidx.appcompat.widget.Toolbar
import androidx.navigation.fragment.findNavController
import androidx.preference.Preference
import com.aurora.extensions.isOAndAbove
import androidx.preference.PreferenceFragmentCompat
import com.aurora.extensions.runOnUiThread
import com.aurora.extensions.showDialog
import com.aurora.extensions.toast
import com.aurora.store.R
import com.aurora.store.data.installer.AppInstaller
import com.aurora.store.util.CommonUtil
import com.aurora.store.util.Log
import com.aurora.store.util.Preferences
import com.aurora.store.util.Preferences.INSTALLATION_ABANDON_SESSION
import com.aurora.store.util.Preferences.PREFERENCE_INSTALLATION_DEVICE_OWNER
import com.aurora.store.util.save
import com.aurora.store.view.custom.preference.AuroraListPreference
import com.aurora.store.util.Preferences.PREFERENCE_INSTALLER_ID
import dagger.hilt.android.AndroidEntryPoint
import rikka.shizuku.Shizuku
import rikka.sui.Sui
@AndroidEntryPoint
class InstallationPreference : BasePreferenceFragment() {
private var shizukuAlive = Sui.isSui()
private val shizukuAliveListener = Shizuku.OnBinderReceivedListener {
Log.d("ShizukuInstaller Alive!")
shizukuAlive = true
}
private val shizukuDeadListener = Shizuku.OnBinderDeadListener {
Log.d("ShizukuInstaller Dead!")
shizukuAlive = false
}
private val shizukuResultListener =
Shizuku.OnRequestPermissionResultListener { _: Int, result: Int ->
if (result == PackageManager.PERMISSION_GRANTED) {
save(Preferences.PREFERENCE_INSTALLER_ID, 5)
activity?.recreate()
} else {
showDialog(
R.string.action_installations,
R.string.installer_shizuku_unavailable
)
}
}
class InstallationPreference : PreferenceFragmentCompat() {
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
setPreferencesFromResource(R.xml.preferences_installation, rootKey)
findPreference<Preference>(PREFERENCE_INSTALLER_ID)?.apply {
setOnPreferenceClickListener {
findNavController().navigate(R.id.installerFragment)
true
}
}
findPreference<Preference>(INSTALLATION_ABANDON_SESSION)?.apply {
setOnPreferenceClickListener {
CommonUtil.cleanupInstallationSessions(requireContext())
runOnUiThread {
requireContext().toast(R.string.toast_abandon_sessions)
}
false
}
}
findPreference<Preference>(PREFERENCE_INSTALLATION_DEVICE_OWNER)?.apply {
val packageName = context.packageName
val devicePolicyManager =
@@ -101,103 +90,5 @@ class InstallationPreference : BasePreferenceFragment() {
title = getString(R.string.title_installation)
setNavigationOnClickListener { findNavController().navigateUp() }
}
if (isOAndAbove() && AppInstaller.hasShizukuOrSui(requireContext())) {
Shizuku.addBinderReceivedListenerSticky(shizukuAliveListener)
Shizuku.addBinderDeadListener(shizukuDeadListener)
Shizuku.addRequestPermissionResultListener(shizukuResultListener)
}
val abandonPreference: Preference? =
findPreference(Preferences.INSTALLATION_ABANDON_SESSION)
abandonPreference?.let {
it.onPreferenceClickListener =
Preference.OnPreferenceClickListener {
CommonUtil.cleanupInstallationSessions(requireContext())
runOnUiThread {
requireContext().toast(R.string.toast_abandon_sessions)
}
false
}
}
val installerPreference: AuroraListPreference? =
findPreference(Preferences.PREFERENCE_INSTALLER_ID)
installerPreference?.let {
it.onPreferenceChangeListener =
Preference.OnPreferenceChangeListener { _, newValue ->
val selectedId = Integer.parseInt(newValue as String)
if (selectedId == 2) {
if (AppInstaller.hasRootAccess()) {
save(Preferences.PREFERENCE_INSTALLER_ID, selectedId)
true
} else {
showDialog(
R.string.action_installations,
R.string.installer_root_unavailable
)
false
}
} else if (selectedId == 3) {
if (AppInstaller.hasAuroraService(requireContext())) {
save(Preferences.PREFERENCE_INSTALLER_ID, selectedId)
true
} else {
showDialog(
R.string.action_installations,
R.string.installer_service_unavailable
)
false
}
} else if (selectedId == 4) {
if (AppInstaller.hasAppManager(requireContext())) {
save(Preferences.PREFERENCE_INSTALLER_ID, selectedId)
true
} else {
showDialog(
R.string.action_installations,
R.string.installer_am_unavailable
)
false
}
} else if (selectedId == 5) {
if (isOAndAbove() && AppInstaller.hasShizukuOrSui(requireContext())) {
if (shizukuAlive && AppInstaller.hasShizukuPerm()) {
save(Preferences.PREFERENCE_INSTALLER_ID, selectedId)
true
} else if (shizukuAlive && !Shizuku.shouldShowRequestPermissionRationale()) {
Shizuku.requestPermission(9000)
false
} else {
showDialog(
R.string.action_installations,
R.string.installer_shizuku_unavailable
)
false
}
} else {
showDialog(
R.string.action_installations,
R.string.installer_shizuku_unavailable
)
false
}
} else {
save(Preferences.PREFERENCE_INSTALLER_ID, selectedId)
true
}
}
}
}
override fun onDestroy() {
if (isOAndAbove() && AppInstaller.hasShizukuOrSui(requireContext())) {
Shizuku.removeBinderReceivedListener(shizukuAliveListener)
Shizuku.removeBinderDeadListener(shizukuDeadListener)
Shizuku.removeRequestPermissionResultListener(shizukuResultListener)
}
super.onDestroy()
}
}

View File

@@ -17,7 +17,7 @@
*
*/
package com.aurora.store.view.ui.onboarding
package com.aurora.store.view.ui.preferences
import android.content.pm.PackageManager
import android.os.Bundle
@@ -29,15 +29,14 @@ 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.AppInstaller
import com.aurora.store.data.installer.NativeInstaller
import com.aurora.store.data.installer.RootInstaller
import com.aurora.store.data.installer.ServiceInstaller
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.databinding.FragmentInstallerBinding
import com.aurora.store.util.Log
import com.aurora.store.util.Preferences
import com.aurora.store.util.Preferences.PREFERENCE_INSTALLER_ID
@@ -49,9 +48,9 @@ import rikka.shizuku.Shizuku
import rikka.sui.Sui
@AndroidEntryPoint
class InstallerFragment : BaseFragment(R.layout.fragment_onboarding_installer) {
class InstallerFragment : BaseFragment(R.layout.fragment_installer) {
private var _binding: FragmentOnboardingInstallerBinding? = null
private var _binding: FragmentInstallerBinding? = null
private val binding get() = _binding!!
private var installerId: Int = 0
@@ -82,11 +81,14 @@ class InstallerFragment : BaseFragment(R.layout.fragment_onboarding_installer) {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
_binding = FragmentOnboardingInstallerBinding.bind(view)
_binding = FragmentInstallerBinding.bind(view)
// Toolbar
binding.toolbar.setNavigationOnClickListener { findNavController().navigateUp() }
installerId = Preferences.getInteger(requireContext(), PREFERENCE_INSTALLER_ID)
if (isOAndAbove() && hasShizukuOrSui(requireContext())) {
if (isOAndAbove() && AppInstaller.hasShizukuOrSui(requireContext())) {
Shizuku.addBinderReceivedListenerSticky(shizukuAliveListener)
Shizuku.addBinderDeadListener(shizukuDeadListener)
Shizuku.addRequestPermissionResultListener(shizukuResultListener)
@@ -95,7 +97,7 @@ class InstallerFragment : BaseFragment(R.layout.fragment_onboarding_installer) {
// RecyclerView
binding.epoxyRecycler.withModels {
setFilterDuplicates(true)
getRecommendedInstallers().forEach {
getInstallers().forEach {
add(
InstallerViewModel_()
.id(it.id)
@@ -110,9 +112,7 @@ class InstallerFragment : BaseFragment(R.layout.fragment_onboarding_installer) {
}
if (isMIUI() && !isMiuiOptimizationDisabled()) {
findNavController().navigate(
OnboardingFragmentDirections.actionOnboardingFragmentToDeviceMiuiSheet()
)
findNavController().navigate(R.id.deviceMiuiSheet)
}
}
@@ -122,7 +122,7 @@ class InstallerFragment : BaseFragment(R.layout.fragment_onboarding_installer) {
}
override fun onDestroy() {
if (isOAndAbove() && hasShizukuOrSui(requireContext())) {
if (isOAndAbove() && AppInstaller.hasShizukuOrSui(requireContext())) {
Shizuku.removeBinderReceivedListener(shizukuAliveListener)
Shizuku.removeBinderDeadListener(shizukuDeadListener)
Shizuku.removeRequestPermissionResultListener(shizukuResultListener)
@@ -134,15 +134,13 @@ class InstallerFragment : BaseFragment(R.layout.fragment_onboarding_installer) {
when (installerId) {
0 -> {
if (isMIUI() && !isMiuiOptimizationDisabled()) {
findNavController().navigate(
OnboardingFragmentDirections.actionOnboardingFragmentToDeviceMiuiSheet()
)
findNavController().navigate(R.id.deviceMiuiSheet)
}
this.installerId = installerId
save(PREFERENCE_INSTALLER_ID, installerId)
}
2 -> {
if (hasRootAccess()) {
if (AppInstaller.hasRootAccess()) {
this.installerId = installerId
save(PREFERENCE_INSTALLER_ID, installerId)
} else {
@@ -152,8 +150,19 @@ class InstallerFragment : BaseFragment(R.layout.fragment_onboarding_installer) {
)
}
}
3 -> {
if (AppInstaller.hasAuroraService(requireContext())) {
this.installerId = installerId
save(PREFERENCE_INSTALLER_ID, installerId)
} else {
showDialog(
R.string.action_installations,
R.string.installer_service_unavailable
)
}
}
4 -> {
if (hasAppManager(requireContext())) {
if (AppInstaller.hasAppManager(requireContext())) {
this.installerId = installerId
save(PREFERENCE_INSTALLER_ID, installerId)
} else {
@@ -164,8 +173,8 @@ class InstallerFragment : BaseFragment(R.layout.fragment_onboarding_installer) {
}
}
5 -> {
if (isOAndAbove() && hasShizukuOrSui(requireContext())) {
if (shizukuAlive && hasShizukuPerm()) {
if (isOAndAbove() && AppInstaller.hasShizukuOrSui(requireContext())) {
if (shizukuAlive && AppInstaller.hasShizukuPerm()) {
this.installerId = installerId
save(PREFERENCE_INSTALLER_ID, installerId)
} else if (shizukuAlive && !Shizuku.shouldShowRequestPermissionRationale()) {
@@ -190,10 +199,12 @@ class InstallerFragment : BaseFragment(R.layout.fragment_onboarding_installer) {
}
}
private fun getRecommendedInstallers(): List<Installer> {
private fun getInstallers(): List<Installer> {
val installers = mutableListOf(
SessionInstaller.getInstallerInfo(requireContext()),
NativeInstaller.getInstallerInfo(requireContext()),
RootInstaller.getInstallerInfo(requireContext()),
ServiceInstaller.getInstallerInfo(requireContext()),
AMInstaller.getInstallerInfo(requireContext())
)