mirror of
https://github.com/ovrport/app.git
synced 2026-10-26 19:19:56 -04:00
refactor: UI code refactors
This commit is contained in:
1 parent
0aad2646fe
commit
47a2f5815d
7 files changed
+179
-161
No files matched your search
@@ -1,8 +1,5 @@
|
||||
package moe.crx.ovrport.ui
|
||||
|
||||
import androidx.compose.animation.AnimatedVisibility
|
||||
import androidx.compose.animation.fadeIn
|
||||
import androidx.compose.animation.fadeOut
|
||||
import androidx.compose.foundation.clickable
|
||||
import androidx.compose.foundation.layout.Row
|
||||
import androidx.compose.foundation.layout.fillMaxSize
|
||||
@@ -21,16 +18,14 @@ import androidx.compose.ui.platform.LocalUriHandler
|
||||
import androidx.compose.ui.unit.dp
|
||||
import androidx.compose.ui.unit.sp
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.delay
|
||||
import kotlinx.coroutines.withContext
|
||||
import moe.crx.ovrport.AndroidPlatform
|
||||
import moe.crx.ovrport.getCurrentVersion
|
||||
import moe.crx.ovrport.patch.Patch
|
||||
import moe.crx.ovrport.getPlatform
|
||||
import moe.crx.ovrport.model.GithubRelease
|
||||
import moe.crx.ovrport.patch.Constants
|
||||
import moe.crx.ovrport.patch.Patch
|
||||
import moe.crx.ovrport.ui.theme.OverportTheme
|
||||
import moe.crx.ovrport.utils.HttpUtil
|
||||
import org.jetbrains.compose.resources.painterResource
|
||||
import org.jetbrains.compose.resources.stringResource
|
||||
import overportapp.composeapp.generated.resources.Res
|
||||
@@ -82,11 +77,7 @@ fun AppContent(
|
||||
}
|
||||
},
|
||||
actions = {
|
||||
AnimatedVisibility(
|
||||
versionToUpdate?.name != null && versionToUpdate?.name != getCurrentVersion(),
|
||||
enter = fadeIn(),
|
||||
exit = fadeOut()
|
||||
) {
|
||||
FadeVisibility(versionToUpdate?.name != null && versionToUpdate?.name != getCurrentVersion()) {
|
||||
Row(
|
||||
verticalAlignment = Alignment.CenterVertically, modifier = Modifier.clip(
|
||||
RoundedCornerShape(16.dp)
|
||||
@@ -115,21 +106,13 @@ fun AppContent(
|
||||
val inProgress = viewModel.working
|
||||
val isPatcherVisible = viewModel.isApkLoaded() && !inProgress
|
||||
|
||||
AnimatedVisibility(
|
||||
!isPatcherVisible,
|
||||
enter = fadeIn(),
|
||||
exit = fadeOut()
|
||||
) {
|
||||
FadeVisibility(!isPatcherVisible) {
|
||||
StartingCard(innerPadding, inProgress) {
|
||||
onOpen()
|
||||
}
|
||||
}
|
||||
|
||||
AnimatedVisibility(
|
||||
isPatcherVisible,
|
||||
enter = fadeIn(),
|
||||
exit = fadeOut()
|
||||
) {
|
||||
FadeVisibility(isPatcherVisible) {
|
||||
ApplicationInfoCard(
|
||||
innerPadding,
|
||||
viewModel.currentAppName(),
|
||||
|
||||
@@ -0,0 +1,52 @@
|
||||
package moe.crx.ovrport.ui
|
||||
|
||||
import androidx.compose.foundation.Image
|
||||
import androidx.compose.foundation.layout.*
|
||||
import androidx.compose.foundation.shape.RoundedCornerShape
|
||||
import androidx.compose.material.icons.Icons
|
||||
import androidx.compose.material.icons.filled.Widgets
|
||||
import androidx.compose.material3.Icon
|
||||
import androidx.compose.material3.Text
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.draw.clip
|
||||
import androidx.compose.ui.graphics.ImageBitmap
|
||||
import androidx.compose.ui.unit.dp
|
||||
import org.jetbrains.compose.resources.stringResource
|
||||
import overportapp.composeapp.generated.resources.Res
|
||||
import overportapp.composeapp.generated.resources.unknown_package
|
||||
|
||||
@Composable
|
||||
fun ApplicationInfo(
|
||||
applicationName: String? = "Application",
|
||||
applicationPackage: String? = "com.company.application",
|
||||
applicationVersion: String? = "1.0.0",
|
||||
applicationIcon: ImageBitmap? = null,
|
||||
) {
|
||||
Row(
|
||||
horizontalArrangement = Arrangement.spacedBy(8.dp),
|
||||
) {
|
||||
if (applicationIcon == null) {
|
||||
Icon(
|
||||
Icons.Default.Widgets,
|
||||
contentDescription = null,
|
||||
modifier = Modifier.size(48.dp)
|
||||
)
|
||||
} else {
|
||||
Image(
|
||||
applicationIcon,
|
||||
contentDescription = null,
|
||||
modifier = Modifier.size(48.dp).clip(RoundedCornerShape(8.dp))
|
||||
)
|
||||
}
|
||||
Column(
|
||||
modifier = Modifier.height(48.dp),
|
||||
verticalArrangement = Arrangement.Center
|
||||
) {
|
||||
Text("$applicationName ($applicationVersion)")
|
||||
Text(
|
||||
applicationPackage ?: stringResource(Res.string.unknown_package),
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,103 +1,22 @@
|
||||
package moe.crx.ovrport.ui
|
||||
|
||||
import androidx.compose.foundation.Image
|
||||
import androidx.compose.foundation.clickable
|
||||
import androidx.compose.foundation.layout.*
|
||||
import androidx.compose.foundation.lazy.LazyColumn
|
||||
import androidx.compose.foundation.lazy.items
|
||||
import androidx.compose.foundation.shape.RoundedCornerShape
|
||||
import androidx.compose.material.icons.Icons
|
||||
import androidx.compose.material.icons.filled.Widgets
|
||||
import androidx.compose.material3.*
|
||||
import androidx.compose.runtime.*
|
||||
import androidx.compose.ui.Alignment
|
||||
import androidx.compose.material3.Button
|
||||
import androidx.compose.material3.Checkbox
|
||||
import androidx.compose.material3.ListItem
|
||||
import androidx.compose.material3.Text
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.runtime.mutableStateListOf
|
||||
import androidx.compose.runtime.remember
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.draw.clip
|
||||
import androidx.compose.ui.graphics.ImageBitmap
|
||||
import androidx.compose.ui.platform.LocalUriHandler
|
||||
import androidx.compose.ui.unit.dp
|
||||
import androidx.compose.ui.unit.sp
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.withContext
|
||||
import moe.crx.ovrport.patch.Constants.LOADING_COMPATIBILITY
|
||||
import moe.crx.ovrport.patch.Patch
|
||||
import moe.crx.ovrport.patch.PatchStore
|
||||
import moe.crx.ovrport.patch.getCompatibilityStatus
|
||||
import org.jetbrains.compose.resources.stringResource
|
||||
import org.jetbrains.compose.ui.tooling.preview.Preview
|
||||
import overportapp.composeapp.generated.resources.Res
|
||||
import overportapp.composeapp.generated.resources.unknown_package
|
||||
|
||||
@Composable
|
||||
fun ApplicationInfo(
|
||||
applicationName: String? = "Application",
|
||||
applicationPackage: String? = "com.company.application",
|
||||
applicationVersion: String? = "1.0.0",
|
||||
applicationIcon: ImageBitmap? = null,
|
||||
) {
|
||||
Row(
|
||||
horizontalArrangement = Arrangement.spacedBy(8.dp),
|
||||
) {
|
||||
if (applicationIcon == null) {
|
||||
Icon(
|
||||
Icons.Default.Widgets,
|
||||
contentDescription = null,
|
||||
modifier = Modifier.size(48.dp)
|
||||
)
|
||||
} else {
|
||||
Image(
|
||||
applicationIcon,
|
||||
contentDescription = null,
|
||||
modifier = Modifier.size(48.dp).clip(RoundedCornerShape(8.dp))
|
||||
)
|
||||
}
|
||||
Column(
|
||||
modifier = Modifier.height(48.dp),
|
||||
verticalArrangement = Arrangement.Center
|
||||
) {
|
||||
Text("$applicationName ($applicationVersion)")
|
||||
Text(
|
||||
applicationPackage ?: stringResource(Res.string.unknown_package),
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Composable
|
||||
fun ApplicationStatus(
|
||||
applicationName: String? = "Application",
|
||||
applicationPackage: String? = "",
|
||||
) {
|
||||
var statusInfo by remember(applicationPackage) { mutableStateOf(LOADING_COMPATIBILITY) }
|
||||
val urlHandler = LocalUriHandler.current
|
||||
|
||||
LaunchedEffect(applicationPackage) {
|
||||
withContext(Dispatchers.IO) {
|
||||
statusInfo = getCompatibilityStatus(applicationName, applicationPackage)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Card(colors = CardDefaults.cardColors(statusInfo.status.cardColor, statusInfo.status.contentColor)) {
|
||||
Row(
|
||||
verticalAlignment = Alignment.CenterVertically, modifier = Modifier.clip(
|
||||
RoundedCornerShape(16.dp)
|
||||
).clickable {
|
||||
urlHandler.openUri(statusInfo.url)
|
||||
}) {
|
||||
Icon(
|
||||
statusInfo.status.icon,
|
||||
contentDescription = null,
|
||||
modifier = Modifier.padding(16.dp),
|
||||
)
|
||||
Text(
|
||||
stringResource(statusInfo.status.nameResource),
|
||||
fontSize = 18.sp,
|
||||
modifier = Modifier.padding(0.dp, 16.dp, 16.dp, 16.dp),
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@OptIn(ExperimentalLayoutApi::class)
|
||||
@Composable
|
||||
|
||||
@@ -0,0 +1,57 @@
|
||||
package moe.crx.ovrport.ui
|
||||
|
||||
import androidx.compose.foundation.clickable
|
||||
import androidx.compose.foundation.layout.Row
|
||||
import androidx.compose.foundation.layout.padding
|
||||
import androidx.compose.foundation.shape.RoundedCornerShape
|
||||
import androidx.compose.material3.Card
|
||||
import androidx.compose.material3.CardDefaults
|
||||
import androidx.compose.material3.Icon
|
||||
import androidx.compose.material3.Text
|
||||
import androidx.compose.runtime.*
|
||||
import androidx.compose.ui.Alignment
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.draw.clip
|
||||
import androidx.compose.ui.platform.LocalUriHandler
|
||||
import androidx.compose.ui.unit.dp
|
||||
import androidx.compose.ui.unit.sp
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.withContext
|
||||
import moe.crx.ovrport.patch.Constants.LOADING_COMPATIBILITY
|
||||
import moe.crx.ovrport.patch.getCompatibilityStatus
|
||||
import org.jetbrains.compose.resources.stringResource
|
||||
|
||||
@Composable
|
||||
fun ApplicationStatus(
|
||||
applicationName: String? = "Application",
|
||||
applicationPackage: String? = "",
|
||||
) {
|
||||
var statusInfo by remember(applicationPackage) { mutableStateOf(LOADING_COMPATIBILITY) }
|
||||
val urlHandler = LocalUriHandler.current
|
||||
|
||||
LaunchedEffect(applicationPackage) {
|
||||
withContext(Dispatchers.IO) {
|
||||
statusInfo = getCompatibilityStatus(applicationName, applicationPackage)
|
||||
}
|
||||
}
|
||||
|
||||
Card(colors = CardDefaults.cardColors(statusInfo.status.cardColor, statusInfo.status.contentColor)) {
|
||||
Row(
|
||||
verticalAlignment = Alignment.CenterVertically, modifier = Modifier.clip(
|
||||
RoundedCornerShape(16.dp)
|
||||
).clickable {
|
||||
urlHandler.openUri(statusInfo.url)
|
||||
}) {
|
||||
Icon(
|
||||
statusInfo.status.icon,
|
||||
contentDescription = null,
|
||||
modifier = Modifier.padding(16.dp),
|
||||
)
|
||||
Text(
|
||||
stringResource(statusInfo.status.nameResource),
|
||||
fontSize = 18.sp,
|
||||
modifier = Modifier.padding(0.dp, 16.dp, 16.dp, 16.dp),
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,37 @@
|
||||
package moe.crx.ovrport.ui
|
||||
|
||||
import androidx.compose.animation.core.*
|
||||
import androidx.compose.material.icons.Icons
|
||||
import androidx.compose.material.icons.filled.Bolt
|
||||
import androidx.compose.material3.Icon
|
||||
import androidx.compose.runtime.*
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.draw.alpha
|
||||
import kotlinx.coroutines.delay
|
||||
|
||||
@Composable
|
||||
fun BreathingIcon(modifier: Modifier, duration: Int = 1500) {
|
||||
var isFaded by remember { mutableStateOf(false) }
|
||||
|
||||
val alpha by animateFloatAsState(
|
||||
targetValue = if (isFaded) 0.2f else 1f,
|
||||
animationSpec = infiniteRepeatable(
|
||||
animation = tween(durationMillis = duration, easing = LinearEasing),
|
||||
repeatMode = RepeatMode.Reverse
|
||||
),
|
||||
label = ""
|
||||
)
|
||||
|
||||
LaunchedEffect(Unit) {
|
||||
while (true) {
|
||||
isFaded = !isFaded
|
||||
delay(duration.toLong())
|
||||
}
|
||||
}
|
||||
|
||||
Icon(
|
||||
Icons.Default.Bolt,
|
||||
contentDescription = null,
|
||||
modifier = modifier.alpha(alpha)
|
||||
)
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
package moe.crx.ovrport.ui
|
||||
|
||||
import androidx.compose.animation.AnimatedVisibility
|
||||
import androidx.compose.animation.AnimatedVisibilityScope
|
||||
import androidx.compose.animation.fadeIn
|
||||
import androidx.compose.animation.fadeOut
|
||||
import androidx.compose.runtime.Composable
|
||||
|
||||
@Composable
|
||||
fun FadeVisibility(
|
||||
condition: Boolean,
|
||||
block: @Composable AnimatedVisibilityScope.() -> Unit
|
||||
) {
|
||||
AnimatedVisibility(
|
||||
condition,
|
||||
enter = fadeIn(),
|
||||
exit = fadeOut(),
|
||||
content = block
|
||||
)
|
||||
}
|
||||
@@ -1,36 +1,14 @@
|
||||
package moe.crx.ovrport.ui
|
||||
|
||||
import androidx.compose.animation.core.LinearEasing
|
||||
import androidx.compose.animation.core.RepeatMode
|
||||
import androidx.compose.animation.core.animateFloatAsState
|
||||
import androidx.compose.animation.core.infiniteRepeatable
|
||||
import androidx.compose.animation.core.tween
|
||||
import androidx.compose.foundation.clickable
|
||||
import androidx.compose.foundation.layout.Arrangement
|
||||
import androidx.compose.foundation.layout.Column
|
||||
import androidx.compose.foundation.layout.PaddingValues
|
||||
import androidx.compose.foundation.layout.fillMaxSize
|
||||
import androidx.compose.foundation.layout.height
|
||||
import androidx.compose.foundation.layout.padding
|
||||
import androidx.compose.foundation.layout.width
|
||||
import androidx.compose.foundation.layout.*
|
||||
import androidx.compose.foundation.shape.RoundedCornerShape
|
||||
import androidx.compose.material.icons.Icons
|
||||
import androidx.compose.material.icons.filled.Bolt
|
||||
import androidx.compose.material.icons.filled.Download
|
||||
import androidx.compose.material3.Card
|
||||
import androidx.compose.material3.CardDefaults
|
||||
import androidx.compose.material3.Icon
|
||||
import androidx.compose.material3.LocalContentColor
|
||||
import androidx.compose.material3.Text
|
||||
import androidx.compose.material3.*
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.runtime.LaunchedEffect
|
||||
import androidx.compose.runtime.getValue
|
||||
import androidx.compose.runtime.mutableStateOf
|
||||
import androidx.compose.runtime.remember
|
||||
import androidx.compose.runtime.setValue
|
||||
import androidx.compose.ui.Alignment
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.draw.alpha
|
||||
import androidx.compose.ui.draw.clip
|
||||
import androidx.compose.ui.draw.drawBehind
|
||||
import androidx.compose.ui.draw.rotate
|
||||
@@ -39,7 +17,6 @@ import androidx.compose.ui.graphics.Color
|
||||
import androidx.compose.ui.graphics.PathEffect
|
||||
import androidx.compose.ui.graphics.drawscope.Stroke
|
||||
import androidx.compose.ui.unit.dp
|
||||
import kotlinx.coroutines.delay
|
||||
import moe.crx.ovrport.AndroidPlatform
|
||||
import moe.crx.ovrport.getPlatform
|
||||
import org.jetbrains.compose.resources.stringResource
|
||||
@@ -125,30 +102,3 @@ fun StartingCard(
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Composable
|
||||
fun BreathingIcon(modifier: Modifier, duration: Int = 1500) {
|
||||
var isFaded by remember { mutableStateOf(false) }
|
||||
|
||||
val alpha by animateFloatAsState(
|
||||
targetValue = if (isFaded) 0.2f else 1f,
|
||||
animationSpec = infiniteRepeatable(
|
||||
animation = tween(durationMillis = duration, easing = LinearEasing),
|
||||
repeatMode = RepeatMode.Reverse
|
||||
),
|
||||
label = ""
|
||||
)
|
||||
|
||||
LaunchedEffect(Unit) {
|
||||
while (true) {
|
||||
isFaded = !isFaded
|
||||
delay(duration.toLong())
|
||||
}
|
||||
}
|
||||
|
||||
Icon(
|
||||
Icons.Default.Bolt,
|
||||
contentDescription = null,
|
||||
modifier = modifier.alpha(alpha)
|
||||
)
|
||||
}
|
||||
Reference in new issue
Block a user