Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[FEAT] 코스 발견 / 중첩 리사이클러뷰에서 추천 코스 무한 스크롤 #301

Merged
Merged
Show file tree
Hide file tree
Changes from 60 commits
Commits
Show all changes
68 commits
Select commit Hold shift + click to select a range
203e1ff
Merge branch 'feature/refactor-discover-banner-viewpager' of https://…
leeeha Dec 13, 2023
45a56c4
Merge branch 'develop' of https://github.com/Runnect/Runnect-Android …
leeeha Dec 13, 2023
78102b5
[MOD] #264 마라톤 아이템 데코레이션 코드 수정
leeeha Dec 14, 2023
ad67a81
[ADD] #264 추천 코스 아이템 데코레이션 코드 추가
leeeha Dec 14, 2023
c04920d
[FIX] #264 마라톤 코스 전체가 아니라 일부 아이템만 갱신하도록 변경
leeeha Dec 14, 2023
403d45e
[ADD] #264 추천 코스 아이템 일부만 갱신하는 코드 추가
leeeha Dec 14, 2023
f7d73b8
Merge branch 'develop' of https://github.com/Runnect/Runnect-Android …
leeeha Dec 17, 2023
9990d5c
[MOD] #264 현재 코스 아이템의 뷰 타입을 구분하는 코드 변경
leeeha Dec 17, 2023
b747e43
[DEL] #264 로그 삭제
leeeha Dec 17, 2023
daaca86
[DEL] #264 주석 삭제
leeeha Dec 17, 2023
3875052
[MOD] #264 주석 수정
leeeha Dec 17, 2023
156e0b4
[CHORE] #264 코스 상세페이지 내용 수정했다가 되돌리는 함수 이름 수정
leeeha Dec 17, 2023
91e8f75
[FIX] #264 코스 상세페이지의 path 리스트가 비어있는 경우 get 함수 사용하지 않도록 변경
leeeha Dec 17, 2023
ddbf82e
[CHORE] #264 result launcher 관련 주석 위치 변경
leeeha Dec 17, 2023
1aad6af
[DEL] #264 불필요한 코드 삭제
leeeha Dec 17, 2023
539e16c
[DEL] #264 불필요한 코드 삭제
leeeha Dec 17, 2023
7e6b04e
Merge branch 'feature/fix-detail-to-discover-update' of https://githu…
leeeha Dec 17, 2023
c156a93
[REFACTOR] #264 sealed 클래스의 자식 클래스에서 공통 속성을 오버라이드 하여 타겟 아이템을 찾는 코드 간결화
leeeha Dec 18, 2023
2a24df9
[MOD] #297 추천 코스 응답 dto 수정
leeeha Dec 18, 2023
53421d0
[ADD] #297 도메인 레이어의 추천 코스 dto에 isEnd 속성 추가
leeeha Dec 18, 2023
c3d7c74
[FEAT] #297 추천 코스 목록이 마지막 페이지에 도달했는지 검사하는 속성을 뷰모델에 저장
leeeha Dec 18, 2023
b65e131
[FEAT] #297 페이지 정보를 추천 코스 뷰홀더에게 넘기기
leeeha Dec 18, 2023
14dbc2a
[FEAT] #297 내부 리사이클러뷰에서 findLastCompletelyVisibleItemPosition 함수 호출하는 경우
leeeha Dec 19, 2023
40c9501
[FIX] #297 기존 추천코스를 replace 하지 않고, add 하도록 변경하기
leeeha Dec 19, 2023
cf81bbb
[FIX] #297 외부 리사이클러뷰에서 스크롤의 끝을 감지하도록 변경
leeeha Dec 19, 2023
d1d21d2
[MOD] #297 마라톤 코스의 뷰홀더 코드 변경
leeeha Dec 19, 2023
49f63a8
[CHORE] #297 멀티뷰 어댑터에 리스트 지역변수 만들기
leeeha Dec 19, 2023
f03af42
[MOD] #264 멀티 뷰 홀더에서 리스트 지역변수를 따로 만들지 않고 어댑터에서 참조하도록 변경
leeeha Dec 19, 2023
491e368
[FIX] #297 다음 페이지 요청할 때마다 뷰모델의 isEnd 속성 변경
leeeha Dec 19, 2023
57d64a2
[FIX] #297 내부, 외부 리사이클러뷰 모두 갱신하여 무한스크롤 구현
leeeha Dec 19, 2023
1a629c2
[FIX] #297 외부 리사이클러뷰 notifyItemChanged -> 내부 리사이클러뷰 submitList 실행
leeeha Dec 19, 2023
862edd7
[FIX] #297 아이템 데코가 누적해서 적용되는 문제 해결
leeeha Dec 19, 2023
c1940c0
[DEL] #297 사용하지 않는 상수 삭제
leeeha Dec 19, 2023
025de50
[DEL] #297 불필요한 형변환 코드 삭제
leeeha Dec 19, 2023
7eeff9b
[DEL] #297 사용하지 않는 함수 삭제
leeeha Dec 19, 2023
0d29825
[CHORE] #297 스크롤 관련 주석 추가
leeeha Dec 19, 2023
ff07437
[CHORE] #297 다음 페이지 보여주는 함수 이름 변경
leeeha Dec 19, 2023
e632f32
[REFACTOR] #297 스크롤 방향을 나타내는 상수 const로 정의
leeeha Dec 19, 2023
3d924fe
[FEAT] #264 코스 데이터가 비어있으면 러닝 시작 화면으로 넘어가지 못하도록 스낵바 띄우기
leeeha Dec 19, 2023
cc0cf5f
[MOD] #297 추천 코스 멀티뷰 아이템을 헤더와 코스 부분으로 구분하기
leeeha Dec 20, 2023
380a9ae
[FEAT] #297 마라톤 코스 조회 이후, 추천 코스 헤더 아이템 추가하도록 구현
leeeha Dec 20, 2023
004a3f7
[FEAT] #297 추천코스 헤더 텍스트에 대해 데이터 바인딩 적용
leeeha Dec 20, 2023
e4540dc
[REFACTOR] #297 멀티 뷰 홀더 생성 시, 팩토리 패턴 적용
leeeha Dec 20, 2023
605dc9d
[DEL] #297 사용하지 않는 임포트문 삭제
leeeha Dec 20, 2023
77c9604
Merge branch 'feature/fix-detail-to-discover-update' of https://githu…
leeeha Dec 20, 2023
b37b5dd
[CHORE] #297 멀티뷰 관련 클래스의 패키지 이동
leeeha Dec 20, 2023
4ab19a1
[ADD] #297 스낵바 임포트문 추가
leeeha Dec 20, 2023
ef6f71d
[CHORE] #297 멀티뷰 아이템 추가 관련 주석 수정
leeeha Dec 20, 2023
ccbaa85
[FIX] #297 외부 리사이클러뷰의 추천 코스 리스트 갱신 -> 내부 리사이클러뷰에 새 데이터 submitList
leeeha Dec 20, 2023
7eb0ffa
[FIX] #297 기존에 사용하던 그리드 아이템 데코레이션 적용
leeeha Dec 20, 2023
613e052
[REFACTOR] #297 마라톤, 추천 코스 뷰홀더를 팩토리로부터 참조하도록 변경하기
leeeha Dec 20, 2023
d37246c
[CHORE] #297 구현한 코드에 대한 설명 추가
leeeha Dec 20, 2023
9fea113
Merge branch 'develop' of https://github.com/Runnect/Runnect-Android …
leeeha Dec 26, 2023
b617690
[REFACTOR] #297 코스 아이템 갱신 시, 불필요한 반복문 연산 제거
leeeha Dec 26, 2023
295a7b3
[DEL] #297 외부 리사이클러뷰의 멀티 뷰 타입에서 추천 코스 헤더 타입 제거
leeeha Dec 26, 2023
140956a
[MOD] #297 멀티뷰 타입의 개수를 상수로 정의하지 않고, 이넘 클래스의 자식 개수로 참조하도록 변경
leeeha Dec 26, 2023
6ee12e1
[REFACTOR] #297 스낵바 띄우는 함수 통일하기
leeeha Dec 26, 2023
d889bc1
[FIX] #297 다음 페이지 로딩 중일 때는 중복해서 서버 요청 보내지 않도록 변경
leeeha Dec 26, 2023
e21ab14
[FIX] #297 그리드 아이템 데코레이션 코드 변경
leeeha Dec 26, 2023
d21b9bc
[UI] #297 마라톤, 추천코스 뷰 디테일 작업
leeeha Dec 26, 2023
5dde025
[REFACTOR] #297 스낵바 띄우는 함수 호출할 때, named argument 사용하도록 변경
leeeha Dec 30, 2023
458b935
[REFACTOR] #297 스낵바 띄우는 확장함수 내용 변경
leeeha Dec 30, 2023
af6c4f4
[MOD] #297 스낵바 확장함수 인자 타입 변경
leeeha Jan 3, 2024
34aeaae
[MOD] #297 RecommendCoursePagingData 널처리 방법 수정
leeeha Jan 3, 2024
203bda9
[REFACTOR] #297 EditableCourseDetail 객체 생성 시 named argument 적용
leeeha Jan 3, 2024
3118504
[CHORE] #297 Timber 로그 메시지의 레벨 변경
leeeha Jan 3, 2024
7001d90
Merge branch 'develop' of https://github.com/Runnect/Runnect-Android …
leeeha Jan 3, 2024
7b28154
[FEAT] #297 특정 레이아웃에 대한 바인딩 객체를 반환하는 확장 함수 구현
leeeha Jan 5, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,10 @@ import kotlinx.serialization.Serializable
data class ResponseGetDiscoverRecommend(
@SerialName("ordering")
val ordering: String,
@SerialName("totalPageSize")
val totalPageSize: Int,
@SerialName("isEnd")
val isEnd: Boolean,
@SerialName("publicCourses")
val publicCourses: List<PublicCourse>
) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import com.runnect.runnect.data.source.remote.RemoteCourseDataSource
import com.runnect.runnect.domain.entity.DiscoverSearchCourse
import com.runnect.runnect.domain.entity.DiscoverMultiViewItem.*
import com.runnect.runnect.domain.entity.EditableCourseDetail
import com.runnect.runnect.domain.entity.RecommendCoursePagingData
import com.runnect.runnect.domain.repository.CourseRepository
import com.runnect.runnect.util.extension.toData
import okhttp3.MultipartBody
Expand All @@ -32,11 +33,13 @@ class CourseRepositoryImpl @Inject constructor(private val remoteCourseDataSourc
override suspend fun getRecommendCourse(
pageNo: String,
ordering: String
): Result<List<RecommendCourse>?> = runCatching {
remoteCourseDataSource.getRecommendCourse(
): Result<RecommendCoursePagingData> = runCatching {
val response = remoteCourseDataSource.getRecommendCourse(
pageNo = pageNo,
ordering = ordering
).data?.toRecommendCourses()
).data

RecommendCoursePagingData(response?.isEnd, response?.toRecommendCourses())
}

override suspend fun getCourseSearch(keyword: String): Result<List<DiscoverSearchCourse>?> =
Expand Down
Original file line number Diff line number Diff line change
@@ -1,21 +1,23 @@
package com.runnect.runnect.domain.entity

sealed class DiscoverMultiViewItem {
sealed class DiscoverMultiViewItem(
open val id: Int
leeeha marked this conversation as resolved.
Show resolved Hide resolved
) {
data class MarathonCourse(
val id: Int,
override val id: Int,
val courseId: Int,
var title: String,
val image: String,
var scrap: Boolean,
val departure: String,
) : DiscoverMultiViewItem()
) : DiscoverMultiViewItem(id)

data class RecommendCourse(
val id: Int,
override val id: Int,
val courseId: Int,
var title: String,
val image: String,
var scrap: Boolean,
val departure: String,
) : DiscoverMultiViewItem()
) : DiscoverMultiViewItem(id)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package com.runnect.runnect.domain.entity

data class RecommendCoursePagingData(
val isEnd: Boolean?,
val recommendCourses: List<DiscoverMultiViewItem.RecommendCourse>?
)
leeeha marked this conversation as resolved.
Show resolved Hide resolved
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import com.runnect.runnect.data.dto.response.ResponsePutMyDrawCourse
import com.runnect.runnect.domain.entity.CourseDetail
import com.runnect.runnect.domain.entity.DiscoverSearchCourse
import com.runnect.runnect.domain.entity.DiscoverMultiViewItem.*
import com.runnect.runnect.domain.entity.RecommendCoursePagingData
import com.runnect.runnect.domain.entity.EditableCourseDetail
import okhttp3.MultipartBody
import okhttp3.RequestBody
Expand All @@ -22,7 +23,7 @@ import retrofit2.Response
interface CourseRepository {
suspend fun getMarathonCourse(): Result<List<MarathonCourse>?>

suspend fun getRecommendCourse(pageNo: String, ordering: String): Result<List<RecommendCourse>?>
suspend fun getRecommendCourse(pageNo: String, ordering: String): Result<RecommendCoursePagingData>

suspend fun getCourseSearch(keyword: String): Result<List<DiscoverSearchCourse>?>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -287,24 +287,33 @@ class CourseDetailActivity :
return@setOnClickListener
}

Intent(
this@CourseDetailActivity,
CountDownActivity::class.java
).apply {
putExtra(
EXTRA_COURSE_DATA, CourseData(
courseId = courseDetail.courseId,
publicCourseId = courseDetail.id,
touchList = connectedSpots,
startLatLng = departureLatLng,
departure = courseDetail.departure,
distance = courseDetail.distance.toFloat(),
image = courseDetail.image,
dataFrom = "detail"
)
)
startActivity(this)
if (!::departureLatLng.isInitialized || connectedSpots.isEmpty()) {
showSnackbar(binding.root, getString(R.string.course_detail_list_empty_error_msg))
return@setOnClickListener
}

navigateToCountDownActivity()
}
}

