diff --git a/build.gradle.kts b/build.gradle.kts index 0401669..c3f6689 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -14,15 +14,25 @@ buildscript { } } -val repo = FileRepository(rootProject.file(".git")) -val refId = repo.refDatabase.exactRef("refs/remotes/origin/lsp").objectId!! -val commitCount = Git(repo).log().add(refId).call().count() +val commitCount = run { + val repo = FileRepository(rootProject.file(".git")) + val refId = repo.refDatabase.exactRef("refs/remotes/origin/lsp").objectId!! + Git(repo).log().add(refId).call().count() +} + +val coreCommitCount = run { + val repo = FileRepository(rootProject.file("core/.git")) + val refId = repo.refDatabase.exactRef("refs/remotes/origin/lspatch").objectId!! + Git(repo).log().add(refId).call().count() +} // sync from https://github.com/LSPosed/LSPosed/blob/master/build.gradle.kts val defaultManagerPackageName by extra("org.lsposed.lspatch") val apiCode by extra(93) val verCode by extra(commitCount) val verName by extra("0.3") +val coreVerCode by extra(coreCommitCount + 4200) +val coreVerName by extra("1.7.2") val androidMinSdkVersion by extra(28) val androidTargetSdkVersion by extra(32) val androidCompileSdkVersion by extra(32) diff --git a/manager/build.gradle.kts b/manager/build.gradle.kts index 4b96c8d..1647b25 100644 --- a/manager/build.gradle.kts +++ b/manager/build.gradle.kts @@ -5,8 +5,11 @@ val androidMinSdkVersion: Int by rootProject.extra val androidTargetSdkVersion: Int by rootProject.extra val defaultManagerPackageName: String by rootProject.extra +val apiCode: Int by rootProject.extra val verCode: Int by rootProject.extra val verName: String by rootProject.extra +val coreVerCode: Int by rootProject.extra +val coreVerName: String by rootProject.extra val androidSourceCompatibility: JavaVersion by rootProject.extra val androidTargetCompatibility: JavaVersion by rootProject.extra @@ -26,6 +29,10 @@ android { targetSdk = androidTargetSdkVersion versionCode = verCode versionName = verName + + buildConfigField("int", "API_CODE", """$apiCode""") + buildConfigField("int", "CORE_VERSION_CODE", """$coreVerCode""") + buildConfigField("String", "CORE_VERSION_NAME", """"$coreVerName"""") } buildTypes { diff --git a/manager/src/main/java/org/lsposed/lspatch/ui/activity/MainActivity.kt b/manager/src/main/java/org/lsposed/lspatch/ui/activity/MainActivity.kt index 7f3e273..04ca23d 100644 --- a/manager/src/main/java/org/lsposed/lspatch/ui/activity/MainActivity.kt +++ b/manager/src/main/java/org/lsposed/lspatch/ui/activity/MainActivity.kt @@ -70,7 +70,7 @@ private fun MainNavHost(navController: NavHostController, modifier: Modifier) { @Composable private fun MainNavigationBar(page: PageList, onClick: (PageList) -> Unit) { NavigationBar(tonalElevation = 8.dp) { - arrayOf(PageList.Home, PageList.Manage, PageList.Repo, PageList.Settings).forEach { + arrayOf(PageList.Repo, PageList.Manage, PageList.Home, PageList.Logs, PageList.Settings).forEach { NavigationBarItem( selected = page == it, onClick = { onClick(it) }, diff --git a/manager/src/main/java/org/lsposed/lspatch/ui/page/HomePage.kt b/manager/src/main/java/org/lsposed/lspatch/ui/page/HomePage.kt index 4a08b3a..e040150 100644 --- a/manager/src/main/java/org/lsposed/lspatch/ui/page/HomePage.kt +++ b/manager/src/main/java/org/lsposed/lspatch/ui/page/HomePage.kt @@ -1,26 +1,122 @@ package org.lsposed.lspatch.ui.page -import androidx.compose.material3.ExperimentalMaterial3Api -import androidx.compose.material3.Scaffold -import androidx.compose.material3.SmallTopAppBar -import androidx.compose.material3.Text +import android.content.ClipData +import android.content.ClipboardManager +import android.content.Context +import android.os.Build +import androidx.compose.foundation.layout.* +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll +import androidx.compose.material3.* import androidx.compose.runtime.Composable +import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.font.FontFamily +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import kotlinx.coroutines.launch +import org.lsposed.lspatch.BuildConfig import org.lsposed.lspatch.R @OptIn(ExperimentalMaterial3Api::class) @Composable fun HomePage() { + val snackbarHostState = remember { SnackbarHostState() } Scaffold( - topBar = { TopBar() } + topBar = { TopBar() }, + snackbarHost = { SnackbarHost(snackbarHostState) } ) { innerPadding -> - + Column( + modifier = Modifier + .padding(innerPadding) + .padding(horizontal = 16.dp) + .verticalScroll(rememberScrollState()) + ) { + InfoCard(snackbarHostState) + } } } +@Preview @Composable private fun TopBar() { - SmallTopAppBar( - title = { Text(stringResource(R.string.app_name)) } + CenterAlignedTopAppBar( + title = { + Text( + text = stringResource(R.string.app_name), + color = MaterialTheme.colorScheme.primary, + fontWeight = FontWeight.Bold, + fontFamily = FontFamily.Monospace, + style = MaterialTheme.typography.titleMedium + ) + }, ) } + +private val apiVersion = if (Build.VERSION.PREVIEW_SDK_INT != 0) { + "${Build.VERSION.CODENAME} Preview (API ${Build.VERSION.PREVIEW_SDK_INT})" +} else { + "${Build.VERSION.RELEASE} (API ${Build.VERSION.SDK_INT})" +} + +private val device = buildString { + append(Build.MANUFACTURER[0].uppercaseChar().toString() + Build.MANUFACTURER.substring(1)) + if (Build.BRAND != Build.MANUFACTURER) { + append(" " + Build.BRAND[0].uppercaseChar() + Build.BRAND.substring(1)) + } + append(" " + Build.MODEL + " ") +} + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +private fun InfoCard(snackbarHostState: SnackbarHostState) { + val context = LocalContext.current + val scope = rememberCoroutineScope() + Card { + Column( + modifier = Modifier + .fillMaxWidth() + .padding(start = 24.dp, top = 24.dp, end = 24.dp, bottom = 16.dp) + ) { + val contents = StringBuilder() + val infoCardContent: @Composable (Pair) -> Unit = { texts -> + contents.appendLine(texts.first).appendLine(texts.second).appendLine() + Text(text = texts.first, style = MaterialTheme.typography.bodyLarge) + Text(text = texts.second, style = MaterialTheme.typography.bodyMedium) + } + + infoCardContent(stringResource(R.string.home_api_version) to "${BuildConfig.API_CODE}") + + Spacer(Modifier.height(24.dp)) + infoCardContent(stringResource(R.string.home_lspatch_version) to BuildConfig.VERSION_NAME + " (${BuildConfig.VERSION_CODE})") + + Spacer(Modifier.height(24.dp)) + infoCardContent(stringResource(R.string.home_framework_version) to BuildConfig.CORE_VERSION_NAME + " (${BuildConfig.CORE_VERSION_CODE})") + + Spacer(Modifier.height(24.dp)) + infoCardContent(stringResource(R.string.home_system_version) to apiVersion) + + Spacer(Modifier.height(24.dp)) + infoCardContent(stringResource(R.string.home_device) to device) + + Spacer(Modifier.height(24.dp)) + infoCardContent(stringResource(R.string.home_system_abi) to Build.SUPPORTED_ABIS[0]) + + val copiedMessage = stringResource(R.string.home_info_copied) + TextButton( + modifier = Modifier.align(Alignment.End), + onClick = { + val cm = context.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager + cm.setPrimaryClip(ClipData.newPlainText("LSPatch", contents.toString())) + scope.launch { snackbarHostState.showSnackbar(copiedMessage) } + }, + content = { Text(stringResource(android.R.string.copy)) } + ) + } + } +} diff --git a/manager/src/main/java/org/lsposed/lspatch/ui/page/PageList.kt b/manager/src/main/java/org/lsposed/lspatch/ui/page/PageList.kt index 330ca59..4528d6e 100644 --- a/manager/src/main/java/org/lsposed/lspatch/ui/page/PageList.kt +++ b/manager/src/main/java/org/lsposed/lspatch/ui/page/PageList.kt @@ -35,7 +35,7 @@ enum class PageList( body = { HomePage() } ), Logs( - iconSelected = Icons.Filled.Assessment, + iconSelected = Icons.Filled.Assignment, iconNotSelected = Icons.Outlined.Assignment, body = {} ), diff --git a/manager/src/main/res/values/strings.xml b/manager/src/main/res/values/strings.xml index d165bb6..e980d60 100644 --- a/manager/src/main/res/values/strings.xml +++ b/manager/src/main/res/values/strings.xml @@ -6,6 +6,15 @@ Logs Settings + + API Version + LSPatch Version + Framework Version + System Version + Device + System ABI + Copied to clipboard + Manage