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