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 e96d08521..448de5cde 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 @@ -36,6 +36,7 @@ import com.aurora.store.data.installer.AppInstaller.Companion.hasShizuku import com.aurora.store.data.installer.AppInstaller.Companion.hasShizukuPerm import com.aurora.store.data.model.Installer import com.aurora.store.databinding.FragmentOnboardingInstallerBinding +import com.aurora.store.util.Log import com.aurora.store.util.Preferences import com.aurora.store.util.Preferences.PREFERENCE_INSTALLER_ID import com.aurora.store.util.save @@ -53,11 +54,22 @@ class InstallerFragment : BaseFragment() { var installerId: Int = 0 + private var shizukuAlive = false + 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) { this.installerId = 5 save(PREFERENCE_INSTALLER_ID, 5) + B.epoxyRecycler.requestModelBuild() } else { showDialog( R.string.action_installations, @@ -71,7 +83,11 @@ class InstallerFragment : BaseFragment() { container: ViewGroup?, savedInstanceState: Bundle? ): View { + + Shizuku.addBinderReceivedListenerSticky(shizukuAliveListener) + Shizuku.addBinderDeadListener(shizukuDeadListener) Shizuku.addRequestPermissionResultListener(shizukuResultListener) + B = FragmentOnboardingInstallerBinding.bind( inflater.inflate( R.layout.fragment_onboarding_installer, @@ -166,10 +182,10 @@ class InstallerFragment : BaseFragment() { } 5 -> { if (hasShizuku(requireContext()) && isOAndAbove()) { - if (hasShizukuPerm()) { + if (shizukuAlive && hasShizukuPerm()) { this.installerId = installerId save(PREFERENCE_INSTALLER_ID, installerId) - } else if (Shizuku.shouldShowRequestPermissionRationale()) { + } else if (shizukuAlive && !Shizuku.shouldShowRequestPermissionRationale()) { Shizuku.requestPermission(9000) } else { showDialog( @@ -204,4 +220,4 @@ class InstallerFragment : BaseFragment() { ) } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/aurora/store/view/ui/preferences/InstallationPreference.kt b/app/src/main/java/com/aurora/store/view/ui/preferences/InstallationPreference.kt index 2abbcb240..4f08cb436 100644 --- a/app/src/main/java/com/aurora/store/view/ui/preferences/InstallationPreference.kt +++ b/app/src/main/java/com/aurora/store/view/ui/preferences/InstallationPreference.kt @@ -24,15 +24,18 @@ import android.os.Bundle import android.view.View import androidx.preference.Preference import androidx.preference.PreferenceFragmentCompat +import com.aurora.extensions.isOAndAbove import com.aurora.extensions.runOnUiThread 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.AppInstaller import com.aurora.store.data.installer.ServiceInstaller import com.aurora.store.data.installer.ShizukuInstaller import com.aurora.store.util.CommonUtil +import com.aurora.store.util.Log import com.aurora.store.util.PackageUtil import com.aurora.store.util.Preferences import com.aurora.store.util.save @@ -42,6 +45,29 @@ import rikka.shizuku.Shizuku class InstallationPreference : PreferenceFragmentCompat() { + + private var shizukuAlive = false + 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 + ) + } + } + override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { setPreferencesFromResource(R.xml.preferences_installation, rootKey) } @@ -49,6 +75,10 @@ class InstallationPreference : PreferenceFragmentCompat() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) + Shizuku.addBinderReceivedListenerSticky(shizukuAliveListener) + Shizuku.addBinderDeadListener(shizukuDeadListener) + Shizuku.addRequestPermissionResultListener(shizukuResultListener) + val abandonPreference: Preference? = findPreference(Preferences.INSTALLATION_ABANDON_SESSION) @@ -104,9 +134,20 @@ class InstallationPreference : PreferenceFragmentCompat() { false } } else if (selectedId == 5) { - if (checkShizukuAvailability()) { - save(Preferences.PREFERENCE_INSTALLER_ID, selectedId) - true + if (AppInstaller.hasShizuku(requireContext()) && isOAndAbove()) { + 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, @@ -154,6 +195,6 @@ class InstallationPreference : PreferenceFragmentCompat() { private fun checkShizukuAvailability(): Boolean { return PackageUtil.isInstalled(requireContext(), ShizukuInstaller.SHIZUKU_PACKAGE_NAME) && - Shizuku.checkSelfPermission() == PackageManager.PERMISSION_GRANTED + shizukuAlive && Shizuku.checkSelfPermission() == PackageManager.PERMISSION_GRANTED } }