Skip to content

Commit

Permalink
Merge pull request #309 from Runnect/feature/fix-multiview-recyclervi…
Browse files Browse the repository at this point in the history
…ew-loading

[FIX] 코스 발견 / 마라톤, 추천 코스 조회 로직 수정
  • Loading branch information
leeeha authored Jan 24, 2024
2 parents f676d4c + c3ff1f8 commit 4be95ed
Show file tree
Hide file tree
Showing 8 changed files with 227 additions and 178 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -149,7 +149,7 @@ class MainActivity : BindingActivity<ActivityMainBinding>(R.layout.activity_main
var storageScrapFragment: StorageScrapFragment? = null

fun updateCourseDiscoverScreen() {
discoverFragment?.getRecommendCourses(pageNo = 1)
discoverFragment?.getRecommendCourses()
}

fun updateStorageScrapScreen() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,13 +17,15 @@ import com.runnect.runnect.R
import com.runnect.runnect.binding.BindingFragment
import com.runnect.runnect.databinding.FragmentDiscoverBinding
import com.runnect.runnect.domain.entity.DiscoverBanner
import com.runnect.runnect.domain.entity.DiscoverMultiViewItem
import com.runnect.runnect.presentation.discover.model.EditableDiscoverCourse
import com.runnect.runnect.presentation.MainActivity
import com.runnect.runnect.presentation.MainActivity.Companion.isVisitorMode
import com.runnect.runnect.presentation.detail.CourseDetailActivity
import com.runnect.runnect.presentation.detail.CourseDetailRootScreen
import com.runnect.runnect.presentation.discover.adapter.BannerAdapter
import com.runnect.runnect.presentation.discover.adapter.multiview.DiscoverMultiViewAdapter
import com.runnect.runnect.presentation.discover.adapter.multiview.DiscoverMultiViewType
import com.runnect.runnect.presentation.discover.pick.DiscoverPickActivity
import com.runnect.runnect.presentation.discover.search.DiscoverSearchActivity
import com.runnect.runnect.presentation.state.UiStateV2
Expand All @@ -39,6 +41,7 @@ import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.Job
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking
import timber.log.Timber

@AndroidEntryPoint
Expand All @@ -60,6 +63,7 @@ class DiscoverFragment : BindingFragment<FragmentDiscoverBinding>(R.layout.fragm
val updatedCourse: EditableDiscoverCourse =
result.data?.getCompatibleParcelableExtra(EXTRA_EDITABLE_DISCOVER_COURSE)
?: return@registerForActivityResult

multiViewAdapter.updateCourseItem(
publicCourseId = viewModel.clickedCourseId,
updatedCourse = updatedCourse
Expand All @@ -72,12 +76,52 @@ class DiscoverFragment : BindingFragment<FragmentDiscoverBinding>(R.layout.fragm
binding.vm = viewModel
binding.lifecycleOwner = viewLifecycleOwner

initView()
createBannerScrollJob()
addListener()
addObserver()
registerCallback()
}

private fun initView() {
initMultiViewAdapter()
}

private fun initMultiViewAdapter() {
multiViewAdapter = DiscoverMultiViewAdapter(
onHeartButtonClick = { courseId, scrap ->
viewModel.postCourseScrap(courseId, scrap)
},
onCourseItemClick = { courseId ->
navigateToDetailScreen(courseId)
viewModel.saveClickedCourseId(courseId)
},
handleVisitorMode = {
context?.let { showCourseScrapWarningToast(it) }
}
).apply {
binding.rvDiscoverMultiView.adapter = this
binding.rvDiscoverMultiView.setHasFixedSize(true)
}
}

private fun navigateToDetailScreen(publicCourseId: Int) {
val context = context ?: return
Intent(context, CourseDetailActivity::class.java).apply {
putExtra(EXTRA_PUBLIC_COURSE_ID, publicCourseId)
putExtra(EXTRA_ROOT_SCREEN, CourseDetailRootScreen.COURSE_DISCOVER)
resultLauncher.launch(this)
}
activity?.applyScreenEnterAnimation()
}

private fun showCourseScrapWarningToast(context: Context) {
RunnectToast.createToast(
context = context,
message = context.getString(R.string.visitor_mode_course_detail_scrap_warning_msg)
).show()
}

private fun createBannerScrollJob() {
bannerScrollJob = viewLifeCycleScope.launch {
delay(BANNER_SCROLL_DELAY_TIME)
Expand All @@ -96,7 +140,6 @@ class DiscoverFragment : BindingFragment<FragmentDiscoverBinding>(R.layout.fragm
ViewPager2.OnPageChangeCallback() {
override fun onPageSelected(position: Int) {
super.onPageSelected(position)
Timber.d("viewpager position: $position")
updateBannerPosition(position)
updateBannerIndicatorPosition()
}
Expand Down Expand Up @@ -155,18 +198,17 @@ class DiscoverFragment : BindingFragment<FragmentDiscoverBinding>(R.layout.fragm
}

private fun checkNextPageLoadingCondition(recyclerView: RecyclerView) {
if (!recyclerView.canScrollVertically(SCROLL_DIRECTION)) {
if (isCourseLoadingCompleted() && !recyclerView.canScrollVertically(SCROLL_DIRECTION)) {
Timber.d("스크롤이 끝에 도달했어요!")

if (viewModel.isNextPageLoading()) {
Timber.d("다음 페이지 로딩 중입니다.")
return
if (!viewModel.isNextPageLoading()) {
viewModel.getRecommendCourseNextPage()
}

viewModel.getRecommendCourseNextPage()
}
}

private fun isCourseLoadingCompleted() = ::multiViewAdapter.isInitialized &&
multiViewAdapter.itemCount >= DiscoverMultiViewType.values().size

private fun showCircleUploadButton() {
binding.fabDiscoverUploadText.isVisible = false
binding.fabDiscoverUpload.isVisible = true
Expand All @@ -186,8 +228,7 @@ class DiscoverFragment : BindingFragment<FragmentDiscoverBinding>(R.layout.fragm

private fun initRefreshLayoutListener() {
binding.refreshLayout.setOnRefreshListener {
viewModel.resetMultiViewItems()
viewModel.refreshCurrentCourses()
viewModel.refreshDiscoverCourses()
binding.refreshLayout.isRefreshing = false
}
}
Expand Down Expand Up @@ -294,10 +335,11 @@ class DiscoverFragment : BindingFragment<FragmentDiscoverBinding>(R.layout.fragm
private fun setupMarathonCourseGetStateObserver() {
viewModel.marathonCourseState.observe(viewLifecycleOwner) { state ->
when (state) {
is UiStateV2.Loading -> showLoadingProgressBar()
is UiStateV2.Success -> {
multiViewAdapter.initMarathonCourses(state.data)
}

is UiStateV2.Failure -> {
dismissLoadingProgressBar()
context?.showSnackbar(
anchorView = binding.root,
message = state.msg,
Expand All @@ -316,11 +358,8 @@ class DiscoverFragment : BindingFragment<FragmentDiscoverBinding>(R.layout.fragm
is UiStateV2.Loading -> showLoadingProgressBar()

is UiStateV2.Success -> {
if (viewModel.checkCourseLoadState()) {
dismissLoadingProgressBar()
initMultiViewAdapter()
initMultiRecyclerView()
}
dismissLoadingProgressBar()
multiViewAdapter.initRecommendCourses(state.data)
}

is UiStateV2.Failure -> {
Expand All @@ -347,52 +386,11 @@ class DiscoverFragment : BindingFragment<FragmentDiscoverBinding>(R.layout.fragm
binding.pbDiscoverLoading.isVisible = false
}

private fun initMultiViewAdapter() {
multiViewAdapter = DiscoverMultiViewAdapter(
multiViewItems = viewModel.multiViewItems,
onHeartButtonClick = { courseId, scrap ->
viewModel.postCourseScrap(courseId, scrap)
},
onCourseItemClick = { courseId ->
navigateToDetailScreen(courseId)
viewModel.saveClickedCourseId(courseId)
},
handleVisitorMode = {
context?.let { showCourseScrapWarningToast(it) }
}
)
}

private fun initMultiRecyclerView() {
binding.rvDiscoverMultiView.apply {
setHasFixedSize(true)
adapter = multiViewAdapter
}
}

private fun navigateToDetailScreen(publicCourseId: Int) {
val context = context ?: return
Intent(context, CourseDetailActivity::class.java).apply {
putExtra(EXTRA_PUBLIC_COURSE_ID, publicCourseId)
putExtra(EXTRA_ROOT_SCREEN, CourseDetailRootScreen.COURSE_DISCOVER)
resultLauncher.launch(this)
}
activity?.applyScreenEnterAnimation()
}

private fun showCourseScrapWarningToast(context: Context) {
RunnectToast.createToast(
context = context,
message = context.getString(R.string.visitor_mode_course_detail_scrap_warning_msg)
).show()
}

private fun setupRecommendCourseNextPageStateObserver() {
viewModel.nextPageState.observe(viewLifecycleOwner) { state ->
when (state) {
is UiStateV2.Success -> {
val nextPageCourses = state.data
multiViewAdapter.addRecommendCourseNextPage(nextPageCourses)
multiViewAdapter.addRecommendCourseNextPage(state.data)
}

is UiStateV2.Failure -> {
Expand Down Expand Up @@ -449,8 +447,8 @@ class DiscoverFragment : BindingFragment<FragmentDiscoverBinding>(R.layout.fragm
return layoutManager.findFirstCompletelyVisibleItemPosition() > 0
}

fun getRecommendCourses(pageNo: Int) {
viewModel.getRecommendCourse(pageNo = pageNo, ordering = "date")
fun getRecommendCourses() {
viewModel.getRecommendCourses()
}

override fun onAttach(context: Context) {
Expand Down
Loading

0 comments on commit 4be95ed

Please sign in to comment.