From aa7dd38d061865c5cd97484cd952f2216bb6f832 Mon Sep 17 00:00:00 2001 From: Niko Diamadis Date: Sun, 15 Oct 2023 13:33:24 +0200 Subject: [PATCH] Verbessere Techniker-Verwaltung --- app/build.gradle | 1 - .../techniklogger/data/objects/Member.kt | 21 ++++ .../fragments/ManageMembersFragment.kt | 117 +++++------------- .../techniklogger/modals/MemberBottomSheet.kt | 94 ++++++++++++++ app/src/main/res/layout/dialog_view_name.xml | 6 +- .../main/res/layout/dialog_view_progress.xml | 5 +- app/src/main/res/layout/member_dialog.xml | 19 ++- 7 files changed, 167 insertions(+), 96 deletions(-) create mode 100644 app/src/main/java/com/cyb3rko/techniklogger/modals/MemberBottomSheet.kt diff --git a/app/build.gradle b/app/build.gradle index 8e23399..cc76421 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -64,7 +64,6 @@ dependencies { implementation "androidx.navigation:navigation-ui-ktx:$navigation_version" implementation 'androidx.recyclerview:recyclerview:1.3.1' implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0' - implementation 'com.afollestad.material-dialogs:bottomsheets:3.3.0' implementation 'com.airbnb.android:lottie:5.2.0' implementation 'com.amitshekhar.android:android-networking:1.0.2' implementation 'com.github.GrenderG:Toasty:1.5.2' diff --git a/app/src/main/java/com/cyb3rko/techniklogger/data/objects/Member.kt b/app/src/main/java/com/cyb3rko/techniklogger/data/objects/Member.kt index 0615823..c140ae5 100644 --- a/app/src/main/java/com/cyb3rko/techniklogger/data/objects/Member.kt +++ b/app/src/main/java/com/cyb3rko/techniklogger/data/objects/Member.kt @@ -12,6 +12,9 @@ internal class Member : ParseObject() { val name get() = getString(COLUMN_NAME)!! + val retired + get() = getBoolean(COLUMN_RETIRED) + fun setAdmin(admin: Boolean) { put(COLUMN_ADMIN, admin) } @@ -20,10 +23,28 @@ internal class Member : ParseObject() { put(COLUMN_NAME, name) } + private fun setRetired(retired: Boolean) { + put(COLUMN_RETIRED, retired) + } + fun retire() { put(COLUMN_RETIRED, true) } + override fun equals(other: Any?): Boolean { + if (other !is Member) return false + return this.name == other.name && this.admin == other.admin && this.retired == other.retired + } + + fun copy(): Member { + val member = Member() + member.objectId = objectId + member.setAdmin(admin) + member.setName(name) + member.setRetired(retired) + return member + } + companion object { const val CLASS_NAME = "Techniker" diff --git a/app/src/main/java/com/cyb3rko/techniklogger/fragments/ManageMembersFragment.kt b/app/src/main/java/com/cyb3rko/techniklogger/fragments/ManageMembersFragment.kt index fdc42d2..349c729 100644 --- a/app/src/main/java/com/cyb3rko/techniklogger/fragments/ManageMembersFragment.kt +++ b/app/src/main/java/com/cyb3rko/techniklogger/fragments/ManageMembersFragment.kt @@ -7,20 +7,13 @@ import android.view.View import android.view.ViewGroup import android.widget.ArrayAdapter import androidx.fragment.app.Fragment -import com.afollestad.materialdialogs.LayoutMode -import com.afollestad.materialdialogs.MaterialDialog -import com.afollestad.materialdialogs.bottomsheets.BottomSheet -import com.afollestad.materialdialogs.callbacks.onDismiss -import com.afollestad.materialdialogs.customview.customView import com.cyb3rko.techniklogger.R -import com.cyb3rko.techniklogger.data.objects.Member import com.cyb3rko.techniklogger.data.ParseController import com.cyb3rko.techniklogger.databinding.FragmentManageMembersBinding import com.cyb3rko.techniklogger.logE +import com.cyb3rko.techniklogger.modals.MemberBottomSheet import com.cyb3rko.techniklogger.showErrorToast import com.cyb3rko.techniklogger.showSuccessToast -import com.google.android.material.switchmaterial.SwitchMaterial -import com.google.android.material.textfield.TextInputEditText class ManageMembersFragment : Fragment() { private var _binding: FragmentManageMembersBinding? = null @@ -42,31 +35,19 @@ class ManageMembersFragment : Fragment() { loadMembers() binding.fab.setOnClickListener { - MaterialDialog(myContext, BottomSheet(LayoutMode.WRAP_CONTENT)).show { - title(text = "Techniker hinzufügen") - customView(R.layout.member_dialog, horizontalPadding = true) - positiveButton(text = "Hinzufügen") { - val view = it.view - val newName = view.findViewById(R.id.name).text.toString() - val newAdmin = view.findViewById(R.id.admin).isChecked - - Member().apply { - setAdmin(newAdmin) - setName(newName) - saveInBackground { - if (it == null) { - showSuccessToast("Hinzugefügt") - showAnimation(true) - loadMembers() - } else { - showErrorToast("Fehler beim Hinzufügen") - logE("Fehler beim Hinzufügen des Technikers") - it.printStackTrace() - } - } + MemberBottomSheet { member -> + member?.saveInBackground { exception -> + if (exception == null) { + showSuccessToast("Hinzugefügt") + showAnimation(true) + loadMembers() + } else { + showErrorToast("Fehler beim Hinzufügen") + logE("Fehler beim Hinzufügen des Technikers") + exception.printStackTrace() } } - } + }.show(parentFragmentManager, MemberBottomSheet.TAG) } binding.swipeRefreshLayout.apply { @@ -101,65 +82,27 @@ class ManageMembersFragment : Fragment() { showAnimation(false) binding.list.setOnItemClickListener { _, _, index, _ -> - val dialogView = layoutInflater.inflate(R.layout.member_dialog, null) - dialogView.findViewById(R.id.name).setText(memberNames[index]) - dialogView.findViewById(R.id.admin).isChecked = members[index].admin - MaterialDialog(myContext, BottomSheet(LayoutMode.WRAP_CONTENT)).show { - title(text = "Techniker-Info") - customView(0, dialogView, horizontalPadding = true) - onDismiss { - val view = it.view - val newName = view.findViewById(R.id.name).text.toString() - val newAdmin = view.findViewById(R.id.admin).isChecked - val member = members[index] - - val adminChanged = newAdmin != member.admin - val nameChanged = newName != member.name - if (adminChanged || nameChanged) { - member.apply { - setAdmin(newAdmin) - setName(newName) - saveInBackground { - if (it == null) { - showSuccessToast("Gespeichert") - if (nameChanged) { - showAnimation(true) - loadMembers() - } - } else { - showErrorToast("Fehler bei der Speicherung") - logE("Fehler bei der Speicherung des neuen Technikers") - it.printStackTrace() - } - } + val member = members[index] + MemberBottomSheet(members[index]) { editedMember -> + if (editedMember == null) { + showAnimation(true) + loadMembers() + return@MemberBottomSheet + } + if (editedMember != member) { + editedMember.saveInBackground { + if (it == null) { + showSuccessToast("Gespeichert") + showAnimation(true) + loadMembers() + } else { + showErrorToast("Fehler bei der Speicherung") + logE("Fehler bei der Speicherung des neuen Technikers") + it.printStackTrace() } } } - negativeButton(text = "Entlassen") { - val name = memberNames[index] - MaterialDialog(myContext).show { - title(text = "Entlassung") - message(text = "Soll '$name' wirklich entlassen werden?") - positiveButton(text = "Ja") { - members[index].apply { - retire() - saveInBackground { - if (it == null) { - showSuccessToast("Techniker entlassen") - showAnimation(true) - loadMembers() - } else { - showErrorToast("Fehler bei der Entlassung") - logE("Fehler bei der Entlassung des Technikers") - it.printStackTrace() - } - } - } - } - negativeButton(text = "Nein") - } - } - } + }.show(parentFragmentManager, MemberBottomSheet.TAG) } } else { showAnimation(true, false) diff --git a/app/src/main/java/com/cyb3rko/techniklogger/modals/MemberBottomSheet.kt b/app/src/main/java/com/cyb3rko/techniklogger/modals/MemberBottomSheet.kt new file mode 100644 index 0000000..9fed85b --- /dev/null +++ b/app/src/main/java/com/cyb3rko/techniklogger/modals/MemberBottomSheet.kt @@ -0,0 +1,94 @@ +package com.cyb3rko.techniklogger.modals + +import android.content.DialogInterface +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import com.cyb3rko.techniklogger.data.objects.Member +import com.cyb3rko.techniklogger.databinding.MemberDialogBinding +import com.google.android.material.bottomsheet.BottomSheetDialogFragment +import com.google.android.material.dialog.MaterialAlertDialogBuilder + +internal class MemberBottomSheet( + private val member: Member? = null, + private val action: (member: Member?) -> Unit +): BottomSheetDialogFragment() { + private lateinit var binding: MemberDialogBinding + + private var mode = -1 + private lateinit var mMember: Member + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + binding = MemberDialogBinding.inflate(layoutInflater) + if (member == null) { + mode = MODE_ADD + } else { + mMember = member.copy() + binding.name.setText(mMember.name) + binding.admin.isChecked = mMember.admin + mode = MODE_EDIT + } + if (mode == MODE_ADD) { + binding.title.text = "Techniker hinzufügen" + binding.button.text = "Hinzufügen" + } else { + binding.title.text = "Techniker-Info" + binding.button.text = "Entlassen" + } + binding.button.setOnClickListener { + val newName = binding.name.text.toString() + val newAdmin = binding.admin.isChecked + + if (mode == MODE_ADD) { + Member().apply { + setAdmin(newAdmin) + setName(newName) + action(this) + dismiss() + } + } else { + MaterialAlertDialogBuilder(requireContext()) + .setTitle("Entlassung") + .setMessage("Soll '${mMember.name}' wirklich entlassen werden?") + .setPositiveButton("Ja") { _ , _ -> + mMember.apply { + retire() + action(this) + dismiss() + } + } + .setNegativeButton("Nein", null) + .show() + } + } + + return binding.root + } + + override fun onDismiss(dialog: DialogInterface) { + if (mode == MODE_EDIT && ::binding.isInitialized) { + val newName = binding.name.text.toString() + val newAdmin = binding.admin.isChecked + val adminChanged = newAdmin != mMember.admin + val nameChanged = newName != mMember.name + if (adminChanged || nameChanged) { + mMember.apply { + setAdmin(newAdmin) + setName(newName) + action(this) + } + } + } + } + + companion object { + const val TAG = "Member Bottom Sheet" + const val MODE_ADD = 0 + const val MODE_EDIT = 1 + } +} diff --git a/app/src/main/res/layout/dialog_view_name.xml b/app/src/main/res/layout/dialog_view_name.xml index 9b209ec..c24f268 100644 --- a/app/src/main/res/layout/dialog_view_name.xml +++ b/app/src/main/res/layout/dialog_view_name.xml @@ -4,9 +4,9 @@ android:id="@+id/md_input" android:layout_width="match_parent" android:layout_height="wrap_content" - android:paddingStart="@dimen/md_dialog_frame_margin_horizontal" - android:paddingEnd="@dimen/md_dialog_frame_margin_horizontal" - android:paddingTop="@dimen/md_dialog_frame_margin_vertical"> + android:paddingStart="16dp" + android:paddingEnd="16dp" + android:paddingTop="16dp"> + android:padding="16dp"> + android:padding="16dp"> + + + + \ No newline at end of file