diff --git a/.idea/deploymentTargetDropDown.xml b/.idea/deploymentTargetDropDown.xml deleted file mode 100644 index 88b09f6..0000000 --- a/.idea/deploymentTargetDropDown.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - - - - \ 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 4826054..ebce78c 100644 --- a/app/src/main/java/com/denizk0461/weserplaner/db/AppDAO.kt +++ b/app/src/main/java/com/denizk0461/weserplaner/db/AppDAO.kt @@ -87,6 +87,9 @@ interface AppDAO { @Query("SELECT * FROM timetables ORDER BY id") fun getTimetables(): LiveData> + @Query("SELECT COUNT(*) FROM timetables") + fun getTimetableCount(): Int + @Query("SELECT * FROM timetables WHERE id = :id LIMIT 1") fun getTimetableForId(id: Int): Timetable 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 fb085a2..ac31b36 100644 --- a/app/src/main/java/com/denizk0461/weserplaner/db/AppRepository.kt +++ b/app/src/main/java/com/denizk0461/weserplaner/db/AppRepository.kt @@ -178,6 +178,8 @@ class AppRepository(app: Application) { fun getTimetables(): LiveData> = dao.getTimetables() + fun getTimetableCount(): Int = dao.getTimetableCount() + fun getTimetableForId(id: Int): Timetable = dao.getTimetableForId(id) fun deleteTimetable(id: Int) { 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 0b6b000..3390832 100644 --- a/app/src/main/java/com/denizk0461/weserplaner/fragment/EventFragment.kt +++ b/app/src/main/java/com/denizk0461/weserplaner/fragment/EventFragment.kt @@ -13,6 +13,7 @@ import com.denizk0461.weserplaner.activity.FetcherActivity import com.denizk0461.weserplaner.activity.TimetableOverviewActivity import com.denizk0461.weserplaner.adapter.StudIPEventPageAdapter import com.denizk0461.weserplaner.data.getTextSheet +import com.denizk0461.weserplaner.data.showErrorSnackBar import com.denizk0461.weserplaner.data.showSnackBar import com.denizk0461.weserplaner.databinding.FragmentEventBinding import com.denizk0461.weserplaner.sheet.ScheduleUpdateSheet @@ -35,6 +36,9 @@ class EventFragment : AppFragment() { // Titles for the view pager's tabs private lateinit var weekdays: Array + // Name of the currently selected schedule + private lateinit var timetableName: String + // Instantiate the view binding override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View { _binding = FragmentEventBinding.inflate(inflater, container, false) @@ -118,9 +122,9 @@ class EventFragment : AppFragment() { // Set visibility of the fetch button depending on whether any events have been stored viewModel.getEventCount().observe(viewLifecycleOwner) { eventCount -> - val timetableName = viewModel.getSelectedTimetableName() + timetableName = viewModel.getSelectedTimetableName() if (timetableName.isNotBlank()) { - binding.appTitleBar.text = timetableName + binding.appTitleBar.text = getString(R.string.title_schedule_placeholder, timetableName) } binding.buttonFetchSchedule.visibility = if (eventCount == 0) { @@ -132,6 +136,14 @@ class EventFragment : AppFragment() { // Set up button for adding a new event binding.fabAddEvent.setOnClickListener { + + if (viewModel.getTimetableCount() == 0) { + context.theme.showErrorSnackBar( + binding.coordinatorLayout, + getString(R.string.sheet_schedule_update_no_timetable), + ) + return@setOnClickListener + } /* * Open the bottom sheet used for editing an event, but tell the sheet that it will be * used for creating a new event instead. 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 aa0479a..d3c543c 100644 --- a/app/src/main/java/com/denizk0461/weserplaner/sheet/ScheduleUpdateSheet.kt +++ b/app/src/main/java/com/denizk0461/weserplaner/sheet/ScheduleUpdateSheet.kt @@ -171,7 +171,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 + timetableId = viewModel.getCurrentTimetableId(), title = binding.editTextTitle.text.toString().trim(), lecturer = binding.editTextLecturers.text.toString().trim(), room = binding.editTextRoom.text.toString().trim(), diff --git a/app/src/main/java/com/denizk0461/weserplaner/sheet/TimetableAddSheet.kt b/app/src/main/java/com/denizk0461/weserplaner/sheet/TimetableAddSheet.kt index 488ba07..9427101 100644 --- a/app/src/main/java/com/denizk0461/weserplaner/sheet/TimetableAddSheet.kt +++ b/app/src/main/java/com/denizk0461/weserplaner/sheet/TimetableAddSheet.kt @@ -2,6 +2,7 @@ package com.denizk0461.weserplaner.sheet import android.os.Bundle import android.view.View +import androidx.core.widget.addTextChangedListener import androidx.fragment.app.viewModels import androidx.navigation.fragment.NavHostFragment import com.denizk0461.weserplaner.R @@ -38,6 +39,16 @@ class TimetableAddSheet : AppSheet(R.layout.sheet_timetable_add) { } binding.buttonSave.setOnClickListener { + + if (binding.editTextTitle.text.toString().isBlank()) { + // Set an error on the title field + binding.textLayoutTitle.error = + getString(R.string.sheet_schedule_update_text_field_empty_error) + + // action must not be executed + return@setOnClickListener + } + viewModel.insertTimetable(Timetable(name = binding.editTextTitle.text.toString().trim())) // Tell the user that the event has been updated @@ -47,5 +58,9 @@ class TimetableAddSheet : AppSheet(R.layout.sheet_timetable_add) { dismiss() } + + binding.editTextTitle.addTextChangedListener { + binding.textLayoutTitle.error = null + } } } \ No newline at end of file diff --git a/app/src/main/java/com/denizk0461/weserplaner/viewmodel/EventViewModel.kt b/app/src/main/java/com/denizk0461/weserplaner/viewmodel/EventViewModel.kt index f3c98a3..b81599a 100644 --- a/app/src/main/java/com/denizk0461/weserplaner/viewmodel/EventViewModel.kt +++ b/app/src/main/java/com/denizk0461/weserplaner/viewmodel/EventViewModel.kt @@ -26,6 +26,8 @@ class EventViewModel(private val app: Application) : AppViewModel(app) { } } + fun getTimetableCount(): Int = returnBlocking { repo.getTimetableCount() } + /** * This value determines whether the user wants their timetable to launch with the current day. */ diff --git a/app/src/main/java/com/denizk0461/weserplaner/viewmodel/ScheduleUpdateViewModel.kt b/app/src/main/java/com/denizk0461/weserplaner/viewmodel/ScheduleUpdateViewModel.kt index 54a132c..a6a36bc 100644 --- a/app/src/main/java/com/denizk0461/weserplaner/viewmodel/ScheduleUpdateViewModel.kt +++ b/app/src/main/java/com/denizk0461/weserplaner/viewmodel/ScheduleUpdateViewModel.kt @@ -18,4 +18,6 @@ class ScheduleUpdateViewModel(application: Application) : AppViewModel(applicati * @param event the event to update */ fun update(event: StudIPEvent) { doAsync { repo.update(event) } } + + fun getCurrentTimetableId(): Int = repo.getPreferenceSelectedTimetable() } \ No newline at end of file diff --git a/app/src/main/res/layout/sheet_allergen.xml b/app/src/main/res/layout/sheet_allergen.xml index a3f7d82..1806614 100644 --- a/app/src/main/res/layout/sheet_allergen.xml +++ b/app/src/main/res/layout/sheet_allergen.xml @@ -1,6 +1,7 @@ + android:layout_marginBottom="2dp" + tools:text="Some kind of meal with extras I guess"/> + android:paddingHorizontal="24dp" + tools:text="[Category]"/> + + + + + + + + + + + + + Veranstaltung wurde aktualisiert. Bestehende Veranstaltung bearbeiten Neue Veranstaltung hinzufügen + Stundenplan: %s Veranstaltungstitel Dozierende*r Raum + Du musst einen Stundenplan erstellen, bevor du Veranstaltungen hinzufügst! Auf akademisches Viertel umstellen Sorry, ein Fehler ist aufgetreten! Der Kurs kann nicht enden bevor er aufhört. @@ -145,6 +147,7 @@ Dein Stundenplan Stundenplan + Stundenplan: %s Aufgaben & Prüfungen Aufgaben Mensenangebote diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index c73042a..e33d77c 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -32,7 +32,7 @@ Continue to the app App settings - Timetable + Schedule Refresh offers All offers Today\'s events @@ -67,9 +67,9 @@ Show help Schedule Go to your schedule - How to save your timetable in the app - • 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 + How to save your schedule in the app + • Log in with your Stud.IP login\n • Open your schedule 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 schedule in the app View full schedule New event @@ -95,10 +95,12 @@ Event has been updated. Edit existing event Add new event + Schedule: %s Event title Lecturer(s) Room + You must create a schedule before you add events! Change to academic quarter Sorry, an error occurred! The course cannot end before it begins. @@ -148,6 +150,7 @@ Your Schedule Schedule + Schedule: %s Tasks & Exams Tasks Canteen Offers @@ -243,7 +246,7 @@ Settings Heads up, new feature! - As the new semester will start in a couple of weeks, you can prepare in advance by adding your new timetable! You can now add as many timetables to the app as you like.\n\nHead into the settings to find the new \'timetables\' option! + As the new semester will start in a couple of weeks, you can prepare in advance by adding your new schedule! You can now add as many schedules to the app as you like.\n\nHead into the settings to find the new \'schedules\' option! General Stud.IP Schedule @@ -254,22 +257,22 @@ Refresh your Stud.IP schedule This will clear any customisations! - Select which timetable to display - Timetable - Edit timetable - Timetable name + Select which schedule to display + Schedule + Edit schedule + Schedule name Add Edit - Edit this timetable - Add a new timetable - There is no timetable to edit! - Timetable has been updated. - Timetable has been added. - Timetable has been deleted. + Edit this schedule + Add a new schedule + There is no schedule to edit! + Schedule has been updated. + Schedule has been added. + Schedule has been deleted. Sure? - Hint: if you download a timetable from Stud.IP, it automatically gets added as a new timetable, so you won\'t need to do anything here! + Hint: if you download a schedule from Stud.IP, it automatically gets added as a new schedule, so you won\'t need to do anything here! - Launch timetable on current day + Launch schedule on current day If unselected, Monday will be shown on launch instead Highlight next course