SDPTeam15/PolyEvents

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

Summary

Maintainability
A
0 mins
Test Coverage
C
72%
package com.github.sdpteam15.polyevents.view.fragments.home

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.Spinner
import androidx.fragment.app.Fragment
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.database.remote.NUMBER_UPCOMING_EVENTS
import com.github.sdpteam15.polyevents.model.database.remote.login.UserLogin
import com.github.sdpteam15.polyevents.model.entity.Event
import com.github.sdpteam15.polyevents.model.entity.UserRole
import com.github.sdpteam15.polyevents.model.observable.Observable
import com.github.sdpteam15.polyevents.model.observable.ObservableList
import com.github.sdpteam15.polyevents.view.PolyEventsApplication.Companion.inTest
import com.github.sdpteam15.polyevents.view.activity.EventActivity
import com.github.sdpteam15.polyevents.view.activity.MainActivity
import com.github.sdpteam15.polyevents.view.activity.TimeTableActivity
import com.github.sdpteam15.polyevents.view.adapter.EventItemAdapter
import com.github.sdpteam15.polyevents.view.fragments.EXTRA_EVENT_ID

/**
 * The fragment for the home page.
 */
class VisitorHomeFragment : Fragment() {

    private lateinit var recyclerView: RecyclerView
    val events = ObservableList<Event>()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setHasOptionsMenu(true)
    }

    override fun onResume() {
        super.onResume()
        // Check if the user is connected and with a rank which is not participant.
        // If so, display a spinner to change its current role
        // Otherwise, hide the spinner
        val bool =
            UserLogin.currentUserLogin.isConnected() && currentDatabase.currentUser!!.userProfiles.fold(
                false, { a, c ->
                    if (a) {
                        a
                    } else {
                        c.userRole.ordinal < UserRole.PARTICIPANT.ordinal
                    }
                })
        requireActivity().findViewById<Spinner>(R.id.spinner_visitor).visibility =
            if (bool) View.VISIBLE else View.INVISIBLE
    }

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View {
        // Inflate the layout for this fragment
        val fragmentView = inflater.inflate(R.layout.fragment_home_visitor, container, false)
        recyclerView = fragmentView.findViewById(R.id.id_recycler_upcomming_events)

        val openEvent = { event: Event ->
            val intent = Intent(inflater.context, EventActivity::class.java).apply {
                putExtra(EXTRA_EVENT_ID, event.eventId)
            }
            startActivity(intent)
        }

        recyclerView.adapter = EventItemAdapter(events, openEvent)
        recyclerView.setHasFixedSize(false)

        val observableDBAnswer = Observable<Boolean>()
        // Get all events from database
        currentDatabase.eventDatabase.getEvents(events, NUMBER_UPCOMING_EVENTS.toLong())
            .observe(requireActivity()) {
                if (!it.value) {
                    HelperFunctions.showToast(
                        getString(R.string.failed_to_load_events),
                        fragmentView.context
                    )
                }
            }.then.updateOnce(requireActivity(), observableDBAnswer)


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

        events.observe(this) {
            recyclerView.adapter!!.notifyDataSetChanged()
        }

        if (!inTest)
            HelperFunctions.getLocationPermission(requireActivity())
        MainActivity.instance!!.switchRoles(
            fragmentView!!.findViewById(R.id.spinner_visitor),
            UserRole.PARTICIPANT
        )

        fragmentView.findViewById<Button>(R.id.id_timetable_button).setOnClickListener {
            val intent = Intent(activity, TimeTableActivity::class.java)
            startActivity(intent)
        }

        return fragmentView
    }

    override fun onRequestPermissionsResult(
        requestCode: Int,
        permissions: Array<String>,
        grantResults: IntArray
    ) = HelperFunctions.onRequestPermissionsResult(requestCode, permissions, grantResults)
}