From 58c2d5023f4a8fa7a8757be0dee172a10894c7ab Mon Sep 17 00:00:00 2001 From: CnC-Robert Date: Tue, 22 Aug 2023 23:08:50 +0200 Subject: [PATCH] fix: fix di --- .../app/revanced/manager/di/ServiceModule.kt | 2 + .../{ShizkuService.kt => ShizukuService.kt} | 16 ++-- .../manager/ui/component/ShizukuCard.kt | 90 ++++++++----------- .../manager/ui/screen/InstalledAppsScreen.kt | 16 ++-- .../screen/settings/AdvancedSettingsScreen.kt | 36 ++++---- .../ui/viewmodel/AdvancedSettingsViewModel.kt | 5 +- .../ui/viewmodel/InstalledAppsViewModel.kt | 4 +- .../ui/viewmodel/InstallerViewModel.kt | 6 +- 8 files changed, 80 insertions(+), 95 deletions(-) rename app/src/main/java/app/revanced/manager/service/{ShizkuService.kt => ShizukuService.kt} (77%) diff --git a/app/src/main/java/app/revanced/manager/di/ServiceModule.kt b/app/src/main/java/app/revanced/manager/di/ServiceModule.kt index 78b99c2..b44b7be 100644 --- a/app/src/main/java/app/revanced/manager/di/ServiceModule.kt +++ b/app/src/main/java/app/revanced/manager/di/ServiceModule.kt @@ -3,6 +3,7 @@ package app.revanced.manager.di import app.revanced.manager.network.service.GithubService import app.revanced.manager.network.service.HttpService import app.revanced.manager.network.service.ReVancedService +import app.revanced.manager.service.ShizukuService import org.koin.core.module.dsl.singleOf import org.koin.dsl.module @@ -18,4 +19,5 @@ val serviceModule = module { single { provideReVancedService(get()) } singleOf(::HttpService) singleOf(::GithubService) + singleOf(::ShizukuService) } \ No newline at end of file diff --git a/app/src/main/java/app/revanced/manager/service/ShizkuService.kt b/app/src/main/java/app/revanced/manager/service/ShizukuService.kt similarity index 77% rename from app/src/main/java/app/revanced/manager/service/ShizkuService.kt rename to app/src/main/java/app/revanced/manager/service/ShizukuService.kt index 31706e7..7101824 100644 --- a/app/src/main/java/app/revanced/manager/service/ShizkuService.kt +++ b/app/src/main/java/app/revanced/manager/service/ShizukuService.kt @@ -7,23 +7,21 @@ import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.setValue import androidx.core.content.FileProvider +import app.revanced.manager.util.PM import rikka.shizuku.Shizuku import java.io.File -class ShizukuApi( - private val app: Application +class ShizukuService( + private val app: Application, + private val pm: PM ) { - - var isBinderAvailable = false var isPermissionGranted by mutableStateOf(false) init { Shizuku.addBinderReceivedListenerSticky { - isBinderAvailable = true isPermissionGranted = Shizuku.checkSelfPermission() == PackageManager.PERMISSION_GRANTED } Shizuku.addBinderDeadListener { - isBinderAvailable = false isPermissionGranted = false } } @@ -37,7 +35,9 @@ class ShizukuApi( app.startActivity(intent) } - fun isShizukuPermissionGranted() = isBinderAvailable && isPermissionGranted + fun isShizukuInstalled() = pm.getPackageInfo(shizukuPackageName) != null - fun isShizukuInstalled() = Shizuku.pingBinder() + companion object { + const val shizukuPackageName = "moe.shizuku.privileged.api" + } } \ No newline at end of file diff --git a/app/src/main/java/app/revanced/manager/ui/component/ShizukuCard.kt b/app/src/main/java/app/revanced/manager/ui/component/ShizukuCard.kt index ada444b..f47a424 100644 --- a/app/src/main/java/app/revanced/manager/ui/component/ShizukuCard.kt +++ b/app/src/main/java/app/revanced/manager/ui/component/ShizukuCard.kt @@ -1,8 +1,6 @@ package app.revanced.manager.ui.component -import android.content.pm.PackageManager import android.util.Log -import androidx.compose.animation.AnimatedVisibility import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column @@ -21,77 +19,65 @@ import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.DisposableEffect -import androidx.compose.runtime.LaunchedEffect import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import app.revanced.manager.R -import app.revanced.manager.service.ShizukuApi +import app.revanced.manager.util.tag import rikka.shizuku.Shizuku - @OptIn(ExperimentalMaterial3Api::class) @Composable fun ShizukuCard( - shizukuApi: ShizukuApi + onPermissionResult: (Int, Int) -> Unit, ) { - - val listener: (Int, Int) -> Unit = { _, grantResult -> - shizukuApi.isPermissionGranted = grantResult == PackageManager.PERMISSION_GRANTED - } - - LaunchedEffect(Unit) { - Shizuku.addRequestPermissionResultListener(listener) - } DisposableEffect(Unit) { + Shizuku.addRequestPermissionResultListener(onPermissionResult) + onDispose { - Shizuku.removeRequestPermissionResultListener(listener) + Shizuku.removeRequestPermissionResultListener(onPermissionResult) } } - AnimatedVisibility(visible = !shizukuApi.isPermissionGranted) { - Card( - colors = CardDefaults.cardColors( - MaterialTheme.colorScheme.errorContainer - ), - onClick = { - if (shizukuApi.isBinderAvailable && !shizukuApi.isPermissionGranted) { - Log.i("ShizukuCard", "Requesting permission") - Shizuku.requestPermission(114514) - } - }, + Card( + colors = CardDefaults.cardColors( + MaterialTheme.colorScheme.errorContainer + ), + onClick = { + Log.i(tag, "Requesting permission") + Shizuku.requestPermission(114514) + }, + modifier = Modifier + .fillMaxWidth() + .padding(16.dp) + .clip(RoundedCornerShape(24.dp)) + .background(MaterialTheme.colorScheme.tertiaryContainer), + ) { + Row( modifier = Modifier .fillMaxWidth() - .padding(16.dp) - .clip(RoundedCornerShape(24.dp)) - .background(MaterialTheme.colorScheme.tertiaryContainer), + .padding(16.dp), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(16.dp) ) { - Row( - modifier = Modifier - .fillMaxWidth() - .padding(16.dp), - verticalAlignment = Alignment.CenterVertically, - horizontalArrangement = Arrangement.spacedBy(16.dp) - ) { - Icon( - imageVector = Icons.Default.Warning, - contentDescription = null, - tint = MaterialTheme.colorScheme.onErrorContainer, - modifier = Modifier.size(24.dp) + Icon( + imageVector = Icons.Default.Warning, + contentDescription = null, + tint = MaterialTheme.colorScheme.onErrorContainer, + modifier = Modifier.size(24.dp) + ) + Column { + Text( + text = stringResource(R.string.shizuku_unavailable), + style = MaterialTheme.typography.titleMedium + ) + Text( + text = stringResource(R.string.home_shizuku_warning), + style = MaterialTheme.typography.bodyMedium, + color = MaterialTheme.colorScheme.onErrorContainer ) - Column() { - Text( - text = stringResource(R.string.shizuku_unavailable), - style = MaterialTheme.typography.titleMedium - ) - Text( - text = stringResource(R.string.home_shizuku_warning), - style = MaterialTheme.typography.bodyMedium, - color = MaterialTheme.colorScheme.onErrorContainer - ) - } } } } diff --git a/app/src/main/java/app/revanced/manager/ui/screen/InstalledAppsScreen.kt b/app/src/main/java/app/revanced/manager/ui/screen/InstalledAppsScreen.kt index 99e34a6..c7569af 100644 --- a/app/src/main/java/app/revanced/manager/ui/screen/InstalledAppsScreen.kt +++ b/app/src/main/java/app/revanced/manager/ui/screen/InstalledAppsScreen.kt @@ -1,8 +1,9 @@ package app.revanced.manager.ui.screen +import android.content.pm.PackageManager +import androidx.compose.animation.AnimatedVisibility import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.size import androidx.compose.foundation.lazy.LazyColumn @@ -39,12 +40,13 @@ fun InstalledAppsScreen( verticalArrangement = installedApps?.let { if (it.isEmpty()) Arrangement.Center else Arrangement.Top } ?: Arrangement.Center ) { item { - if (viewModel.shizukuApi.isShizukuInstalled()) ShizukuCard(viewModel.shizukuApi) - - Box(Modifier.fillMaxSize(), contentAlignment = Alignment.Center) { - Text( - text = stringResource(R.string.no_patched_apps_found), - style = MaterialTheme.typography.titleLarge + AnimatedVisibility( + visible = viewModel.shizukuService.isShizukuInstalled() && !viewModel.shizukuService.isPermissionGranted + ) { + ShizukuCard( + onPermissionResult = { _, grantResult -> + viewModel.shizukuService.isPermissionGranted = grantResult == PackageManager.PERMISSION_GRANTED + } ) } } diff --git a/app/src/main/java/app/revanced/manager/ui/screen/settings/AdvancedSettingsScreen.kt b/app/src/main/java/app/revanced/manager/ui/screen/settings/AdvancedSettingsScreen.kt index bb17f3e..f411249 100644 --- a/app/src/main/java/app/revanced/manager/ui/screen/settings/AdvancedSettingsScreen.kt +++ b/app/src/main/java/app/revanced/manager/ui/screen/settings/AdvancedSettingsScreen.kt @@ -1,9 +1,7 @@ package app.revanced.manager.ui.screen.settings import android.app.ActivityManager -import android.content.Context import android.os.Build -import android.widget.Toast import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column @@ -43,12 +41,11 @@ import androidx.compose.ui.unit.dp import androidx.core.content.getSystemService import app.revanced.manager.R import app.revanced.manager.domain.manager.PreferencesManager -import app.revanced.manager.service.ShizukuApi import app.revanced.manager.ui.component.AppTopBar import app.revanced.manager.ui.component.GroupHeader import app.revanced.manager.ui.viewmodel.AdvancedSettingsViewModel +import app.revanced.manager.util.toast import org.koin.androidx.compose.getViewModel -import org.koin.compose.koinInject @OptIn(ExperimentalMaterial3Api::class) @Composable @@ -69,9 +66,15 @@ fun AdvancedSettingsScreen( if (showInstallerPicker) { InstallerPicker( + currentInstaller = prefs.defaultInstaller.getAsState().value, onDismiss = { showInstallerPicker = false }, - onConfirm = { vm.setInstaller(it) }, - viewModel = vm + onConfirm = { + if (it == PreferencesManager.InstallerManager.SHIZUKU && !vm.shizukuService.isPermissionGranted) { + context.toast(context.getString(R.string.shizuku_unavailable)) + return@InstallerPicker + } + vm.setInstaller(it) + } ) } @@ -184,15 +187,14 @@ private fun APIUrlDialog(currentUrl: String, onSubmit: (String?) -> Unit) { @Composable private fun InstallerPicker( + currentInstaller: PreferencesManager.InstallerManager, onDismiss: () -> Unit, onConfirm: (PreferencesManager.InstallerManager) -> Unit, - prefs: PreferencesManager = koinInject(), - viewModel: AdvancedSettingsViewModel ) { - var selectedInstaller by rememberSaveable { mutableStateOf(prefs.defaultInstaller.getBlocking()) } - val context: Context = LocalContext.current + var selectedInstaller by rememberSaveable { mutableStateOf(currentInstaller) } - AlertDialog(onDismissRequest = onDismiss, + AlertDialog( + onDismissRequest = onDismiss, title = { Text(stringResource(R.string.installer)) }, text = { Column { @@ -203,8 +205,7 @@ private fun InstallerPicker( .clickable { selectedInstaller = it }, verticalAlignment = Alignment.CenterVertically ) { - RadioButton(selected = selectedInstaller == it, - onClick = { selectedInstaller = it }) + RadioButton(selected = selectedInstaller == it, onClick = null) Text(stringResource(it.displayName)) } } @@ -212,16 +213,11 @@ private fun InstallerPicker( }, confirmButton = { Button(onClick = { - if (selectedInstaller == PreferencesManager.InstallerManager.SHIZUKU && viewModel.shizukuApi.isShizukuPermissionGranted()) { - Toast.makeText( - context, R.string.shizuku_unavailable, Toast.LENGTH_SHORT - ).show() - return@Button - } onConfirm(selectedInstaller) onDismiss() }) { Text(stringResource(R.string.apply)) } - }) + } + ) } \ No newline at end of file diff --git a/app/src/main/java/app/revanced/manager/ui/viewmodel/AdvancedSettingsViewModel.kt b/app/src/main/java/app/revanced/manager/ui/viewmodel/AdvancedSettingsViewModel.kt index 03670fe..984bc74 100644 --- a/app/src/main/java/app/revanced/manager/ui/viewmodel/AdvancedSettingsViewModel.kt +++ b/app/src/main/java/app/revanced/manager/ui/viewmodel/AdvancedSettingsViewModel.kt @@ -7,17 +7,16 @@ import app.revanced.manager.R import app.revanced.manager.domain.manager.PreferencesManager import app.revanced.manager.domain.repository.PatchBundleRepository import app.revanced.manager.domain.bundles.RemotePatchBundle -import app.revanced.manager.service.ShizukuApi +import app.revanced.manager.service.ShizukuService import app.revanced.manager.util.uiSafe import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch -import org.koin.compose.koinInject class AdvancedSettingsViewModel( val prefs: PreferencesManager, private val app: Application, private val patchBundleRepository: PatchBundleRepository, - val shizukuApi: ShizukuApi + val shizukuService: ShizukuService ) : ViewModel() { val apiUrl = prefs.api diff --git a/app/src/main/java/app/revanced/manager/ui/viewmodel/InstalledAppsViewModel.kt b/app/src/main/java/app/revanced/manager/ui/viewmodel/InstalledAppsViewModel.kt index 4107b36..9bf9791 100644 --- a/app/src/main/java/app/revanced/manager/ui/viewmodel/InstalledAppsViewModel.kt +++ b/app/src/main/java/app/revanced/manager/ui/viewmodel/InstalledAppsViewModel.kt @@ -5,7 +5,7 @@ import androidx.compose.runtime.mutableStateMapOf import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import app.revanced.manager.domain.repository.InstalledAppRepository -import app.revanced.manager.service.ShizukuApi +import app.revanced.manager.service.ShizukuService import app.revanced.manager.util.PM import app.revanced.manager.util.collectEach import kotlinx.coroutines.Dispatchers @@ -16,7 +16,7 @@ import kotlinx.coroutines.withContext class InstalledAppsViewModel( private val installedAppsRepository: InstalledAppRepository, private val pm: PM, - val shizukuApi: ShizukuApi + val shizukuService: ShizukuService ) : ViewModel() { val apps = installedAppsRepository.getAll().flowOn(Dispatchers.IO) diff --git a/app/src/main/java/app/revanced/manager/ui/viewmodel/InstallerViewModel.kt b/app/src/main/java/app/revanced/manager/ui/viewmodel/InstallerViewModel.kt index 7898a87..9da1799 100644 --- a/app/src/main/java/app/revanced/manager/ui/viewmodel/InstallerViewModel.kt +++ b/app/src/main/java/app/revanced/manager/ui/viewmodel/InstallerViewModel.kt @@ -28,7 +28,7 @@ import app.revanced.manager.patcher.worker.PatcherProgressManager import app.revanced.manager.patcher.worker.PatcherWorker import app.revanced.manager.patcher.worker.Step import app.revanced.manager.service.InstallService -import app.revanced.manager.service.ShizukuApi +import app.revanced.manager.service.ShizukuService import app.revanced.manager.service.UninstallService import app.revanced.manager.ui.destination.Destination import app.revanced.manager.util.PM @@ -56,7 +56,7 @@ class InstallerViewModel(input: Destination.Installer) : ViewModel(), KoinCompon private val workerRepository: WorkerRepository by inject() private val installedAppReceiver: InstalledAppRepository by inject() - private val shizukuApi: ShizukuApi by inject() + private val shizukuService: ShizukuService by inject() val prefs: PreferencesManager by inject() val packageName: String = input.selectedApp.packageName private val outputFile = File(app.cacheDir, "output.apk") @@ -210,7 +210,7 @@ class InstallerViewModel(input: Destination.Installer) : ViewModel(), KoinCompon pm.installApp(listOf(signedFile)) } PreferencesManager.InstallerManager.SHIZUKU -> { - shizukuApi.installPackage(signedFile) + shizukuService.installPackage(signedFile) } PreferencesManager.InstallerManager.ROOT -> { // RootApi.installPackage(signedFile)