From fc656d4d43ee8a34eb71d11314a044fd791f180d Mon Sep 17 00:00:00 2001 From: Aayush Gupta Date: Mon, 15 Dec 2025 17:25:15 +0800 Subject: [PATCH] compose: preferences: Migrate installer logic to compose Signed-off-by: Aayush Gupta --- .../compose/composable/InstallerListItem.kt | 79 +++++++ .../store/compose/navigation/NavDisplay.kt | 5 + .../aurora/store/compose/navigation/Screen.kt | 3 + .../installation/InstallerScreen.kt | 102 ++++++++++ .../epoxy/views/preference/InstallerView.kt | 64 ------ .../installation/InstallationPreference.kt | 4 +- .../installation/InstallerFragment.kt | 192 ------------------ .../preferences/InstallerViewModel.kt | 137 +++++++++++++ .../res/layout-land/fragment_installer.xml | 47 ----- .../main/res/layout/fragment_installer.xml | 48 ----- app/src/main/res/layout/view_installer.xml | 63 ------ .../main/res/navigation/mobile_navigation.xml | 5 - 12 files changed, 329 insertions(+), 420 deletions(-) create mode 100644 app/src/main/java/com/aurora/store/compose/composable/InstallerListItem.kt create mode 100644 app/src/main/java/com/aurora/store/compose/ui/preferences/installation/InstallerScreen.kt delete mode 100644 app/src/main/java/com/aurora/store/view/epoxy/views/preference/InstallerView.kt delete mode 100644 app/src/main/java/com/aurora/store/view/ui/preferences/installation/InstallerFragment.kt create mode 100644 app/src/main/java/com/aurora/store/viewmodel/preferences/InstallerViewModel.kt delete mode 100644 app/src/main/res/layout-land/fragment_installer.xml delete mode 100644 app/src/main/res/layout/fragment_installer.xml delete mode 100644 app/src/main/res/layout/view_installer.xml diff --git a/app/src/main/java/com/aurora/store/compose/composable/InstallerListItem.kt b/app/src/main/java/com/aurora/store/compose/composable/InstallerListItem.kt new file mode 100644 index 000000000..0bc1752d2 --- /dev/null +++ b/app/src/main/java/com/aurora/store/compose/composable/InstallerListItem.kt @@ -0,0 +1,79 @@ +/* + * SPDX-FileCopyrightText: 2025 The Calyx Institute + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +package com.aurora.store.compose.composable + +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.RadioButton +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.dimensionResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.style.TextOverflow +import androidx.compose.ui.tooling.preview.Preview +import com.aurora.store.R +import com.aurora.store.compose.preview.PreviewTemplate +import com.aurora.store.data.installer.SessionInstaller +import com.aurora.store.data.model.InstallerInfo + +/** + * Composable to display installer details in a list + * @param modifier The modifier to be applied to the composable + * @param installerInfo A [InstallerInfo] object to display details + * @param isSelected Whether this installer is selected + * @param onClick Callback when this composable is clicked + */ +@Composable +fun InstallerListItem( + modifier: Modifier = Modifier, + installerInfo: InstallerInfo, + isSelected: Boolean = false, + onClick: () -> Unit = {} +) { + Row( + modifier = modifier + .fillMaxWidth() + .clickable(onClick = onClick) + .padding(dimensionResource(R.dimen.padding_small)), + horizontalArrangement = Arrangement.SpaceBetween, + verticalAlignment = Alignment.CenterVertically + ) { + Column(modifier = Modifier.weight(1F)) { + Text( + text = stringResource(installerInfo.title), + style = MaterialTheme.typography.bodyLarge, + maxLines = 1, + overflow = TextOverflow.Ellipsis + ) + Text( + text = stringResource(installerInfo.subtitle), + style = MaterialTheme.typography.bodyMedium, + maxLines = 1, + overflow = TextOverflow.Ellipsis + ) + Text( + text = stringResource(installerInfo.description), + style = MaterialTheme.typography.bodySmall + ) + } + RadioButton(selected = isSelected, onClick = onClick) + } +} + +@Preview(showBackground = true) +@Composable +private fun InstallerListItemPreview() { + PreviewTemplate { + InstallerListItem(installerInfo = SessionInstaller.installerInfo, isSelected = true) + } +} diff --git a/app/src/main/java/com/aurora/store/compose/navigation/NavDisplay.kt b/app/src/main/java/com/aurora/store/compose/navigation/NavDisplay.kt index 1ac5fd84c..ab5a563f3 100644 --- a/app/src/main/java/com/aurora/store/compose/navigation/NavDisplay.kt +++ b/app/src/main/java/com/aurora/store/compose/navigation/NavDisplay.kt @@ -28,6 +28,7 @@ import com.aurora.store.compose.ui.dispenser.DispenserScreen import com.aurora.store.compose.ui.downloads.DownloadsScreen import com.aurora.store.compose.ui.favourite.FavouriteScreen import com.aurora.store.compose.ui.onboarding.OnboardingScreen +import com.aurora.store.compose.ui.preferences.installation.InstallerScreen import com.aurora.store.compose.ui.search.SearchScreen import com.aurora.store.compose.ui.spoof.SpoofScreen @@ -140,6 +141,10 @@ fun NavDisplay(startDestination: NavKey) { entry { DispenserScreen(onNavigateUp = ::onNavigateUp) } + + entry { + InstallerScreen(onNavigateUp = ::onNavigateUp) + } } ) } diff --git a/app/src/main/java/com/aurora/store/compose/navigation/Screen.kt b/app/src/main/java/com/aurora/store/compose/navigation/Screen.kt index b7e41759b..116d1a267 100644 --- a/app/src/main/java/com/aurora/store/compose/navigation/Screen.kt +++ b/app/src/main/java/com/aurora/store/compose/navigation/Screen.kt @@ -57,4 +57,7 @@ sealed class Screen : NavKey, Parcelable { @Serializable data object Dispenser : Screen() + + @Serializable + data object Installer : Screen() } diff --git a/app/src/main/java/com/aurora/store/compose/ui/preferences/installation/InstallerScreen.kt b/app/src/main/java/com/aurora/store/compose/ui/preferences/installation/InstallerScreen.kt new file mode 100644 index 000000000..4205ba101 --- /dev/null +++ b/app/src/main/java/com/aurora/store/compose/ui/preferences/installation/InstallerScreen.kt @@ -0,0 +1,102 @@ +/* + * SPDX-FileCopyrightText: 2025 The Calyx Institute + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +package com.aurora.store.compose.ui.preferences.installation + +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.material3.Scaffold +import androidx.compose.material3.SnackbarHost +import androidx.compose.material3.SnackbarHostState +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.getValue +import androidx.compose.runtime.remember +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.dimensionResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.tooling.preview.Preview +import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel +import androidx.lifecycle.compose.collectAsStateWithLifecycle +import com.aurora.store.R +import com.aurora.store.compose.composable.InstallerListItem +import com.aurora.store.compose.composable.TopAppBar +import com.aurora.store.compose.preview.PreviewTemplate +import com.aurora.store.data.installer.AppInstaller +import com.aurora.store.data.installer.SessionInstaller +import com.aurora.store.data.model.Installer +import com.aurora.store.data.model.InstallerInfo +import com.aurora.store.viewmodel.preferences.InstallerViewModel + +@Composable +fun InstallerScreen(onNavigateUp: () -> Unit, viewModel: InstallerViewModel = hiltViewModel()) { + val currentInstallerId by viewModel.currentInstaller.collectAsStateWithLifecycle() + val snackBarHostState = remember { SnackbarHostState() } + + LaunchedEffect(key1 = Unit) { + viewModel.error.collect { error -> + snackBarHostState.showSnackbar(message = error) + } + } + + ScreenContent( + onNavigateUp = onNavigateUp, + snackBarHostState = snackBarHostState, + currentInstaller = Installer.entries[currentInstallerId], + availableInstallers = AppInstaller.getAvailableInstallersInfo(LocalContext.current), + onInstallerSelected = { installer -> viewModel.save(installer) } + ) +} + +@Composable +private fun ScreenContent( + onNavigateUp: () -> Unit = {}, + snackBarHostState: SnackbarHostState = SnackbarHostState(), + currentInstaller: Installer = Installer.SESSION, + availableInstallers: List = emptyList(), + onInstallerSelected: (installer: Installer) -> Unit = {} +) { + val snackBarHostState = remember { snackBarHostState } + + Scaffold( + snackbarHost = { + SnackbarHost(hostState = snackBarHostState) + }, + topBar = { + TopAppBar( + title = stringResource(R.string.pref_install_mode_title), + onNavigateUp = onNavigateUp + ) + } + ) { paddingValues -> + LazyColumn( + modifier = Modifier + .padding(paddingValues) + .fillMaxSize() + .padding(vertical = dimensionResource(R.dimen.padding_medium)) + ) { + items(items = availableInstallers, key = { i -> i.id }) { installerInfo -> + InstallerListItem( + installerInfo = installerInfo, + isSelected = installerInfo.installer == currentInstaller, + onClick = { onInstallerSelected(installerInfo.installer) } + ) + } + } + } +} + +@Preview +@Composable +private fun InstallerScreenPreview() { + PreviewTemplate { + ScreenContent( + availableInstallers = listOf(SessionInstaller.installerInfo) + ) + } +} 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 deleted file mode 100644 index d3dd0e2a8..000000000 --- a/app/src/main/java/com/aurora/store/view/epoxy/views/preference/InstallerView.kt +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Aurora Store - * Copyright (C) 2021, Rahul Kumar Patel - * - * Aurora Store is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 2 of the License, or - * (at your option) any later version. - * - * Aurora Store is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Aurora Store. If not, see . - * - */ - -package com.aurora.store.view.epoxy.views.preference - -import android.content.Context -import android.util.AttributeSet -import android.widget.CompoundButton -import com.airbnb.epoxy.CallbackProp -import com.airbnb.epoxy.ModelProp -import com.airbnb.epoxy.ModelView -import com.aurora.store.data.model.InstallerInfo -import com.aurora.store.databinding.ViewInstallerBinding -import com.aurora.store.view.epoxy.views.BaseModel -import com.aurora.store.view.epoxy.views.BaseView - -@ModelView( - autoLayout = ModelView.Size.MATCH_WIDTH_WRAP_HEIGHT, - baseModelClass = BaseModel::class -) -class InstallerView @JvmOverloads constructor( - context: Context?, - attrs: AttributeSet? = null, - defStyleAttr: Int = 0 -) : BaseView(context, attrs, defStyleAttr) { - - @ModelProp - fun installer(installer: InstallerInfo) { - binding.line1.text = context.getString(installer.title) - binding.line2.text = context.getString(installer.subtitle) - binding.line3.text = context.getString(installer.description) - } - - @ModelProp - fun markChecked(isChecked: Boolean) { - binding.radiobutton.isChecked = isChecked - } - - @CallbackProp - fun checked(onCheckedChangeListener: CompoundButton.OnCheckedChangeListener?) { - binding.radiobutton.setOnCheckedChangeListener(onCheckedChangeListener) - } - - @CallbackProp - fun click(onClickListener: OnClickListener?) { - binding.root.setOnClickListener(onClickListener) - } -} diff --git a/app/src/main/java/com/aurora/store/view/ui/preferences/installation/InstallationPreference.kt b/app/src/main/java/com/aurora/store/view/ui/preferences/installation/InstallationPreference.kt index 1c33ffc02..5ceab35e9 100644 --- a/app/src/main/java/com/aurora/store/view/ui/preferences/installation/InstallationPreference.kt +++ b/app/src/main/java/com/aurora/store/view/ui/preferences/installation/InstallationPreference.kt @@ -28,8 +28,10 @@ import androidx.core.content.getSystemService import androidx.navigation.fragment.findNavController import androidx.preference.Preference import androidx.preference.PreferenceFragmentCompat +import com.aurora.extensions.navigate import com.aurora.extensions.showDialog import com.aurora.store.R +import com.aurora.store.compose.navigation.Screen import com.aurora.store.util.Preferences.PREFERENCE_INSTALLATION_DEVICE_OWNER import com.aurora.store.util.Preferences.PREFERENCE_INSTALLER_ID import dagger.hilt.android.AndroidEntryPoint @@ -42,7 +44,7 @@ class InstallationPreference : PreferenceFragmentCompat() { findPreference(PREFERENCE_INSTALLER_ID)?.apply { setOnPreferenceClickListener { - findNavController().navigate(R.id.installerFragment) + requireContext().navigate(Screen.Installer) true } } diff --git a/app/src/main/java/com/aurora/store/view/ui/preferences/installation/InstallerFragment.kt b/app/src/main/java/com/aurora/store/view/ui/preferences/installation/InstallerFragment.kt deleted file mode 100644 index db14bf7e3..000000000 --- a/app/src/main/java/com/aurora/store/view/ui/preferences/installation/InstallerFragment.kt +++ /dev/null @@ -1,192 +0,0 @@ -/* - * Aurora Store - * Copyright (C) 2021, Rahul Kumar Patel - * - * Aurora Store is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 2 of the License, or - * (at your option) any later version. - * - * Aurora Store is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Aurora Store. If not, see . - * - */ - -package com.aurora.store.view.ui.preferences.installation - -import android.content.pm.PackageManager -import android.os.Bundle -import android.util.Log -import android.view.View -import androidx.navigation.fragment.findNavController -import com.aurora.extensions.isMIUI -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.AppInstaller -import com.aurora.store.databinding.FragmentInstallerBinding -import com.aurora.store.util.Preferences -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 dagger.hilt.android.AndroidEntryPoint -import rikka.shizuku.Shizuku -import rikka.sui.Sui - -@AndroidEntryPoint -class InstallerFragment : BaseFragment() { - - private val TAG = InstallerFragment::class.java.simpleName - - private var installerId: Int = 0 - - private var shizukuAlive = Sui.isSui() - private val shizukuAliveListener = Shizuku.OnBinderReceivedListener { - Log.d(TAG, "ShizukuInstaller Alive!") - shizukuAlive = true - } - private val shizukuDeadListener = Shizuku.OnBinderDeadListener { - Log.d(TAG, "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) - binding.epoxyRecycler.requestModelBuild() - } else { - showDialog( - R.string.action_installations, - R.string.installer_shizuku_unavailable - ) - } - } - - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) - - // Toolbar - binding.toolbar.setNavigationOnClickListener { findNavController().navigateUp() } - - installerId = Preferences.getInteger(requireContext(), PREFERENCE_INSTALLER_ID) - - if (AppInstaller.hasShizukuOrSui(requireContext())) { - Shizuku.addBinderReceivedListenerSticky(shizukuAliveListener) - Shizuku.addBinderDeadListener(shizukuDeadListener) - Shizuku.addRequestPermissionResultListener(shizukuResultListener) - } - - // RecyclerView - binding.epoxyRecycler.withModels { - setFilterDuplicates(true) - AppInstaller.getAvailableInstallersInfo(requireContext()).forEach { - add( - InstallerViewModel_() - .id(it.id) - .installer(it) - .markChecked(installerId == it.id) - .click { _ -> - save(it.id) - requestModelBuild() - } - ) - } - } - - if (isMIUI && !isMiuiOptimizationDisabled) { - findNavController().navigate(R.id.deviceMiuiSheet) - } - } - - override fun onDestroy() { - if (AppInstaller.hasShizukuOrSui(requireContext())) { - Shizuku.removeBinderReceivedListener(shizukuAliveListener) - Shizuku.removeBinderDeadListener(shizukuDeadListener) - Shizuku.removeRequestPermissionResultListener(shizukuResultListener) - } - super.onDestroy() - } - - private fun save(installerId: Int) { - when (installerId) { - 0 -> { - if (isMIUI && !isMiuiOptimizationDisabled) { - findNavController().navigate(R.id.deviceMiuiSheet) - } - this.installerId = installerId - save(PREFERENCE_INSTALLER_ID, installerId) - } - - 2 -> { - if (AppInstaller.hasRootAccess()) { - this.installerId = installerId - save(PREFERENCE_INSTALLER_ID, installerId) - } else { - showDialog( - R.string.action_installations, - R.string.installer_root_unavailable - ) - } - } - - 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 (AppInstaller.hasAppManager(requireContext())) { - this.installerId = installerId - save(PREFERENCE_INSTALLER_ID, installerId) - } else { - showDialog( - R.string.action_installations, - R.string.installer_am_unavailable - ) - } - } - - 5 -> { - if (isOAndAbove && AppInstaller.hasShizukuOrSui(requireContext())) { - if (shizukuAlive && AppInstaller.hasShizukuPerm()) { - this.installerId = installerId - save(PREFERENCE_INSTALLER_ID, installerId) - } else if (shizukuAlive && !Shizuku.shouldShowRequestPermissionRationale()) { - Shizuku.requestPermission(9000) - } else { - showDialog( - R.string.action_installations, - R.string.installer_shizuku_unavailable - ) - } - } else { - showDialog( - R.string.action_installations, - R.string.installer_shizuku_unavailable - ) - } - } - - else -> { - this.installerId = installerId - save(PREFERENCE_INSTALLER_ID, installerId) - } - } - } -} diff --git a/app/src/main/java/com/aurora/store/viewmodel/preferences/InstallerViewModel.kt b/app/src/main/java/com/aurora/store/viewmodel/preferences/InstallerViewModel.kt new file mode 100644 index 000000000..ee1506acf --- /dev/null +++ b/app/src/main/java/com/aurora/store/viewmodel/preferences/InstallerViewModel.kt @@ -0,0 +1,137 @@ +/* + * SPDX-FileCopyrightText: 2025 The Calyx Institute + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +package com.aurora.store.viewmodel.preferences + +import android.content.Context +import android.content.pm.PackageManager +import android.util.Log +import androidx.core.content.edit +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.aurora.extensions.isMIUI +import com.aurora.extensions.isMiuiOptimizationDisabled +import com.aurora.extensions.observeAsStateFlow +import com.aurora.store.R +import com.aurora.store.data.installer.AppInstaller +import com.aurora.store.data.model.Installer +import com.aurora.store.util.Preferences +import com.aurora.store.util.Preferences.PREFERENCE_INSTALLER_ID +import com.aurora.store.util.save +import dagger.hilt.android.lifecycle.HiltViewModel +import dagger.hilt.android.qualifiers.ApplicationContext +import kotlinx.coroutines.flow.MutableSharedFlow +import kotlinx.coroutines.flow.asSharedFlow +import kotlinx.coroutines.launch +import rikka.shizuku.Shizuku +import rikka.sui.Sui +import javax.inject.Inject + +@HiltViewModel +class InstallerViewModel @Inject constructor( + @ApplicationContext private val context: Context +) : ViewModel(), Shizuku.OnBinderReceivedListener, Shizuku.OnBinderDeadListener, + Shizuku.OnRequestPermissionResultListener { + + private val TAG = InstallerViewModel::class.java.simpleName + private val sharedPreferences = Preferences.getPrefs(context) + private var isShizukuAlive = Sui.isSui() + + private val _error = MutableSharedFlow() + val error = _error.asSharedFlow() + + private var _installerId: Int + get() = sharedPreferences.getInt(PREFERENCE_INSTALLER_ID, 0) + set(value) = sharedPreferences.edit { putInt(PREFERENCE_INSTALLER_ID, value) } + + val currentInstaller = sharedPreferences.observeAsStateFlow( + key = PREFERENCE_INSTALLER_ID, + scope = viewModelScope, + initial = AppInstaller.getCurrentInstaller(context).ordinal, + valueProvider = { _installerId } + ) + + init { + Shizuku.addBinderReceivedListenerSticky(this) + Shizuku.addBinderDeadListener(this) + Shizuku.addRequestPermissionResultListener(this) + } + + override fun onBinderReceived() { + isShizukuAlive = true + } + + override fun onBinderDead() { + isShizukuAlive = false + } + + override fun onRequestPermissionResult(requestCode: Int, grantResult: Int) { + if (grantResult == PackageManager.PERMISSION_GRANTED) { + save(Installer.SHIZUKU) + } else { + viewModelScope.launch { + Log.e(TAG, "Permission denied for shizuku") + _error.emit(context.getString(R.string.permissions_denied)) + } + } + } + + fun save(installer: Installer) { + viewModelScope.launch { + // Error handling for different installers + when (installer) { + Installer.SESSION -> { + if (isMIUI && !isMiuiOptimizationDisabled) { + Log.e(TAG, "Trying to set session installer with MIUI optimizations") + _error.emit(context.getString(R.string.device_miui_description)) + return@launch + } + } + + Installer.ROOT -> { + if (!AppInstaller.hasRootAccess()) { + Log.e(TAG, "Trying to set root installer without root access") + _error.emit(context.getString(R.string.installer_root_unavailable)) + return@launch + } + } + + Installer.SERVICE -> { + if (!AppInstaller.hasAuroraService(context)) { + Log.e(TAG, "Trying to set service installer without companion app") + _error.emit(context.getString(R.string.installer_service_unavailable)) + return@launch + } + } + + Installer.SHIZUKU -> { + if (AppInstaller.hasShizukuOrSui(context) && isShizukuAlive) { + if (!AppInstaller.hasShizukuPerm()) { + Log.i(TAG, "Requesting permission for shizuku") + Shizuku.requestPermission(9000) + return@launch + } + } else { + Log.e(TAG, "Trying to set shizuku installer without appropriate setup") + _error.emit(context.getString(R.string.installer_shizuku_unavailable)) + return@launch + } + } + + Installer.AM -> { + if (!AppInstaller.hasAppManager(context)) { + Log.e(TAG, "Trying to set AM installer without companion app") + _error.emit(context.getString(R.string.installer_am_unavailable)) + return@launch + } + } + + else -> Log.i(TAG, "Trying to set ${installer.name} installer without any checks") + } + + context.save(PREFERENCE_INSTALLER_ID, installer.ordinal) + } + } +} diff --git a/app/src/main/res/layout-land/fragment_installer.xml b/app/src/main/res/layout-land/fragment_installer.xml deleted file mode 100644 index 723aa2997..000000000 --- a/app/src/main/res/layout-land/fragment_installer.xml +++ /dev/null @@ -1,47 +0,0 @@ - - - - - - - - - - diff --git a/app/src/main/res/layout/fragment_installer.xml b/app/src/main/res/layout/fragment_installer.xml deleted file mode 100644 index c41ea459b..000000000 --- a/app/src/main/res/layout/fragment_installer.xml +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - - - - - - diff --git a/app/src/main/res/layout/view_installer.xml b/app/src/main/res/layout/view_installer.xml deleted file mode 100644 index 29f5c0f42..000000000 --- a/app/src/main/res/layout/view_installer.xml +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/navigation/mobile_navigation.xml b/app/src/main/res/navigation/mobile_navigation.xml index 690685184..ccb60a5da 100644 --- a/app/src/main/res/navigation/mobile_navigation.xml +++ b/app/src/main/res/navigation/mobile_navigation.xml @@ -184,11 +184,6 @@ app:popUpTo="@id/splashFragment" app:popUpToInclusive="true" /> -