private fun navigateToCountDownActivity() {
Intent(
this@CourseDetailActivity,
CountDownActivity::class.java
).apply {
putExtra(
EXTRA_COURSE_DATA, CourseData(
courseId = courseDetail.courseId,
publicCourseId = courseDetail.id,
touchList = connectedSpots,
startLatLng = departureLatLng,
departure = courseDetail.departure,
distance = courseDetail.distance.toFloat(),
image = courseDetail.image,
dataFrom = "detail"
)
)
startActivity(this)
}
}

Expand Down Expand Up @@ -334,7 +343,7 @@ class CourseDetailActivity :
onNegativeButtonClicked = {},
onPositiveButtonClicked = {
// 편집 모드 -> 뒤로가기 버튼 -> 편집 중단 확인 -> 뷰에 원래 제목으로 보여줌.
viewModel.restoreOriginalContents()
viewModel.restoreOriginalCourseDetail()
enterReadMode()
}
)
Expand Down Expand Up @@ -396,7 +405,7 @@ class CourseDetailActivity :
private fun enterEditMode() {
viewModel.apply {
updateCurrentScreenMode(EditMode)
saveCurrentContents()
saveCurrentCourseDetail()
}
updateLayoutForEditMode()
}
Expand Down Expand Up @@ -448,7 +457,10 @@ class CourseDetailActivity :
courseDetail = state.data ?: return@observe
binding.courseDetail = courseDetail

