SDPTeam15/PolyEvents

View on GitHub
app/src/main/java/com/github/sdpteam15/polyevents/view/fragments/ZonePreviewBottomSheetDialogFragment.kt

Summary

Maintainability
A
0 mins
Test Coverage
A
93%
package com.github.sdpteam15.polyevents.view.fragments

import android.content.Intent
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Button
import android.widget.TextView
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.github.sdpteam15.polyevents.R
import com.github.sdpteam15.polyevents.helper.HelperFunctions
import com.github.sdpteam15.polyevents.model.database.remote.Database.currentDatabase
import com.github.sdpteam15.polyevents.model.entity.Event
import com.github.sdpteam15.polyevents.model.entity.Zone
import com.github.sdpteam15.polyevents.model.observable.Observable
import com.github.sdpteam15.polyevents.model.observable.ObservableList
import com.github.sdpteam15.polyevents.view.activity.EventActivity
import com.github.sdpteam15.polyevents.view.adapter.EventPreviewAdapter
import com.google.android.material.bottomsheet.BottomSheetDialogFragment

/**
 * Documentation on: https://developer.android.com/guide/topics/ui/dialogs.html#kotlin
 */
class ZonePreviewBottomSheetDialogFragment : BottomSheetDialogFragment() {

    companion object {
        const val TAG = "ZonePreviewBottomSheetDialogFragment"
        const val EXTRA_ZONE_ID = "zoneId"
        const val EXTRA_ZONE_NAME = "zoneName"

        fun newInstance(
            zoneId: String,
            onShowEventsClickListener: View.OnClickListener,
            onItineraryClickListener: View.OnClickListener
        ): ZonePreviewBottomSheetDialogFragment {
            val args = Bundle()
            args.putString(EXTRA_ZONE_ID, zoneId)
            val f = ZonePreviewBottomSheetDialogFragment()
            f.onShowEventsClickListener = onShowEventsClickListener
            f.onItineraryClickListener = onItineraryClickListener
            f.arguments = args
            return f
        }
    }

    private var zoneId: String? = null

    private lateinit var previewUpcomingEventsTextView: TextView
    private lateinit var seeEventsButton: Button
    private lateinit var showItineraryButton: Button
    private lateinit var previewUpComingEventsRecyclerView: RecyclerView
    private lateinit var zoneNameTextView: TextView
    private lateinit var zoneDescriptionTextView: TextView

    private lateinit var onItineraryClickListener: View.OnClickListener
    private lateinit var onShowEventsClickListener: View.OnClickListener

    private val getZoneInformationCallbacks = Observable<Boolean>()

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        val v = inflater.inflate(
            R.layout.fragment_preview_zone_events_bottom_sheet,
            container,
            false
        )

        zoneId = arguments?.getString(EXTRA_ZONE_ID)

        seeEventsButton = v.findViewById(R.id.zone_preview_show_events_button)
        showItineraryButton = v.findViewById(R.id.zone_preview_show_itinerary_button)
        previewUpcomingEventsTextView = v.findViewById(R.id.zone_preview_dialog_upcoming_events)
        previewUpComingEventsRecyclerView =
            v.findViewById(R.id.zone_preview_dialog_event_recycler_view)
        zoneNameTextView = v.findViewById(R.id.zone_preview_dialog_zone_name)
        zoneDescriptionTextView = v.findViewById(R.id.zone_preview_dialog_zone_description)

        val zoneObservable = Observable<Zone>()
        zoneObservable.observeOnce(this) {
            val zoneName = it.value.zoneName

            zoneNameTextView.text = zoneName
            zoneDescriptionTextView.text = it.value.description

            // Buttons are disabled until the zone information is retrieved
            seeEventsButton.isEnabled = true
            showItineraryButton.isEnabled = true

            // on click go to the events list per zone fragment (and dismiss the dialog as well on click)
            seeEventsButton.setOnClickListener {
                dismiss()
                onShowEventsClickListener.onClick(view)
            }
            // Set the itinerary button on click listener (and dismiss the dialog as well on click)
            showItineraryButton.setOnClickListener {
                dismiss()
                onItineraryClickListener.onClick(view)
            }
        }

        HelperFunctions.showProgressDialog(
            requireActivity(),
            listOf(getZoneInformationCallbacks),
            requireActivity().supportFragmentManager
        )

        currentDatabase.zoneDatabase.getZoneInformation(
            zoneId = zoneId!!,
            zone = zoneObservable
        ).update(requireActivity(), getZoneInformationCallbacks)

        val eventsObservableList = ObservableList<Event>()
        eventsObservableList.observe(this) {
            if (it.value.isEmpty()) {
                previewUpcomingEventsTextView.text =
                    resources.getString(R.string.no_upcoming_events)
            } else {
                previewUpcomingEventsTextView.text = resources.getString(R.string.upcoming_events)
                previewUpComingEventsRecyclerView.adapter!!.notifyDataSetChanged()
            }
        }
        val openEvent = { event: Event ->
            val intent = Intent(inflater.context, EventActivity::class.java).apply {
                putExtra(EXTRA_EVENT_ID, event.eventId)
            }
            startActivity(intent)
        }
        // setup recycler view for preview events
        val eventPreviewAdapter = EventPreviewAdapter(eventsObservableList, openEvent)
        previewUpComingEventsRecyclerView.layoutManager = LinearLayoutManager(v.context)
        previewUpComingEventsRecyclerView.adapter = eventPreviewAdapter

        // Select the first 3 events happening in the zone for preview
        currentDatabase.eventDatabase.getEventsByZoneId(
            events = eventsObservableList,
            zoneId = zoneId!!,
            limit = 3
        )

        return v
    }

    /**
     * Set the click listener for the zone itinerary button
     * @param onItineraryClickListener the listener for the zone itinerary button
     */
    fun setOnItineraryClickListener(onItineraryClickListener: View.OnClickListener) {
        this.onItineraryClickListener = View.OnClickListener {
            dismiss()
            onItineraryClickListener.onClick(view)
        }
    }

    /**
     * Set the click listener for the show events button
     * @param onShowEventsClickListener the listener for the show events button
     */
    fun setOnShowEventsClickListener(onShowEventsClickListener: View.OnClickListener) {
        this.onShowEventsClickListener = View.OnClickListener {
            dismiss()
            onShowEventsClickListener.onClick(view)
        }
    }
}