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 5168a5f6b..e40d3679d 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 @@ -35,6 +35,7 @@ import com.aurora.store.BuildConfig import com.aurora.store.R import com.aurora.store.data.event.SessionEvent import com.aurora.store.util.Log +import com.aurora.store.util.PackageUtil import org.greenrobot.eventbus.EventBus import java.io.File @@ -48,21 +49,34 @@ class ServiceInstaller(context: Context) : InstallerBase(context) { @RequiresApi(Build.VERSION_CODES.LOLLIPOP) override fun install(packageName: String, files: List) { - if (isAlreadyQueued(packageName)) { - Log.i("$packageName already queued") - } else { - Log.i("Received service install request for $packageName") - val uriList = files.map { - when (it) { - is File -> getUri(it) - is String -> getUri(File(it)) - else -> { - throw Exception("Invalid data, expecting listOf() File or String") - } - } + + when { + isAlreadyQueued(packageName) -> { + Log.i("$packageName already queued") } - xInstall(packageName, uriList) + PackageUtil.isInstalled(context, PRIVILEGED_EXTENSION_PACKAGE_NAME) -> { + Log.i("Received service install request for $packageName") + val uriList = files.map { + when (it) { + is File -> getUri(it) + is String -> getUri(File(it)) + else -> { + throw Exception("Invalid data, expecting listOf() File or String") + } + } + } + + xInstall(packageName, uriList) + } + else -> { + val event = SessionEvent.Failed( + packageName, + context.getString(R.string.installer_status_failure), + context.getString(R.string.installer_service_unavailable) + ) + EventBus.getDefault().post(event) + } } } @@ -103,16 +117,13 @@ class ServiceInstaller(context: Context) : InstallerBase(context) { Log.e("Failed to connect Aurora Services") } } else { - Log.e(context.getString(R.string.installer_service_unavailable)) - EventBus - .getDefault() - .post( - SessionEvent.Failed( - packageName, - context.getString(R.string.installer_status_failure), - context.getString(R.string.installer_service_unavailable) - ) - ) + Log.e(context.getString(R.string.installer_service_misconfigured)) + val event = SessionEvent.Failed( + packageName, + context.getString(R.string.installer_status_failure), + context.getString(R.string.installer_service_misconfigured) + ) + EventBus.getDefault().post(event) } } diff --git a/app/src/main/java/com/aurora/store/view/epoxy/views/preference/InstallerView.kt b/app/src/main/java/com/aurora/store/view/epoxy/views/preference/InstallerView.kt index e117e8faf..0c725abfd 100644 --- a/app/src/main/java/com/aurora/store/view/epoxy/views/preference/InstallerView.kt +++ b/app/src/main/java/com/aurora/store/view/epoxy/views/preference/InstallerView.kt @@ -76,4 +76,9 @@ class InstallerView : RelativeLayout { fun checked(onCheckedChangeListener: CompoundButton.OnCheckedChangeListener?) { B.checkbox.setOnCheckedChangeListener(onCheckedChangeListener) } + + @CallbackProp + fun click(onClickListener: OnClickListener?) { + B.root.setOnClickListener(onClickListener) + } } \ No newline at end of file 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 38685a627..af2cea3f5 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 @@ -19,20 +19,26 @@ package com.aurora.store.view.ui.onboarding +import android.content.DialogInterface +import android.graphics.drawable.ColorDrawable import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.annotation.StringRes +import com.aurora.extensions.getStyledAttributeColor +import com.aurora.extensions.runOnUiThread import com.aurora.store.R +import com.aurora.store.data.installer.ServiceInstaller import com.aurora.store.data.model.Installer import com.aurora.store.databinding.FragmentOnboardingInstallerBinding +import com.aurora.store.util.PackageUtil import com.aurora.store.util.Preferences import com.aurora.store.util.Preferences.PREFERENCE_INSTALLER_ID -import com.aurora.extensions.runOnUiThread -import com.aurora.extensions.toast 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.android.material.dialog.MaterialAlertDialogBuilder import com.google.gson.reflect.TypeToken import com.topjohnwu.superuser.Shell import java.nio.charset.StandardCharsets @@ -81,12 +87,9 @@ class InstallerFragment : BaseFragment() { .id(it.id) .installer(it) .markChecked(installerId == it.id) - .checked { _, checked -> - if (checked) { - installerId = it.id - save(installerId) - requestModelBuild() - } + .click { _ -> + save(it.id) + requestModelBuild() } ) } @@ -94,21 +97,32 @@ class InstallerFragment : BaseFragment() { } private fun save(installerId: Int) { - if (installerId == 2) { - checkRoot() - } - save(PREFERENCE_INSTALLER_ID, installerId) - } - - private fun checkRoot() { - Shell.getShell { - runOnUiThread { - requireContext().toast( - if (it.isRoot) - getString(R.string.installer_root_available) - else - getString(R.string.installer_root_unavailable) - ) + when (installerId) { + 2 -> { + if (checkRootAvailability()) { + this.installerId = installerId + save(PREFERENCE_INSTALLER_ID, installerId) + } else { + showDialog( + R.string.action_installations, + R.string.installer_root_unavailable + ) + } + } + 3 -> { + if (checkServicesAvailability()) { + this.installerId = installerId + save(PREFERENCE_INSTALLER_ID, installerId) + } else { + showDialog( + R.string.action_installations, + R.string.installer_service_unavailable + ) + } + } + else -> { + this.installerId = installerId + save(PREFERENCE_INSTALLER_ID, installerId) } } } @@ -125,4 +139,31 @@ class InstallerFragment : BaseFragment() { object : TypeToken?>() {}.type ) } + + private fun checkRootAvailability(): Boolean { + return Shell.getShell().isRoot + } + + private fun checkServicesAvailability(): Boolean { + return PackageUtil.isInstalled( + requireContext(), + ServiceInstaller.PRIVILEGED_EXTENSION_PACKAGE_NAME + ) + } + + private fun showDialog(@StringRes titleId: Int, @StringRes messageId: Int) { + runOnUiThread { + val backgroundColor: Int = + requireContext().getStyledAttributeColor(android.R.attr.colorBackground) + + val builder = MaterialAlertDialogBuilder(requireContext()).apply { + setTitle(titleId) + setMessage(messageId) + setPositiveButton(android.R.string.ok) { dialog: DialogInterface, _ -> dialog.dismiss() } + background = ColorDrawable(backgroundColor) + }.create() + + builder.show() + } + } } \ 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 d161e0ff3..7c9ba1e50 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 @@ -19,17 +19,24 @@ package com.aurora.store.view.ui.preferences +import android.content.DialogInterface +import android.graphics.drawable.ColorDrawable import android.os.Bundle import android.view.View +import androidx.annotation.StringRes import androidx.preference.Preference import androidx.preference.PreferenceFragmentCompat +import com.aurora.extensions.getStyledAttributeColor import com.aurora.extensions.runOnUiThread import com.aurora.extensions.toast import com.aurora.store.R +import com.aurora.store.data.installer.ServiceInstaller import com.aurora.store.util.CommonUtil +import com.aurora.store.util.PackageUtil import com.aurora.store.util.Preferences import com.aurora.store.util.save import com.aurora.store.view.custom.preference.AuroraListPreference +import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.topjohnwu.superuser.Shell @@ -63,10 +70,25 @@ class InstallationPreference : PreferenceFragmentCompat() { Preference.OnPreferenceChangeListener { _, newValue -> val selectedId = Integer.parseInt(newValue as String) if (selectedId == 2) { - if (checkRoot()) { + if (checkRootAvailability()) { save(Preferences.PREFERENCE_INSTALLER_ID, selectedId) true } else { + showDialog( + R.string.action_installations, + R.string.installer_root_unavailable + ) + false + } + } else if (selectedId == 3) { + if (checkServicesAvailability()) { + save(Preferences.PREFERENCE_INSTALLER_ID, selectedId) + true + } else { + showDialog( + R.string.action_installations, + R.string.installer_service_unavailable + ) false } } else { @@ -77,18 +99,30 @@ class InstallationPreference : PreferenceFragmentCompat() { } } - private fun checkRoot(): Boolean { - var isRootAvailable = false + private fun checkRootAvailability(): Boolean { + return Shell.getShell().isRoot + } - Shell.getShell { - isRootAvailable = it.isRoot + private fun checkServicesAvailability(): Boolean { + return PackageUtil.isInstalled( + requireContext(), + ServiceInstaller.PRIVILEGED_EXTENSION_PACKAGE_NAME + ) + } - if (isRootAvailable) - toast(R.string.installer_root_available) - else - toast(R.string.installer_root_unavailable) + private fun showDialog(@StringRes titleId: Int, @StringRes messageId: Int) { + runOnUiThread { + val backgroundColor: Int = + requireContext().getStyledAttributeColor(android.R.attr.colorBackground) + + val builder = MaterialAlertDialogBuilder(requireContext()).apply { + setTitle(titleId) + setMessage(messageId) + setPositiveButton(android.R.string.ok) { dialog: DialogInterface, _ -> dialog.dismiss() } + background = ColorDrawable(backgroundColor) + }.create() + + builder.show() } - - return isRootAvailable } } diff --git a/app/src/main/res/layout/view_installer.xml b/app/src/main/res/layout/view_installer.xml index 53ad1e8f0..f5ed4726f 100644 --- a/app/src/main/res/layout/view_installer.xml +++ b/app/src/main/res/layout/view_installer.xml @@ -56,5 +56,7 @@ android:layout_height="@dimen/icon_size_category" android:layout_alignParentEnd="true" android:layout_centerInParent="true" + android:clickable="false" + android:focusable="false" android:minWidth="0dp" /> \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index dfceb873e..459a5e6f5 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -205,7 +205,8 @@ "Root access available" "No Root, grant root access or change the installer." "Aurora services is available and ready to install." - "Aurora services not configured. Make sure service is enabled & all permissions are granted" + "Aurora services not installed, kindly install it or change installer" + "Aurora services not configured. Make sure service is enabled & all permissions are granted" "Installation failed" "Installation cancelled" "Installation was blocked"