viewModel.updateCourseDetailContents(courseDetail.toCourseDetailContents())
val editableCourseDetail =
EditableCourseDetail(courseDetail.title, courseDetail.description)
viewModel.updateCourseDetailEditText(editableCourseDetail)
leeeha marked this conversation as resolved.
Show resolved Hide resolved

updateUserProfileStamp()
updateUserLevel()
updateScrapState()
Expand All @@ -466,16 +478,10 @@ class CourseDetailActivity :
}
}

private fun <T : Any> T.toCourseDetailContents(): EditableCourseDetail? {
return when (this) {
is CourseDetail -> EditableCourseDetail(title, description)
is EditableCourseDetail -> EditableCourseDetail(title, description)
else -> null
}
}

private fun initDepartureLatLng() {
departureLatLng = LatLng(courseDetail.path[0][0], courseDetail.path[0][1])
if (courseDetail.path.isNotEmpty()) {
departureLatLng = LatLng(courseDetail.path[0][0], courseDetail.path[0][1])
}
}

private fun initConnectedSpots() {
Expand All @@ -494,8 +500,8 @@ class CourseDetailActivity :
binding.indeterminateBar.isVisible = false

state.data?.let { response ->
viewModel.updateCourseDetailContents(response.toCourseDetailContents())
updateTextView(response)
viewModel.updateCourseDetailEditText(response)
updateCourseDetailTextView(response)
}

enterReadMode()
Expand All @@ -512,7 +518,7 @@ class CourseDetailActivity :
}
}

