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 460b4e9..2ae02d0 100644 --- a/app/src/main/java/com/denizk0461/weserplaner/fragment/EventPageFragment.kt +++ b/app/src/main/java/com/denizk0461/weserplaner/fragment/EventPageFragment.kt @@ -11,6 +11,7 @@ import com.denizk0461.weserplaner.adapter.StudIPEventPageAdapter import com.denizk0461.weserplaner.adapter.StudIPEventItemAdapter import com.denizk0461.weserplaner.databinding.RecyclerViewBinding import com.denizk0461.weserplaner.model.StudIPEvent +import com.denizk0461.weserplaner.sheet.EventActionSheet import com.denizk0461.weserplaner.sheet.ScheduleUpdateSheet import com.denizk0461.weserplaner.viewmodel.EventPageViewModel @@ -105,8 +106,36 @@ class EventPageFragment : AppFragment(), StudIPEventItemAda } } + /** + * Creates and shows a snack bar. + * + * @param text content to display in the snack bar + */ + fun showSnackBar(text: String) { + // Retrieve parent fragment + val parentFragment = activity?.let { activity -> + // Retrieve parent fragment to access its functions + val navHostFragment = activity + .supportFragmentManager + .fragments[0] as NavHostFragment + navHostFragment + .childFragmentManager + .primaryNavigationFragment as EventFragment + } + + // Show a snack bar in the parent fragment + parentFragment?.showSnackBar(text) + } + override fun onClick(event: StudIPEvent) { - // TODO implement functionality or delete + // Open a bottom sheet to view options for the event + openBottomSheet( + EventActionSheet().also { sheet -> + val bundle = Bundle() + bundle.putParcelable("event", event) + sheet.arguments = bundle + } + ) } override fun onLongClick(event: StudIPEvent): Boolean { diff --git a/app/src/main/java/com/denizk0461/weserplaner/sheet/AppSheet.kt b/app/src/main/java/com/denizk0461/weserplaner/sheet/AppSheet.kt index 576b5b3..794a96e 100644 --- a/app/src/main/java/com/denizk0461/weserplaner/sheet/AppSheet.kt +++ b/app/src/main/java/com/denizk0461/weserplaner/sheet/AppSheet.kt @@ -31,4 +31,15 @@ open class AppSheet(@LayoutRes private val layoutId: Int) : BottomSheetDialogFra override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View = LayoutInflater.from(context).inflate(layoutId, container, false) + + /** + * Opens a bottom sheet. Sheet will be attached to the fragment manager of the parent of the + * sheet that's calling this function. Sheet must be a subclass of + * [com.denizk0461.weserplaner.sheet.AppSheet]. + * + * @param sheet element that will be displayed + */ + protected fun openBottomSheet(sheet: AppSheet) { + sheet.show(parentFragmentManager, sheet.javaClass.simpleName) + } } \ No newline at end of file diff --git a/app/src/main/java/com/denizk0461/weserplaner/sheet/EventActionSheet.kt b/app/src/main/java/com/denizk0461/weserplaner/sheet/EventActionSheet.kt new file mode 100644 index 0000000..771ab87 --- /dev/null +++ b/app/src/main/java/com/denizk0461/weserplaner/sheet/EventActionSheet.kt @@ -0,0 +1,70 @@ +package com.denizk0461.weserplaner.sheet + +import android.os.Bundle +import android.view.View +import com.denizk0461.weserplaner.R +import com.denizk0461.weserplaner.data.getParcelableCompat +import com.denizk0461.weserplaner.data.viewBinding +import com.denizk0461.weserplaner.databinding.SheetEventActionBinding +import com.denizk0461.weserplaner.fragment.EventPageFragment +import com.denizk0461.weserplaner.model.StudIPEvent + +/** + * Sheet used to display actions available for a given event to the user. + */ +class EventActionSheet : AppSheet(R.layout.sheet_event_action) { + + // View binding + private val binding: SheetEventActionBinding by viewBinding(SheetEventActionBinding::bind) + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + // Retrieve event from arguments + val event = arguments.getParcelableCompat("event") + + // Set header text + binding.eventHeader.text = event.title + + // Set up dismiss button + binding.buttonDismiss.setOnClickListener { + // Do nothing and dismiss the sheet + dismiss() + } + + // Set up button to edit the event + binding.buttonEditEvent.setOnClickListener { + // Open editing sheet + openBottomSheet( + ScheduleUpdateSheet().also { sheet -> + val bundle = Bundle() + bundle.putBoolean("isEditing", true) + bundle.putParcelable("event", event) + sheet.arguments = bundle + } + ) + + // Close this sheet + dismiss() + } + + // Set up button to delete the event + binding.buttonDeleteEvent.setOnClickListener { + // Open deletion confirm sheet + openBottomSheet( + EventConfirmDeletionSheet().also { sheet -> + val bundle = Bundle() + bundle.putParcelable("event", event) + sheet.arguments = bundle + } + ) + + // Show a snack bar in the parent fragment to tell the user that the action was successful + (parentFragment as EventPageFragment) + .showSnackBar(getString(R.string.sheet_event_confirm_deletion_snack)) + + // Close this sheet + dismiss() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/denizk0461/weserplaner/sheet/EventConfirmDeletionSheet.kt b/app/src/main/java/com/denizk0461/weserplaner/sheet/EventConfirmDeletionSheet.kt new file mode 100644 index 0000000..80a3c8a --- /dev/null +++ b/app/src/main/java/com/denizk0461/weserplaner/sheet/EventConfirmDeletionSheet.kt @@ -0,0 +1,57 @@ +package com.denizk0461.weserplaner.sheet + +import android.os.Bundle +import android.view.View +import androidx.fragment.app.viewModels +import com.denizk0461.weserplaner.R +import com.denizk0461.weserplaner.data.getParcelableCompat +import com.denizk0461.weserplaner.data.viewBinding +import com.denizk0461.weserplaner.databinding.SheetEventConfirmDeletionBinding +import com.denizk0461.weserplaner.model.StudIPEvent +import com.denizk0461.weserplaner.viewmodel.EventConfirmDeletionViewModel + +/** + * Sheet displayed to the user to confirm that they want to delete an event from their timetable. + */ +class EventConfirmDeletionSheet : AppSheet(R.layout.sheet_event_confirm_deletion) { + + // View model + private val viewModel: EventConfirmDeletionViewModel by viewModels() + + // View binding + private val binding: SheetEventConfirmDeletionBinding by viewBinding(SheetEventConfirmDeletionBinding::bind) + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + // Retrieve event from arguments + val event = arguments.getParcelableCompat("event") + + // Set up dismiss button + binding.buttonDismiss.setOnClickListener { + // Do nothing and dismiss the sheet + dismiss() + } + + // Set up button to delete the event + binding.buttonDelete.setOnClickListener { + // Delete the event + viewModel.delete(event) + + // Dismiss the sheet + dismiss() + } + + // Set up cancel button + binding.buttonCancel.setOnClickListener { + // Do nothing and dismiss the sheet + dismiss() + } + + // Set text content with the event's title inserted + binding.textConfirmDeletionContent.text = getString( + R.string.sheet_event_confirm_deletion_content, + event.title, + ) + } +} \ No newline at end of file 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 f5c58f1..aa0479a 100644 --- a/app/src/main/java/com/denizk0461/weserplaner/sheet/ScheduleUpdateSheet.kt +++ b/app/src/main/java/com/denizk0461/weserplaner/sheet/ScheduleUpdateSheet.kt @@ -41,9 +41,6 @@ class ScheduleUpdateSheet : AppSheet(R.layout.sheet_schedule_update) { // View model private val viewModel: ScheduleUpdateViewModel by viewModels() - // Whether the user has once clicked the delete button; used to prevent an accidental click - private var hasClickedDelete: Boolean = false - // Determines whether the user is editing an existing event or creating a new one private var isEditing: Boolean = false @@ -94,34 +91,6 @@ class ScheduleUpdateSheet : AppSheet(R.layout.sheet_schedule_update) { binding.editTextLecturers.setText(event.lecturer) binding.editTextRoom.setText(event.room) - // Prepare delete button - binding.buttonDelete.setOnClickListener { - /* - * Check if the user has already clicked the button before; this is done to prevent - * accidentally deleting an event. - */ - if (hasClickedDelete) { - - // Delete the event - viewModel.delete(event) - - // Tell the user that the event has been deleted - parentFragment?.showSnackBar( - getString(R.string.sheet_schedule_snack_delete) - ) - - // Dismiss the sheet upon deletion - dismiss() - } else { - // Update the text to show the user that they clicked the button once - TransitionManager - .beginDelayedTransition(binding.buttonContainer as ViewGroup) - binding.buttonDelete.text = - getString(R.string.sheet_schedule_update_delete_confirm) - hasClickedDelete = true - } - } - // Prepare update button binding.buttonSave.setOnClickListener { // Check if any of the text fields are empty @@ -181,9 +150,6 @@ class ScheduleUpdateSheet : AppSheet(R.layout.sheet_schedule_update) { // Set the title to reflect that an event is being added binding.sheetTitle.text = getString(R.string.sheet_schedule_update_header_add) - // Hide delete button, since there is nothing to delete - binding.buttonDelete.visibility = View.GONE - // Prepare save button binding.buttonSave.setOnClickListener { // Check if any of the text fields are empty diff --git a/app/src/main/java/com/denizk0461/weserplaner/viewmodel/EventConfirmDeletionViewModel.kt b/app/src/main/java/com/denizk0461/weserplaner/viewmodel/EventConfirmDeletionViewModel.kt new file mode 100644 index 0000000..60abd19 --- /dev/null +++ b/app/src/main/java/com/denizk0461/weserplaner/viewmodel/EventConfirmDeletionViewModel.kt @@ -0,0 +1,14 @@ +package com.denizk0461.weserplaner.viewmodel + +import android.app.Application +import com.denizk0461.weserplaner.model.StudIPEvent + +class EventConfirmDeletionViewModel(application: Application) : AppViewModel(application) { + + /** + * Deletes a schedule element. + * + * @param event the event to delete + */ + fun delete(event: StudIPEvent) { doAsync { repo.delete(event) } } +} \ No newline at end of file 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 d1500a2..54a132c 100644 --- a/app/src/main/java/com/denizk0461/weserplaner/viewmodel/ScheduleUpdateViewModel.kt +++ b/app/src/main/java/com/denizk0461/weserplaner/viewmodel/ScheduleUpdateViewModel.kt @@ -18,11 +18,4 @@ class ScheduleUpdateViewModel(application: Application) : AppViewModel(applicati * @param event the event to update */ fun update(event: StudIPEvent) { doAsync { repo.update(event) } } - - /** - * Deletes a schedule element. - * - * @param event the event to delete - */ - fun delete(event: StudIPEvent) { doAsync { repo.delete(event) } } } \ No newline at end of file diff --git a/app/src/main/res/drawable/add_task.xml b/app/src/main/res/drawable/add_task.xml new file mode 100644 index 0000000..b4abb37 --- /dev/null +++ b/app/src/main/res/drawable/add_task.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/arrow_back.xml b/app/src/main/res/drawable/arrow_back.xml new file mode 100644 index 0000000..8452791 --- /dev/null +++ b/app/src/main/res/drawable/arrow_back.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/edit.xml b/app/src/main/res/drawable/edit.xml new file mode 100644 index 0000000..1c9bd3e --- /dev/null +++ b/app/src/main/res/drawable/edit.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/layout/sheet_event_action.xml b/app/src/main/res/layout/sheet_event_action.xml new file mode 100644 index 0000000..fb55590 --- /dev/null +++ b/app/src/main/res/layout/sheet_event_action.xml @@ -0,0 +1,206 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/sheet_event_confirm_deletion.xml b/app/src/main/res/layout/sheet_event_confirm_deletion.xml new file mode 100644 index 0000000..9bb2f37 --- /dev/null +++ b/app/src/main/res/layout/sheet_event_confirm_deletion.xml @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/sheet_schedule_update.xml b/app/src/main/res/layout/sheet_schedule_update.xml index 509600f..1e792a2 100644 --- a/app/src/main/res/layout/sheet_schedule_update.xml +++ b/app/src/main/res/layout/sheet_schedule_update.xml @@ -187,15 +187,6 @@ android:layout_marginBottom="8dp" android:animateLayoutChanges="true"> - - Neue Veranstaltung %ss hast du keine Veranstaltungen. + Veranstaltung bearbeiten + Aufgabe oder Prüfung hinzufügen + Siehe Aufgaben und Prüfungen für diese Veranstaltung + Raum für diese Veranstaltung finden + Veranstaltung löschen + + Bestätige Löschvorgang + Bist du dir sicher, dass du diese Veranstaltung \'%s\' löschen möchtest? + Die Veranstaltung wurde gelöscht. + Speichern Löschen Sicher? diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index e03bc33..f826434 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -52,6 +52,16 @@ New event You don\'t have any events for %s. + Edit this event + Add a task or exam + View tasks and exams for this event + Find this event\'s room + Delete this event + + Confirm delete action + Are you sure that you want to delete the event \'%s\'? + The event has been deleted. + Save Delete Sure?