EPForumL/androidApp

View on GitHub
app/src/main/java/com/github/ybecker/epforuml/basicEntities/questions/MyQuestionsFragment.kt

Summary

Maintainability
C
7 hrs
Test Coverage
A
96%
package com.github.ybecker.epforuml.basicEntities.questions

import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.fragment.app.Fragment
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.github.ybecker.epforuml.database.DatabaseManager
import com.github.ybecker.epforuml.database.Model
import com.github.ybecker.epforuml.R
import com.github.ybecker.epforuml.database.DatabaseManager.db
import java.util.concurrent.CompletableFuture

//Fragment to display the questions asked by the user
class MyQuestionsFragment : Fragment() {

    private lateinit var recyclerView: RecyclerView
    private lateinit var adapter: MyQuestionsAdapter
    private val user = DatabaseManager.user
    private var myQuestionsMap = mutableMapOf<Model.Course, List<Model.Question>>()

    private lateinit var cache : ArrayList<Model.Question>
    private lateinit var answersCache : ArrayList<Model.Answer>

    private lateinit var allQuestions : ArrayList<Model.Question>
    private lateinit var allAnswers : ArrayList<Model.Answer>
    private lateinit var allCourses : ArrayList<Model.Course>

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        return inflater.inflate(R.layout.fragment_my_questions, container, false)
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        cache = requireArguments().getParcelableArrayList("savedQuestions") ?: arrayListOf()
        answersCache = requireArguments().getParcelableArrayList("savedAnswers") ?: arrayListOf()

        allQuestions = requireArguments().getParcelableArrayList("allQuestions")!!
        allAnswers = requireArguments().getParcelableArrayList("allAnswers")!!
        allCourses = requireArguments().getParcelableArrayList("allCourses")!!

        val layoutManager = LinearLayoutManager(context)
        recyclerView = view.findViewById(R.id.recycler_my_questions)
        recyclerView.layoutManager = layoutManager
        recyclerView.setHasFixedSize(false)

        // If user is not logged in, display a message
        if (user == null) {
            val message = "You need to be logged in to view your questions."
            val messageView = view.findViewById<TextView>(R.id.not_connected_text_view)
            messageView.text = message
            messageView.visibility = View.VISIBLE
        } else {
            refresh()
        }
    }

    // Fetch the questions and the corresponding courses and display them in the recycler view
    private fun getMyQuestionsMap() {
        if (DatabaseManager.user == null) {
            val notConnected = view?.findViewById<TextView>(R.id.not_connected_text_view)
            notConnected?.visibility = View.VISIBLE
        } else {
            val userId = user?.userId
            if (userId != null) {
                db.getUserQuestions(userId).thenAccept { questions ->
                    val courseIds = questions.map { question -> question.courseId }.toSet().toList()
                    val futureCourses = mutableListOf<CompletableFuture<Model.Course?>>()

                    for (id in courseIds) {
                        futureCourses.add(db.getCourseById(id))
                    }

                    // When all courses are fetched, store the questions and display them
                    CompletableFuture.allOf(*futureCourses.toTypedArray()).thenAccept {
                        myQuestionsMap = mutableMapOf()
                        futureCourses.let {
                            it.forEach { futureCourse ->
                                val course = futureCourse.get()
                                if (course != null) {
                                    val courseQuestion = questions.filter { question -> question.courseId == course.courseId }
                                    myQuestionsMap.set(course, courseQuestion)
                                }
                            }
                        }

                        myQuestionsDisplay()
                    }
                }
            }
        }
    }

    // Display the questions in the recycler view or a message if there are no questions
    private fun myQuestionsDisplay() {
        if (myQuestionsMap.isEmpty()) {
            val message = "You have no questions yet."
            val messageView = view?.findViewById<TextView>(R.id.no_question)
            messageView?.text = message
            messageView?.visibility = View.VISIBLE
        }

        adapter = MyQuestionsAdapter(myQuestionsMap, cache, answersCache, allQuestions, allAnswers,
            allCourses, "MyQuestionsFragment")
        recyclerView.adapter = adapter
    }

    // Fetch the questions and refresh the display
    private fun refresh() {
        getMyQuestionsMap()
    }
}