coding-blocks/CBOnlineApp

View on GitHub
app/src/main/java/com/codingblocks/cbonlineapp/dashboard/mycourses/DashboardMyCoursesFragment.kt

Summary

Maintainability
C
1 day
Test Coverage
package com.codingblocks.cbonlineapp.dashboard.mycourses

import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.AdapterView
import androidx.core.view.isVisible
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.distinctUntilChanged
import com.codingblocks.cbonlineapp.R
import com.codingblocks.cbonlineapp.auth.LoginActivity
import com.codingblocks.cbonlineapp.baseclasses.BaseCBFragment
import com.codingblocks.cbonlineapp.commons.SheetAdapter
import com.codingblocks.cbonlineapp.commons.SheetItem
import com.codingblocks.cbonlineapp.dashboard.DashboardViewModel
import com.codingblocks.cbonlineapp.mycourse.MyCourseActivity
import com.codingblocks.cbonlineapp.util.COURSE_NAME
import com.codingblocks.cbonlineapp.util.RUN_ATTEMPT_ID
import com.codingblocks.cbonlineapp.util.extensions.changeViewState
import com.codingblocks.cbonlineapp.util.extensions.setRv
import com.codingblocks.cbonlineapp.util.livedata.observer
import com.google.android.material.bottomsheet.BottomSheetDialog
import kotlinx.android.synthetic.main.app_bar_dashboard.*
import kotlinx.android.synthetic.main.bottom_sheet_mycourses.view.*
import kotlinx.android.synthetic.main.fragment_dashboard_my_courses.*
import org.jetbrains.anko.AnkoLogger
import org.jetbrains.anko.singleTop
import org.jetbrains.anko.support.v4.intentFor
import org.koin.androidx.viewmodel.ext.android.sharedViewModel

class DashboardMyCoursesFragment : BaseCBFragment(), AnkoLogger {

    private val dialog by lazy { BottomSheetDialog(requireContext()) }
    private val imgs by lazy { resources.obtainTypedArray(R.array.course_type_img) }
    private val coursesType by lazy { resources.getStringArray(R.array.course_type) }
    private val vm: DashboardViewModel by sharedViewModel()
    private val type = MutableLiveData<Int>()
    private val courseListAdapter = MyCourseListAdapter()

    private val itemClickListener: ItemClickListener by lazy {
        object : ItemClickListener {

            override fun onClick(id: String, runId: String, runAttemptId: String, name: String) {
                startActivity(
                    intentFor<MyCourseActivity>(
                        RUN_ATTEMPT_ID to runAttemptId,
                        COURSE_NAME to name
                    ).singleTop()
                )
            }
        }
    }

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

    override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)
        dashboardCourseShimmer.startShimmer()
    }

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

        courseTypeTv.apply {
            val lastSelected = vm.prefs.SP_COURSE_FILTER_TYPE
            text = coursesType[lastSelected]
            vm.courseFilter.postValue(coursesType[lastSelected])
            setCompoundDrawablesRelativeWithIntrinsicBounds(
                requireContext().getDrawable(imgs.getResourceId(lastSelected, 0)),
                null,
                requireContext().getDrawable(R.drawable.ic_dropdown),
                null
            )

            setOnClickListener {
                dialog.show()
            }
        }

        type.observer(thisLifecycleOwner) { num ->
            courseTypeTv.apply {
                text = coursesType[num]
                vm.courseFilter.postValue(coursesType[num])
                setCompoundDrawablesRelativeWithIntrinsicBounds(
                    requireContext().getDrawable(
                        imgs.getResourceId(
                            num,
                            0
                        )
                    ),
                    null, requireContext().getDrawable(R.drawable.ic_dropdown), null
                )
            }
        }
        dashboardMyCoursesExploreBtn.setOnClickListener {
            requireActivity().dashboardBottomNav.selectedItemId = R.id.dashboard_explore
        }
        dashboardCoursesRv.setRv(requireContext(), courseListAdapter, true)
        if (vm.isLoggedIn == true) {
            vm.fetchMyCourses()
            vm.courses.distinctUntilChanged().observer(thisLifecycleOwner) {
                courseListAdapter.submitList(it)
                changeViewState(
                    dashboardCoursesRv,
                    emptyLl,
                    dashboardCourseShimmer,
                    it.isEmpty()
                )
            }
        } else {
            dashboardMyCourseLoggedOut.isVisible = true
            dashboardMyCourse.isVisible = false
        }

//        viewModel.errorLiveData.observer(thisLifecycleOwner) {
//            when (it) {
//                ErrorStatus.NO_CONNECTION -> {
// //                    dashboardCourseRoot.showSnackbar(it, Snackbar.LENGTH_SHORT, dashboardBottomNav)
//                }
//                ErrorStatus.TIMEOUT -> {
//                    dashboardCourseRoot.showSnackbar(
//                        it,
//                        Snackbar.LENGTH_INDEFINITE,
//                        dashboardBottomNav
//                    ) {
//                        viewModel.fetchMyCourses()
//                    }
//                }
//                ErrorStatus.UNAUTHORIZED -> {
//                    Components.showConfirmation(requireContext(), UNAUTHORIZED) {
//                    }
//                }
//                else -> {
//                    dashboardCourseRoot.showSnackbar(it, Snackbar.LENGTH_SHORT, dashboardBottomNav)
//                    AppCrashlyticsWrapper.log(it)
//                }
//            }
//            if (courseListAdapter.currentList.isEmpty())
//                showEmptyView(emptyView = emptyLl, shimmerView = dashboardCourseShimmer)
//        }
        courseListAdapter.onItemClick = itemClickListener
        loginBtn.setOnClickListener {
            startActivity(intentFor<LoginActivity>())
            requireActivity().finish()
        }
    }

    private fun setUpBottomSheet() {
        val sheetDialog = layoutInflater.inflate(R.layout.bottom_sheet_mycourses, null)
        val list = arrayListOf<SheetItem>()
        repeat(6) {
            list.add(SheetItem(coursesType[it], imgs.getResourceId(it, 0)))
        }
        sheetDialog.run {
            val initialSelectedItem = vm.prefs.SP_COURSE_FILTER_TYPE
            val sheetAdapter = SheetAdapter(list, initialSelectedItem)
            sheetLv.adapter = sheetAdapter
            sheetLv.onItemClickListener = AdapterView.OnItemClickListener { _, _, position, _ ->
                type.postValue(position)
                vm.prefs.SP_COURSE_FILTER_TYPE = position
                sheetAdapter.selectedItem = position
                dialog.dismiss()
            }
        }
        dialog.dismissWithAnimation = true
        dialog.setContentView(sheetDialog)
    }

    override fun onDestroyView() {
        super.onDestroyView()
        courseListAdapter.onItemClick = null
    }

//    override fun onResume() {
//        super.onResume()
//        if (courseListAdapter.currentList.isNullOrEmpty()) {
//            viewModel.fetchMyCourses()
//        }
//    }
}