Update colors
Add average to NotenActivity Fix Bugs in NotenActivity and FachActivity
This commit is contained in:
@@ -1,6 +1,8 @@
|
||||
package com.schoolapp.cleverclass
|
||||
|
||||
import android.content.Context
|
||||
import android.content.Intent
|
||||
import android.content.SharedPreferences
|
||||
import android.os.Bundle
|
||||
import androidx.activity.ComponentActivity
|
||||
import androidx.activity.compose.setContent
|
||||
@@ -12,28 +14,48 @@ 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.ArrowBack
|
||||
import androidx.compose.material3.BottomAppBar
|
||||
import androidx.compose.material3.Button
|
||||
import androidx.compose.material3.ButtonDefaults
|
||||
import androidx.compose.material3.ExperimentalMaterial3Api
|
||||
import androidx.compose.material3.Icon
|
||||
import androidx.compose.material3.IconButton
|
||||
import androidx.compose.material3.MaterialTheme
|
||||
import androidx.compose.material3.Scaffold
|
||||
import androidx.compose.material3.Surface
|
||||
import androidx.compose.material3.Text
|
||||
import androidx.compose.material3.TopAppBar
|
||||
import androidx.compose.material3.TopAppBarDefaults
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.runtime.DisposableEffect
|
||||
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.graphics.Color
|
||||
import androidx.compose.ui.unit.dp
|
||||
import com.schoolapp.cleverclass.ui.theme.CleverClassTheme
|
||||
import com.schoolapp.cleverclass.ui.theme.TextOnColouredButton
|
||||
|
||||
val subjects = listOf("Biologie","Chemie","Deutsch","Englisch","Ethik","Evangelisch","Französisch",
|
||||
"Geographie","Geschichte","Informatik","Katolisch","Kunst","Latein","Mathe","Musik","Physik",
|
||||
"Pulitik und Gesellschaft","Sport","Wirtschaft")
|
||||
|
||||
val colors = listOf(
|
||||
Color(0xFF69F0AE),
|
||||
Color(0xFFEEFF41),
|
||||
Color(0xFFFFAB40),
|
||||
Color(0xFF18FFFF),
|
||||
Color(0xFFB2FF59))
|
||||
|
||||
class NotenActivity : ComponentActivity() {
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
@@ -54,41 +76,91 @@ class NotenActivity : ComponentActivity() {
|
||||
@OptIn(ExperimentalMaterial3Api::class)
|
||||
@Composable
|
||||
fun NotenContent(activity: ComponentActivity){
|
||||
Column() {
|
||||
TopAppBar(
|
||||
colors = TopAppBarDefaults.centerAlignedTopAppBarColors(MaterialTheme.colorScheme.primaryContainer),
|
||||
title = {
|
||||
Text(text = "Noten",
|
||||
style = MaterialTheme.typography.headlineSmall
|
||||
)},
|
||||
navigationIcon = {
|
||||
IconButton(onClick = { activity.finish() }) {
|
||||
Icon(
|
||||
imageVector = Icons.Filled.ArrowBack,
|
||||
contentDescription = null,
|
||||
modifier = Modifier.size(28.dp)
|
||||
)
|
||||
}
|
||||
},
|
||||
modifier = Modifier.fillMaxWidth()
|
||||
)
|
||||
val sharedPreferences = activity.getSharedPreferences("gradeAverages", Context.MODE_PRIVATE)
|
||||
|
||||
Column(modifier = Modifier.verticalScroll(rememberScrollState())) {
|
||||
FachButton(color = Color(0xFF69F0AE), text = "Deutsch", 0, 3.66f, activity)
|
||||
FachButton(color = Color(0xFFEEFF41), text = "Mathe",2, 1.56f, activity)
|
||||
FachButton(color = Color(0xFFFFAB40), text = "Englisch",2, 2.27f, activity)
|
||||
FachButton(color = Color(0xFF18FFFF), text = "Latein",2, 4.75f, activity)
|
||||
FachButton(color = Color(0xFFB2FF59), text = "Französisch",2, 2.33f, activity)
|
||||
var allAverage by remember {
|
||||
mutableStateOf(calculateAllAverage(loadAllAverages(sharedPreferences)))
|
||||
}
|
||||
|
||||
Scaffold(
|
||||
topBar = {
|
||||
TopAppBar(
|
||||
colors = TopAppBarDefaults.centerAlignedTopAppBarColors(MaterialTheme.colorScheme.primaryContainer),
|
||||
title = {
|
||||
Text(text = "Noten",
|
||||
style = MaterialTheme.typography.headlineSmall,
|
||||
color = MaterialTheme.colorScheme.onPrimaryContainer
|
||||
)},
|
||||
navigationIcon = {
|
||||
IconButton(onClick = { activity.finish() }) {
|
||||
Icon(
|
||||
imageVector = Icons.Filled.ArrowBack,
|
||||
contentDescription = null,
|
||||
modifier = Modifier.size(28.dp),
|
||||
tint = MaterialTheme.colorScheme.onPrimaryContainer
|
||||
)
|
||||
}
|
||||
},
|
||||
modifier = Modifier.fillMaxWidth()
|
||||
)
|
||||
},
|
||||
bottomBar = {
|
||||
BottomAppBar(
|
||||
containerColor = MaterialTheme.colorScheme.primaryContainer,
|
||||
modifier = Modifier
|
||||
.fillMaxWidth()
|
||||
.height(64.dp)
|
||||
) {
|
||||
Row (modifier = Modifier
|
||||
.fillMaxWidth()
|
||||
.align(Alignment.CenterVertically)){
|
||||
Spacer(modifier = Modifier.width(16.dp))
|
||||
Text(text = "Gesamtschnitt:",
|
||||
style = MaterialTheme.typography.headlineSmall)
|
||||
Spacer(modifier = Modifier.weight(1f))
|
||||
Text(
|
||||
text = "Ø" + formatFloat(allAverage),
|
||||
style = MaterialTheme.typography.headlineSmall)
|
||||
Spacer(modifier = Modifier.width(16.dp))
|
||||
}
|
||||
}
|
||||
}
|
||||
) {innerPadding ->
|
||||
Column(modifier = Modifier
|
||||
.verticalScroll(rememberScrollState())
|
||||
.padding(innerPadding))
|
||||
{
|
||||
subjects.forEach { name ->
|
||||
FachButton(
|
||||
color = colors.random(),
|
||||
subject = name,
|
||||
saWeight = 2,
|
||||
activity = activity,
|
||||
sharedPreferences = sharedPreferences,
|
||||
onAvgChange = { allAverage = calculateAllAverage(loadAllAverages(sharedPreferences)) }
|
||||
)
|
||||
}
|
||||
Spacer(modifier = Modifier.height(16.dp))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Composable
|
||||
fun FachButton(color : Color, text : String, saWeight: Int, average : Float, activity : ComponentActivity){
|
||||
fun FachButton(
|
||||
color : Color,
|
||||
subject : String,
|
||||
saWeight: Int, activity :
|
||||
ComponentActivity,
|
||||
sharedPreferences: SharedPreferences,
|
||||
onAvgChange: () -> Unit){
|
||||
var avg by remember {
|
||||
mutableStateOf(sharedPreferences.getFloat(subject, 0.0f))
|
||||
}
|
||||
|
||||
Button(
|
||||
onClick = {
|
||||
val intent = Intent(activity, FachActivity::class.java).apply {
|
||||
putExtra(FachActivity.NAME_KEY, text)
|
||||
putExtra(FachActivity.NAME_KEY, subject)
|
||||
putExtra(FachActivity.WEIGHT_KEY, saWeight)
|
||||
}
|
||||
activity.startActivity(intent) },
|
||||
@@ -100,13 +172,54 @@ fun FachButton(color : Color, text : String, saWeight: Int, average : Float, act
|
||||
.padding(start = 16.dp, end = 16.dp, top = 16.dp)
|
||||
) {
|
||||
Row(modifier = Modifier.fillMaxWidth()) {
|
||||
Text(text = text,
|
||||
Text(text = subject,
|
||||
color = TextOnColouredButton,
|
||||
style = MaterialTheme.typography.labelMedium)
|
||||
Spacer(modifier = Modifier.weight(1f))
|
||||
Text(text = "Ø$average",
|
||||
Text(text = "Ø${formatFloat(avg)}",
|
||||
color = TextOnColouredButton,
|
||||
style = MaterialTheme.typography.labelMedium)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// changes state when Shared Preference is updated
|
||||
val observer = remember {
|
||||
SharedPreferences.OnSharedPreferenceChangeListener { _, key ->
|
||||
if (key == subject) {
|
||||
avg = sharedPreferences.getFloat(subject, 0.0f)
|
||||
onAvgChange()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// handles observer creation and disposal
|
||||
DisposableEffect(Unit) {
|
||||
sharedPreferences.registerOnSharedPreferenceChangeListener(observer)
|
||||
onDispose {
|
||||
sharedPreferences.unregisterOnSharedPreferenceChangeListener(observer)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun calculateAllAverage(avgs: List<Float>): Float{
|
||||
var total = 0.0f
|
||||
var number = 0
|
||||
|
||||
avgs.forEach{ avg ->
|
||||
if (avg != 0.0f && !avg.isNaN()){
|
||||
total += avg
|
||||
number += 1
|
||||
}
|
||||
}
|
||||
return (total / number)
|
||||
}
|
||||
|
||||
fun loadAllAverages(sharedPreferences: SharedPreferences): List<Float>{
|
||||
val avgs = emptyList<Float>().toMutableList()
|
||||
|
||||
subjects.forEach { name ->
|
||||
avgs += sharedPreferences.getFloat(name, 0.0f)
|
||||
}
|
||||
|
||||
return avgs
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user