mirror of
https://github.com/revanced/revanced-manager-compose
synced 2025-02-21 18:41:10 +01:00
i will robert suffer with di :trol:
This commit is contained in:
parent
f618fd2059
commit
08402c104c
@ -146,7 +146,7 @@ dependencies {
|
||||
implementation(libs.markdown)
|
||||
|
||||
// Shizuku
|
||||
implementation("dev.rikka.shizuku:api:13.1.2")
|
||||
implementation("dev.rikka.shizuku:provider:13.1.2")
|
||||
compileOnly("dev.rikka.hidden:stub:4.2.0")
|
||||
implementation(libs.shizuku.api)
|
||||
implementation(libs.shizuku.provider)
|
||||
compileOnly(libs.hidden.stub)
|
||||
}
|
||||
|
@ -62,7 +62,7 @@
|
||||
</provider>
|
||||
<provider
|
||||
android:name="rikka.shizuku.ShizukuProvider"
|
||||
android:authorities="app.revanced.manager.shizuku"
|
||||
android:authorities="${applicationId}.shizuku"
|
||||
android:enabled="true"
|
||||
android:exported="true"
|
||||
android:multiprocess="false"
|
||||
|
@ -12,12 +12,10 @@ import kotlinx.coroutines.launch
|
||||
import me.zhanghai.android.appiconloader.coil.AppIconFetcher
|
||||
import me.zhanghai.android.appiconloader.coil.AppIconKeyer
|
||||
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.androidLogger
|
||||
import org.koin.androidx.workmanager.koin.workManagerFactory
|
||||
import org.koin.core.context.startKoin
|
||||
lateinit var rvmApp: ManagerApplication
|
||||
|
||||
class ManagerApplication : Application() {
|
||||
private val scope = MainScope()
|
||||
@ -26,9 +24,6 @@ class ManagerApplication : Application() {
|
||||
override fun onCreate() {
|
||||
super.onCreate()
|
||||
|
||||
rvmApp = this
|
||||
ShizukuApi.init()
|
||||
|
||||
startKoin {
|
||||
androidContext(this@ManagerApplication)
|
||||
androidLogger()
|
||||
|
@ -1,21 +1,23 @@
|
||||
package app.revanced.manager.service
|
||||
|
||||
import android.app.Application
|
||||
import android.content.Intent
|
||||
import android.content.pm.PackageManager
|
||||
import androidx.compose.runtime.getValue
|
||||
import androidx.compose.runtime.mutableStateOf
|
||||
import androidx.compose.runtime.setValue
|
||||
import androidx.core.content.FileProvider
|
||||
import app.revanced.manager.rvmApp
|
||||
import rikka.shizuku.Shizuku
|
||||
import java.io.File
|
||||
|
||||
object ShizukuApi {
|
||||
class ShizukuApi(
|
||||
private val app: Application
|
||||
) {
|
||||
|
||||
var isBinderAvailable = false
|
||||
var isPermissionGranted by mutableStateOf(false)
|
||||
|
||||
fun init() {
|
||||
init {
|
||||
Shizuku.addBinderReceivedListenerSticky {
|
||||
isBinderAvailable = true
|
||||
isPermissionGranted = Shizuku.checkSelfPermission() == PackageManager.PERMISSION_GRANTED
|
||||
@ -27,12 +29,12 @@ object ShizukuApi {
|
||||
}
|
||||
|
||||
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 {
|
||||
addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
|
||||
addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
|
||||
}
|
||||
rvmApp.startActivity(intent)
|
||||
app.startActivity(intent)
|
||||
}
|
||||
|
||||
fun isShizukuPermissionGranted() = isBinderAvailable && isPermissionGranted
|
||||
|
@ -31,13 +31,17 @@ import app.revanced.manager.R
|
||||
import app.revanced.manager.service.ShizukuApi
|
||||
import rikka.shizuku.Shizuku
|
||||
|
||||
private val listener: (Int, Int) -> Unit = { _, grantResult ->
|
||||
ShizukuApi.isPermissionGranted = grantResult == PackageManager.PERMISSION_GRANTED
|
||||
}
|
||||
|
||||
@OptIn(ExperimentalMaterial3Api::class)
|
||||
@Composable
|
||||
fun ShizukuCard() {
|
||||
fun ShizukuCard(
|
||||
shizukuApi: ShizukuApi
|
||||
) {
|
||||
|
||||
val listener: (Int, Int) -> Unit = { _, grantResult ->
|
||||
shizukuApi.isPermissionGranted = grantResult == PackageManager.PERMISSION_GRANTED
|
||||
}
|
||||
|
||||
LaunchedEffect(Unit) {
|
||||
Shizuku.addRequestPermissionResultListener(listener)
|
||||
}
|
||||
@ -47,14 +51,14 @@ fun ShizukuCard() {
|
||||
}
|
||||
}
|
||||
|
||||
AnimatedVisibility(visible = !ShizukuApi.isPermissionGranted) {
|
||||
AnimatedVisibility(visible = !shizukuApi.isPermissionGranted) {
|
||||
Card(
|
||||
colors = CardDefaults.cardColors(
|
||||
MaterialTheme.colorScheme.errorContainer
|
||||
),
|
||||
onClick = {
|
||||
if (ShizukuApi.isBinderAvailable && !ShizukuApi.isPermissionGranted) {
|
||||
Log.e("ShizukuCard", "Requesting permission")
|
||||
if (shizukuApi.isBinderAvailable && !shizukuApi.isPermissionGranted) {
|
||||
Log.i("ShizukuCard", "Requesting permission")
|
||||
Shizuku.requestPermission(114514)
|
||||
}
|
||||
},
|
||||
|
@ -2,6 +2,7 @@ package app.revanced.manager.ui.screen
|
||||
|
||||
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
|
||||
@ -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.AppLabel
|
||||
import app.revanced.manager.ui.component.LoadingIndicator
|
||||
import app.revanced.manager.ui.component.ShizukuCard
|
||||
import app.revanced.manager.ui.viewmodel.InstalledAppsViewModel
|
||||
import org.koin.androidx.compose.getViewModel
|
||||
|
||||
@ -36,8 +38,17 @@ fun InstalledAppsScreen(
|
||||
horizontalAlignment = Alignment.CenterHorizontally,
|
||||
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()) {
|
||||
items(
|
||||
installedApps,
|
||||
|
@ -68,8 +68,11 @@ fun AdvancedSettingsScreen(
|
||||
}
|
||||
|
||||
if (showInstallerPicker) {
|
||||
InstallerPicker(onDismiss = { showInstallerPicker = false },
|
||||
onConfirm = { vm.setInstaller(it) })
|
||||
InstallerPicker(
|
||||
onDismiss = { showInstallerPicker = false },
|
||||
onConfirm = { vm.setInstaller(it) },
|
||||
viewModel = vm
|
||||
)
|
||||
}
|
||||
|
||||
Scaffold(topBar = {
|
||||
@ -183,7 +186,8 @@ private fun APIUrlDialog(currentUrl: String, onSubmit: (String?) -> Unit) {
|
||||
private fun InstallerPicker(
|
||||
onDismiss: () -> Unit,
|
||||
onConfirm: (PreferencesManager.InstallerManager) -> Unit,
|
||||
prefs: PreferencesManager = koinInject()
|
||||
prefs: PreferencesManager = koinInject(),
|
||||
viewModel: AdvancedSettingsViewModel
|
||||
) {
|
||||
var selectedInstaller by rememberSaveable { mutableStateOf(prefs.defaultInstaller.getBlocking()) }
|
||||
val context: Context = LocalContext.current
|
||||
@ -208,7 +212,7 @@ private fun InstallerPicker(
|
||||
},
|
||||
confirmButton = {
|
||||
Button(onClick = {
|
||||
if (selectedInstaller == PreferencesManager.InstallerManager.SHIZUKU && !ShizukuApi.isShizukuPermissionGranted()) {
|
||||
if (selectedInstaller == PreferencesManager.InstallerManager.SHIZUKU && viewModel.shizukuApi.isShizukuPermissionGranted()) {
|
||||
Toast.makeText(
|
||||
context, R.string.shizuku_unavailable, Toast.LENGTH_SHORT
|
||||
).show()
|
||||
|
@ -7,14 +7,17 @@ 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.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
|
||||
private val patchBundleRepository: PatchBundleRepository,
|
||||
val shizukuApi: ShizukuApi
|
||||
) : ViewModel() {
|
||||
val apiUrl = prefs.api
|
||||
|
||||
|
@ -5,6 +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.util.PM
|
||||
import app.revanced.manager.util.collectEach
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
@ -14,7 +15,8 @@ import kotlinx.coroutines.withContext
|
||||
|
||||
class InstalledAppsViewModel(
|
||||
private val installedAppsRepository: InstalledAppRepository,
|
||||
private val pm: PM
|
||||
private val pm: PM,
|
||||
val shizukuApi: ShizukuApi
|
||||
) : ViewModel() {
|
||||
val apps = installedAppsRepository.getAll().flowOn(Dispatchers.IO)
|
||||
|
||||
|
@ -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="shizuku_available">Shizuku service available</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="default_installer">Default</string>
|
||||
<string name="shizuku_installer">Shizuku</string>
|
||||
|
@ -26,7 +26,8 @@ aboutLibrariesGradlePlugin = "10.8.2"
|
||||
coil = "2.4.0"
|
||||
app-icon-loader-coil = "1.5.0"
|
||||
skrapeit = "1.2.1"
|
||||
|
||||
shizuku = "13.1.2"
|
||||
hidden = "4.2.0"
|
||||
[libraries]
|
||||
# AndroidX Core
|
||||
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 = { 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]
|
||||
android-application = { id = "com.android.application", version.ref = "androidGradlePlugin" }
|
||||
kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlinGradlePlugin" }
|
||||
|
Loading…
x
Reference in New Issue
Block a user