private fun updateTextView(courseDetail: EditableCourseDetail) {
private fun updateCourseDetailTextView(courseDetail: EditableCourseDetail) {
binding.apply {
tvCourseDetailTitle.text = courseDetail.title
tvCourseDetailDesc.text = courseDetail.description
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,21 +58,19 @@ class CourseDetailViewModel @Inject constructor(
private var _currentScreenMode: ScreenMode = ScreenMode.ReadOnlyMode
val currentScreenMode get() = _currentScreenMode

private var savedCourseDetailContents = EditableCourseDetail("", "")
private var savedCourseDetail = EditableCourseDetail("", "")

fun updateCourseDetailContents(courseDetail: EditableCourseDetail?) {
courseDetail?.let {
_title.value = courseDetail.title
_description.value = courseDetail.description
}
fun updateCourseDetailEditText(course: EditableCourseDetail) {
_title.value = course.title
_description.value = course.description
}

fun saveCurrentContents() {
savedCourseDetailContents = EditableCourseDetail(title, description)
fun saveCurrentCourseDetail() {
savedCourseDetail = EditableCourseDetail(title, description)
}

fun restoreOriginalContents() {
updateCourseDetailContents(savedCourseDetailContents)
fun restoreOriginalCourseDetail() {
updateCourseDetailEditText(savedCourseDetail)
}

fun updateCurrentScreenMode(mode: ScreenMode) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import android.app.Activity
import android.content.Context
import android.content.Intent
import android.os.Bundle
import android.view.Gravity
import android.view.View
import androidx.activity.OnBackPressedCallback
import androidx.activity.result.contract.ActivityResultContracts
Expand All @@ -22,7 +23,7 @@ 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.DiscoverMultiViewAdapter
import com.runnect.runnect.presentation.discover.adapter.multiview.DiscoverMultiViewAdapter
import com.runnect.runnect.presentation.discover.pick.DiscoverPickActivity
import com.runnect.runnect.presentation.discover.search.DiscoverSearchActivity
import com.runnect.runnect.presentation.state.UiStateV2
Expand Down Expand Up @@ -55,11 +56,10 @@ class DiscoverFragment : BindingFragment<FragmentDiscoverBinding>(R.layout.fragm
private val resultLauncher =
registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
if (result.resultCode == Activity.RESULT_OK) {
// 상세페이지 갔다가 이전으로 돌아오면 아이템 변경사항이 바로 반영되도록 (제목, 스크랩)
val updatedCourse: EditableDiscoverCourse =
result.data?.getCompatibleParcelableExtra(EXTRA_EDITABLE_DISCOVER_COURSE)
?: return@registerForActivityResult

// todo: 상세페이지 갔다가 이전으로 돌아오면 제목, 스크랩 변경사항이 바로 표시되도록
multiViewAdapter.updateCourseItem(
publicCourseId = viewModel.clickedCourseId,
updatedCourse = updatedCourse
Expand Down Expand Up @@ -145,12 +145,28 @@ class DiscoverFragment : BindingFragment<FragmentDiscoverBinding>(R.layout.fragm
binding.rvDiscoverMultiView.addOnScrollListener(object : RecyclerView.OnScrollListener() {
override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
super.onScrolled(recyclerView, dx, dy)

val isScrollDown = dy > 0
if (isScrollDown) showCircleUploadButton()

checkNextPageLoadingCondition(recyclerView)
}
})
}

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

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

viewModel.getRecommendCourseNextPage()
}
}

private fun showCircleUploadButton() {
binding.fabDiscoverUploadText.isVisible = false
binding.fabDiscoverUpload.isVisible = true
Expand Down Expand Up @@ -215,6 +231,7 @@ class DiscoverFragment : BindingFragment<FragmentDiscoverBinding>(R.layout.fragm
setupBannerGetStateObserver()
setupMarathonCourseGetStateObserver()
setupRecommendCourseGetStateObserver()
setupRecommendCourseNextPageStateObserver()
setupCourseScrapStateObserver()
}

Expand All @@ -227,7 +244,7 @@ class DiscoverFragment : BindingFragment<FragmentDiscoverBinding>(R.layout.fragm
}

is UiStateV2.Failure -> {
context?.showSnackbar(binding.root, state.msg)
context?.showSnackbar(binding.root, state.msg, Gravity.TOP)
}

else -> {}
Expand Down Expand Up @@ -277,7 +294,7 @@ class DiscoverFragment : BindingFragment<FragmentDiscoverBinding>(R.layout.fragm

is UiStateV2.Failure -> {
dismissLoadingProgressBar()
context?.showSnackbar(binding.root, state.msg)
context?.showSnackbar(binding.root, state.msg, Gravity.TOP)
}

else -> {}
Expand All @@ -300,7 +317,7 @@ class DiscoverFragment : BindingFragment<FragmentDiscoverBinding>(R.layout.fragm

is UiStateV2.Failure -> {
dismissLoadingProgressBar()
context?.showSnackbar(binding.root, state.msg)
context?.showSnackbar(binding.root, state.msg, Gravity.TOP)
}

else -> {}
Expand Down Expand Up @@ -343,11 +360,11 @@ class DiscoverFragment : BindingFragment<FragmentDiscoverBinding>(R.layout.fragm

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

Expand All @@ -358,10 +375,27 @@ class DiscoverFragment : BindingFragment<FragmentDiscoverBinding>(R.layout.fragm
).show()
}

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

is UiStateV2.Failure -> {
context?.showSnackbar(binding.root, state.msg, Gravity.TOP)
}

else -> {}
}
}
}

private fun setupCourseScrapStateObserver() {
viewModel.courseScrapState.observe(viewLifecycleOwner) { state ->
if (state is UiStateV2.Failure) {
context?.showSnackbar(binding.root, state.msg)
context?.showSnackbar(binding.root, state.msg, Gravity.TOP)
}
}
}
Expand Down Expand Up @@ -414,6 +448,7 @@ class DiscoverFragment : BindingFragment<FragmentDiscoverBinding>(R.layout.fragm
companion object {
private const val BANNER_SCROLL_DELAY_TIME = 5000L
private const val CENTER_POS_OF_INFINITE_BANNERS = Int.MAX_VALUE / 2
private const val SCROLL_DIRECTION = 1
private const val EXTRA_PUBLIC_COURSE_ID = "publicCourseId"
private const val EXTRA_ROOT_SCREEN = "rootScreen"
const val EXTRA_EDITABLE_DISCOVER_COURSE = "editable_discover_course"
Expand Down
Loading
Loading