Skip to content

Commit

Permalink
修正系统避让区域 (#18)
Browse files Browse the repository at this point in the history
* 修正系统避让区域

* 提升`appVersionCode`

* 修复重复避让
  • Loading branch information
MercuryGryph authored Jan 18, 2025
1 parent 522f994 commit 9a43e7f
Show file tree
Hide file tree
Showing 10 changed files with 755 additions and 502 deletions.
4 changes: 2 additions & 2 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ plugins {
}

val appVersion: String = "1.2.1"
val appVersionCode: String = "018"
val appVersionCode: String = "019"

val gitCommitId: String = try {
val stdout = ByteArrayOutputStream()
Expand Down Expand Up @@ -134,4 +134,4 @@ tasks.register("getCurrentAppVersion") {
doLast {
File("appVersion.txt").writeText(appVersion)
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,12 +21,15 @@ import android.os.Environment
import android.provider.MediaStore
import android.util.Log
import android.widget.Toast
import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableIntStateOf
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.setValue
import androidx.compose.ui.platform.LocalConfiguration
import androidx.compose.ui.unit.LayoutDirection
import androidx.compose.ui.unit.dp
import androidx.core.app.ActivityCompat
import androidx.core.app.NotificationCompat
import androidx.core.app.NotificationManagerCompat
Expand All @@ -48,6 +51,8 @@ import java.io.FileOutputStream
import java.io.InputStream

object GlobalViewModel : ViewModel() {
var windowInsetsPadding by mutableStateOf(PaddingValues(0.dp))

var isVpnServiceRunning by mutableStateOf(LocalVpnService.IsRunning)
var showMessageDialog by mutableStateOf(false)
var proberPlatform by mutableStateOf(ProberPlatform.DIVING_FISH)
Expand All @@ -68,10 +73,19 @@ class Application : Application() {
lateinit var configManager: ConfigManager
lateinit var proberContext: ProberContext
lateinit var db: AppDatabase

val isLandscape: Boolean
@Composable get() =
LocalConfiguration.current.orientation == Configuration.ORIENTATION_LANDSCAPE

val layoutDirection: LayoutDirection
@Composable get() =
if (LocalConfiguration.current.layoutDirection == Configuration.SCREENLAYOUT_LAYOUTDIR_RTL) {
LayoutDirection.Rtl
} else {
LayoutDirection.Ltr
}

override fun onCreate() {
super.onCreate()
createNotificationChannel()
Expand Down
136 changes: 77 additions & 59 deletions app/src/main/java/io/github/skydynamic/maiproberplus/ui/AppContent.kt
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import androidx.compose.animation.Crossfade
import androidx.compose.animation.core.tween
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding
Expand All @@ -31,11 +32,13 @@ import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import io.github.skydynamic.maiproberplus.Application.Companion.application
import io.github.skydynamic.maiproberplus.GlobalViewModel
import io.github.skydynamic.maiproberplus.core.utils.checkResourceComplete
import io.github.skydynamic.maiproberplus.ui.component.DownloadDialog
import io.github.skydynamic.maiproberplus.ui.component.InfoDialog
import io.github.skydynamic.maiproberplus.ui.component.WindowInsetsSpacer
import io.github.skydynamic.maiproberplus.ui.compose.bests.BestsImageGenerateCompose
import io.github.skydynamic.maiproberplus.ui.compose.scores.ScoreManagerCompose
import io.github.skydynamic.maiproberplus.ui.compose.setting.SettingCompose
Expand Down Expand Up @@ -72,72 +75,87 @@ fun AppContent() {
openInitDownloadDialog = true
}

if (application.isLandscape) {
Row(
modifier = Modifier
.fillMaxSize()
Scaffold(
Modifier.fillMaxSize()
) { insetsPadding ->
GlobalViewModel.windowInsetsPadding = insetsPadding

Box(
Modifier
.background(MaterialTheme.colorScheme.background)
) {
NavigationRail(
containerColor = NavigationBarDefaults.containerColor,
) {
items.forEachIndexed { index, item ->
NavigationRailItem(
icon = {
Icon(
if (GlobalViewModel.currentTab == index) selectedIcons[index] else unselectedIcons[index],
contentDescription = item
if (application.isLandscape) {
Row(
modifier = Modifier
.fillMaxSize()
) {
NavigationRail(
containerColor = NavigationBarDefaults.containerColor,
) {
items.forEachIndexed { index, item ->
NavigationRailItem(
icon = {
Icon(
if (GlobalViewModel.currentTab == index) selectedIcons[index] else unselectedIcons[index],
contentDescription = item
)
},
label = { Text(item) },
selected = GlobalViewModel.currentTab == index,
onClick = { GlobalViewModel.currentTab = index },
modifier = Modifier
.weight(1f)
)
},
label = { Text(item) },
selected = GlobalViewModel.currentTab == index,
onClick = { GlobalViewModel.currentTab = index },
}
}

Crossfade(
targetState = GlobalViewModel.currentTab,
animationSpec = tween(durationMillis = 500),
label = "pageCross",
modifier = Modifier
.weight(1f)
)
}
}

Crossfade(
targetState = GlobalViewModel.currentTab,
animationSpec = tween(durationMillis = 500),
label = "pageCross"
) { targetState ->
composeList[targetState]()
}
}
} else {
Scaffold(
modifier = Modifier.fillMaxSize(),
bottomBar = {
NavigationBar {
items.forEachIndexed { index, item ->
NavigationBarItem(
icon = {
Icon(
if (GlobalViewModel.currentTab == index) selectedIcons[index] else unselectedIcons[index],
contentDescription = item
)
},
label = { Text(item) },
selected = GlobalViewModel.currentTab == index,
onClick = { GlobalViewModel.currentTab = index }
)
.padding(
start = if (application.isLandscape) 0.dp else WindowInsetsSpacer.startPadding,
end = WindowInsetsSpacer.endPadding
)
) { targetState ->
composeList[targetState]()
}
}
}
) { padding ->
Box(
modifier = Modifier
.fillMaxSize()
.padding(padding)
) {
Crossfade(
targetState = GlobalViewModel.currentTab,
animationSpec = tween(durationMillis = 500),
label = "pageCross"
) { targetState ->
composeList[targetState]()
} else {
Column(
modifier = Modifier
.fillMaxSize()
) {
Crossfade(
targetState = GlobalViewModel.currentTab,
animationSpec = tween(durationMillis = 500),
label = "pageCross",
modifier = Modifier
.weight(1f)
.padding(
start = if (application.isLandscape) 0.dp else WindowInsetsSpacer.startPadding,
end = WindowInsetsSpacer.endPadding
)
) { targetState ->
composeList[targetState]()
}
NavigationBar {
items.forEachIndexed { index, item ->
NavigationBarItem(
icon = {
Icon(
if (GlobalViewModel.currentTab == index) selectedIcons[index] else unselectedIcons[index],
contentDescription = item
)
},
label = { Text(item) },
selected = GlobalViewModel.currentTab == index,
onClick = { GlobalViewModel.currentTab = index }
)
}
}
}
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
package io.github.skydynamic.maiproberplus.ui.component

import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.calculateEndPadding
import androidx.compose.foundation.layout.calculateStartPadding
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.width
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.Dp
import io.github.skydynamic.maiproberplus.Application.Companion.application
import io.github.skydynamic.maiproberplus.GlobalViewModel

object WindowInsetsSpacer {
val topPadding: Dp
get() = GlobalViewModel.windowInsetsPadding
.calculateTopPadding()

val bottomPadding: Dp
get() = GlobalViewModel.windowInsetsPadding
.calculateBottomPadding()

val startPadding: Dp
@Composable
get() = GlobalViewModel.windowInsetsPadding
.calculateStartPadding(
application.layoutDirection
)

val endPadding: Dp
@Composable
get() = GlobalViewModel.windowInsetsPadding
.calculateEndPadding(
application.layoutDirection
)

@Composable
fun StartPaddingSpacer(
modifier: Modifier = Modifier
) {
Spacer(
modifier.width(startPadding)
)
}

@Composable
fun EndPaddingSpacer(
modifier: Modifier = Modifier
) {
Spacer(
modifier.width(endPadding)
)
}

@Composable
fun TopPaddingSpacer(
modifier: Modifier = Modifier
) {
Spacer(
modifier.height(topPadding)
)
}

@Composable
fun BottomPaddingSpacer(
modifier: Modifier = Modifier
) {
Spacer(
modifier.height(bottomPadding)
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ import io.github.skydynamic.maiproberplus.core.prober.sendMessageToUi
import io.github.skydynamic.maiproberplus.core.utils.ChuniB30ImageGenerater
import io.github.skydynamic.maiproberplus.core.utils.MaimaiB50GenerateUtil
import io.github.skydynamic.maiproberplus.ui.component.ImagePreview
import io.github.skydynamic.maiproberplus.ui.component.WindowInsetsSpacer
import io.github.skydynamic.maiproberplus.ui.compose.scores.refreshScore
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
Expand Down Expand Up @@ -78,6 +79,8 @@ fun BestsImageGenerateCompose() {
.wrapContentHeight()
.verticalScroll(rememberScrollState())
) {
WindowInsetsSpacer.TopPaddingSpacer()

SingleChoiceSegmentedButtonRow(
modifier = Modifier
.padding(16.dp)
Expand Down Expand Up @@ -158,6 +161,10 @@ fun BestsImageGenerateCompose() {
}
}
}

if (application.isLandscape) {
WindowInsetsSpacer.BottomPaddingSpacer()
}
}
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,13 @@
package io.github.skydynamic.maiproberplus.ui.compose.scores

import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.SegmentedButton
import androidx.compose.material3.SegmentedButtonDefaults
import androidx.compose.material3.SingleChoiceSegmentedButtonRow
Expand All @@ -16,11 +19,13 @@ import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import io.github.skydynamic.maiproberplus.core.data.GameType
import io.github.skydynamic.maiproberplus.core.utils.checkResourceComplete
import io.github.skydynamic.maiproberplus.ui.component.DownloadDialog
import io.github.skydynamic.maiproberplus.ui.component.WindowInsetsSpacer
import io.github.skydynamic.maiproberplus.ui.compose.scores.chuni.ChuniScoreList
import io.github.skydynamic.maiproberplus.ui.compose.scores.maimai.MaimaiScoreList

Expand Down Expand Up @@ -57,11 +62,20 @@ fun ScoreManagerCompose() {
GameType.Chunithm -> ChuniScoreList(coroutineScope)
}
}

Box(
Modifier
.fillMaxWidth()
.height(WindowInsetsSpacer.topPadding)
.align(Alignment.TopCenter)
.background(MaterialTheme.colorScheme.surface.copy(alpha = 0.5f))
)

SingleChoiceSegmentedButtonRow(
modifier = Modifier
.fillMaxWidth()
.padding(horizontal = 32.dp, vertical = 16.dp)
.padding(top = WindowInsetsSpacer.topPadding)
) {
GameType.entries.forEach {
SegmentedButton(
Expand Down
Loading

0 comments on commit 9a43e7f

Please sign in to comment.