Merge remote-tracking branch 'origin/master'
This commit is contained in:
@@ -61,12 +61,12 @@ import kotlinx.coroutines.Dispatchers
|
|||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
|
|
||||||
|
|
||||||
var SAWeight = 0
|
private var SAWeight = 0
|
||||||
var name = "Test"
|
private var name = "Test"
|
||||||
|
|
||||||
var typesSelection = listOf("Test", "Ex", "Referat", "Mündlich", "Sonstiges")
|
private var typesSelection = listOf("Test", "Ex", "Referat", "Mündlich", "Sonstiges")
|
||||||
val gradesSelection = listOf(1, 2, 3, 4, 5, 6)
|
private val gradesSelection = listOf(1, 2, 3, 4, 5, 6)
|
||||||
val weightsSelection = listOf(0.5f, 1f, 1.5f, 2f)
|
private val weightsSelection = listOf(0.5f, 1f, 1.5f, 2f)
|
||||||
|
|
||||||
class FachActivity : ComponentActivity() {
|
class FachActivity : ComponentActivity() {
|
||||||
companion object {
|
companion object {
|
||||||
@@ -139,9 +139,7 @@ fun GradeContent(activity: ComponentActivity, loadedGrades: List<GradeData>){
|
|||||||
|
|
||||||
DisposableEffect(activity) {
|
DisposableEffect(activity) {
|
||||||
onDispose {
|
onDispose {
|
||||||
CoroutineScope(Dispatchers.IO).launch {
|
saveGradesStart(activity, grades)
|
||||||
saveGrades(activity, grades, name)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -156,9 +154,8 @@ fun GradeContent(activity: ComponentActivity, loadedGrades: List<GradeData>){
|
|||||||
)},
|
)},
|
||||||
navigationIcon = {
|
navigationIcon = {
|
||||||
IconButton(onClick = {
|
IconButton(onClick = {
|
||||||
CoroutineScope(Dispatchers.IO).launch {
|
typesSelection = listOf("Test", "Ex", "Referat", "Mündlich", "Sonstiges")
|
||||||
saveGrades(activity, grades, name)
|
saveGradesStart(activity, grades)
|
||||||
}
|
|
||||||
activity.finish()
|
activity.finish()
|
||||||
}) {
|
}) {
|
||||||
Icon(
|
Icon(
|
||||||
@@ -197,7 +194,7 @@ fun GradeContent(activity: ComponentActivity, loadedGrades: List<GradeData>){
|
|||||||
style = MaterialTheme.typography.headlineSmall)
|
style = MaterialTheme.typography.headlineSmall)
|
||||||
Spacer(modifier = Modifier.weight(1f))
|
Spacer(modifier = Modifier.weight(1f))
|
||||||
Text(
|
Text(
|
||||||
text = "Ø" + if(average.isNaN()) "0.0" else formatFloat(average),
|
text = "Ø" + formatFloat(average),
|
||||||
style = MaterialTheme.typography.headlineSmall)
|
style = MaterialTheme.typography.headlineSmall)
|
||||||
Spacer(modifier = Modifier.width(16.dp))
|
Spacer(modifier = Modifier.width(16.dp))
|
||||||
}
|
}
|
||||||
@@ -226,20 +223,25 @@ fun GradeContent(activity: ComponentActivity, loadedGrades: List<GradeData>){
|
|||||||
grades.forEach{ gradeData ->
|
grades.forEach{ gradeData ->
|
||||||
GradePrefab(
|
GradePrefab(
|
||||||
id = gradeData.id,
|
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,
|
type = gradeData.type,
|
||||||
grade = gradeData.grade,
|
grade = gradeData.grade,
|
||||||
weight = gradeData.weight,
|
weight = gradeData.weight,
|
||||||
color = gradeData.color,
|
color = gradeData.color,
|
||||||
onGradeChange = { grade ->
|
onGradeChange = { grade ->
|
||||||
grades.find { it.id == gradeData.id }?.grade = grade
|
grades.find { it.id == gradeData.id }?.grade = grade
|
||||||
average = calculateAverage(grades, editor) },
|
average = calculateAverage(grades, editor)
|
||||||
|
saveGradesStart(activity, grades) },
|
||||||
onWeightChange = { weight ->
|
onWeightChange = { weight ->
|
||||||
grades.find { it.id == gradeData.id }?.weight = weight
|
grades.find { it.id == gradeData.id }?.weight = weight
|
||||||
average = calculateAverage(grades, editor) },
|
average = calculateAverage(grades, editor)
|
||||||
|
saveGradesStart(activity, grades) },
|
||||||
onTypeChange = { type ->
|
onTypeChange = { type ->
|
||||||
grades.find { it.id == gradeData.id }?.type = 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))
|
Spacer(modifier = Modifier.height(216.dp))
|
||||||
@@ -258,6 +260,7 @@ fun GradeContent(activity: ComponentActivity, loadedGrades: List<GradeData>){
|
|||||||
style = MaterialTheme.typography.labelMedium,
|
style = MaterialTheme.typography.labelMedium,
|
||||||
modifier = Modifier.clickable {
|
modifier = Modifier.clickable {
|
||||||
grades = emptyList()
|
grades = emptyList()
|
||||||
|
saveGradesStart(activity, grades)
|
||||||
editor.putFloat(name, 0.0f).apply()
|
editor.putFloat(name, 0.0f).apply()
|
||||||
showDeleteConfirmation = false
|
showDeleteConfirmation = false
|
||||||
}
|
}
|
||||||
@@ -555,3 +558,9 @@ fun calculateAverage(grades: List<GradeData>, editor: Editor): Float {
|
|||||||
|
|
||||||
return finalGrade
|
return finalGrade
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun saveGradesStart(context: Context, grades: List<GradeData>){
|
||||||
|
CoroutineScope(Dispatchers.IO).launch {
|
||||||
|
saveGrades(context, grades, name)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -3,9 +3,11 @@ package com.schoolapp.cleverclass
|
|||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
import android.content.SharedPreferences
|
import android.content.SharedPreferences
|
||||||
|
import android.content.SharedPreferences.Editor
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import androidx.activity.ComponentActivity
|
import androidx.activity.ComponentActivity
|
||||||
import androidx.activity.compose.setContent
|
import androidx.activity.compose.setContent
|
||||||
|
import androidx.compose.foundation.clickable
|
||||||
import androidx.compose.foundation.layout.Column
|
import androidx.compose.foundation.layout.Column
|
||||||
import androidx.compose.foundation.layout.Row
|
import androidx.compose.foundation.layout.Row
|
||||||
import androidx.compose.foundation.layout.Spacer
|
import androidx.compose.foundation.layout.Spacer
|
||||||
@@ -20,9 +22,12 @@ import androidx.compose.foundation.shape.RoundedCornerShape
|
|||||||
import androidx.compose.foundation.verticalScroll
|
import androidx.compose.foundation.verticalScroll
|
||||||
import androidx.compose.material.icons.Icons
|
import androidx.compose.material.icons.Icons
|
||||||
import androidx.compose.material.icons.filled.ArrowBack
|
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.BottomAppBar
|
||||||
import androidx.compose.material3.Button
|
import androidx.compose.material3.Button
|
||||||
import androidx.compose.material3.ButtonDefaults
|
import androidx.compose.material3.ButtonDefaults
|
||||||
|
import androidx.compose.material3.Divider
|
||||||
import androidx.compose.material3.ExperimentalMaterial3Api
|
import androidx.compose.material3.ExperimentalMaterial3Api
|
||||||
import androidx.compose.material3.Icon
|
import androidx.compose.material3.Icon
|
||||||
import androidx.compose.material3.IconButton
|
import androidx.compose.material3.IconButton
|
||||||
@@ -44,17 +49,46 @@ import androidx.compose.ui.graphics.Color
|
|||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
import com.schoolapp.cleverclass.ui.theme.CleverClassTheme
|
import com.schoolapp.cleverclass.ui.theme.CleverClassTheme
|
||||||
import com.schoolapp.cleverclass.ui.theme.TextOnColouredButton
|
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",
|
private val subjects = listOf(
|
||||||
"Geographie","Geschichte","Informatik","Katolisch","Kunst","Latein","Mathe","Musik","Physik",
|
"Mathe", "Deutsch", "Englisch", "Französisch", "Latein",
|
||||||
"Pulitik und Gesellschaft","Sport","Wirtschaft")
|
"Physik", "Chemie", "Biologie", "Informatik",
|
||||||
|
"Geographie", "Wirtschaft", "Geschichte", "Politik und Gesellschaft",
|
||||||
|
"Ethik", "Evangelisch", "Katholisch",
|
||||||
|
"Kunst", "Musik", "Sport"
|
||||||
|
)
|
||||||
|
|
||||||
val colors = listOf(
|
private val saWeights = listOf(
|
||||||
Color(0xFF69F0AE),
|
2, 2, 2, 2, 2,
|
||||||
Color(0xFFEEFF41),
|
1, 1, 0, 0,
|
||||||
Color(0xFFFFAB40),
|
0, 0, 0, 0,
|
||||||
|
0, 0, 0,
|
||||||
|
0, 0, 0
|
||||||
|
)
|
||||||
|
|
||||||
|
private val colorsA = listOf(
|
||||||
|
Color(0xFF536DFE),
|
||||||
Color(0xFF18FFFF),
|
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() {
|
class NotenActivity : ComponentActivity() {
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
@@ -77,10 +111,14 @@ class NotenActivity : ComponentActivity() {
|
|||||||
@Composable
|
@Composable
|
||||||
fun NotenContent(activity: ComponentActivity){
|
fun NotenContent(activity: ComponentActivity){
|
||||||
val sharedPreferences = activity.getSharedPreferences("gradeAverages", Context.MODE_PRIVATE)
|
val sharedPreferences = activity.getSharedPreferences("gradeAverages", Context.MODE_PRIVATE)
|
||||||
|
val editor = sharedPreferences.edit()
|
||||||
|
|
||||||
var allAverage by remember {
|
var allAverage by remember {
|
||||||
mutableStateOf(calculateAllAverage(loadAllAverages(sharedPreferences)))
|
mutableStateOf(calculateAllAverage(loadAllAverages(sharedPreferences)))
|
||||||
}
|
}
|
||||||
|
var showDeleteConfirmation by remember {
|
||||||
|
mutableStateOf(false)
|
||||||
|
}
|
||||||
|
|
||||||
Scaffold(
|
Scaffold(
|
||||||
topBar = {
|
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()
|
modifier = Modifier.fillMaxWidth()
|
||||||
)
|
)
|
||||||
},
|
},
|
||||||
@@ -126,31 +174,114 @@ fun NotenContent(activity: ComponentActivity){
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
) {innerPadding ->
|
) {innerPadding ->
|
||||||
Column(modifier = Modifier
|
Column(
|
||||||
.verticalScroll(rememberScrollState())
|
horizontalAlignment = Alignment.CenterHorizontally,
|
||||||
.padding(innerPadding))
|
modifier = Modifier
|
||||||
|
.verticalScroll(rememberScrollState())
|
||||||
|
.padding(innerPadding)
|
||||||
|
)
|
||||||
{
|
{
|
||||||
subjects.forEach { name ->
|
GroopTitle("Hauptfächer", true)
|
||||||
|
for (i in 0..4){
|
||||||
FachButton(
|
FachButton(
|
||||||
color = colors.random(),
|
color = colorsA[i],
|
||||||
subject = name,
|
subject = subjects[i],
|
||||||
saWeight = 2,
|
saWeight = saWeights[i],
|
||||||
activity = activity,
|
activity = activity,
|
||||||
sharedPreferences = sharedPreferences,
|
sharedPreferences = sharedPreferences,
|
||||||
onAvgChange = { allAverage = calculateAllAverage(loadAllAverages(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))
|
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
|
@Composable
|
||||||
fun FachButton(
|
fun FachButton(
|
||||||
color : Color,
|
color : Color,
|
||||||
subject : String,
|
subject : String,
|
||||||
saWeight: Int, activity :
|
saWeight: Int,
|
||||||
ComponentActivity,
|
activity: ComponentActivity,
|
||||||
sharedPreferences: SharedPreferences,
|
sharedPreferences: SharedPreferences,
|
||||||
onAvgChange: () -> Unit){
|
onAvgChange: () -> Unit){
|
||||||
var avg by remember {
|
var avg by remember {
|
||||||
@@ -176,7 +307,7 @@ fun FachButton(
|
|||||||
color = TextOnColouredButton,
|
color = TextOnColouredButton,
|
||||||
style = MaterialTheme.typography.labelMedium)
|
style = MaterialTheme.typography.labelMedium)
|
||||||
Spacer(modifier = Modifier.weight(1f))
|
Spacer(modifier = Modifier.weight(1f))
|
||||||
Text(text = "Ø${formatFloat(avg)}",
|
Text(text = if (avg != 0.0f) "Ø${formatFloat(avg)}" else "---",
|
||||||
color = TextOnColouredButton,
|
color = TextOnColouredButton,
|
||||||
style = MaterialTheme.typography.labelMedium)
|
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{
|
fun calculateAllAverage(avgs: List<Float>): Float{
|
||||||
var total = 0.0f
|
var total = 0.0f
|
||||||
var number = 0
|
var number = 0
|
||||||
@@ -223,3 +365,12 @@ fun loadAllAverages(sharedPreferences: SharedPreferences): List<Float>{
|
|||||||
|
|
||||||
return avgs
|
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)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -5,5 +5,8 @@ fun formatFloat(number: Float): String {
|
|||||||
|
|
||||||
formattedString = formattedString.substring(0, if(formattedString.length == 3) 3 else 4)
|
formattedString = formattedString.substring(0, if(formattedString.length == 3) 3 else 4)
|
||||||
|
|
||||||
|
if(number.isNaN())
|
||||||
|
formattedString = "0.0"
|
||||||
|
|
||||||
return formattedString
|
return formattedString
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user