Merge remote-tracking branch 'origin/master'

This commit is contained in:
matthias
2024-04-18 17:53:25 +02:00
3 changed files with 197 additions and 34 deletions

View File

@@ -61,12 +61,12 @@ import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
var SAWeight = 0
var name = "Test"
private var SAWeight = 0
private var name = "Test"
var typesSelection = listOf("Test", "Ex", "Referat", "Mündlich", "Sonstiges")
val gradesSelection = listOf(1, 2, 3, 4, 5, 6)
val weightsSelection = listOf(0.5f, 1f, 1.5f, 2f)
private var typesSelection = listOf("Test", "Ex", "Referat", "Mündlich", "Sonstiges")
private val gradesSelection = listOf(1, 2, 3, 4, 5, 6)
private val weightsSelection = listOf(0.5f, 1f, 1.5f, 2f)
class FachActivity : ComponentActivity() {
companion object {
@@ -139,9 +139,7 @@ fun GradeContent(activity: ComponentActivity, loadedGrades: List<GradeData>){
DisposableEffect(activity) {
onDispose {
CoroutineScope(Dispatchers.IO).launch {
saveGrades(activity, grades, name)
}
saveGradesStart(activity, grades)
}
}
@@ -156,9 +154,8 @@ fun GradeContent(activity: ComponentActivity, loadedGrades: List<GradeData>){
)},
navigationIcon = {
IconButton(onClick = {
CoroutineScope(Dispatchers.IO).launch {
saveGrades(activity, grades, name)
}
typesSelection = listOf("Test", "Ex", "Referat", "Mündlich", "Sonstiges")
saveGradesStart(activity, grades)
activity.finish()
}) {
Icon(
@@ -197,7 +194,7 @@ fun GradeContent(activity: ComponentActivity, loadedGrades: List<GradeData>){
style = MaterialTheme.typography.headlineSmall)
Spacer(modifier = Modifier.weight(1f))
Text(
text = "Ø" + if(average.isNaN()) "0.0" else formatFloat(average),
text = "Ø" + formatFloat(average),
style = MaterialTheme.typography.headlineSmall)
Spacer(modifier = Modifier.width(16.dp))
}
@@ -226,20 +223,25 @@ fun GradeContent(activity: ComponentActivity, loadedGrades: List<GradeData>){
grades.forEach{ gradeData ->
GradePrefab(
id = gradeData.id,
onClose = { grades = grades.filter { it.id != gradeData.id } },
onClose = {
grades = grades.filter { it.id != gradeData.id }
saveGradesStart(activity, grades) },
type = gradeData.type,
grade = gradeData.grade,
weight = gradeData.weight,
color = gradeData.color,
onGradeChange = { grade ->
grades.find { it.id == gradeData.id }?.grade = grade
average = calculateAverage(grades, editor) },
average = calculateAverage(grades, editor)
saveGradesStart(activity, grades) },
onWeightChange = { weight ->
grades.find { it.id == gradeData.id }?.weight = weight
average = calculateAverage(grades, editor) },
average = calculateAverage(grades, editor)
saveGradesStart(activity, grades) },
onTypeChange = { type ->
grades.find { it.id == gradeData.id }?.type = type
average = calculateAverage(grades, editor) }
average = calculateAverage(grades, editor)
saveGradesStart(activity, grades) }
)
}
Spacer(modifier = Modifier.height(216.dp))
@@ -258,6 +260,7 @@ fun GradeContent(activity: ComponentActivity, loadedGrades: List<GradeData>){
style = MaterialTheme.typography.labelMedium,
modifier = Modifier.clickable {
grades = emptyList()
saveGradesStart(activity, grades)
editor.putFloat(name, 0.0f).apply()
showDeleteConfirmation = false
}
@@ -555,3 +558,9 @@ fun calculateAverage(grades: List<GradeData>, editor: Editor): Float {
return finalGrade
}
fun saveGradesStart(context: Context, grades: List<GradeData>){
CoroutineScope(Dispatchers.IO).launch {
saveGrades(context, grades, name)
}
}

View File

@@ -3,9 +3,11 @@ package com.schoolapp.cleverclass
import android.content.Context
import android.content.Intent
import android.content.SharedPreferences
import android.content.SharedPreferences.Editor
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
@@ -20,9 +22,12 @@ 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.material.icons.outlined.Delete
import androidx.compose.material3.AlertDialog
import androidx.compose.material3.BottomAppBar
import androidx.compose.material3.Button
import androidx.compose.material3.ButtonDefaults
import androidx.compose.material3.Divider
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
@@ -44,17 +49,46 @@ 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
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
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")
private val subjects = listOf(
"Mathe", "Deutsch", "Englisch", "Französisch", "Latein",
"Physik", "Chemie", "Biologie", "Informatik",
"Geographie", "Wirtschaft", "Geschichte", "Politik und Gesellschaft",
"Ethik", "Evangelisch", "Katholisch",
"Kunst", "Musik", "Sport"
)
val colors = listOf(
Color(0xFF69F0AE),
Color(0xFFEEFF41),
Color(0xFFFFAB40),
private val saWeights = listOf(
2, 2, 2, 2, 2,
1, 1, 0, 0,
0, 0, 0, 0,
0, 0, 0,
0, 0, 0
)
private val colorsA = listOf(
Color(0xFF536DFE),
Color(0xFF18FFFF),
Color(0xFFB2FF59))
Color(0xFF448AFF),
Color(0xFF64FFDA),
Color(0xFF40C4FF)
)
private val colorsB = listOf(
Color(0xFFFFFF00),
Color(0xFFFFAB40),
Color(0xFFFFD740),
Color(0xFFEEFF41)
)
private val colorsC = listOf(
Color(0xFFFF5252),
Color(0xFFFF4081),
Color(0xFFFF6052),
Color(0xFFFF6E40)
)
class NotenActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
@@ -77,10 +111,14 @@ class NotenActivity : ComponentActivity() {
@Composable
fun NotenContent(activity: ComponentActivity){
val sharedPreferences = activity.getSharedPreferences("gradeAverages", Context.MODE_PRIVATE)
val editor = sharedPreferences.edit()
var allAverage by remember {
mutableStateOf(calculateAllAverage(loadAllAverages(sharedPreferences)))
}
var showDeleteConfirmation by remember {
mutableStateOf(false)
}
Scaffold(
topBar = {
@@ -101,6 +139,16 @@ fun NotenContent(activity: ComponentActivity){
)
}
},
actions = {
IconButton(onClick = { showDeleteConfirmation = true }) {
Icon(
imageVector = Icons.Outlined.Delete,
contentDescription = null,
modifier = Modifier.size(28.dp),
tint = MaterialTheme.colorScheme.onPrimaryContainer
)
}
},
modifier = Modifier.fillMaxWidth()
)
},
@@ -126,31 +174,114 @@ fun NotenContent(activity: ComponentActivity){
}
}
) {innerPadding ->
Column(modifier = Modifier
.verticalScroll(rememberScrollState())
.padding(innerPadding))
Column(
horizontalAlignment = Alignment.CenterHorizontally,
modifier = Modifier
.verticalScroll(rememberScrollState())
.padding(innerPadding)
)
{
subjects.forEach { name ->
GroopTitle("Hauptfächer", true)
for (i in 0..4){
FachButton(
color = colors.random(),
subject = name,
saWeight = 2,
color = colorsA[i],
subject = subjects[i],
saWeight = saWeights[i],
activity = activity,
sharedPreferences = sharedPreferences,
onAvgChange = { allAverage = calculateAllAverage(loadAllAverages(sharedPreferences)) }
)
}
GroopTitle("Naturwissenschaften", false)
for (i in 5..8){
FachButton(
color = colorsB[i - 5],
subject = subjects[i],
saWeight = saWeights[i],
activity = activity,
sharedPreferences = sharedPreferences,
onAvgChange = { allAverage = calculateAllAverage(loadAllAverages(sharedPreferences)) }
)
}
GroopTitle("Gesellschaftswissenschaften", false)
for (i in 9..12){
FachButton(
color = colorsC[i - 9],
subject = subjects[i],
saWeight = saWeights[i],
activity = activity,
sharedPreferences = sharedPreferences,
onAvgChange = { allAverage = calculateAllAverage(loadAllAverages(sharedPreferences)) }
)
}
GroopTitle("Religionen", false)
for (i in 13..15){
FachButton(
color = colorsA[i - 13],
subject = subjects[i],
saWeight = saWeights[i],
activity = activity,
sharedPreferences = sharedPreferences,
onAvgChange = { allAverage = calculateAllAverage(loadAllAverages(sharedPreferences)) }
)
}
GroopTitle("Sonstiges", false)
for (i in 16..18){
FachButton(
color = colorsB[i - 16],
subject = subjects[i],
saWeight = saWeights[i],
activity = activity,
sharedPreferences = sharedPreferences,
onAvgChange = { allAverage = calculateAllAverage(loadAllAverages(sharedPreferences)) }
)
}
Spacer(modifier = Modifier.height(16.dp))
}
}
if (showDeleteConfirmation){
AlertDialog(
onDismissRequest = { showDeleteConfirmation = false },
text = { Text(text = "Möchten Sie wirklich alle Noten aus Allen Fächern löschen?", color = MaterialTheme.colorScheme.onPrimaryContainer, style = MaterialTheme.typography.labelMedium) },
confirmButton = {
Row(modifier = Modifier.fillMaxWidth()){
Text(
text = "Bestätigen",
color = MaterialTheme.colorScheme.secondary,
style = MaterialTheme.typography.labelMedium,
modifier = Modifier.clickable {
deleteAll(editor, activity)
showDeleteConfirmation = false
}
)
Spacer(modifier = Modifier.weight(1f))
Text(
text = "Abbrechen",
color = MaterialTheme.colorScheme.secondary,
style = MaterialTheme.typography.labelMedium,
modifier = Modifier.clickable { showDeleteConfirmation = false }
)
}
},
containerColor = MaterialTheme.colorScheme.primaryContainer
)
}
}
@Composable
fun FachButton(
color : Color,
subject : String,
saWeight: Int, activity :
ComponentActivity,
saWeight: Int,
activity: ComponentActivity,
sharedPreferences: SharedPreferences,
onAvgChange: () -> Unit){
var avg by remember {
@@ -176,7 +307,7 @@ fun FachButton(
color = TextOnColouredButton,
style = MaterialTheme.typography.labelMedium)
Spacer(modifier = Modifier.weight(1f))
Text(text = "Ø${formatFloat(avg)}",
Text(text = if (avg != 0.0f) "Ø${formatFloat(avg)}" else "---",
color = TextOnColouredButton,
style = MaterialTheme.typography.labelMedium)
}
@@ -201,6 +332,17 @@ fun FachButton(
}
}
@Composable
fun GroopTitle(name: String, top: Boolean){
if(!top) {
Spacer(modifier = Modifier.height(32.dp))
Divider()
}
Spacer(modifier = Modifier.height(32.dp))
Text(text = name, style = MaterialTheme.typography.headlineSmall, color = MaterialTheme.colorScheme.onBackground)
Spacer(modifier = Modifier.height(12.dp))
}
fun calculateAllAverage(avgs: List<Float>): Float{
var total = 0.0f
var number = 0
@@ -223,3 +365,12 @@ fun loadAllAverages(sharedPreferences: SharedPreferences): List<Float>{
return avgs
}
fun deleteAll(editor: Editor, context: Context){
subjects.forEach{name ->
editor.putFloat(name, 0.0f).apply()
CoroutineScope(Dispatchers.IO).launch {
GradeStoreManager.saveGrades(context, emptyList(), name)
}
}
}

View File

@@ -5,5 +5,8 @@ fun formatFloat(number: Float): String {
formattedString = formattedString.substring(0, if(formattedString.length == 3) 3 else 4)
if(number.isNaN())
formattedString = "0.0"
return formattedString
}