i will robert suffer with di :trol:

This commit is contained in:
Aunali321 2023-08-23 01:29:18 +05:30
parent f618fd2059
commit 08402c104c
11 changed files with 58 additions and 30 deletions

View File

@ -146,7 +146,7 @@ dependencies {
implementation(libs.markdown) implementation(libs.markdown)
// Shizuku // Shizuku
implementation("dev.rikka.shizuku:api:13.1.2") implementation(libs.shizuku.api)
implementation("dev.rikka.shizuku:provider:13.1.2") implementation(libs.shizuku.provider)
compileOnly("dev.rikka.hidden:stub:4.2.0") compileOnly(libs.hidden.stub)
} }

View File

@ -62,7 +62,7 @@
</provider> </provider>
<provider <provider
android:name="rikka.shizuku.ShizukuProvider" android:name="rikka.shizuku.ShizukuProvider"
android:authorities="app.revanced.manager.shizuku" android:authorities="${applicationId}.shizuku"
android:enabled="true" android:enabled="true"
android:exported="true" android:exported="true"
android:multiprocess="false" android:multiprocess="false"

View File

@ -12,12 +12,10 @@ import kotlinx.coroutines.launch
import me.zhanghai.android.appiconloader.coil.AppIconFetcher import me.zhanghai.android.appiconloader.coil.AppIconFetcher
import me.zhanghai.android.appiconloader.coil.AppIconKeyer import me.zhanghai.android.appiconloader.coil.AppIconKeyer
import org.koin.android.ext.android.inject import org.koin.android.ext.android.inject
import app.revanced.manager.service.ShizukuApi
import org.koin.android.ext.koin.androidContext import org.koin.android.ext.koin.androidContext
import org.koin.android.ext.koin.androidLogger import org.koin.android.ext.koin.androidLogger
import org.koin.androidx.workmanager.koin.workManagerFactory import org.koin.androidx.workmanager.koin.workManagerFactory
import org.koin.core.context.startKoin import org.koin.core.context.startKoin
lateinit var rvmApp: ManagerApplication
class ManagerApplication : Application() { class ManagerApplication : Application() {
private val scope = MainScope() private val scope = MainScope()
@ -26,9 +24,6 @@ class ManagerApplication : Application() {
override fun onCreate() { override fun onCreate() {
super.onCreate() super.onCreate()
rvmApp = this
ShizukuApi.init()
startKoin { startKoin {
androidContext(this@ManagerApplication) androidContext(this@ManagerApplication)
androidLogger() androidLogger()

View File

@ -1,21 +1,23 @@
package app.revanced.manager.service package app.revanced.manager.service
import android.app.Application
import android.content.Intent import android.content.Intent
import android.content.pm.PackageManager import android.content.pm.PackageManager
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.setValue import androidx.compose.runtime.setValue
import androidx.core.content.FileProvider import androidx.core.content.FileProvider
import app.revanced.manager.rvmApp
import rikka.shizuku.Shizuku import rikka.shizuku.Shizuku
import java.io.File import java.io.File
object ShizukuApi { class ShizukuApi(
private val app: Application
) {
var isBinderAvailable = false var isBinderAvailable = false
var isPermissionGranted by mutableStateOf(false) var isPermissionGranted by mutableStateOf(false)
fun init() { init {
Shizuku.addBinderReceivedListenerSticky { Shizuku.addBinderReceivedListenerSticky {
isBinderAvailable = true isBinderAvailable = true
isPermissionGranted = Shizuku.checkSelfPermission() == PackageManager.PERMISSION_GRANTED isPermissionGranted = Shizuku.checkSelfPermission() == PackageManager.PERMISSION_GRANTED
@ -27,12 +29,12 @@ object ShizukuApi {
} }
fun installPackage(file: File) { fun installPackage(file: File) {
val intent = Intent(Intent.ACTION_VIEW, FileProvider.getUriForFile(rvmApp, "app.revanced.manager.provider", file) val intent = Intent(Intent.ACTION_VIEW, FileProvider.getUriForFile(app, "app.revanced.manager.provider", file)
).apply { ).apply {
addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
} }
rvmApp.startActivity(intent) app.startActivity(intent)
} }
fun isShizukuPermissionGranted() = isBinderAvailable && isPermissionGranted fun isShizukuPermissionGranted() = isBinderAvailable && isPermissionGranted

View File

@ -31,13 +31,17 @@ import app.revanced.manager.R
import app.revanced.manager.service.ShizukuApi import app.revanced.manager.service.ShizukuApi
import rikka.shizuku.Shizuku import rikka.shizuku.Shizuku
private val listener: (Int, Int) -> Unit = { _, grantResult ->
ShizukuApi.isPermissionGranted = grantResult == PackageManager.PERMISSION_GRANTED
}
@OptIn(ExperimentalMaterial3Api::class) @OptIn(ExperimentalMaterial3Api::class)
@Composable @Composable
fun ShizukuCard() { fun ShizukuCard(
shizukuApi: ShizukuApi
) {
val listener: (Int, Int) -> Unit = { _, grantResult ->
shizukuApi.isPermissionGranted = grantResult == PackageManager.PERMISSION_GRANTED
}
LaunchedEffect(Unit) { LaunchedEffect(Unit) {
Shizuku.addRequestPermissionResultListener(listener) Shizuku.addRequestPermissionResultListener(listener)
} }
@ -47,14 +51,14 @@ fun ShizukuCard() {
} }
} }
AnimatedVisibility(visible = !ShizukuApi.isPermissionGranted) { AnimatedVisibility(visible = !shizukuApi.isPermissionGranted) {
Card( Card(
colors = CardDefaults.cardColors( colors = CardDefaults.cardColors(
MaterialTheme.colorScheme.errorContainer MaterialTheme.colorScheme.errorContainer
), ),
onClick = { onClick = {
if (ShizukuApi.isBinderAvailable && !ShizukuApi.isPermissionGranted) { if (shizukuApi.isBinderAvailable && !shizukuApi.isPermissionGranted) {
Log.e("ShizukuCard", "Requesting permission") Log.i("ShizukuCard", "Requesting permission")
Shizuku.requestPermission(114514) Shizuku.requestPermission(114514)
} }
}, },

View File

@ -2,6 +2,7 @@ package app.revanced.manager.ui.screen
import androidx.compose.foundation.clickable import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.size
import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.LazyColumn
@ -21,6 +22,7 @@ import app.revanced.manager.data.room.apps.installed.InstalledApp
import app.revanced.manager.ui.component.AppIcon import app.revanced.manager.ui.component.AppIcon
import app.revanced.manager.ui.component.AppLabel import app.revanced.manager.ui.component.AppLabel
import app.revanced.manager.ui.component.LoadingIndicator import app.revanced.manager.ui.component.LoadingIndicator
import app.revanced.manager.ui.component.ShizukuCard
import app.revanced.manager.ui.viewmodel.InstalledAppsViewModel import app.revanced.manager.ui.viewmodel.InstalledAppsViewModel
import org.koin.androidx.compose.getViewModel import org.koin.androidx.compose.getViewModel
@ -36,8 +38,17 @@ fun InstalledAppsScreen(
horizontalAlignment = Alignment.CenterHorizontally, horizontalAlignment = Alignment.CenterHorizontally,
verticalArrangement = installedApps?.let { if (it.isEmpty()) Arrangement.Center else Arrangement.Top } ?: Arrangement.Center verticalArrangement = installedApps?.let { if (it.isEmpty()) Arrangement.Center else Arrangement.Top } ?: Arrangement.Center
) { ) {
installedApps?.let { installedApps -> 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
)
}
}
installedApps?.let { installedApps ->
if (installedApps.isNotEmpty()) { if (installedApps.isNotEmpty()) {
items( items(
installedApps, installedApps,

View File

@ -68,8 +68,11 @@ fun AdvancedSettingsScreen(
} }
if (showInstallerPicker) { if (showInstallerPicker) {
InstallerPicker(onDismiss = { showInstallerPicker = false }, InstallerPicker(
onConfirm = { vm.setInstaller(it) }) onDismiss = { showInstallerPicker = false },
onConfirm = { vm.setInstaller(it) },
viewModel = vm
)
} }
Scaffold(topBar = { Scaffold(topBar = {
@ -183,7 +186,8 @@ private fun APIUrlDialog(currentUrl: String, onSubmit: (String?) -> Unit) {
private fun InstallerPicker( private fun InstallerPicker(
onDismiss: () -> Unit, onDismiss: () -> Unit,
onConfirm: (PreferencesManager.InstallerManager) -> Unit, onConfirm: (PreferencesManager.InstallerManager) -> Unit,
prefs: PreferencesManager = koinInject() prefs: PreferencesManager = koinInject(),
viewModel: AdvancedSettingsViewModel
) { ) {
var selectedInstaller by rememberSaveable { mutableStateOf(prefs.defaultInstaller.getBlocking()) } var selectedInstaller by rememberSaveable { mutableStateOf(prefs.defaultInstaller.getBlocking()) }
val context: Context = LocalContext.current val context: Context = LocalContext.current
@ -208,7 +212,7 @@ private fun InstallerPicker(
}, },
confirmButton = { confirmButton = {
Button(onClick = { Button(onClick = {
if (selectedInstaller == PreferencesManager.InstallerManager.SHIZUKU && !ShizukuApi.isShizukuPermissionGranted()) { if (selectedInstaller == PreferencesManager.InstallerManager.SHIZUKU && viewModel.shizukuApi.isShizukuPermissionGranted()) {
Toast.makeText( Toast.makeText(
context, R.string.shizuku_unavailable, Toast.LENGTH_SHORT context, R.string.shizuku_unavailable, Toast.LENGTH_SHORT
).show() ).show()

View File

@ -7,14 +7,17 @@ import app.revanced.manager.R
import app.revanced.manager.domain.manager.PreferencesManager import app.revanced.manager.domain.manager.PreferencesManager
import app.revanced.manager.domain.repository.PatchBundleRepository import app.revanced.manager.domain.repository.PatchBundleRepository
import app.revanced.manager.domain.bundles.RemotePatchBundle import app.revanced.manager.domain.bundles.RemotePatchBundle
import app.revanced.manager.service.ShizukuApi
import app.revanced.manager.util.uiSafe import app.revanced.manager.util.uiSafe
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import org.koin.compose.koinInject
class AdvancedSettingsViewModel( class AdvancedSettingsViewModel(
val prefs: PreferencesManager, val prefs: PreferencesManager,
private val app: Application, private val app: Application,
private val patchBundleRepository: PatchBundleRepository private val patchBundleRepository: PatchBundleRepository,
val shizukuApi: ShizukuApi
) : ViewModel() { ) : ViewModel() {
val apiUrl = prefs.api val apiUrl = prefs.api

View File

@ -5,6 +5,7 @@ import androidx.compose.runtime.mutableStateMapOf
import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewModelScope
import app.revanced.manager.domain.repository.InstalledAppRepository import app.revanced.manager.domain.repository.InstalledAppRepository
import app.revanced.manager.service.ShizukuApi
import app.revanced.manager.util.PM import app.revanced.manager.util.PM
import app.revanced.manager.util.collectEach import app.revanced.manager.util.collectEach
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
@ -14,7 +15,8 @@ import kotlinx.coroutines.withContext
class InstalledAppsViewModel( class InstalledAppsViewModel(
private val installedAppsRepository: InstalledAppRepository, private val installedAppsRepository: InstalledAppRepository,
private val pm: PM private val pm: PM,
val shizukuApi: ShizukuApi
) : ViewModel() { ) : ViewModel() {
val apps = installedAppsRepository.getAll().flowOn(Dispatchers.IO) val apps = installedAppsRepository.getAll().flowOn(Dispatchers.IO)

View File

@ -244,7 +244,7 @@
<string name="installing_message">Tap on <b>Update</b> when prompted. \n ReVanced Manager will close when updating.</string> <string name="installing_message">Tap on <b>Update</b> when prompted. \n ReVanced Manager will close when updating.</string>
<string name="shizuku_available">Shizuku service available</string> <string name="shizuku_available">Shizuku service available</string>
<string name="shizuku_unavailable">Shizuku service not connected</string> <string name="shizuku_unavailable">Shizuku service not connected</string>
<string name="home_shizuku_warning">Some functions unavailable</string> <string name="home_shizuku_warning">Some functions are unavailable</string>
<string name="installer_description">Choose the default installer</string> <string name="installer_description">Choose the default installer</string>
<string name="default_installer">Default</string> <string name="default_installer">Default</string>
<string name="shizuku_installer">Shizuku</string> <string name="shizuku_installer">Shizuku</string>

View File

@ -26,7 +26,8 @@ aboutLibrariesGradlePlugin = "10.8.2"
coil = "2.4.0" coil = "2.4.0"
app-icon-loader-coil = "1.5.0" app-icon-loader-coil = "1.5.0"
skrapeit = "1.2.1" skrapeit = "1.2.1"
shizuku = "13.1.2"
hidden = "4.2.0"
[libraries] [libraries]
# AndroidX Core # AndroidX Core
androidx-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "ktx" } androidx-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "ktx" }
@ -98,6 +99,12 @@ skrapeit-parser = { group = "it.skrape", name = "skrapeit-html-parser", version.
# Markdown # Markdown
markdown = { group = "org.jetbrains", name = "markdown", version.ref = "markdown" } markdown = { group = "org.jetbrains", name = "markdown", version.ref = "markdown" }
# Shizuku
shizuku-api = { group = "dev.rikka.shizuku", name = "api", version.ref = "shizuku" }
shizuku-provider = { group = "dev.rikka.shizuku", name = "provider", version.ref = "shizuku" }
hidden-stub = { group = "dev.rikka.hidden", name = "stub", version.ref = "hidden" }
[plugins] [plugins]
android-application = { id = "com.android.application", version.ref = "androidGradlePlugin" } android-application = { id = "com.android.application", version.ref = "androidGradlePlugin" }
kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlinGradlePlugin" } kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlinGradlePlugin" }