added a settings screen skeleton

This commit is contained in:
Odweta
2024-11-30 09:52:32 +01:00
parent 509f7f33a7
commit 0a4ea395fd
7 changed files with 242 additions and 335 deletions
@@ -40,6 +40,7 @@ const val accountDataFilePath: String = "account_data.txt"
const val timeTableFilePath: String = "timetable.json"
const val userDataFilePath: String = "userdata.json"
const val marksFilePath: String = "marks.json"
const val settingsDataFilePath: String = "settings.txt"
lateinit var fileDir: File
var width: Int = 0
var height: Int = 0
@@ -55,7 +56,8 @@ enum class IsShowing {
Timetable,
Marks,
Menu,
About
About,
Settings
}
enum class Screen {
@@ -72,6 +74,44 @@ var isShowing: MutableState<IsShowing> = mutableStateOf(IsShowing.Timetable)
var toolbarText: MutableState<String> = mutableStateOf("")
// default settings (will get overwritten by the saved settings)
class Setting(auxId: SettingsId, auxName: String, auxChecked: Boolean) {
var id: SettingsId = auxId
var name: String = auxName
var checked: MutableState<Boolean> = mutableStateOf(auxChecked)
override fun toString() = "$id#$name#${checked.value}"
}
enum class SettingsId {
Svoboda,
Amoled,
RefreshButton
}
class SettingsData {
var useSvobodaMode: Setting = Setting(
SettingsId.Svoboda,
"Používat Svoboda mód",
false
)
var useAmoledMode: Setting = Setting(
SettingsId.Amoled,
"Používat AMOLED mód",
false
)
var showRefreshButton: Setting = Setting(
SettingsId.RefreshButton,
"Zobrazovat tlačítko obnovení dat",
true
)
override fun toString() = "$useSvobodaMode\n$useAmoledMode\n$showRefreshButton"
}
var settingsData: SettingsData = SettingsData()
var done: Boolean = false
var timeTableAvailOffline: Boolean = false
@@ -1,15 +1,11 @@
package com.odweta.solon
import android.app.Activity
import android.content.Context
import android.content.Intent
import android.widget.Toast
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch
import kotlinx.coroutines.delay
import org.json.JSONObject
import kotlin.math.cos
private var week: List<Day> = mutableListOf()
private var toastShowing: Boolean = false
@@ -145,7 +141,7 @@ private suspend fun launchPhase1(ctx: Context) {
toast2.show()
}
if (!timeTableAvailOffline || internetAvail) {
if (!timeTableAvailOffline || !marksAvailOffline || internetAvail) {
// set up the API (required for later uses of it)
Network.setupAPI()
@@ -173,6 +169,9 @@ private suspend fun launchPhase1(ctx: Context) {
marks = Parsing.parseMarksJSON(marksJSON)
// set the settings
settingsData = Util.stringToSettingsData(Util.fileToString(settingsDataFilePath))
// continue to launch phase 2
done = true
launchPhase2(ctx)
@@ -69,6 +69,7 @@ class MainActivity : ComponentActivity() {
IsShowing.Marks -> MarksScreen()
IsShowing.Menu -> MenuScreen()
IsShowing.About -> AboutScreen()
IsShowing.Settings -> SettingsScreen()
}
}
@@ -160,5 +160,29 @@ fun MenuScreen(modifier: Modifier = Modifier) {
fontSize = 23.sp
)
}
Spacer(modifier = Modifier.height(100.dp))
Button(onClick = {
isShowing.value = IsShowing.Settings
},
colors = ButtonDefaults.buttonColors(
contentColor = Color.White,
containerColor = Color.Black
),
modifier = Modifier
.border(
width = 5.dp,
shape = RoundedCornerShape(roundedCornerDimen),
color = PastelYellow
)
.width(230.dp)
.height(80.dp)
) {
Text(
text = "Nastavení",
fontSize = 23.sp
)
}
}
}
@@ -0,0 +1,149 @@
package com.odweta.solon
import android.util.Log
import androidx.activity.compose.BackHandler
import androidx.compose.foundation.background
import androidx.compose.foundation.border
import androidx.compose.foundation.clickable
import androidx.compose.foundation.gestures.scrollable
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
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.foundation.layout.size
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.foundation.verticalScroll
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.ArrowBackIosNew
import androidx.compose.material3.Button
import androidx.compose.material3.ButtonDefaults
import androidx.compose.material3.Icon
import androidx.compose.material3.Switch
import androidx.compose.material3.SwitchColors
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalUriHandler
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.text.style.TextDecoration
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import com.odweta.solon.ui.theme.PastelYellow
@Composable
fun SettingsScreen(modifier: Modifier = Modifier) {
// handle the back gesture (back swipe form side or back button on bottom android navbar)
BackHandler {
isShowing.value = IsShowing.Menu
}
val scrollState = rememberScrollState()
Column(modifier = Modifier
.fillMaxSize()
.background(color = Color.Black)
.verticalScroll(scrollState)
) {
Box(
modifier = Modifier
.fillMaxWidth()
.padding(start = 5.dp)
) {
Button(
onClick = {
isShowing.value = IsShowing.Menu
},
colors = ButtonDefaults.buttonColors(
contentColor = Color.White,
containerColor = Color.Black
),
modifier = Modifier
.border(
width = 5.dp,
shape = RoundedCornerShape(roundedCornerDimen),
color = PastelYellow
)
.width(70.dp)
.height(70.dp)
) {
Icon(
imageVector = Icons.Default.ArrowBackIosNew,
contentDescription = "Back icon",
modifier = Modifier.size(40.dp)
)
}
} // back button
Spacer(Modifier.height(10.dp))
SettingsTableRow(settingsData.useSvobodaMode)
Spacer(Modifier.height(10.dp))
SettingsTableRow(settingsData.useAmoledMode)
Spacer(Modifier.height(10.dp))
SettingsTableRow(settingsData.showRefreshButton)
}
}
@Composable
fun SettingsTableRow(setting: Setting) {
Row(
modifier = Modifier
.padding(10.dp)
.background(color = Color.Black, shape = RoundedCornerShape(roundedCornerDimen))
.fillMaxWidth(),
verticalAlignment = Alignment.CenterVertically
) {
Text(
text = setting.name,
textAlign = TextAlign.Start,
color = Color.White,
fontSize = 20.sp
)
Spacer(modifier = Modifier.weight(1f))
Switch(
checked = setting.checked.value,
onCheckedChange = {
setting.checked.value = it
when (setting.id) {
SettingsId.Svoboda -> settingsData.useSvobodaMode = setting
SettingsId.Amoled -> settingsData.useAmoledMode = setting
SettingsId.RefreshButton -> settingsData.showRefreshButton = setting
}
Util.saveStringToFile(settingsDataFilePath, settingsData.toString())
},
colors = SwitchColors(
uncheckedThumbColor = Color.Black,
uncheckedTrackColor = Color.DarkGray,
uncheckedBorderColor = Color.DarkGray,
checkedThumbColor = Color.Black,
checkedTrackColor = PastelYellow,
checkedBorderColor = PastelYellow,
checkedIconColor = Color.White,
uncheckedIconColor = Color.White,
disabledCheckedThumbColor = Color.Black,
disabledCheckedTrackColor = Color.Black,
disabledCheckedBorderColor = Color.Black,
disabledCheckedIconColor = Color.Black,
disabledUncheckedThumbColor = Color.Black,
disabledUncheckedTrackColor = Color.Black,
disabledUncheckedBorderColor = Color.Black,
disabledUncheckedIconColor = Color.Black
)
)
}
}
@@ -17,6 +17,7 @@ import android.net.NetworkCapabilities
import android.os.Build
import android.os.Handler
import android.util.DisplayMetrics
import android.util.Log
import android.view.WindowManager
import android.view.animation.AnimationUtils
import android.widget.Button
@@ -248,5 +249,27 @@ class Util {
null
}
}
fun stringToSettingsData(s: String): SettingsData {
val settings = s.split("\n")
val auxSettingsData = SettingsData()
val useSvobodaMode = settings[0].split("#")
val useAmoledMode = settings[1].split("#")
val showRefreshButton = settings[2].split("#")
auxSettingsData.useSvobodaMode.id = SettingsId.Svoboda
auxSettingsData.useSvobodaMode.name = useSvobodaMode[1]
auxSettingsData.useSvobodaMode.checked.value = useSvobodaMode[2].toBoolean()
auxSettingsData.useAmoledMode.id = SettingsId.Amoled
auxSettingsData.useAmoledMode.name = useAmoledMode[1]
auxSettingsData.useAmoledMode.checked.value = useAmoledMode[2].toBoolean()
auxSettingsData.showRefreshButton.id = SettingsId.RefreshButton
auxSettingsData.showRefreshButton.name = showRefreshButton[1]
auxSettingsData.showRefreshButton.checked.value = showRefreshButton[2].toBoolean()
return auxSettingsData
}
}
}