diff --git a/mobile/.idea/caches/deviceStreaming.xml b/mobile/.idea/caches/deviceStreaming.xml deleted file mode 100644 index b81700b..0000000 --- a/mobile/.idea/caches/deviceStreaming.xml +++ /dev/null @@ -1,329 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/mobile/app/src/main/java/com/odweta/solon/Global.kt b/mobile/app/src/main/java/com/odweta/solon/Global.kt index b1bd7e4..3d57619 100644 --- a/mobile/app/src/main/java/com/odweta/solon/Global.kt +++ b/mobile/app/src/main/java/com/odweta/solon/Global.kt @@ -40,6 +40,7 @@ const val accountDataFilePath: String = "account_data.txt" const val timeTableFilePath: String = "timetable.json" const val userDataFilePath: String = "userdata.json" const val marksFilePath: String = "marks.json" +const val settingsDataFilePath: String = "settings.txt" lateinit var fileDir: File var width: Int = 0 var height: Int = 0 @@ -55,7 +56,8 @@ enum class IsShowing { Timetable, Marks, Menu, - About + About, + Settings } enum class Screen { @@ -72,6 +74,44 @@ var isShowing: MutableState = mutableStateOf(IsShowing.Timetable) var toolbarText: MutableState = mutableStateOf("") +// default settings (will get overwritten by the saved settings) +class Setting(auxId: SettingsId, auxName: String, auxChecked: Boolean) { + var id: SettingsId = auxId + var name: String = auxName + var checked: MutableState = mutableStateOf(auxChecked) + override fun toString() = "$id#$name#${checked.value}" +} + +enum class SettingsId { + Svoboda, + Amoled, + RefreshButton +} + +class SettingsData { + var useSvobodaMode: Setting = Setting( + SettingsId.Svoboda, + "Používat Svoboda mód", + false + ) + + var useAmoledMode: Setting = Setting( + SettingsId.Amoled, + "Používat AMOLED mód", + false + ) + + var showRefreshButton: Setting = Setting( + SettingsId.RefreshButton, + "Zobrazovat tlačítko obnovení dat", + true + ) + + override fun toString() = "$useSvobodaMode\n$useAmoledMode\n$showRefreshButton" +} + +var settingsData: SettingsData = SettingsData() + var done: Boolean = false var timeTableAvailOffline: Boolean = false diff --git a/mobile/app/src/main/java/com/odweta/solon/Launch.kt b/mobile/app/src/main/java/com/odweta/solon/Launch.kt index 34c2d02..c8b4e1f 100644 --- a/mobile/app/src/main/java/com/odweta/solon/Launch.kt +++ b/mobile/app/src/main/java/com/odweta/solon/Launch.kt @@ -1,15 +1,11 @@ package com.odweta.solon -import android.app.Activity import android.content.Context -import android.content.Intent import android.widget.Toast import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.launch import kotlinx.coroutines.delay import org.json.JSONObject -import kotlin.math.cos private var week: List = mutableListOf() private var toastShowing: Boolean = false @@ -145,7 +141,7 @@ private suspend fun launchPhase1(ctx: Context) { toast2.show() } - if (!timeTableAvailOffline || internetAvail) { + if (!timeTableAvailOffline || !marksAvailOffline || internetAvail) { // set up the API (required for later uses of it) Network.setupAPI() @@ -173,6 +169,9 @@ private suspend fun launchPhase1(ctx: Context) { marks = Parsing.parseMarksJSON(marksJSON) + // set the settings + settingsData = Util.stringToSettingsData(Util.fileToString(settingsDataFilePath)) + // continue to launch phase 2 done = true launchPhase2(ctx) diff --git a/mobile/app/src/main/java/com/odweta/solon/MainActivity.kt b/mobile/app/src/main/java/com/odweta/solon/MainActivity.kt index 25de4de..bcec57d 100644 --- a/mobile/app/src/main/java/com/odweta/solon/MainActivity.kt +++ b/mobile/app/src/main/java/com/odweta/solon/MainActivity.kt @@ -69,6 +69,7 @@ class MainActivity : ComponentActivity() { IsShowing.Marks -> MarksScreen() IsShowing.Menu -> MenuScreen() IsShowing.About -> AboutScreen() + IsShowing.Settings -> SettingsScreen() } } diff --git a/mobile/app/src/main/java/com/odweta/solon/Menu.kt b/mobile/app/src/main/java/com/odweta/solon/Menu.kt index 1894e6e..4c8d336 100644 --- a/mobile/app/src/main/java/com/odweta/solon/Menu.kt +++ b/mobile/app/src/main/java/com/odweta/solon/Menu.kt @@ -160,5 +160,29 @@ fun MenuScreen(modifier: Modifier = Modifier) { fontSize = 23.sp ) } + + Spacer(modifier = Modifier.height(100.dp)) + + Button(onClick = { + isShowing.value = IsShowing.Settings + }, + colors = ButtonDefaults.buttonColors( + contentColor = Color.White, + containerColor = Color.Black + ), + modifier = Modifier + .border( + width = 5.dp, + shape = RoundedCornerShape(roundedCornerDimen), + color = PastelYellow + ) + .width(230.dp) + .height(80.dp) + ) { + Text( + text = "Nastavení", + fontSize = 23.sp + ) + } } } \ No newline at end of file diff --git a/mobile/app/src/main/java/com/odweta/solon/Settings.kt b/mobile/app/src/main/java/com/odweta/solon/Settings.kt new file mode 100644 index 0000000..ef5f79f --- /dev/null +++ b/mobile/app/src/main/java/com/odweta/solon/Settings.kt @@ -0,0 +1,149 @@ +package com.odweta.solon + +import android.util.Log +import androidx.activity.compose.BackHandler +import androidx.compose.foundation.background +import androidx.compose.foundation.border +import androidx.compose.foundation.clickable +import androidx.compose.foundation.gestures.scrollable +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.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.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.ArrowBackIosNew +import androidx.compose.material3.Button +import androidx.compose.material3.ButtonDefaults +import androidx.compose.material3.Icon +import androidx.compose.material3.Switch +import androidx.compose.material3.SwitchColors +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.remember +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.platform.LocalUriHandler +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.text.style.TextDecoration +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import com.odweta.solon.ui.theme.PastelYellow + +@Composable +fun SettingsScreen(modifier: Modifier = Modifier) { + // handle the back gesture (back swipe form side or back button on bottom android navbar) + BackHandler { + isShowing.value = IsShowing.Menu + } + + val scrollState = rememberScrollState() + + Column(modifier = Modifier + .fillMaxSize() + .background(color = Color.Black) + .verticalScroll(scrollState) + ) { + Box( + modifier = Modifier + .fillMaxWidth() + .padding(start = 5.dp) + ) { + Button( + onClick = { + isShowing.value = IsShowing.Menu + }, + colors = ButtonDefaults.buttonColors( + contentColor = Color.White, + containerColor = Color.Black + ), + modifier = Modifier + .border( + width = 5.dp, + shape = RoundedCornerShape(roundedCornerDimen), + color = PastelYellow + ) + .width(70.dp) + .height(70.dp) + ) { + Icon( + imageVector = Icons.Default.ArrowBackIosNew, + contentDescription = "Back icon", + modifier = Modifier.size(40.dp) + ) + } + } // back button + + Spacer(Modifier.height(10.dp)) + + SettingsTableRow(settingsData.useSvobodaMode) + + Spacer(Modifier.height(10.dp)) + + SettingsTableRow(settingsData.useAmoledMode) + + Spacer(Modifier.height(10.dp)) + + SettingsTableRow(settingsData.showRefreshButton) + } +} + +@Composable +fun SettingsTableRow(setting: Setting) { + Row( + modifier = Modifier + .padding(10.dp) + .background(color = Color.Black, shape = RoundedCornerShape(roundedCornerDimen)) + .fillMaxWidth(), + verticalAlignment = Alignment.CenterVertically + ) { + Text( + text = setting.name, + textAlign = TextAlign.Start, + color = Color.White, + fontSize = 20.sp + ) + + Spacer(modifier = Modifier.weight(1f)) + + Switch( + checked = setting.checked.value, + onCheckedChange = { + setting.checked.value = it + when (setting.id) { + SettingsId.Svoboda -> settingsData.useSvobodaMode = setting + SettingsId.Amoled -> settingsData.useAmoledMode = setting + SettingsId.RefreshButton -> settingsData.showRefreshButton = setting + } + Util.saveStringToFile(settingsDataFilePath, settingsData.toString()) + }, + colors = SwitchColors( + uncheckedThumbColor = Color.Black, + uncheckedTrackColor = Color.DarkGray, + uncheckedBorderColor = Color.DarkGray, + checkedThumbColor = Color.Black, + checkedTrackColor = PastelYellow, + checkedBorderColor = PastelYellow, + checkedIconColor = Color.White, + uncheckedIconColor = Color.White, + disabledCheckedThumbColor = Color.Black, + disabledCheckedTrackColor = Color.Black, + disabledCheckedBorderColor = Color.Black, + disabledCheckedIconColor = Color.Black, + disabledUncheckedThumbColor = Color.Black, + disabledUncheckedTrackColor = Color.Black, + disabledUncheckedBorderColor = Color.Black, + disabledUncheckedIconColor = Color.Black + ) + ) + } +} \ No newline at end of file diff --git a/mobile/app/src/main/java/com/odweta/solon/Util.kt b/mobile/app/src/main/java/com/odweta/solon/Util.kt index b820c6a..a071260 100644 --- a/mobile/app/src/main/java/com/odweta/solon/Util.kt +++ b/mobile/app/src/main/java/com/odweta/solon/Util.kt @@ -17,6 +17,7 @@ import android.net.NetworkCapabilities import android.os.Build import android.os.Handler import android.util.DisplayMetrics +import android.util.Log import android.view.WindowManager import android.view.animation.AnimationUtils import android.widget.Button @@ -248,5 +249,27 @@ class Util { null } } + + fun stringToSettingsData(s: String): SettingsData { + val settings = s.split("\n") + val auxSettingsData = SettingsData() + val useSvobodaMode = settings[0].split("#") + val useAmoledMode = settings[1].split("#") + val showRefreshButton = settings[2].split("#") + + auxSettingsData.useSvobodaMode.id = SettingsId.Svoboda + auxSettingsData.useSvobodaMode.name = useSvobodaMode[1] + auxSettingsData.useSvobodaMode.checked.value = useSvobodaMode[2].toBoolean() + + auxSettingsData.useAmoledMode.id = SettingsId.Amoled + auxSettingsData.useAmoledMode.name = useAmoledMode[1] + auxSettingsData.useAmoledMode.checked.value = useAmoledMode[2].toBoolean() + + auxSettingsData.showRefreshButton.id = SettingsId.RefreshButton + auxSettingsData.showRefreshButton.name = showRefreshButton[1] + auxSettingsData.showRefreshButton.checked.value = showRefreshButton[2].toBoolean() + + return auxSettingsData + } } } \ No newline at end of file