app/src/main/java/com/codingblocks/cbonlineapp/course/CourseSearchFragment.kt
package com.codingblocks.cbonlineapp.course
import android.app.Activity
import android.app.Dialog
import android.content.DialogInterface.OnShowListener
import android.content.Intent
import android.os.Bundle
import android.util.DisplayMetrics
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import androidx.annotation.NonNull
import androidx.core.app.ActivityOptionsCompat
import androidx.core.view.ViewCompat
import androidx.core.widget.addTextChangedListener
import androidx.lifecycle.observe
import androidx.recyclerview.widget.RecyclerView
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.setRv
import com.google.android.material.bottomsheet.BottomSheetBehavior
import com.google.android.material.bottomsheet.BottomSheetDialog
import com.google.android.material.bottomsheet.BottomSheetDialogFragment
import kotlinx.android.synthetic.main.fragment_search_course.view.*
import org.koin.androidx.viewmodel.ext.android.viewModel
/**
* @author aggarwalpulkit596
*/
class CourseSearchFragment : BottomSheetDialogFragment() {
private val viewModel by viewModel<CourseViewModel>()
private val courseCardListAdapter = CourseListAdapter("LIST")
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
val view = layoutInflater.inflate(com.codingblocks.cbonlineapp.R.layout.fragment_search_course, container)
view.searchEditText.addTextChangedListener {
if (!it.isNullOrEmpty()) {
viewModel.searchCourses(it.toString())
}
}
view.closeBtn.setOnClickListener {
dialog?.dismiss()
}
viewModel.findCourses.observe(viewLifecycleOwner) { courses ->
courseCardListAdapter.submitList(courses)
}
courseCardListAdapter.onItemClick = itemClickListener
view.courseSearchRv.setRv(requireContext(), courseCardListAdapter, orientation = RecyclerView.VERTICAL, setDivider = true)
return view
}
private val itemClickListener: ItemClickListener by lazy {
object : ItemClickListener {
override fun onClick(id: String, name: String, logo: ImageView) {
val intent = Intent(requireContext(), 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(
requireActivity(),
logo,
ViewCompat.getTransitionName(logo)!!
)
startActivity(intent, options.toBundle())
}
}
}
@NonNull
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
val dialog: Dialog = super.onCreateDialog(savedInstanceState)
dialog.setOnShowListener(
OnShowListener { dialogInterface ->
val bottomSheetDialog = dialogInterface as BottomSheetDialog
setupFullHeight(bottomSheetDialog)
}
)
return dialog
}
private fun setupFullHeight(bottomSheetDialog: BottomSheetDialog) {
val sheet = bottomSheetDialog.findViewById<View>(com.google.android.material.R.id.design_bottom_sheet)!!
val layoutParams = sheet.layoutParams
val windowHeight = getWindowHeight()
if (layoutParams != null) {
layoutParams.height = windowHeight
}
sheet.layoutParams = layoutParams
BottomSheetBehavior.from(sheet).state = BottomSheetBehavior.STATE_EXPANDED
}
private fun getWindowHeight(): Int { // Calculate window height for fullscreen use
val displayMetrics = DisplayMetrics()
(context as Activity?)!!.windowManager.defaultDisplay.getMetrics(displayMetrics)
return displayMetrics.heightPixels
}
}