Skip to content

Commit

Permalink
[MERGE] #352 -> develop
Browse files Browse the repository at this point in the history
[FEAT/#352] Timeline / 타임라인 목록 필터 구현
  • Loading branch information
Marchbreeze authored Feb 2, 2024
2 parents 8fef37b + 1922633 commit d85c0cd
Show file tree
Hide file tree
Showing 13 changed files with 185 additions and 45 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -40,13 +40,16 @@ class LookFragment : BindingFragment<FragmentLookBinding>(R.layout.fragment_look
private var isScrolled: Boolean = false
private var isNoFriend: Boolean = false

private var isFilterSelected: Boolean = false

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)

initAdapter()
initInviteBtnListener()
initFilterBtnListener()
setListBottomPadding()
observeTimelinePagingList()
observeTimelinePagingList(isFilterSelected)
setPullToScrollListener()
observePagingLoadingState()
catchScrollForAmplitude()
Expand All @@ -59,6 +62,7 @@ class LookFragment : BindingFragment<FragmentLookBinding>(R.layout.fragment_look
adapter.addLoadStateListener { combinedLoadStates ->
if (combinedLoadStates.prepend.endOfPaginationReached) {
binding.layoutLookNoFriendsList.isVisible = adapter.itemCount < 1
binding.layoutLookListInfo.isGone = adapter.itemCount < 1
binding.rvLook.isGone = adapter.itemCount < 1
isNoFriend = adapter.itemCount < 1
}
Expand All @@ -77,6 +81,16 @@ class LookFragment : BindingFragment<FragmentLookBinding>(R.layout.fragment_look
}
}

private fun initFilterBtnListener() {
binding.btnLookFilter.setOnSingleClickListener {
isFilterSelected = !isFilterSelected
adapter.refresh()
viewModel.setFirstLoading(true)
observeTimelinePagingList(isFilterSelected)
binding.tvLookFilterType.text = if(isFilterSelected) TYPE_MINE else TYPE_ALL
}
}

private fun setListBottomPadding() {
binding.rvLook.addItemDecoration(BaseLinearRcvItemDeco(bottomPadding = 14))
}
Expand All @@ -96,11 +110,10 @@ class LookFragment : BindingFragment<FragmentLookBinding>(R.layout.fragment_look
}.launchIn(lifecycleScope)
}

private fun observeTimelinePagingList() {
viewModel.getLookListWithPaging().flowWithLifecycle(lifecycle)
.onEach { pagingData ->
adapter.submitData(lifecycle, pagingData)
}.launchIn(lifecycleScope)
private fun observeTimelinePagingList(onlyMine: Boolean) {
viewModel.getLookListWithPaging(onlyMine).flowWithLifecycle(lifecycle).onEach { pagingData ->
adapter.submitData(lifecycle, pagingData)
}.launchIn(lifecycleScope)
}


Expand Down Expand Up @@ -166,5 +179,8 @@ class LookFragment : BindingFragment<FragmentLookBinding>(R.layout.fragment_look
companion object {
const val INVITE_DIALOG = "inviteDialog"
const val TIMELINE_NO_FRIEND = "timeline_0friend"

const val TYPE_ALL = "모든 쪽지"
const val TYPE_MINE = "내가 보낸 쪽지"
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ class LookViewHolder(
setTextColor(itemView.context.colorOf(R.color.semantic_gender_f_500))
FROM_FEMALE
}
if (item.isUserSenderVote) text = FROM_ME
}
}
}
Expand All @@ -58,5 +59,6 @@ class LookViewHolder(
const val MALE = "MALE"
const val FROM_MALE = "남학생에게 받음"
const val FROM_FEMALE = "여학생에게 받음"
const val FROM_ME = "나에게 받음"
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -29,10 +29,10 @@ class LookViewModel @Inject constructor(
_isFirstLoading.value = boolean
}

fun getLookListWithPaging(): Flow<PagingData<LookModel>> =
fun getLookListWithPaging(onlyMine: Boolean): Flow<PagingData<LookModel>> =
Pager(
config = PagingConfig(LookPagingSource.LOOK_PAGE_SIZE),
pagingSourceFactory = { LookPagingSource(lookService) }
pagingSourceFactory = { LookPagingSource(lookService, onlyMine) }
).flow.cachedIn(viewModelScope)

fun getYelloId() = authRepository.getYelloId()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,14 +30,12 @@ class ProfileViewModel @Inject constructor(

init {
resetPageVariable()
// resetStateVariable()
}

private val _getUserDataResult = MutableSharedFlow<Boolean>()
val getUserDataResult: SharedFlow<Boolean> = _getUserDataResult

private val _getFriendListState =
MutableStateFlow<UiState<ProfileFriendsListModel>>(UiState.Empty)
private val _getFriendListState = MutableStateFlow<UiState<ProfileFriendsListModel>>(UiState.Empty)
val getFriendListState: StateFlow<UiState<ProfileFriendsListModel>> = _getFriendListState

private val _deleteUserState = MutableStateFlow<UiState<Unit>>(UiState.Empty)
Expand Down Expand Up @@ -92,6 +90,7 @@ class ProfileViewModel @Inject constructor(
_kakaoQuitState.value = UiState.Empty
_getFriendListState.value = UiState.Empty
_getPurchaseInfoState.value = UiState.Empty
_getUserDataResult.resetReplayCache()
}

fun getUserDataFromServer() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -64,15 +64,18 @@ class ProfileFragment : BindingFragment<FragmentProfileBinding>(R.layout.fragmen
AmplitudeUtils.trackEventWithProperties("view_profile")
}

override fun onResume() {
super.onResume()

resetProfileData()
}

private fun initProfileSetting() {
initProfileManageBtnListener()
initUpwardBtnListener()
initUpwardBtnVisibility()
initAdapter()
setItemDivider()
viewModel.getUserDataFromServer()
viewModel.getFriendsListFromServer()
viewModel.getPurchaseInfoFromServer()
}

private fun setItemDivider() {
Expand Down Expand Up @@ -102,12 +105,7 @@ class ProfileFragment : BindingFragment<FragmentProfileBinding>(R.layout.fragmen

private fun initAdapter() {
_adapter = ProfileFriendAdapter(viewModel,
itemClick = { profileUserModel, position ->
initItemClickListener(
profileUserModel,
position
)
},
itemClick = { profileUserModel, position -> initItemClickListener(profileUserModel, position) },
shopClick = { initShopClickListener() },
modClick = { initProfileModClickListener() }
)
Expand Down Expand Up @@ -155,14 +153,7 @@ class ProfileFragment : BindingFragment<FragmentProfileBinding>(R.layout.fragmen
binding.layoutProfileSwipe.apply {
setOnRefreshListener {
lifecycleScope.launch {
adapter.setItemList(listOf())
viewModel.run {
resetPageVariable()
resetStateVariable()
getPurchaseInfoFromServer()
getUserDataFromServer()
getFriendsListFromServer()
}
resetProfileData()
delay(200)
binding.layoutProfileSwipe.isRefreshing = false
}
Expand All @@ -171,6 +162,17 @@ class ProfileFragment : BindingFragment<FragmentProfileBinding>(R.layout.fragmen
}
}

private fun resetProfileData() {
adapter.setItemList(listOf())
viewModel.run {
resetPageVariable()
resetStateVariable()
getPurchaseInfoFromServer()
getUserDataFromServer()
getFriendsListFromServer()
}
}

private fun observeUserDataResult() {
viewModel.getUserDataResult.flowWithLifecycle(lifecycle).onEach { result ->
if (!result) yelloSnackbar(requireView(), getString(R.string.profile_error_user_data))
Expand Down
9 changes: 9 additions & 0 deletions app/src/main/res/drawable/ic_down.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="18dp"
android:height="18dp"
android:viewportWidth="18"
android:viewportHeight="18">
<path
android:pathData="M13.5,6.75H4.5L9,11.25L13.5,6.75Z"
android:fillColor="#ADB5BD"/>
</vector>
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<stroke
android:width="1dp"
android:color="@color/grayscales_800" />
<corners android:radius="40dp" />
</shape>
89 changes: 82 additions & 7 deletions app/src/main/res/layout/fragment_look.xml
Original file line number Diff line number Diff line change
Expand Up @@ -23,15 +23,90 @@
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />

<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/layout_look_list_info"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:paddingHorizontal="16dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/tv_layout_title">

<ImageView
android:id="@+id/iv_look_info_warning"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_warning_mini"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />

<TextView
android:id="@+id/tv_look_info"
style="@style/TextAppearance.Yello.LabelSmall"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="2dp"
android:text="@string/look_tv_info"
android:textColor="@color/grayscales_600"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@id/btn_look_filter"
app:layout_constraintStart_toEndOf="@id/iv_look_info_warning"
app:layout_constraintTop_toTopOf="parent" />

<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/btn_look_filter"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginVertical="5dp"
android:background="@drawable/shape_grayscales800_line_40_rect"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent">

<TextView
android:id="@+id/tv_look_filter_type"
style="@style/TextAppearance.Yello.LabelLarge"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="20dp"
android:layout_marginEnd="6dp"
android:paddingVertical="6dp"
android:text="@string/look_tv_filter_basic"
android:textColor="@color/grayscales_500"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@id/iv_look_filter_down"
app:layout_constraintHorizontal_chainStyle="packed"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />

<ImageView
android:id="@+id/iv_look_filter_down"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="10dp"
android:src="@drawable/ic_down"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_chainStyle="packed"
app:layout_constraintStart_toEndOf="@id/tv_look_filter_type"
app:layout_constraintTop_toTopOf="parent" />


</androidx.constraintlayout.widget.ConstraintLayout>

</androidx.constraintlayout.widget.ConstraintLayout>

<androidx.swiperefreshlayout.widget.SwipeRefreshLayout
android:id="@+id/layout_look_swipe"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginTop="6dp"
android:visibility="visible"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/tv_layout_title">
app:layout_constraintTop_toBottomOf="@id/layout_look_list_info">

<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv_look"
Expand All @@ -47,13 +122,14 @@

<com.facebook.shimmer.ShimmerFrameLayout
android:id="@+id/shimmer_look_list"
android:visibility="gone"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginTop="6dp"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/tv_layout_title">
app:layout_constraintTop_toBottomOf="@id/layout_look_list_info">

<LinearLayout
android:layout_width="match_parent"
Expand Down Expand Up @@ -84,14 +160,13 @@

<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/layout_look_no_friends_list"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="50dp"
android:layout_width="0dp"
android:layout_height="0dp"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
app:layout_constraintTop_toBottomOf="@id/tv_layout_title">

<ImageView
android:id="@+id/iv_look_no_friend"
Expand Down
2 changes: 2 additions & 0 deletions app/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -155,6 +155,8 @@
<string name="look_title">타임라인</string>
<string name="look_error_friend_list">타임라인 가져오기 실패</string>
<string name="look_invite_no_title">친구들이 받은 쪽지가 궁금하다면\n친구를 초대해볼까요?</string>
<string name="look_tv_info">쪽지를 보낸 사람의 이름은 공개되지 않아요.</string>
<string name="look_tv_filter_basic">모든 쪽지</string>

<string name="view_type_error_msg">Unknown View Type : %d</string>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,8 @@ import com.example.domain.entity.LookListModel.LookModel
import javax.inject.Inject

class LookPagingSource @Inject constructor(
private val lookService: LookService
private val lookService: LookService,
private val onlyMine: Boolean,
) : PagingSource<Int, LookModel>() {

override fun getRefreshKey(state: PagingState<Int, LookModel>): Int? {
Expand All @@ -21,7 +22,11 @@ class LookPagingSource @Inject constructor(
val currentPosition = params.key ?: 0
val currentPage = currentPosition.times(LOOK_POSITION_TO_PAGE).toInt()
val response = runCatching {
lookService.getLookList(currentPage)
if (onlyMine) {
lookService.getLookList(currentPage, ONLY_MINE)
} else {
lookService.getLookList(currentPage)
}
}.getOrElse {
return LoadResult.Error(it)
}
Expand All @@ -42,5 +47,7 @@ class LookPagingSource @Inject constructor(
companion object {
const val LOOK_PAGE_SIZE = 10
const val LOOK_POSITION_TO_PAGE = 0.1

const val ONLY_MINE = "send"
}
}
Loading

0 comments on commit d85c0cd

Please sign in to comment.