coding-blocks/CBOnlineApp

View on GitHub
app/src/main/java/com/codingblocks/cbonlineapp/mycourse/MyCourseActivity.kt

Summary

Maintainability
C
1 day
Test Coverage
package com.codingblocks.cbonlineapp.mycourse

import android.app.Activity
import android.content.Context
import android.content.Intent
import android.os.Bundle
import android.os.Handler
import android.view.View
import androidx.activity.invoke
import androidx.activity.result.ActivityResult
import androidx.activity.result.contract.ActivityResultContracts
import androidx.appcompat.app.AlertDialog
import androidx.lifecycle.Observer
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout
import com.codingblocks.cbonlineapp.R
import com.codingblocks.cbonlineapp.analytics.AppCrashlyticsWrapper
import com.codingblocks.cbonlineapp.auth.LoginActivity
import com.codingblocks.cbonlineapp.baseclasses.BaseCBActivity
import com.codingblocks.cbonlineapp.dashboard.ViewPager2Adapter
import com.codingblocks.cbonlineapp.mycourse.content.player.VideoPlayerActivity.Companion.createVideoPlayerActivityIntent
import com.codingblocks.cbonlineapp.util.COURSE_NAME
import com.codingblocks.cbonlineapp.util.DIALOG_TYPE
import com.codingblocks.cbonlineapp.util.LECTURE
import com.codingblocks.cbonlineapp.util.MediaUtils
import com.codingblocks.cbonlineapp.util.RUN_ATTEMPT_ID
import com.codingblocks.cbonlineapp.util.TAB_POS
import com.codingblocks.cbonlineapp.util.VIDEO
import com.codingblocks.cbonlineapp.util.extensions.animateVisibility
import com.codingblocks.cbonlineapp.util.extensions.setToolbar
import com.codingblocks.cbonlineapp.util.extensions.showSnackbar
import com.codingblocks.cbonlineapp.util.livedata.observer
import com.codingblocks.cbonlineapp.util.livedata.pageChangeCallback
import com.codingblocks.cbonlineapp.util.showConfirmDialog
import com.codingblocks.onlineapi.ErrorStatus
import com.google.android.material.badge.BadgeDrawable
import com.google.android.material.snackbar.Snackbar
import com.google.android.material.tabs.TabLayoutMediator
import kotlinx.android.synthetic.main.activity_my_course.*
import org.jetbrains.anko.AnkoLogger
import org.jetbrains.anko.intentFor
import org.jetbrains.anko.singleTop
import org.jetbrains.anko.toast
import org.koin.androidx.viewmodel.ext.android.stateViewModel

class MyCourseActivity : BaseCBActivity(), AnkoLogger, SwipeRefreshLayout.OnRefreshListener {

    private val viewModel: MyCourseViewModel by stateViewModel()
    private val pagerAdapter: ViewPager2Adapter by lazy { ViewPager2Adapter(this) }
    private var confirmDialog: AlertDialog? = null

    private val startForResult = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result: ActivityResult ->
        if (result.resultCode == Activity.RESULT_OK) {
            confirmDialog?.dismiss()
            toast(getString(R.string.logged_in))
            viewModel.fetchSections()
            viewModel.getStats()
        }
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_my_course)
        setToolbar(toolbar_mycourse)
        intent.getStringExtra(RUN_ATTEMPT_ID)?.let {
            viewModel.attemptId = it
        }
        intent.getStringExtra(COURSE_NAME)?.let {
            viewModel.name = it
        }
        title = viewModel.name

        if (!MediaUtils.checkPermission(this)) {
            MediaUtils.isStoragePermissionGranted(this)
        }
        viewModel.nextContent?.observe(
            this,
            Observer { content ->
                courseResumeBtn.setOnClickListener {
                    if (content != null)
                        when (content.contentable) {
                            LECTURE, VIDEO -> startActivity(createVideoPlayerActivityIntent(this, content.contentId, content.sectionId))
                        } else {
                        toast("Please Wait while the content is being updated!")
                    }
                }
            }
        )

        viewModel.errorLiveData.observer(this) {
            when (it) {
                ErrorStatus.NO_CONNECTION -> {
                    myCourseRoot.showSnackbar(it, Snackbar.LENGTH_SHORT)
                }
                ErrorStatus.TIMEOUT -> {
                    myCourseRoot.showSnackbar(it, Snackbar.LENGTH_INDEFINITE) {
                        viewModel.fetchSections()
                        viewModel.getStats()
                    }
                }
                ErrorStatus.UNAUTHORIZED -> {
                    if (confirmDialog == null)
                        confirmDialog = showConfirmDialog(DIALOG_TYPE.UNAUTHORIZED) {
                            cancelable = false
                            positiveBtnClickListener { startForResult(intentFor<LoginActivity>()) }
                            negativeBtnClickListener { finish() }
                        }
                    confirmDialog?.show()
                }
                else -> {
                    AppCrashlyticsWrapper.log(it)
                }
            }
        }
        setupViewPager()
    }

    private fun setupViewPager() {

        pagerAdapter.apply {
            add(ViewPager2Adapter.FragmentName.COURSE_OVERVIEW)
            add(ViewPager2Adapter.FragmentName.COURSE_CURRICULUM)
            add(ViewPager2Adapter.FragmentName.COURSE_LIBRARY)
//            add(ViewPager2Adapter.FragmentName.COURSE_MISC)
        }
        coursePager.apply {
            isUserInputEnabled = false
            adapter = pagerAdapter
            offscreenPageLimit = 3
            registerOnPageChangeCallback(
                pageChangeCallback { pos, _, _ ->
                    if (pos == 1) {
                        fab.animateVisibility(View.VISIBLE)
                    } else {
                        if (fab.visibility == View.VISIBLE) {
                            fab.animateVisibility(View.GONE)
                        }
                    }
                }
            )
        }
        val badge: BadgeDrawable? = myCourseTabs.getTabAt(3)?.orCreateBadge
        badge?.isVisible = true
        TabLayoutMediator(myCourseTabs, coursePager) { tab, position ->
            tab.text = resources.getStringArray(R.array.tab_titles)[position]
            coursePager.setCurrentItem(tab.position, true)
        }.attach()
        // TODO(#1): Fix this hack
        Handler().postDelayed(
            {
                coursePager.setCurrentItem(intent.getIntExtra(TAB_POS, 0), true)
            },
            100
        )
    }

    fun showFab() {
        if (fab.visibility == View.GONE)
            fab.animateVisibility(View.VISIBLE)
    }

    fun hideFab() {
        if (fab.visibility == View.VISIBLE)
            fab.animateVisibility(View.GONE)
    }

    override fun onRefresh() {
        viewModel.fetchSections(true)
    }

    companion object {

        fun createMyCourseActivityIntent(context: Context, attemptId: String, name: String = "", pos: Int = 0): Intent {
            return context.intentFor<MyCourseActivity>(COURSE_NAME to name, RUN_ATTEMPT_ID to attemptId, TAB_POS to pos).singleTop()
        }
    }
}