You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

226 lines
9.6 KiB
Kotlin

package com.cyb3rko.techniklogger.fragments
import android.annotation.SuppressLint
import android.content.Context
import android.os.Bundle
import android.text.Html
import android.text.SpannableStringBuilder
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import androidx.navigation.fragment.findNavController
import androidx.navigation.fragment.navArgs
import com.cyb3rko.techniklogger.*
import com.cyb3rko.techniklogger.CLASS_EINSATZ
import com.cyb3rko.techniklogger.COLUMN_EINSATZ_JAHR
import com.cyb3rko.techniklogger.CURRENT_YEAR
import com.cyb3rko.techniklogger.SHARED_PREFERENCE
import com.cyb3rko.techniklogger.databinding.FragmentEinsatzPusherBinding
import com.google.android.material.datepicker.MaterialDatePicker
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.google.android.material.timepicker.MaterialTimePicker
import com.google.android.material.timepicker.TimeFormat
import com.parse.ParseObject
import com.parse.ParseQuery
import es.dmoral.toasty.Toasty
import java.sql.Time
import java.text.DecimalFormat
import java.text.SimpleDateFormat
import java.util.*
class EinsatzPusherFragment : Fragment() {
private var _binding: FragmentEinsatzPusherBinding? = null
private lateinit var myContext: Context
private val args: EinsatzPusherFragmentArgs by navArgs()
private lateinit var childKey: String
private var date = ""
private lateinit var entry: ParseObject
private var time = ""
private lateinit var time1: Time
private lateinit var time2: Time
private var duration = ""
private lateinit var location: String
private lateinit var name: String
@SuppressLint("SimpleDateFormat")
private val simpleDateFormat = SimpleDateFormat("dd.MM.yyyy")
// This property is only valid between onCreateView and onDestroyView.
private val binding get() = _binding!!
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
_binding = FragmentEinsatzPusherBinding.inflate(inflater, container, false)
val root = binding.root
myContext = requireContext()
getArgumentInformation()
restoreInformation()
val builder = MaterialDatePicker.Builder.datePicker()
.setTitleText("Datum")
val builder2 = MaterialTimePicker.Builder()
.setTimeFormat(TimeFormat.CLOCK_24H).setTitleText("Von")
val builder3 = MaterialTimePicker.Builder()
.setTimeFormat(TimeFormat.CLOCK_24H).setTitleText("Bis")
binding.dateButton.setOnClickListener {
if (date != "") {
val dateInMillis = simpleDateFormat.parse(date)!!.time
builder.setSelection(dateInMillis + 7200000)
}
if (time != "") {
val times = time.split(" - ")
builder2.setHour(times[0].split(":")[0].toInt())
.setMinute(times[0].split(":")[1].toInt())
builder3.setHour(times[1].split(":")[0].toInt())
.setMinute(times[1].split(":")[1].toInt())
}
var tempTime = ""
val picker = builder.build()
val picker2 = builder2.build()
val picker3 = builder3.build()
var hour: String
var minute: String
var hoursInMillis: Long
var minutesInMillis: Long
picker.addOnPositiveButtonClickListener {
date = simpleDateFormat.format(Date(it))
binding.dateView.text = Html.fromHtml("<b>Datum:</b><br/>${date}")
activity?.let { it1 -> picker2.show(it1.supportFragmentManager, picker2.tag) }
}
picker2.addOnPositiveButtonClickListener {
hour = picker2.hour.toString()
hour = if (hour.length != 1) hour else "0$hour"
minute = picker2.minute.toString()
minute = if (minute.length != 1) minute else "0$minute"
hoursInMillis = picker2.hour.toLong() * 3600000
minutesInMillis = picker2.minute.toLong() * 60000
time1 = Time(hoursInMillis + minutesInMillis)
tempTime += "${hour}:${minute} - "
activity?.let { it1 -> picker3.show(it1.supportFragmentManager, picker3.tag) }
}
picker3.addOnPositiveButtonClickListener {
hour = picker3.hour.toString()
hour = if (hour.length != 1) hour else "0$hour"
minute = picker3.minute.toString()
minute = if (minute.length != 1) minute else "0$minute"
hoursInMillis = hour.toLong() * 3600000
minutesInMillis = minute.toLong() * 60000
time2 = Time(hoursInMillis + minutesInMillis)
tempTime += "${hour}:${minute}"
time = tempTime
duration = DecimalFormat("#.#").format((time2.time - time1.time) / 3600 / 1000.toFloat())
duration = duration.replace(",", ".")
binding.durationView.text = Html.fromHtml("<b>Dauer:</b> $time Uhr, $duration Stunden")
}
activity?.let { it1 -> picker.show(it1.supportFragmentManager, picker.tag) }
}
if (childKey != "") {
binding.deleteButton.visibility = View.VISIBLE
binding.deleteButton.setOnClickListener {
MaterialAlertDialogBuilder(myContext)
.setTitle("Einsatz entfernen")
.setMessage("Möchtest du diesen Einsatz entfernen?")
.setPositiveButton("Ja") { _, _ ->
val query = ParseQuery<ParseObject>(CLASS_TEILNAHME)
query.whereEqualTo("an", ParseObject.createWithoutData(CLASS_EINSATZ, childKey))
query.findInBackground { objects, e ->
if (e == null) {
ParseObject.deleteAllInBackground(objects) {
entry.deleteInBackground {
if (it == null) {
findNavController().navigate(R.id.navigation_listing)
} else {
Toasty.error(myContext, "Fehler bei Einsatz-Löschung").show()
Log.e("TechnikLogger.Einsätze", it.message.toString())
}
}
}
} else {
Toasty.error(myContext, "Fehler bei Teilnehmer-Löschung").show()
Log.e("TechnikLogger.Einsätze", e.message.toString())
}
}
}
.setNegativeButton("Abbrechen", null)
.show()
}
}
binding.finishedButton.setOnClickListener {
val name = binding.nameEditText.text.toString()
val location = binding.locationEditText.text.toString()
if (name != "" && location != "" && time != "") {
entry.put(COLUMN_EINSATZ_NAME, name)
entry.put(COLUMN_EINSATZ_ORT, location)
val dateTimes = date.split(".")
var dateTime = "${dateTimes[2]}.${dateTimes[1]}.${dateTimes[0]}"
if (time != "") dateTime += ",$time"
entry.put(COLUMN_EINSATZ_DATUM, dateTime)
entry.put(COLUMN_EINSATZ_DAUER, duration.toFloat())
val sharedPref = context?.getSharedPreferences(
SHARED_PREFERENCE,
Context.MODE_PRIVATE
)
val jahrObject = ParseObject.createWithoutData(
CLASS_JAHR,
sharedPref?.getString(CURRENT_YEAR, "")!!
)
entry.put(COLUMN_EINSATZ_JAHR, jahrObject)
entry.saveInBackground {
if (it == null) {
findNavController().navigate(R.id.navigation_listing)
} else {
Toasty.error(myContext, "Fehler bei Einsatz-Speicherung").show()
Log.e("TechnikLogger.Einsätze", it.message.toString())
}
}
} else {
Toasty.error(myContext, "Fülle zuerst alle Felder aus").show()
}
}
return root
}
private fun getArgumentInformation() {
childKey = args.objectId
name = args.name
location = args.location
date = args.date
time = args.time
duration = args.duration
}
private fun restoreInformation() {
if (name != "") {
binding.nameEditText.text = SpannableStringBuilder(name)
}
if (location != "") {
binding.locationEditText.text = SpannableStringBuilder(location)
}
if (date != "") {
binding.dateView.text = Html.fromHtml("<b>Datum:</b><br/>${date}")
}
if (time != "") {
binding.durationView.text = Html.fromHtml("<b>Dauer:</b> $time Uhr, $duration Stunden")
} else if (duration != "") {
binding.durationView.text = Html.fromHtml("<b>Dauer:</b> $duration Stunden")
}
if (childKey == "") {
entry = ParseObject(CLASS_EINSATZ)
} else {
entry = ParseObject.createWithoutData(CLASS_EINSATZ, childKey)
}
}
}