diff --git a/app/build.gradle.kts b/app/build.gradle.kts
index e9e5b1d..e942169 100644
--- a/app/build.gradle.kts
+++ b/app/build.gradle.kts
@@ -12,8 +12,8 @@ android {
applicationId = "com.denizk0461.weserplaner"
minSdk = 24
targetSdk = 33
- versionCode = 7
- versionName = "1.0.3"
+ versionCode = 8
+ versionName = "1.1.0"
resourceConfigurations += arrayOf("en", "de")
@@ -65,5 +65,7 @@ dependencies {
implementation("com.google.android.material:material:1.9.0")
+ implementation("com.github.alamkanak:android-week-view:1.2.6")
+
implementation("org.jsoup:jsoup:1.15.4")
}
\ No newline at end of file
diff --git a/app/schemas/com.denizk0461.weserplaner.db.AppDatabase/21.json b/app/schemas/com.denizk0461.weserplaner.db.AppDatabase/21.json
index f4890c2..4f58403 100644
--- a/app/schemas/com.denizk0461.weserplaner.db.AppDatabase/21.json
+++ b/app/schemas/com.denizk0461.weserplaner.db.AppDatabase/21.json
@@ -2,7 +2,7 @@
"formatVersion": 1,
"database": {
"version": 21,
- "identityHash": "202a385ce4f79f957d41c8e4a2b8ab22",
+ "identityHash": "8cc123552f213d71a339b0c3a89da48c",
"entities": [
{
"tableName": "studip_events",
@@ -268,7 +268,7 @@
},
{
"tableName": "event_tasks",
- "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`taskId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `eventId` INTEGER NOT NULL, `dueDate` INTEGER NOT NULL, `notifyDate` INTEGER NOT NULL, `title` TEXT NOT NULL, `notes` TEXT NOT NULL, `room` TEXT NOT NULL, FOREIGN KEY(`eventId`) REFERENCES `studip_events`(`eventId`) ON UPDATE NO ACTION ON DELETE CASCADE )",
+ "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`taskId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `eventId` INTEGER NOT NULL, `dueDate` INTEGER NOT NULL, `notifyDate` INTEGER NOT NULL, `title` TEXT NOT NULL, `notes` TEXT NOT NULL, `room` TEXT NOT NULL, `isFinished` INTEGER NOT NULL, FOREIGN KEY(`eventId`) REFERENCES `studip_events`(`eventId`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "taskId",
@@ -311,6 +311,12 @@
"columnName": "room",
"affinity": "TEXT",
"notNull": true
+ },
+ {
+ "fieldPath": "isFinished",
+ "columnName": "isFinished",
+ "affinity": "INTEGER",
+ "notNull": true
}
],
"primaryKey": {
@@ -338,7 +344,7 @@
"views": [],
"setupQueries": [
"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
- "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '202a385ce4f79f957d41c8e4a2b8ab22')"
+ "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '8cc123552f213d71a339b0c3a89da48c')"
]
}
}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 77ac85b..08c489a 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -41,6 +41,14 @@
android:configChanges="orientation|keyboardHidden|screenSize"
android:theme="@style/Theme.StudIPTimetable">
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/denizk0461/weserplaner/activity/TimetableOverviewActivity.kt b/app/src/main/java/com/denizk0461/weserplaner/activity/TimetableOverviewActivity.kt
new file mode 100644
index 0000000..9ea0fe9
--- /dev/null
+++ b/app/src/main/java/com/denizk0461/weserplaner/activity/TimetableOverviewActivity.kt
@@ -0,0 +1,62 @@
+package com.denizk0461.weserplaner.activity
+
+import android.os.Bundle
+import androidx.appcompat.app.AppCompatActivity
+import androidx.core.view.WindowCompat
+import androidx.core.view.WindowInsetsCompat
+import androidx.core.view.WindowInsetsControllerCompat
+import androidx.lifecycle.ViewModelProvider
+import com.alamkanak.weekview.WeekViewEvent
+import com.denizk0461.weserplaner.databinding.ActivityTimetableOverviewBinding
+import com.denizk0461.weserplaner.viewmodel.TimetableOverviewViewModel
+import java.util.Calendar
+import java.util.Date
+
+/**
+ * This activity serves the user in displaying a full week overview of their timetable. This can be
+ * used to quickly share their timetable with other people, in screenshot form, for example, as
+ * [com.denizk0461.weserplaner.fragment.EventFragment] only displays one day at a time.
+ */
+class TimetableOverviewActivity : AppCompatActivity() {
+
+ // View binding
+ private lateinit var binding: ActivityTimetableOverviewBinding
+
+ // View model
+ private lateinit var viewModel: TimetableOverviewViewModel
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ WindowCompat.setDecorFitsSystemWindows(window, false)
+ super.onCreate(savedInstanceState)
+
+ // Instantiate view model
+ viewModel = ViewModelProvider.AndroidViewModelFactory(application)
+ .create(TimetableOverviewViewModel::class.java)
+
+ // Inflate view binding and bind to this activity
+ binding = ActivityTimetableOverviewBinding.inflate(layoutInflater)
+ setContentView(binding.root)
+
+ // Hide system UI elements to maximise space for the user's timetable
+ hideSystemUi()
+
+ val a = WeekViewEvent(0, "hi", createCalendarDate(), createCalendarDate(true))
+
+ viewModel.getAllEvents().observe(this) { events ->
+ binding.weekView.weekViewLoader
+ }
+
+ // TODO pay attention to whether content is hidden behind camera cutouts
+ }
+
+ private fun hideSystemUi() {
+ WindowCompat.setDecorFitsSystemWindows(window, false)
+ WindowInsetsControllerCompat(window, binding.root).let { controller ->
+ controller.hide(WindowInsetsCompat.Type.systemBars())
+ controller.systemBarsBehavior = WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
+ }
+ }
+
+ private fun createCalendarDate(a: Boolean = false) = Calendar.getInstance().also {
+ it.time = Date(if (!a) 1684792800 else 1684800000) }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/denizk0461/weserplaner/adapter/DropdownAdapter.kt b/app/src/main/java/com/denizk0461/weserplaner/adapter/DropdownAdapter.kt
new file mode 100644
index 0000000..9fc544b
--- /dev/null
+++ b/app/src/main/java/com/denizk0461/weserplaner/adapter/DropdownAdapter.kt
@@ -0,0 +1,24 @@
+package com.denizk0461.weserplaner.adapter
+
+import android.content.Context
+import android.widget.ArrayAdapter
+import android.widget.Filter
+import com.denizk0461.weserplaner.R
+
+/**
+ * Class used to mitigate issues with the ArrayAdapter deleting items.
+ *
+ * @param context context reference
+ * @param items list of texts to display
+ */
+class DropdownAdapter(context: Context, items: List)
+ : ArrayAdapter(context, R.layout.item_dropdown, items) {
+
+ private val noOpFilter = object : Filter() {
+ private val noOpResult = FilterResults()
+ override fun performFiltering(constraint: CharSequence?) = noOpResult
+ override fun publishResults(constraint: CharSequence?, results: FilterResults?) {}
+ }
+
+ override fun getFilter() = noOpFilter
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/denizk0461/weserplaner/adapter/TaskOverviewAdapter.kt b/app/src/main/java/com/denizk0461/weserplaner/adapter/TaskOverviewAdapter.kt
index c02a75f..29256d3 100644
--- a/app/src/main/java/com/denizk0461/weserplaner/adapter/TaskOverviewAdapter.kt
+++ b/app/src/main/java/com/denizk0461/weserplaner/adapter/TaskOverviewAdapter.kt
@@ -11,7 +11,7 @@ import com.denizk0461.weserplaner.R
import com.denizk0461.weserplaner.data.AppDiffUtilCallback
import com.denizk0461.weserplaner.data.isInThePast
import com.denizk0461.weserplaner.databinding.ItemTaskBinding
-import com.denizk0461.weserplaner.model.EventTask
+import com.denizk0461.weserplaner.model.EventTaskExtended
import com.denizk0461.weserplaner.model.FormattedDate
class TaskOverviewAdapter(
@@ -21,7 +21,7 @@ class TaskOverviewAdapter(
/**
* List of all events.
*/
- private val tasks: MutableList = mutableListOf()
+ private val tasks: MutableList = mutableListOf()
/**
* View holder class for parent class
@@ -58,12 +58,15 @@ class TaskOverviewAdapter(
// view set-up
- // Set title text
- holder.binding.textTitle.text = currentItem.title
+ // Set event title text
+ holder.binding.textEventTitle.text = currentItem.eventTitle
+
+ // Set task title text
+ holder.binding.textTitle.text = currentItem.taskTitle
- // Set due date text to formatted date, TODO let user pick the date format
val dueDate = FormattedDate(currentItem.dueDate)
+ // Set due date text to formatted date, TODO let user pick the date format
holder.binding.textDueDate.text = dueDate.localisedString(context)
if (currentItem.notifyDate == -1L) {
@@ -93,6 +96,10 @@ class TaskOverviewAdapter(
}, notifyDate.dateString, notifyDate.timeString)
}
+ holder.binding.textLecturer.text = currentItem.lecturer
+ holder.binding.textRoom.text = currentItem.room
+ holder.binding.textNotes.text = currentItem.notes
+
// Set up single click listener
holder.binding.linearLayout.setOnClickListener {
// Prepare layout animation
@@ -121,7 +128,7 @@ class TaskOverviewAdapter(
*
* @param newData new dataset to be displayed
*/
- fun setNewData(newData: List) {
+ fun setNewData(newData: List) {
// Calculate the difference between the old list and the new list
val diffResult = DiffUtil.calculateDiff(AppDiffUtilCallback(tasks, newData))
@@ -146,6 +153,6 @@ class TaskOverviewAdapter(
* @param task item that has been long-pressed
* @return whether the long press was successful
*/
- fun onLongClick(task: EventTask): Boolean
+ fun onLongClick(task: EventTaskExtended): Boolean
}
}
\ No newline at end of file
diff --git a/app/src/main/java/com/denizk0461/weserplaner/db/AppDAO.kt b/app/src/main/java/com/denizk0461/weserplaner/db/AppDAO.kt
index 2636831..cc33d14 100644
--- a/app/src/main/java/com/denizk0461/weserplaner/db/AppDAO.kt
+++ b/app/src/main/java/com/denizk0461/weserplaner/db/AppDAO.kt
@@ -13,6 +13,14 @@ interface AppDAO {
/* --- Stud.IP schedule events --- */
+ /**
+ * Retrieve all Stud.IP events from the database.
+ *
+ * @return all events
+ */
+ @Query("SELECT * FROM studip_events ORDER BY timeslotId, eventId")
+ fun getAllEvents(): LiveData>
+
/**
* Retrieves the number of Stud.IP events available in the database.
*
@@ -81,7 +89,8 @@ interface AppDAO {
"studip_events.title AS eventTitle, " +
"studip_events.lecturer, " +
"event_tasks.notes, " +
- "studip_events.room " +
+ "studip_events.room, " +
+ "event_tasks.isFinished " +
"FROM event_tasks " +
"JOIN studip_events ON event_tasks.eventId = studip_events.eventId " +
"ORDER BY taskId"
@@ -102,7 +111,8 @@ interface AppDAO {
"studip_events.title AS eventTitle, " +
"studip_events.lecturer, " +
"event_tasks.notes, " +
- "studip_events.room " +
+ "studip_events.room, " +
+ "event_tasks.isFinished " +
"FROM event_tasks " +
"JOIN studip_events ON event_tasks.eventId = studip_events.eventId " +
"ORDER BY taskTitle")
@@ -122,7 +132,8 @@ interface AppDAO {
"studip_events.title AS eventTitle, " +
"studip_events.lecturer, " +
"event_tasks.notes, " +
- "studip_events.room " +
+ "studip_events.room, " +
+ "event_tasks.isFinished " +
"FROM event_tasks " +
"JOIN studip_events ON event_tasks.eventId = studip_events.eventId " +
"ORDER BY dueDate")
diff --git a/app/src/main/java/com/denizk0461/weserplaner/db/AppRepository.kt b/app/src/main/java/com/denizk0461/weserplaner/db/AppRepository.kt
index 46b65dd..ca7eb1f 100644
--- a/app/src/main/java/com/denizk0461/weserplaner/db/AppRepository.kt
+++ b/app/src/main/java/com/denizk0461/weserplaner/db/AppRepository.kt
@@ -58,6 +58,13 @@ class AppRepository(app: Application) {
}
}
+ /**
+ * Retrieve all Stud.IP events from the database.
+ *
+ * @return all events
+ */
+ fun getAllEvents(): LiveData> = dao.getAllEvents()
+
/**
* Retrieves the number of Stud.IP events available in the database.
*
diff --git a/app/src/main/java/com/denizk0461/weserplaner/fragment/EventFragment.kt b/app/src/main/java/com/denizk0461/weserplaner/fragment/EventFragment.kt
index 20f3148..3a89275 100644
--- a/app/src/main/java/com/denizk0461/weserplaner/fragment/EventFragment.kt
+++ b/app/src/main/java/com/denizk0461/weserplaner/fragment/EventFragment.kt
@@ -9,6 +9,7 @@ import androidx.fragment.app.viewModels
import androidx.viewpager2.widget.ViewPager2
import com.denizk0461.weserplaner.R
import com.denizk0461.weserplaner.activity.FetcherActivity
+import com.denizk0461.weserplaner.activity.TimetableOverviewActivity
import com.denizk0461.weserplaner.adapter.StudIPEventPageAdapter
import com.denizk0461.weserplaner.data.showSnackBar
import com.denizk0461.weserplaner.databinding.FragmentEventBinding
@@ -43,6 +44,11 @@ class EventFragment : AppFragment() {
// Get localised weekday names
weekdays = context.resources?.getStringArray(R.array.weekdays) ?: arrayOf()
+ // Set up button to view timetable overview
+ binding.buttonViewOverview.setOnClickListener {
+ startActivity(Intent(context, TimetableOverviewActivity::class.java))
+ }
+
// Set up the view pager's adapter
viewPagerAdapter = StudIPEventPageAdapter(
childFragmentManager,
diff --git a/app/src/main/java/com/denizk0461/weserplaner/fragment/SettingsFragment.kt b/app/src/main/java/com/denizk0461/weserplaner/fragment/SettingsFragment.kt
index cfa034d..2ada3cd 100644
--- a/app/src/main/java/com/denizk0461/weserplaner/fragment/SettingsFragment.kt
+++ b/app/src/main/java/com/denizk0461/weserplaner/fragment/SettingsFragment.kt
@@ -176,6 +176,23 @@ class SettingsFragment : AppFragment() {
}
}
+ // TODO Set up dropdown menu for picking a date format
+// val dateAdapter = DropdownAdapter(
+// context,
+// context.resources.getStringArray(R.array.settings_date_format_items).toList(),
+// )
+//
+// binding.autoCompleteFont.setAdapter(dateAdapter)
+// binding.autoCompleteFont.setText(
+// dateAdapter.getItem(storage.getTypefaceIndex()).toString(),
+// false,
+// )
+//
+// binding.autoCompleteFont.setOnItemClickListener { _, _, position, _ ->
+// storage.setTypefaceIndex(position)
+// binding.autoCompleteFont.setText(dateAdapter.getItem(position), false)
+// }
+
// Set up switch for colouring dietary preferences
binding.switchPrefColour.apply {
isChecked = viewModel.preferenceColour
diff --git a/app/src/main/java/com/denizk0461/weserplaner/fragment/TaskOverviewFragment.kt b/app/src/main/java/com/denizk0461/weserplaner/fragment/TaskOverviewFragment.kt
index 40a9844..149f560 100644
--- a/app/src/main/java/com/denizk0461/weserplaner/fragment/TaskOverviewFragment.kt
+++ b/app/src/main/java/com/denizk0461/weserplaner/fragment/TaskOverviewFragment.kt
@@ -11,7 +11,7 @@ import com.denizk0461.weserplaner.R
import com.denizk0461.weserplaner.adapter.TaskOverviewAdapter
import com.denizk0461.weserplaner.data.showSnackBar
import com.denizk0461.weserplaner.databinding.FragmentTaskOverviewBinding
-import com.denizk0461.weserplaner.model.EventTask
+import com.denizk0461.weserplaner.model.EventTaskExtended
import com.denizk0461.weserplaner.values.TaskOrder
import com.denizk0461.weserplaner.viewmodel.TaskOverviewViewModel
@@ -91,7 +91,7 @@ class TaskOverviewFragment : AppFragment(),
}
}
- override fun onLongClick(task: EventTask): Boolean {
+ override fun onLongClick(task: EventTaskExtended): Boolean {
// TODO
return false
}
diff --git a/app/src/main/java/com/denizk0461/weserplaner/model/EventTask.kt b/app/src/main/java/com/denizk0461/weserplaner/model/EventTask.kt
index e913532..d48c970 100644
--- a/app/src/main/java/com/denizk0461/weserplaner/model/EventTask.kt
+++ b/app/src/main/java/com/denizk0461/weserplaner/model/EventTask.kt
@@ -15,6 +15,7 @@ import androidx.room.PrimaryKey
* @param title title of the task
* @param notes user-added notes for the task
* @param room room the task may take place in
+ * @param isFinished whether this task has been marked as finished by the user
*/
@Entity(
tableName = "event_tasks",
@@ -35,4 +36,5 @@ data class EventTask(
val title: String,
val notes: String,
val room: String,
+ val isFinished: Boolean = false,
)
diff --git a/app/src/main/java/com/denizk0461/weserplaner/model/EventTaskExtended.kt b/app/src/main/java/com/denizk0461/weserplaner/model/EventTaskExtended.kt
index d167ec2..9b9bb82 100644
--- a/app/src/main/java/com/denizk0461/weserplaner/model/EventTaskExtended.kt
+++ b/app/src/main/java/com/denizk0461/weserplaner/model/EventTaskExtended.kt
@@ -14,15 +14,17 @@ package com.denizk0461.weserplaner.model
* @param lecturer lecturer(s) organising the event
* @param notes user-added notes for the task
* @param room room the task may take place in
+ * @param isFinished whether this task has been marked as finished by the user
*/
data class EventTaskExtended(
val taskId: Int,
val eventId: Int,
- val dueDate: Int,
- val notifyDate: Int,
+ val dueDate: Long,
+ val notifyDate: Long,
val eventTitle: String,
val taskTitle: String,
val lecturer: String,
val notes: String,
val room: String,
+ val isFinished: Boolean,
)
diff --git a/app/src/main/java/com/denizk0461/weserplaner/viewmodel/TaskOverviewViewModel.kt b/app/src/main/java/com/denizk0461/weserplaner/viewmodel/TaskOverviewViewModel.kt
index 8ca5e8e..b08c4ac 100644
--- a/app/src/main/java/com/denizk0461/weserplaner/viewmodel/TaskOverviewViewModel.kt
+++ b/app/src/main/java/com/denizk0461/weserplaner/viewmodel/TaskOverviewViewModel.kt
@@ -1,7 +1,7 @@
package com.denizk0461.weserplaner.viewmodel
import android.app.Application
-import com.denizk0461.weserplaner.model.EventTask
+import com.denizk0461.weserplaner.model.EventTaskExtended
import com.denizk0461.weserplaner.values.TaskOrder
/**
@@ -18,8 +18,8 @@ class TaskOverviewViewModel(application: Application) : AppViewModel(application
// fun getTasks(order: TaskOrder): LiveData> = repo.getTasks(order)
fun getTasks(order: TaskOrder) = listOf( // dummy data
- EventTask(0, 0, 1684758756L, -1L, "title1", "user notes", "GW2 B-idk"),
- EventTask(1, 0, 1684798756L, -1L, "title2", "user notes", "GW3 C-idk"),
- EventTask(2, 0, 1689758756L, 1689958756L, "title3", "user notes", "GW4 D-idk"),
+ EventTaskExtended(0, 0, 1684758756L, -1L, "event1", "title1", "lecturer", "user notes", "GW2 B-idk", false),
+ EventTaskExtended(1, 0, 1684798756L, -1L, "event2", "title2", "lecturer", "user notes", "GW3 C-idk", false),
+ EventTaskExtended(2, 0, 1689758756L, 1689958756L, "event3", "title3", "lecturer", "user notes user notes user notes user notes user notes user notes user notes user notes user notes user notes user notes user notes user notes user notes user notes user notes user notes user notes user notes user notes user notes user notes user notes user notes user notes", "GW4 D-idk", false),
)
}
\ No newline at end of file
diff --git a/app/src/main/java/com/denizk0461/weserplaner/viewmodel/TimetableOverviewViewModel.kt b/app/src/main/java/com/denizk0461/weserplaner/viewmodel/TimetableOverviewViewModel.kt
new file mode 100644
index 0000000..8778a33
--- /dev/null
+++ b/app/src/main/java/com/denizk0461/weserplaner/viewmodel/TimetableOverviewViewModel.kt
@@ -0,0 +1,15 @@
+package com.denizk0461.weserplaner.viewmodel
+
+import android.app.Application
+import androidx.lifecycle.LiveData
+import com.denizk0461.weserplaner.model.StudIPEvent
+
+class TimetableOverviewViewModel(application: Application) : AppViewModel(application) {
+
+ /**
+ * Retrieve all Stud.IP events from the database.
+ *
+ * @return all events
+ */
+ fun getAllEvents(): LiveData> = repo.getAllEvents()
+}
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_timetable_overview.xml b/app/src/main/res/layout/activity_timetable_overview.xml
new file mode 100644
index 0000000..9400dc6
--- /dev/null
+++ b/app/src/main/res/layout/activity_timetable_overview.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_event.xml b/app/src/main/res/layout/fragment_event.xml
index 017c141..644c42c 100644
--- a/app/src/main/res/layout/fragment_event.xml
+++ b/app/src/main/res/layout/fragment_event.xml
@@ -13,17 +13,51 @@
android:layout_height="wrap_content"
android:fitsSystemWindows="true">
-
+ android:layout_marginStart="16dp"
+ android:layout_marginEnd="8dp"
+ app:layout_scrollFlags="scroll">
+
+
+
+
+
+
+ android:layout_marginEnd="8dp"
+ app:layout_scrollFlags="scroll">
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/item_task.xml b/app/src/main/res/layout/item_task.xml
index 9ed977b..b0ec7e2 100644
--- a/app/src/main/res/layout/item_task.xml
+++ b/app/src/main/res/layout/item_task.xml
@@ -29,11 +29,11 @@
android:layout_height="wrap_content">
+ android:textSize="22sp"
+ app:fontFamily="@font/lato_bolditalic"/>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml
index 1739320..9f37143 100644
--- a/app/src/main/res/values-de/strings.xml
+++ b/app/src/main/res/values-de/strings.xml
@@ -48,6 +48,7 @@
• Logge dich mit deinem Stud.IP-Login ein\n • Öffne deinen Stundenplan, falls er sich nicht automatisch öffnet, indem du in der unteren Leiste auf das rechte Logo klickst, das wie ein Stift und ein Lineal aussieht\n • Klicke auf den \'Speichern\'-Knopf, der unten in der rechten Ecke auftaucht\n • Fertig!
Speichere den Stundenplan in der App ab
+ Siehe gesamten Stundenplan
Neue Veranstaltung
%ss hast du keine Veranstaltungen.
@@ -249,6 +250,8 @@
Wähle, mit welchem Bildschirm die App startet
+ Wähle das Format für Datumsangaben
+
Färbe Diätpreferenzen
Dies färbt die kleinen Symbole ähnlich wie auf der Webseite
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 62dd7a2..85c147d 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -49,6 +49,7 @@
• Log in with your Stud.IP login\n • Open your timetable view, in case it doesn\'t open automatically, by clicking the rightmost icon in the bottom bar that looks like a pencil and a ruler\n • Click the \'save\' button that appears in the bottom right corner\n • Done!
Save the timetable in the app
+ View full schedule
New event
You don\'t have any events for %s.
@@ -257,6 +258,14 @@
Select which screen to start the app with
+ Select which format to show dates in
+
+ - 24.05.2023, 8:45
+ - 2023–05–24, 08:45
+ - 2023–05–24, 08:45:11.518
+ - 05/24/23, 8:45 AM
+
+
Opt-in to sharing crash data
Data will be anonymised