app/src/main/java/com/codingblocks/cbonlineapp/dashboard/home/DashboardHomeFragment.kt
package com.codingblocks.cbonlineapp.dashboard.home
import android.content.Intent
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import androidx.core.app.ActivityOptionsCompat
import androidx.core.content.ContextCompat.getColor
import androidx.core.view.ViewCompat
import androidx.core.view.isVisible
import androidx.lifecycle.Observer
import androidx.recyclerview.widget.RecyclerView
import com.codingblocks.cbonlineapp.R
import com.codingblocks.cbonlineapp.auth.LoginActivity
import com.codingblocks.cbonlineapp.baseclasses.BaseCBFragment
import com.codingblocks.cbonlineapp.course.CourseActivity
import com.codingblocks.cbonlineapp.course.adapter.CourseListAdapter
import com.codingblocks.cbonlineapp.course.adapter.WishlistListener
import com.codingblocks.cbonlineapp.dashboard.DashboardViewModel
import com.codingblocks.cbonlineapp.mycourse.MyCourseActivity
import com.codingblocks.cbonlineapp.mycourse.content.player.VideoPlayerActivity
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.glide.loadImage
import com.codingblocks.cbonlineapp.util.livedata.observer
import com.codingblocks.onlineapi.models.ProgressItem
import com.github.mikephil.charting.charts.LineChart
import com.github.mikephil.charting.data.Entry
import com.github.mikephil.charting.data.LineData
import com.github.mikephil.charting.data.LineDataSet
import com.github.mikephil.charting.interfaces.datasets.ILineDataSet
import com.skydoves.progressview.ProgressView
import kotlinx.android.synthetic.main.app_bar_dashboard.*
import kotlinx.android.synthetic.main.fragment_dashboard_home.*
import kotlinx.android.synthetic.main.item_performance.*
import org.jetbrains.anko.support.v4.intentFor
import org.koin.androidx.viewmodel.ext.android.sharedViewModel
class DashboardHomeFragment : BaseCBFragment() {
private val vm: DashboardViewModel by sharedViewModel()
private val recentlyPlayedAdapter = RecentlyPlayedAdapter()
private val wishlistAdapter = CourseListAdapter("WISHLIST")
private val itemClickListener: ItemClickListener by lazy {
object : ItemClickListener {
override fun onClick(sectionId: String, contentId: String, postition: Long) {
startActivity(VideoPlayerActivity.createVideoPlayerActivityIntent(requireContext(), contentId, sectionId, postition))
}
}
}
private val wishlistListener: WishlistListener by lazy {
object : WishlistListener {
override fun onWishListClickListener(id: String) {
if (vm.isLoggedIn == true) {
vm.changeWishlistStatus(id)
}
}
}
}
private val wishListItemClickListener: com.codingblocks.cbonlineapp.course.adapter.ItemClickListener by lazy {
object : com.codingblocks.cbonlineapp.course.adapter.ItemClickListener {
override fun onClick(id: String, name: String, logo: ImageView) {
val intent = Intent(requireContext(), CourseActivity::class.java)
intent.putExtra(COURSE_ID, id)
val putExtra = intent.putExtra(COURSE_LOGO, name)
intent.putExtra(LOGO_TRANSITION_NAME, ViewCompat.getTransitionName(logo))
val options: ActivityOptionsCompat = ActivityOptionsCompat.makeSceneTransitionAnimation(
requireActivity(),
logo,
ViewCompat.getTransitionName(logo)!!
)
startActivity(intent, options.toBundle())
}
}
}
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? = inflater.inflate(R.layout.fragment_dashboard_home, container, false)
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
dashboardHomeShimmer.startShimmer()
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
recentPlayedRv.setRv(requireContext(), recentlyPlayedAdapter, orientation = RecyclerView.HORIZONTAL, space = 28f)
wishRv.setRv(requireContext(), wishlistAdapter, orientation = RecyclerView.HORIZONTAL, space = 20f)
recentlyPlayedAdapter.onItemClick = itemClickListener
wishlistAdapter.onItemClick = wishListItemClickListener
wishlistAdapter.wishlistListener = wishlistListener
exploreBtn.setOnClickListener { requireActivity().dashboardBottomNav.selectedItemId = R.id.dashboard_explore }
exploreBtn2.setOnClickListener { requireActivity().dashboardBottomNav.selectedItemId = R.id.dashboard_explore }
loginBtn.setOnClickListener {
startActivity(intentFor<LoginActivity>())
requireActivity().finish()
}
viewAllTv.setOnClickListener {
startActivity(Intent(requireContext(), WishlistActivity::class.java))
}
}
override fun onDestroyView() {
recentlyPlayedAdapter.onItemClick = null
super.onDestroyView()
}
override fun onResume() {
super.onResume()
if (vm.isLoggedIn == true) {
vm.fetchTopRunWithStats().observe(
thisLifecycleOwner,
Observer { coursePair ->
dashboardProgressContainer.isVisible = coursePair != null
dashboardEmptyProgress.isVisible = coursePair == null
dashboardHomeShimmer.hideAndStop()
dashboardHome.isVisible = true
if (coursePair != null) {
vm.getStats(coursePair.runAttempt.attemptId)
homeCourseLogoImg.loadImage(coursePair.course.logo)
coursePair.getProgress().let { progress ->
homeProgressTv.text = getString(R.string.progress, progress.toInt())
homeProgressView.setGradientColor(progress)
}
with(requireActivity()) {
toolbarCourseTitleTv?.text = coursePair.course.title
toolbarCourseTitleTv?.isVisible = true
toolbarCourseResumeTv?.isVisible = true
dashboardToolbarSecondary?.setOnClickListener {
startActivity(
MyCourseActivity.createMyCourseActivityIntent(
requireContext(),
coursePair.runAttempt.attemptId,
coursePair.course.title
)
)
}
}
vm.getPerformance(coursePair.runAttempt.attemptId).observer(thisLifecycleOwner) {
homePerformanceTv.text = it.remarks
homePercentileTv.text = it.percentile.toString()
chart1.loadData(it.averageProgress, it.userProgress)
}
}
}
)
vm.fetchRecentlyPlayed().observer(thisLifecycleOwner) {
recentlyPlayedContainer.isVisible = it.isNotEmpty()
recentlyPlayedAdapter.submitList(it)
}
vm.fetchWishList()
vm.wishlistLiveData.observer(viewLifecycleOwner) { wishlist ->
noWishListLayout.isVisible = wishlist.isEmpty()
wishlistHolder.isVisible = wishlist.isNotEmpty()
wishlistAdapter.submitList(wishlist)
}
} else {
dashboardHomeShimmer.hideAndStop()
dashboardHome.isVisible = false
dashboardHomeLoggedOut.isVisible = true
}
}
}
fun ProgressView.setGradientColor(progress: Double) {
this.progress = progress.toFloat()
if (progress > 90) {
highlightView.colorGradientStart =
getColor(context, R.color.kiwigreen)
highlightView.colorGradientEnd =
getColor(context, R.color.tealgreen)
} else {
highlightView.colorGradientStart =
getColor(context, R.color.pastel_red)
highlightView.colorGradientEnd =
getColor(context, R.color.dusty_orange)
}
}
fun LineChart.loadData(
averageProgress: java.util.ArrayList<ProgressItem>,
userProgress: java.util.ArrayList<ProgressItem>
) {
val values: ArrayList<Entry> = ArrayList()
averageProgress.forEachIndexed { index, progressItem ->
values.add(Entry(index.toFloat(), progressItem.progress.toFloat()))
}
val values2: ArrayList<Entry> = ArrayList()
userProgress.forEachIndexed { index, progressItem ->
values2.add(Entry(index.toFloat(), progressItem.progress.toFloat()))
}
val set1 = LineDataSet(values, "Average Progress")
set1.apply {
setDrawCircles(false)
color = getColor(context, R.color.pastel_red)
setDrawValues(false)
mode = LineDataSet.Mode.CUBIC_BEZIER
lineWidth = 3f
}
val set2 = LineDataSet(values2, "User Progress")
set2.apply {
setDrawCircles(false)
color = getColor(context, R.color.kiwigreen)
mode = LineDataSet.Mode.CUBIC_BEZIER
setDrawValues(false)
lineWidth = 3f
}
val dataSets: ArrayList<ILineDataSet> = ArrayList()
dataSets.add(set1)
dataSets.add(set2)
val data = LineData(dataSets)
this.apply {
this.data = data
setTouchEnabled(false)
axisRight.setDrawGridLines(false)
axisLeft.setDrawGridLines(true)
xAxis.setDrawGridLines(true)
notifyDataSetChanged()
xAxis.labelCount = 10
invalidate()
}
}