coding-blocks/CBOnlineApp

View on GitHub
app/src/main/java/com/codingblocks/cbonlineapp/tracks/TrackActivity.kt

Summary

Maintainability
C
7 hrs
Test Coverage
package com.codingblocks.cbonlineapp.tracks

import android.content.Intent
import android.os.Bundle
import android.view.MenuItem
import android.widget.ImageView
import androidx.core.app.ActivityOptionsCompat
import androidx.core.view.ViewCompat
import com.codingblocks.cbonlineapp.R
import com.codingblocks.cbonlineapp.baseclasses.BaseCBActivity
import com.codingblocks.cbonlineapp.course.CourseActivity
import com.codingblocks.cbonlineapp.course.adapter.CourseListAdapter
import com.codingblocks.cbonlineapp.course.adapter.ItemClickListener
import com.codingblocks.cbonlineapp.util.COURSE_ID
import com.codingblocks.cbonlineapp.util.COURSE_LOGO
import com.codingblocks.cbonlineapp.util.LOGO_TRANSITION_NAME
import com.codingblocks.cbonlineapp.util.extensions.hideAndStop
import com.codingblocks.cbonlineapp.util.extensions.setRv
import com.codingblocks.cbonlineapp.util.extensions.setToolbar
import com.codingblocks.cbonlineapp.util.glide.loadImage
import com.codingblocks.cbonlineapp.util.livedata.observer
import com.codingblocks.onlineapi.ErrorStatus
import com.google.android.material.appbar.AppBarLayout
import kotlinx.android.synthetic.main.activity_course.courseToolbar
import kotlinx.android.synthetic.main.activity_track.appbar
import kotlinx.android.synthetic.main.activity_track.certifiedTv
import kotlinx.android.synthetic.main.activity_track.courseBackdrop
import kotlinx.android.synthetic.main.activity_track.courseLogo
import kotlinx.android.synthetic.main.activity_track.shortTv
import kotlinx.android.synthetic.main.activity_track.trackCourseNumTv
import kotlinx.android.synthetic.main.activity_track.trackCourseRv
import kotlinx.android.synthetic.main.activity_track.trackShimmer
import org.koin.androidx.viewmodel.ext.android.viewModel

class TrackActivity : BaseCBActivity(), AppBarLayout.OnOffsetChangedListener {
    private val courseId by lazy {
        intent.getStringExtra(COURSE_ID)
    }
    private val courseLogoImage by lazy {
        intent.getStringExtra(LOGO_TRANSITION_NAME)
    }

    private val courseLogoUrl by lazy {
        intent.getStringExtra(COURSE_LOGO)
    }
    private val viewModel by viewModel<TrackViewModel>()

    private val courseCardListAdapter = CourseListAdapter("TRACKS")

    private val itemClickListener: ItemClickListener by lazy {
        object : ItemClickListener {
            override fun onClick(id: String, name: String, logo: ImageView) {
                val intent = Intent(this@TrackActivity, CourseActivity::class.java)
                intent.putExtra(COURSE_ID, id)
                intent.putExtra(COURSE_LOGO, name)
                intent.putExtra(LOGO_TRANSITION_NAME, ViewCompat.getTransitionName(logo))
                val options: ActivityOptionsCompat =
                    ActivityOptionsCompat.makeSceneTransitionAnimation(
                        this@TrackActivity,
                        logo,
                        ViewCompat.getTransitionName(logo)!!
                    )
                startActivity(intent, options.toBundle())
            }
        }
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_track)
        supportPostponeEnterTransition()
        setToolbar(courseToolbar)
        viewModel.id = courseId!!
        viewModel.fetchCurrentTrack()
        trackShimmer.showShimmer(true)
        trackCourseRv.setRv(
            this@TrackActivity,
            courseCardListAdapter,
            setDivider = true,
            type = "THICK"
        )
        if (!courseLogoImage.isNullOrEmpty()) {
            courseLogo.transitionName = courseLogoImage
            courseLogo.loadImage(courseLogoUrl!!) {
                supportStartPostponedEnterTransition()
            }
        }

        viewModel.currentTrack.observer(this) { track ->
            title = track.name
            if (courseLogoUrl.isNullOrEmpty()) courseLogo.loadImage(track.logo)
            courseBackdrop.loadImage(track.background)
            shortTv.text = track.description
            certifiedTv.append(track.name)
            trackCourseNumTv.text = "${track.courses?.size} Courses"
        }

        viewModel.courses.observer(this) { courses ->
            courseCardListAdapter.submitList(courses)
            trackShimmer.hideAndStop()
        }
        courseCardListAdapter.onItemClick = itemClickListener
        appbar.addOnOffsetChangedListener(this)
        viewModel.errorLiveData.observer(this) {
            when (it) {
                ErrorStatus.NO_CONNECTION -> {
                    showOffline()
                }
            }
        }
    }

    override fun onOffsetChanged(appBarLayout: AppBarLayout, verticalOffset: Int) {
        val alpha =
            (appBarLayout.totalScrollRange + verticalOffset).toFloat() / appBarLayout.totalScrollRange
        courseLogo.alpha = alpha
        shortTv.alpha = alpha
        trackCourseNumTv.alpha = alpha
    }

    override fun onOptionsItemSelected(item: MenuItem): Boolean {
        if (item.itemId == android.R.id.home) {
            onBackPressed()
        }
        return super.onOptionsItemSelected(item)
    }

    override fun onBackPressed() {
        supportFinishAfterTransition()
        super.onBackPressed()
    }
}