mirror of
https://github.com/revanced/revanced-manager-compose.git
synced 2025-04-30 06:14:25 +02: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)
|
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)
|
||||||
}
|
}
|
||||||
|
@ -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"
|
||||||
|
@ -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()
|
||||||
|
@ -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
|
||||||
|
@ -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)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -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,
|
||||||
|
@ -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()
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
@ -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)
|
||||||
|
|
||||||
|
@ -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>
|
||||||
|
@ -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" }
|
||||||
|
Loading…
x
Reference in New Issue
Block a user