From 98a3a136232173aaf450a87dab05e52e3bd7d976 Mon Sep 17 00:00:00 2001 From: denizk0461 Date: Thu, 25 May 2023 12:32:10 +0200 Subject: [PATCH] Added TimetableOverviewActivity.kt and a means to launch via a button through EventFragment.kt; implementation unfinished --- app/build.gradle.kts | 6 +- .../21.json | 12 +++- app/src/main/AndroidManifest.xml | 8 +++ .../activity/TimetableOverviewActivity.kt | 62 +++++++++++++++++++ .../weserplaner/adapter/DropdownAdapter.kt | 24 +++++++ .../adapter/TaskOverviewAdapter.kt | 21 ++++--- .../com/denizk0461/weserplaner/db/AppDAO.kt | 17 ++++- .../weserplaner/db/AppRepository.kt | 7 +++ .../weserplaner/fragment/EventFragment.kt | 6 ++ .../weserplaner/fragment/SettingsFragment.kt | 17 +++++ .../fragment/TaskOverviewFragment.kt | 4 +- .../denizk0461/weserplaner/model/EventTask.kt | 2 + .../weserplaner/model/EventTaskExtended.kt | 6 +- .../viewmodel/TaskOverviewViewModel.kt | 8 +-- .../viewmodel/TimetableOverviewViewModel.kt | 15 +++++ .../layout/activity_timetable_overview.xml | 11 ++++ app/src/main/res/layout/fragment_event.xml | 54 +++++++++++++--- .../res/layout/fragment_task_overview.xml | 3 +- app/src/main/res/layout/item_dropdown.xml | 10 +++ app/src/main/res/layout/item_task.xml | 50 ++++++++++++--- app/src/main/res/values-de/strings.xml | 3 + app/src/main/res/values/strings.xml | 9 +++ 22 files changed, 313 insertions(+), 42 deletions(-) create mode 100644 app/src/main/java/com/denizk0461/weserplaner/activity/TimetableOverviewActivity.kt create mode 100644 app/src/main/java/com/denizk0461/weserplaner/adapter/DropdownAdapter.kt create mode 100644 app/src/main/java/com/denizk0461/weserplaner/viewmodel/TimetableOverviewViewModel.kt create mode 100644 app/src/main/res/layout/activity_timetable_overview.xml create mode 100644 app/src/main/res/layout/item_dropdown.xml 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