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)
// 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)
}

View File

@ -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"

View File

@ -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()

View File

@ -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

View File

@ -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)
}
},

View File

@ -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,

View File

@ -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()

View File

@ -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

View File

@ -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)

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="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>

View File

@ -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" }