Add shizuku card

This commit is contained in:
Nullptr 2022-03-07 16:36:26 +08:00
parent 0154d6c364
commit e448f6115e
5 changed files with 99 additions and 3 deletions

View File

@ -104,4 +104,6 @@ dependencies {
implementation("com.google.accompanist:accompanist-permissions:0.24.2-alpha") implementation("com.google.accompanist:accompanist-permissions:0.24.2-alpha")
implementation("com.google.accompanist:accompanist-swiperefresh:0.24.2-alpha") implementation("com.google.accompanist:accompanist-swiperefresh:0.24.2-alpha")
implementation("com.google.android.material:material:1.5.0") implementation("com.google.android.material:material:1.5.0")
implementation("dev.rikka.shizuku:api:12.1.0")
implementation("dev.rikka.shizuku:provider:12.1.0")
} }

View File

@ -34,6 +34,14 @@
android:authorities="org.lsposed.lspatch.provider" android:authorities="org.lsposed.lspatch.provider"
android:enabled="true" android:enabled="true"
android:exported="true" /> android:exported="true" />
<provider
android:name="rikka.shizuku.ShizukuProvider"
android:authorities="org.lsposed.lspatch.shizuku"
android:multiprocess="false"
android:enabled="true"
android:exported="true"
android:permission="android.permission.INTERACT_ACROSS_USERS_FULL" />
</application> </application>
</manifest> </manifest>

View File

@ -1,11 +1,20 @@
package org.lsposed.lspatch package org.lsposed.lspatch
import android.app.Application import android.app.Application
import android.content.pm.PackageManager
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.setValue
import rikka.shizuku.Shizuku
const val TAG = "LSPatch Manager" const val TAG = "LSPatch Manager"
class LSPApplication : Application() { class LSPApplication : Application() {
companion object {
var shizukuGranted by mutableStateOf(Shizuku.checkSelfPermission() == PackageManager.PERMISSION_GRANTED)
}
override fun onCreate() { override fun onCreate() {
super.onCreate() super.onCreate()

View File

@ -3,14 +3,17 @@ package org.lsposed.lspatch.ui.page
import android.content.ClipData import android.content.ClipData
import android.content.ClipboardManager import android.content.ClipboardManager
import android.content.Context import android.content.Context
import android.content.pm.PackageManager
import android.os.Build import android.os.Build
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.* import androidx.compose.foundation.layout.*
import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll import androidx.compose.foundation.verticalScroll
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.outlined.CheckCircle
import androidx.compose.material.icons.outlined.Warning
import androidx.compose.material3.* import androidx.compose.material3.*
import androidx.compose.runtime.Composable import androidx.compose.runtime.*
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalContext
@ -21,8 +24,10 @@ import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import org.lsposed.lspatch.BuildConfig import org.lsposed.lspatch.BuildConfig
import org.lsposed.lspatch.LSPApplication
import org.lsposed.lspatch.R import org.lsposed.lspatch.R
import org.lsposed.lspatch.ui.util.HtmlText import org.lsposed.lspatch.ui.util.HtmlText
import rikka.shizuku.Shizuku
@OptIn(ExperimentalMaterial3Api::class) @OptIn(ExperimentalMaterial3Api::class)
@Composable @Composable
@ -38,6 +43,8 @@ fun HomePage() {
.padding(horizontal = 16.dp) .padding(horizontal = 16.dp)
.verticalScroll(rememberScrollState()) .verticalScroll(rememberScrollState())
) { ) {
ShizukuCard()
Spacer(Modifier.height(16.dp))
InfoCard(snackbarHostState) InfoCard(snackbarHostState)
Spacer(Modifier.height(16.dp)) Spacer(Modifier.height(16.dp))
SupportCard() SupportCard()
@ -61,6 +68,73 @@ private fun TopBar() {
) )
} }
private val listener: (Int, Int) -> Unit = { _, grantResult ->
LSPApplication.shizukuGranted = grantResult == PackageManager.PERMISSION_GRANTED
}
@OptIn(ExperimentalMaterial3Api::class)
@Composable
private fun ShizukuCard() {
val key = remember { true }
LaunchedEffect(key) {
Shizuku.addRequestPermissionResultListener(listener)
}
DisposableEffect(key) {
onDispose {
Shizuku.removeRequestPermissionResultListener(listener)
}
}
ElevatedCard(
modifier = Modifier.clickable {
if (!LSPApplication.shizukuGranted) {
Shizuku.requestPermission(114514)
}
},
containerColor = run {
if (LSPApplication.shizukuGranted) MaterialTheme.colorScheme.secondaryContainer
else MaterialTheme.colorScheme.errorContainer
}
) {
Row(
modifier = Modifier
.fillMaxWidth()
.padding(24.dp),
verticalAlignment = Alignment.CenterVertically
) {
if (LSPApplication.shizukuGranted) {
Icon(Icons.Outlined.CheckCircle, stringResource(R.string.home_shizuku_available))
Column(Modifier.padding(start = 20.dp)) {
Text(
text = stringResource(R.string.home_shizuku_available),
fontFamily = FontFamily.Serif,
style = MaterialTheme.typography.titleMedium
)
Spacer(Modifier.height(4.dp))
Text(
text = "API " + Shizuku.getVersion(),
style = MaterialTheme.typography.bodyMedium
)
}
} else {
Icon(Icons.Outlined.Warning, stringResource(R.string.home_shizuku_unavailable))
Column(Modifier.padding(start = 20.dp)) {
Text(
text = stringResource(R.string.home_shizuku_unavailable),
fontFamily = FontFamily.Serif,
style = MaterialTheme.typography.titleMedium
)
Spacer(Modifier.height(4.dp))
Text(
text = stringResource(R.string.home_shizuku_warning),
style = MaterialTheme.typography.bodyMedium
)
}
}
}
}
}
private val apiVersion = if (Build.VERSION.PREVIEW_SDK_INT != 0) { private val apiVersion = if (Build.VERSION.PREVIEW_SDK_INT != 0) {
"${Build.VERSION.CODENAME} Preview (API ${Build.VERSION.PREVIEW_SDK_INT})" "${Build.VERSION.CODENAME} Preview (API ${Build.VERSION.PREVIEW_SDK_INT})"
} else { } else {

View File

@ -7,6 +7,9 @@
<string name="page_settings">Settings</string> <string name="page_settings">Settings</string>
<!-- Home Page --> <!-- Home Page -->
<string name="home_shizuku_available">Shizuku service available</string>
<string name="home_shizuku_unavailable">Shizuku service not connected</string>
<string name="home_shizuku_warning">Some functions unavailable</string>
<string name="home_api_version">API Version</string> <string name="home_api_version">API Version</string>
<string name="home_lspatch_version">LSPatch Version</string> <string name="home_lspatch_version">LSPatch Version</string>
<string name="home_framework_version">Framework Version</string> <string name="home_framework_version">Framework Version</string>