From b21953c571b22867174dafc7807ec7198e3f2188 Mon Sep 17 00:00:00 2001 From: denizk0461 Date: Sun, 21 May 2023 15:29:34 +0200 Subject: [PATCH] Added data type EventTask.kt for the task fragment; added timetableId to StudIPEvent.kt to assign events with a specific timetable, for a future implementation of being able to store multiple timetables simultaneously; database scheme will now be exported to allow for automatic migrations --- app/build.gradle.kts | 4 + .../20.json | 269 ++++++++++++++ .../21.json | 338 ++++++++++++++++++ .../weserplaner/data/StudIPParser.kt | 1 + .../denizk0461/weserplaner/db/AppDatabase.kt | 14 +- .../weserplaner/fragment/EventPageFragment.kt | 1 + .../denizk0461/weserplaner/model/EventTask.kt | 25 ++ .../weserplaner/model/StudIPEvent.kt | 8 + .../weserplaner/sheet/ScheduleUpdateSheet.kt | 2 + app/src/main/res/values-de/strings.xml | 4 + app/src/main/res/values/strings.xml | 6 +- 11 files changed, 667 insertions(+), 5 deletions(-) create mode 100644 app/schemas/com.denizk0461.weserplaner.db.AppDatabase/20.json create mode 100644 app/schemas/com.denizk0461.weserplaner.db.AppDatabase/21.json create mode 100644 app/src/main/java/com/denizk0461/weserplaner/model/EventTask.kt diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 4fca3cf..e9e5b1d 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -20,6 +20,10 @@ android { buildConfigField("long", "BUILD_TIME_MILLIS", "${System.currentTimeMillis()}L") testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + + javaCompileOptions.annotationProcessorOptions { + arguments += mapOf("room.schemaLocation" to "${projectDir}/schemas") + } } buildTypes { diff --git a/app/schemas/com.denizk0461.weserplaner.db.AppDatabase/20.json b/app/schemas/com.denizk0461.weserplaner.db.AppDatabase/20.json new file mode 100644 index 0000000..18d837e --- /dev/null +++ b/app/schemas/com.denizk0461.weserplaner.db.AppDatabase/20.json @@ -0,0 +1,269 @@ +{ + "formatVersion": 1, + "database": { + "version": 20, + "identityHash": "afd2e2f213531096baf1c5656da7f0b9", + "entities": [ + { + "tableName": "studip_events", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`eventId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `title` TEXT NOT NULL, `lecturer` TEXT NOT NULL, `room` TEXT NOT NULL, `day` INTEGER NOT NULL, `timeslotStart` TEXT NOT NULL, `timeslotEnd` TEXT NOT NULL, `timeslotId` INTEGER NOT NULL, `colour` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "eventId", + "columnName": "eventId", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "title", + "columnName": "title", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "lecturer", + "columnName": "lecturer", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "room", + "columnName": "room", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "day", + "columnName": "day", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "timeslotStart", + "columnName": "timeslotStart", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "timeslotEnd", + "columnName": "timeslotEnd", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "timeslotId", + "columnName": "timeslotId", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "colour", + "columnName": "colour", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "eventId" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "offer_date", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER NOT NULL, `date` TEXT NOT NULL, PRIMARY KEY(`id`))", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "offer_canteen", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER NOT NULL, `canteen` TEXT NOT NULL, `openingHours` TEXT NOT NULL, `news` TEXT NOT NULL, PRIMARY KEY(`id`))", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "canteen", + "columnName": "canteen", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "openingHours", + "columnName": "openingHours", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "news", + "columnName": "news", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "offer_category", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER NOT NULL, `dateId` INTEGER NOT NULL, `canteenId` INTEGER NOT NULL, `category` TEXT NOT NULL, PRIMARY KEY(`id`), FOREIGN KEY(`dateId`) REFERENCES `offer_date`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE , FOREIGN KEY(`canteenId`) REFERENCES `offer_canteen`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "dateId", + "columnName": "dateId", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "canteenId", + "columnName": "canteenId", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "category", + "columnName": "category", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [ + { + "table": "offer_date", + "onDelete": "CASCADE", + "onUpdate": "NO ACTION", + "columns": [ + "dateId" + ], + "referencedColumns": [ + "id" + ] + }, + { + "table": "offer_canteen", + "onDelete": "CASCADE", + "onUpdate": "NO ACTION", + "columns": [ + "canteenId" + ], + "referencedColumns": [ + "id" + ] + } + ] + }, + { + "tableName": "offer_item", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`itemId` INTEGER NOT NULL, `categoryId` INTEGER NOT NULL, `title` TEXT NOT NULL, `price` TEXT NOT NULL, `dietary_preferences` TEXT NOT NULL, `allergens` TEXT NOT NULL, PRIMARY KEY(`itemId`), FOREIGN KEY(`categoryId`) REFERENCES `offer_category`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )", + "fields": [ + { + "fieldPath": "itemId", + "columnName": "itemId", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "categoryId", + "columnName": "categoryId", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "title", + "columnName": "title", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "price", + "columnName": "price", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "dietaryPreferences", + "columnName": "dietary_preferences", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "allergens", + "columnName": "allergens", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "itemId" + ] + }, + "indices": [], + "foreignKeys": [ + { + "table": "offer_category", + "onDelete": "CASCADE", + "onUpdate": "NO ACTION", + "columns": [ + "categoryId" + ], + "referencedColumns": [ + "id" + ] + } + ] + } + ], + "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, 'afd2e2f213531096baf1c5656da7f0b9')" + ] + } +} \ 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 new file mode 100644 index 0000000..f12a434 --- /dev/null +++ b/app/schemas/com.denizk0461.weserplaner.db.AppDatabase/21.json @@ -0,0 +1,338 @@ +{ + "formatVersion": 1, + "database": { + "version": 21, + "identityHash": "4ac175b58eab4b387bd1ceb98f39a913", + "entities": [ + { + "tableName": "studip_events", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`eventId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `timetableId` INTEGER NOT NULL DEFAULT 0, `title` TEXT NOT NULL, `lecturer` TEXT NOT NULL, `room` TEXT NOT NULL, `day` INTEGER NOT NULL, `timeslotStart` TEXT NOT NULL, `timeslotEnd` TEXT NOT NULL, `timeslotId` INTEGER NOT NULL, `colour` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "eventId", + "columnName": "eventId", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "timetableId", + "columnName": "timetableId", + "affinity": "INTEGER", + "notNull": true, + "defaultValue": "0" + }, + { + "fieldPath": "title", + "columnName": "title", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "lecturer", + "columnName": "lecturer", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "room", + "columnName": "room", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "day", + "columnName": "day", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "timeslotStart", + "columnName": "timeslotStart", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "timeslotEnd", + "columnName": "timeslotEnd", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "timeslotId", + "columnName": "timeslotId", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "colour", + "columnName": "colour", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "eventId" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "offer_date", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER NOT NULL, `date` TEXT NOT NULL, PRIMARY KEY(`id`))", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "offer_canteen", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER NOT NULL, `canteen` TEXT NOT NULL, `openingHours` TEXT NOT NULL, `news` TEXT NOT NULL, PRIMARY KEY(`id`))", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "canteen", + "columnName": "canteen", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "openingHours", + "columnName": "openingHours", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "news", + "columnName": "news", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "offer_category", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER NOT NULL, `dateId` INTEGER NOT NULL, `canteenId` INTEGER NOT NULL, `category` TEXT NOT NULL, PRIMARY KEY(`id`), FOREIGN KEY(`dateId`) REFERENCES `offer_date`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE , FOREIGN KEY(`canteenId`) REFERENCES `offer_canteen`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "dateId", + "columnName": "dateId", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "canteenId", + "columnName": "canteenId", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "category", + "columnName": "category", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [ + { + "table": "offer_date", + "onDelete": "CASCADE", + "onUpdate": "NO ACTION", + "columns": [ + "dateId" + ], + "referencedColumns": [ + "id" + ] + }, + { + "table": "offer_canteen", + "onDelete": "CASCADE", + "onUpdate": "NO ACTION", + "columns": [ + "canteenId" + ], + "referencedColumns": [ + "id" + ] + } + ] + }, + { + "tableName": "offer_item", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`itemId` INTEGER NOT NULL, `categoryId` INTEGER NOT NULL, `title` TEXT NOT NULL, `price` TEXT NOT NULL, `dietary_preferences` TEXT NOT NULL, `allergens` TEXT NOT NULL, PRIMARY KEY(`itemId`), FOREIGN KEY(`categoryId`) REFERENCES `offer_category`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )", + "fields": [ + { + "fieldPath": "itemId", + "columnName": "itemId", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "categoryId", + "columnName": "categoryId", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "title", + "columnName": "title", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "price", + "columnName": "price", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "dietaryPreferences", + "columnName": "dietary_preferences", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "allergens", + "columnName": "allergens", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "itemId" + ] + }, + "indices": [], + "foreignKeys": [ + { + "table": "offer_category", + "onDelete": "CASCADE", + "onUpdate": "NO ACTION", + "columns": [ + "categoryId" + ], + "referencedColumns": [ + "id" + ] + } + ] + }, + { + "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, `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 )", + "fields": [ + { + "fieldPath": "taskId", + "columnName": "taskId", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "eventId", + "columnName": "eventId", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "dueDate", + "columnName": "dueDate", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "title", + "columnName": "title", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "notes", + "columnName": "notes", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "room", + "columnName": "room", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "taskId" + ] + }, + "indices": [], + "foreignKeys": [ + { + "table": "studip_events", + "onDelete": "CASCADE", + "onUpdate": "NO ACTION", + "columns": [ + "eventId" + ], + "referencedColumns": [ + "eventId" + ] + } + ] + } + ], + "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, '4ac175b58eab4b387bd1ceb98f39a913')" + ] + } +} \ No newline at end of file diff --git a/app/src/main/java/com/denizk0461/weserplaner/data/StudIPParser.kt b/app/src/main/java/com/denizk0461/weserplaner/data/StudIPParser.kt index 00c1fef..c23a3af 100644 --- a/app/src/main/java/com/denizk0461/weserplaner/data/StudIPParser.kt +++ b/app/src/main/java/com/denizk0461/weserplaner/data/StudIPParser.kt @@ -96,6 +96,7 @@ class StudIPParser(application: Application) { // Construct the newly scraped Stud.IP event val event = StudIPEvent( + timetableId = 0, // TODO title = parsedTitle, lecturer = parsedLecturers, room = entryInfo.getOrQuestionMark(1), diff --git a/app/src/main/java/com/denizk0461/weserplaner/db/AppDatabase.kt b/app/src/main/java/com/denizk0461/weserplaner/db/AppDatabase.kt index 31b3bc7..f51b683 100644 --- a/app/src/main/java/com/denizk0461/weserplaner/db/AppDatabase.kt +++ b/app/src/main/java/com/denizk0461/weserplaner/db/AppDatabase.kt @@ -1,6 +1,7 @@ package com.denizk0461.weserplaner.db import android.content.Context +import androidx.room.AutoMigration import androidx.room.Database import androidx.room.Room import androidx.room.RoomDatabase @@ -18,8 +19,13 @@ import com.denizk0461.weserplaner.model.* OfferCanteen::class, OfferCategory::class, OfferItem::class, + EventTask::class, + ], + version = 21, + exportSchema = true, + autoMigrations = [ + AutoMigration(from = 20, to = 21), ], - version = 20, ) abstract class AppDatabase : RoomDatabase() { @@ -50,7 +56,11 @@ abstract class AppDatabase : RoomDatabase() { context.applicationContext, AppDatabase::class.java, "event_db", - ).addMigrations(migrationAddNewsToOfferCanteen_19_20) + ).addMigrations( + migrationAddNewsToOfferCanteen_19_20, +// migrationAddTimetableId_20_21, +// migrationAddEventTask_20_21, + ) // .fallbackToDestructiveMigration() .build() } diff --git a/app/src/main/java/com/denizk0461/weserplaner/fragment/EventPageFragment.kt b/app/src/main/java/com/denizk0461/weserplaner/fragment/EventPageFragment.kt index e738e55..460b4e9 100644 --- a/app/src/main/java/com/denizk0461/weserplaner/fragment/EventPageFragment.kt +++ b/app/src/main/java/com/denizk0461/weserplaner/fragment/EventPageFragment.kt @@ -90,6 +90,7 @@ class EventPageFragment : AppFragment(), StudIPEventItemAda eventAdapter.setNewData(events.ifEmpty { listOf( // Use an event with eventId = -1 to denote that there are no events for this day StudIPEvent( + -1, -1, "", "", diff --git a/app/src/main/java/com/denizk0461/weserplaner/model/EventTask.kt b/app/src/main/java/com/denizk0461/weserplaner/model/EventTask.kt new file mode 100644 index 0000000..cc3b00a --- /dev/null +++ b/app/src/main/java/com/denizk0461/weserplaner/model/EventTask.kt @@ -0,0 +1,25 @@ +package com.denizk0461.weserplaner.model + +import androidx.room.Entity +import androidx.room.ForeignKey +import androidx.room.PrimaryKey + +@Entity( + tableName = "event_tasks", + foreignKeys = [ + ForeignKey( + StudIPEvent::class, + ["eventId"], + ["eventId"], + ForeignKey.CASCADE, + ), + ], +) +data class EventTask( + @PrimaryKey(autoGenerate = true) val taskId: Int = 0, + val eventId: Int, + val dueDate: Int, + val title: String, + val notes: String, + val room: String, +) diff --git a/app/src/main/java/com/denizk0461/weserplaner/model/StudIPEvent.kt b/app/src/main/java/com/denizk0461/weserplaner/model/StudIPEvent.kt index a510225..b75e204 100644 --- a/app/src/main/java/com/denizk0461/weserplaner/model/StudIPEvent.kt +++ b/app/src/main/java/com/denizk0461/weserplaner/model/StudIPEvent.kt @@ -2,6 +2,7 @@ package com.denizk0461.weserplaner.model import android.os.Parcel import android.os.Parcelable +import androidx.room.ColumnInfo import androidx.room.Entity import androidx.room.PrimaryKey @@ -9,6 +10,7 @@ import androidx.room.PrimaryKey * Entity for storing entries of the user's Stud.IP schedule. Registered in the app database. * * @param eventId primary key that uniquely identifies the entry + * @param timetableId identifier to assign the event to a timetable * @param title title of the event * @param lecturer lecturer(s) organising the event * @param room room the event takes place in @@ -21,6 +23,7 @@ import androidx.room.PrimaryKey @Entity(tableName = "studip_events") data class StudIPEvent( @PrimaryKey(autoGenerate = true) val eventId: Int = 0, + @ColumnInfo(defaultValue = "0") val timetableId: Int, val title: String, val lecturer: String, val room: String, @@ -30,6 +33,7 @@ data class StudIPEvent( val timeslotId: Int, val colour: Int = 0, ) : Parcelable { + /** * Parse timeslotStart and timeslotEnd into an easily readable string in the following format: * 12:15 – 13:45 @@ -45,6 +49,7 @@ data class StudIPEvent( other as StudIPEvent if (eventId != other.eventId) return false + if (timetableId != other.timetableId) return false if (title != other.title) return false if (lecturer != other.lecturer) return false if (room != other.room) return false @@ -59,6 +64,7 @@ data class StudIPEvent( override fun hashCode(): Int { var result = eventId + result = 31 * result + timetableId result = 31 * result + title.hashCode() result = 31 * result + lecturer.hashCode() result = 31 * result + room.hashCode() @@ -71,6 +77,7 @@ data class StudIPEvent( } constructor(source: Parcel) : this( + source.readInt(), source.readInt(), source.readString() ?: "", source.readString() ?: "", @@ -86,6 +93,7 @@ data class StudIPEvent( override fun writeToParcel(dest: Parcel, flags: Int): Unit = with(dest) { writeInt(eventId) + writeInt(timetableId) writeString(title) writeString(lecturer) writeString(room) diff --git a/app/src/main/java/com/denizk0461/weserplaner/sheet/ScheduleUpdateSheet.kt b/app/src/main/java/com/denizk0461/weserplaner/sheet/ScheduleUpdateSheet.kt index b043578..f5c58f1 100644 --- a/app/src/main/java/com/denizk0461/weserplaner/sheet/ScheduleUpdateSheet.kt +++ b/app/src/main/java/com/denizk0461/weserplaner/sheet/ScheduleUpdateSheet.kt @@ -144,6 +144,7 @@ class ScheduleUpdateSheet : AppSheet(R.layout.sheet_schedule_update) { // construct new StudIPEvent from the data the user may have edited StudIPEvent( eventId = event.eventId, + timetableId = event.timetableId, title = binding.editTextTitle.text.toString().trim(), lecturer = binding.editTextLecturers.text.toString().trim(), room = binding.editTextRoom.text.toString().trim(), @@ -204,6 +205,7 @@ class ScheduleUpdateSheet : AppSheet(R.layout.sheet_schedule_update) { viewModel.insert( // construct new StudIPEvent from the data the user may have edited StudIPEvent( + timetableId = 0, // TODO current timetable title = binding.editTextTitle.text.toString().trim(), lecturer = binding.editTextLecturers.text.toString().trim(), room = binding.editTextRoom.text.toString().trim(), diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 039aeb5..346ebf5 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -240,6 +240,10 @@ Siehe Lizenzen Ressourcen, die diese App möglich gemacht haben + Experimentelle Einstellungen werden angezeigt. + Experimentelle Einstellungen wurden ausgeblendet. + + Cheatcodes App-Version diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 11e22c1..8f5e92f 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -245,10 +245,10 @@ View licences Resources that made this app possible - Experimental settings have been unlocked. - Experimental settings have been hidden. + Experimental settings have been unlocked. + Experimental settings have been hidden. - Cheat Codes + Cheat Codes App Version