Finished PLZ Inputs and saving

This commit is contained in:
Lorenz Hohermuth 2025-03-23 15:56:07 +01:00
parent e0581c3fa7
commit 2c7dc727d3
3 changed files with 119 additions and 27 deletions

View File

@ -1,5 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="GradleMigrationSettings" migrationVersion="1" />
<component name="GradleSettings">
<option name="linkedExternalProjectsSettings">
<GradleProjectSettings>

View File

@ -2,6 +2,7 @@ plugins {
alias(libs.plugins.android.application)
alias(libs.plugins.kotlin.android)
alias(libs.plugins.kotlin.compose)
id("kotlin-parcelize")
}
android {
@ -60,4 +61,9 @@ dependencies {
androidTestImplementation(libs.androidx.ui.test.junit4)
debugImplementation(libs.androidx.ui.tooling)
debugImplementation(libs.androidx.ui.test.manifest)
implementation("androidx.datastore:datastore-preferences:1.0.0")
implementation("androidx.datastore:datastore:1.0.0")
implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.5.1") // For JSON serialization
}

View File

@ -1,5 +1,6 @@
package com.module.breeze
import android.content.Context
import android.content.Intent
import android.os.Bundle
@ -16,12 +17,17 @@ import androidx.compose.foundation.layout.width
import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.material.icons.outlined.Home
import androidx.compose.material.icons.outlined.Map
import androidx.compose.material3.CircularProgressIndicator
import androidx.compose.material3.Icon
import androidx.compose.material3.ModalBottomSheet
import androidx.compose.material3.Scaffold
import androidx.compose.material3.Text
import androidx.compose.material3.TextField
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.platform.LocalContext
@ -29,8 +35,58 @@ import androidx.compose.ui.text.input.KeyboardType
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import androidx.datastore.core.DataStore
import androidx.datastore.preferences.core.Preferences
import androidx.datastore.preferences.core.edit
import androidx.datastore.preferences.core.stringPreferencesKey
import androidx.datastore.preferences.preferencesDataStore
import com.module.breeze.ui.theme.BreezeTheme
import java.nio.file.WatchEvent
import kotlinx.coroutines.flow.first
import kotlinx.serialization.encodeToString
import kotlinx.serialization.json.Json
var plzArrayStatus: List<String> = listOf(
"Loading...",
"Loading...",
"Loading...",
"Loading...",
"Loading...",
"Loading...",
"Loading...",
)
// ### Start ChatGPT + Fixing
val SHARED_PLZ_KEY = stringPreferencesKey("shared-plz")
val Context.dataStore: DataStore<Preferences> by preferencesDataStore(name = "settings")
suspend fun saveArray(context: Context, array: List<String>) {
context.dataStore.edit { preferences ->
preferences[SHARED_PLZ_KEY] = Json.encodeToString(array)
}
}
suspend fun getArray(context: Context): List<String> {
val preferences = context.dataStore.data.first()
return preferences[SHARED_PLZ_KEY]?.let { Json.decodeFromString(it) } ?: emptyList()
}
// ### End ChatGPT
suspend fun getPLZ(index: Int, ctx: Context): String {
var arr = getArray(ctx)
if (arr.isEmpty() || arr.size != 7) {
arr = listOf("8005", "8005", "8005", "8400", "8400", "8500", "8500")
}
plzArrayStatus = arr
return arr[index]
}
suspend fun setPLZ(index: Int, value: String, ctx: Context) {
var arr = plzArrayStatus.toMutableList()
arr[index] = value
saveArray(ctx, arr)
}
class SettingsActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
@ -52,14 +108,17 @@ class SettingsActivity : ComponentActivity() {
var intent = Intent(ctx, MainActivity::class.java)
ctx.startActivity(intent)
}
}
}
@Composable
fun Settings(modifier: Modifier = Modifier) {
val ctx = LocalContext.current
Navigation(iconStyle.Home, "Home Icon", onClick = {
SettingsActivity.openHome(ctx)
SettingsActivity.openHome(ctx)
})
Column(
modifier = Modifier.fillMaxSize(),
@ -83,13 +142,13 @@ fun Settings(modifier: Modifier = Modifier) {
fontSize = 22.sp
)
}
ConfiguredLocationDay("Monday")
ConfiguredLocationDay("Tuesday")
ConfiguredLocationDay("Wednesday")
ConfiguredLocationDay("Thursday")
ConfiguredLocationDay("Friday")
ConfiguredLocationDay("Saturday")
ConfiguredLocationDay("Sunday")
ConfiguredLocationDay("Monday", 0, ctx)
ConfiguredLocationDay("Tuesday", 1, ctx)
ConfiguredLocationDay("Wednesday", 2, ctx)
ConfiguredLocationDay("Thursday", 3, ctx)
ConfiguredLocationDay("Friday", 4, ctx)
ConfiguredLocationDay("Saturday", 5, ctx)
ConfiguredLocationDay("Sunday", 6, ctx)
}
}
@ -102,22 +161,48 @@ fun GreetingPreview2() {
}
@Composable
fun ConfiguredLocationDay(dayName: String = "day") {
Row(
verticalAlignment = Alignment.CenterVertically,
modifier = Modifier.padding(0.dp, 4.dp)
) {
Text(
text = dayName,
fontWeight = breezeFontWeight,
modifier = Modifier.width(100.dp)
)
TextField(
value = "0000",
onValueChange = {},
label = { Text("PLZ") },
keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number),
modifier = Modifier.width(110.dp)
)
fun ConfiguredLocationDay(dayName: String = "day", index: Int, ctx: Context) {
var plz by remember { mutableStateOf("") }
var isLoadingGet by remember { mutableStateOf(false) }
var isLoadingSet by remember { mutableStateOf(false) }
LaunchedEffect(index) {
isLoadingGet = true
plz = getPLZ(index, ctx)
isLoadingGet = false
}
LaunchedEffect(plz) {
isLoadingSet = true
setPLZ(index, plz, ctx)
isLoadingSet = false
}
if (isLoadingSet || isLoadingGet) {
CircularProgressIndicator()
} else {
Row(
verticalAlignment = Alignment.CenterVertically,
modifier = Modifier.padding(0.dp, 4.dp)
) {
Text(
text = dayName,
fontWeight = breezeFontWeight,
modifier = Modifier.width(100.dp)
)
TextField(
value = plz,
onValueChange = { newPlz ->
var cutNewPlz = newPlz
if (newPlz.length > 4) {
cutNewPlz = newPlz.substring(0, 4)
}
plz = cutNewPlz
},
label = { Text("PLZ") },
keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number),
modifier = Modifier.width(110.dp)
)
}
}
}