diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 2149fe8..f7fb6eb 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -40,6 +40,11 @@ android:exported="false" android:label="@string/title_activity_noten" android:theme="@style/Theme.CleverClass" /> + by preferencesDataStore(name = "lesson_preferences") + + suspend fun saveLessons(context: Context, lessons: List, day: String) { + context.dataStore.edit { preferences -> + val json = Gson().toJson(lessons) + preferences[stringPreferencesKey(day)] = json + } + } + + fun getLessons(context: Context, day: String): Flow> { + return context.dataStore.data.map { preferences -> + val json = preferences[stringPreferencesKey(day)] ?: return@map emptyList() + val type = object : TypeToken>() {}.type + Gson().fromJson(json, type) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/schoolapp/cleverclass/StundenplanActivity.kt b/app/src/main/java/com/schoolapp/cleverclass/StundenplanActivity.kt index 86afec4..0a90f3e 100644 --- a/app/src/main/java/com/schoolapp/cleverclass/StundenplanActivity.kt +++ b/app/src/main/java/com/schoolapp/cleverclass/StundenplanActivity.kt @@ -1,11 +1,15 @@ package com.schoolapp.cleverclass +import android.content.Context +import android.content.Intent import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.compose.setContent +import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.ArrowBack @@ -18,19 +22,47 @@ import androidx.compose.material3.Text import androidx.compose.material3.TopAppBar import androidx.compose.material3.TopAppBarDefaults 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 import androidx.compose.ui.unit.dp +import com.schoolapp.cleverclass.LessonStoreManager.getLessons import com.schoolapp.cleverclass.ui.theme.CleverClassTheme +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch + +private val listOfDays = listOf("mon", "tue", "wed", "thu", "fri", "sat", "sun") +private val lessonGrabberIndex = 0 class StundenplanActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) + + val sharedPreferences = this.getSharedPreferences("TimeTable", Context.MODE_PRIVATE) + val maxLessons = sharedPreferences.getString("maxLessons", "").toString() + val lessonLength = sharedPreferences.getString("lessonLength", "").toString() + setContent { CleverClassTheme { Surface( modifier = Modifier.fillMaxSize(), color = MaterialTheme.colorScheme.background ) { + println(maxLessons) + //println(lessonLength) + if (maxLessons.isEmpty() || lessonLength.isEmpty()) { + val intent = Intent(this@StundenplanActivity, TimeTableSetupActivity::class.java).apply { + putExtra(TimeTableSetupActivity.TYPE_KEY, "FirstSetup") + } + startActivity(intent) + } + StundenplanContent(activity = this) } } @@ -64,7 +96,46 @@ fun StundenplanContent(activity: ComponentActivity){ ) Column() { - + listOfDays.forEach() {currentDay -> + Day(currentDay) + } } } +} + +data class LessonData( + val subject: String, + val teacher: String, + val room: String +) + +@Composable +fun Day(day: String) { + var lessons = emptyList() + val context = LocalContext.current + Column { + LaunchedEffect(lessons, context) { + getLessons(context, day).collect { savedLessons -> + lessons = savedLessons.toMutableList() + } + } + lessons.forEach() { + Lesson(subject = it.subject, teacher = it.teacher, room = it.room) + } + } +} + +@Composable +fun Lesson(subject: String, teacher: String, room: String) { + Box(modifier = Modifier + .size(200.dp, 100.dp) + .padding(3.dp) + ) { + Text(modifier = Modifier.align(Alignment.Center), + text = "$subject\n@$room\n/w$teacher") + } +} + +fun currentDay(): String { + return "hi" } \ No newline at end of file diff --git a/app/src/main/java/com/schoolapp/cleverclass/TimeTableSetupActivity.kt b/app/src/main/java/com/schoolapp/cleverclass/TimeTableSetupActivity.kt new file mode 100644 index 0000000..8ca36da --- /dev/null +++ b/app/src/main/java/com/schoolapp/cleverclass/TimeTableSetupActivity.kt @@ -0,0 +1,316 @@ +package com.schoolapp.cleverclass + +import android.content.Context +import android.os.Bundle +import androidx.activity.ComponentActivity +import androidx.activity.compose.setContent +import androidx.compose.foundation.Image +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Arrangement +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.fillMaxHeight +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.rememberScrollState +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.foundation.text.KeyboardOptions +import androidx.compose.foundation.text.selection.TextSelectionColors +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.material.icons.outlined.Info +import androidx.compose.material3.AlertDialog +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.OutlinedTextField +import androidx.compose.material3.Surface +import androidx.compose.material3.Text +import androidx.compose.material3.TextFieldDefaults +import androidx.compose.material3.TopAppBar +import androidx.compose.material3.TopAppBarDefaults +import androidx.compose.runtime.Composable +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.res.painterResource +import androidx.compose.ui.text.input.KeyboardType +import androidx.compose.ui.text.input.PasswordVisualTransformation +import androidx.compose.ui.text.input.VisualTransformation +import androidx.compose.ui.unit.dp +import com.schoolapp.cleverclass.ui.theme.CleverClassTheme +import com.schoolapp.cleverclass.ui.theme.InputPrimaryColor +import com.schoolapp.cleverclass.ui.theme.InputSecondaryColor + +private lateinit var activityType : String + +class TimeTableSetupActivity : ComponentActivity() { + companion object{ + const val TYPE_KEY = "type_key" + } + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + activityType = intent.getStringExtra(TYPE_KEY).toString() + + setContent { + CleverClassTheme { + Surface( + modifier = Modifier.fillMaxSize(), + color = MaterialTheme.colorScheme.background + ) { + TimeTableSetupContent(activity = this) + } + } + } + } +} + + +// Content of TimeTableSetup +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun TimeTableSetupContent(activity: ComponentActivity){ + val inputFieldColors = TextFieldDefaults.outlinedTextFieldColors( + textColor = MaterialTheme.colorScheme.onPrimaryContainer, + containerColor = MaterialTheme.colorScheme.secondaryContainer, + cursorColor = InputPrimaryColor, + selectionColors = TextSelectionColors( + handleColor = InputPrimaryColor, + backgroundColor = InputSecondaryColor + ), + focusedBorderColor = InputSecondaryColor, + unfocusedBorderColor = Color.Transparent + ) + + val sharedPreferences = activity.getSharedPreferences("TimeTable", Context.MODE_PRIVATE) + val editor = sharedPreferences.edit() + + var maxLessons by remember { + mutableStateOf(sharedPreferences.getString("maxLessons", "-1").toString()) + } + var lessonLength by remember { + mutableStateOf(sharedPreferences.getString("lessonLength", "-1").toString()) + } + var showPassword by remember { + mutableStateOf(false) + } + + var showInfo by remember { + mutableStateOf(false) + } + var showDeleteConfirmation by remember { + mutableStateOf(false) + } + + Column { + TopAppBar( + colors = TopAppBarDefaults.centerAlignedTopAppBarColors(MaterialTheme.colorScheme.primaryContainer), + title = { Text(text = "") }, + navigationIcon = { + IconButton(onClick = { activity.finish() }) { + Icon( + imageVector = Icons.Filled.ArrowBack, + contentDescription = null, + modifier = Modifier.size(28.dp), + tint = MaterialTheme.colorScheme.onPrimaryContainer + ) + } + }, + modifier = Modifier.fillMaxWidth() + ) + + Column( + verticalArrangement = Arrangement.Center, + modifier = Modifier + .fillMaxHeight() + .verticalScroll(rememberScrollState()) + ) { + Surface( + color = MaterialTheme.colorScheme.primaryContainer, + shape = RoundedCornerShape(20), + modifier = Modifier.padding(16.dp) + ) { + Column(horizontalAlignment = Alignment.CenterHorizontally, + modifier = Modifier.padding(16.dp) + ) { + Row(verticalAlignment = Alignment.CenterVertically) { + Text( + text = "Stundenplan Setup", + style = MaterialTheme.typography.labelMedium, + color = MaterialTheme.colorScheme.onPrimaryContainer, + modifier = Modifier.padding(10.dp) + ) + + Spacer(modifier = Modifier.weight(1f)) + + if (activityType == "Settings") + IconButton(onClick = { showDeleteConfirmation = !showDeleteConfirmation }) { + Icon( + imageVector = Icons.Outlined.Delete, + contentDescription = null, + modifier = Modifier.size(28.dp), + tint = MaterialTheme.colorScheme.onPrimaryContainer + ) + } + else if (activityType == "FirstSetup") + IconButton(onClick = { showInfo = !showInfo }) { + Icon( + imageVector = Icons.Outlined.Info, + contentDescription = null, + tint = MaterialTheme.colorScheme.onPrimaryContainer + ) + } + } + + Spacer(modifier = Modifier.height(16.dp)) + + OutlinedTextField( + value = maxLessons, + onValueChange = { maxLessons = it }, + placeholder = { + Text( + text = "Maximale Stundenanzahl an einem Tag", + style = MaterialTheme.typography.labelMedium, + color = MaterialTheme.colorScheme.primaryContainer + ) + }, + modifier = Modifier.fillMaxWidth(), + singleLine = true, + shape = RoundedCornerShape(20), + textStyle = MaterialTheme.typography.labelMedium, + colors = inputFieldColors + ) + + Spacer(modifier = Modifier.height(16.dp)) + + OutlinedTextField( + value = lessonLength, + onValueChange = { lessonLength = it }, + placeholder = { + Text( + text = "Länge einer Schulstunde", + style = MaterialTheme.typography.labelMedium, + color = MaterialTheme.colorScheme.primaryContainer + ) + }, + modifier = Modifier.fillMaxWidth(), + singleLine = true, + shape = RoundedCornerShape(20), + textStyle = MaterialTheme.typography.labelMedium, + colors = inputFieldColors, + visualTransformation = if(showPassword) VisualTransformation.None else PasswordVisualTransformation(), + keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Password), + trailingIcon = { + IconButton(onClick = { showPassword = !showPassword }) + { + Image( + painter = painterResource( + id = if(showPassword) + R.drawable.baseline_visibility_24 + else + R.drawable.baseline_visibility_off_24 + ), + contentDescription = null, + ) + } + } + ) + + Spacer(modifier = Modifier.height(10.dp)) + + Box( + contentAlignment = Alignment.Center, + modifier = Modifier.clickable { + editor.putString("maxLessons", maxLessons) + editor.putString("lessonLength", lessonLength) + editor.apply() + activity.finish() + } + ) { + Text( + text = "Speichen", + color = MaterialTheme.colorScheme.secondary, + style = MaterialTheme.typography.labelMedium, + modifier = Modifier.padding(10.dp) + ) + } + } + } + } + } + + if (showInfo) { + AlertDialog( + onDismissRequest = { showInfo = false }, + text = { + Text( + text = "Der Benutzername und das Passwort können später in den Einstellungen geändert werden", + color = MaterialTheme.colorScheme.onPrimaryContainer, + style = MaterialTheme.typography.labelMedium) + }, + confirmButton = { + Text( + text = "Schließen", + color = MaterialTheme.colorScheme.secondary, + style = MaterialTheme.typography.labelMedium, + modifier = Modifier.clickable { showInfo = false } + ) + }, + containerColor = MaterialTheme.colorScheme.primaryContainer, + modifier = Modifier + .padding(5.dp) + ) + } + + if (showDeleteConfirmation) { + AlertDialog( + onDismissRequest = { showDeleteConfirmation = false }, + text = { + Text( + text = "Möchten Sie wirklich die Anmeldedaten 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 { + editor.putString("username", "") + editor.putString("password", "") + editor.apply() + showDeleteConfirmation = false + activity.finish() + } + ) + + 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 + ) + } +} \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 8ab8047..f4bf06f 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -9,4 +9,5 @@ DSBActivity DSBDayViewActivity DSBLoginActivity + TimetableSetupActivity \ No newline at end of file