Skip to content

Commit f605208

Browse files
authored
Merge pull request #610 from Team-WSS/feat/603
fix: 피드 디테일에서 뒤로 갔을 때 위치 수정
2 parents ae0a1ff + 47b97d6 commit f605208

3 files changed

Lines changed: 92 additions & 78 deletions

File tree

app/src/main/java/com/into/websoso/ui/feedDetail/FeedDetailActivity.kt

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,8 @@ class FeedDetailActivity : BaseActivity<ActivityFeedDetailBinding>(activity_feed
118118
false -> likeCount + 1
119119
}
120120

121-
view.findViewById<TextView>(tv_feed_thumb_up_count).text = updatedLikeCount.toString()
121+
view.findViewById<TextView>(tv_feed_thumb_up_count).text =
122+
updatedLikeCount.toString()
122123
view.isSelected = !view.isSelected
123124

124125
singleEventHandler.debounce(coroutineScope = lifecycleScope) {
@@ -367,6 +368,7 @@ class FeedDetailActivity : BaseActivity<ActivityFeedDetailBinding>(activity_feed
367368
val nickname = result.data?.getStringExtra(USER_NICKNAME).orEmpty()
368369
val intent = Intent().apply {
369370
putExtra(USER_NICKNAME, nickname)
371+
putExtra(FEED_ID, feedId)
370372
}
371373
setResult(BlockUser.RESULT_OK, intent)
372374
if (!isFinishing) finish()
@@ -467,14 +469,16 @@ class FeedDetailActivity : BaseActivity<ActivityFeedDetailBinding>(activity_feed
467469
}.show(supportFragmentManager, RemovedFeedDialogFragment.TAG)
468470

469471
else -> {
470-
setResult(FeedDetailRemoved.RESULT_OK)
472+
val extraIntent = Intent().apply { putExtra(FEED_ID, feedId) }
473+
setResult(FeedDetailRemoved.RESULT_OK, extraIntent)
471474
if (!isFinishing) finish()
472475
}
473476
}
474477
}
475478

476479
feedDetailUiState.isServerError -> {
477-
setResult(FeedDetailError.RESULT_OK)
480+
val extraIntent = Intent().apply { putExtra(FEED_ID, feedId) }
481+
setResult(FeedDetailError.RESULT_OK, extraIntent)
478482
if (!isFinishing) finish()
479483
}
480484

@@ -537,7 +541,7 @@ class FeedDetailActivity : BaseActivity<ActivityFeedDetailBinding>(activity_feed
537541
}
538542

539543
companion object {
540-
private const val FEED_ID: String = "FEED_ID"
544+
const val FEED_ID: String = "FEED_ID"
541545
private const val DEFAULT_FEED_ID: Long = -1
542546
private const val NOTIFICATION_ID: String = "NOTIFICATION_ID"
543547
private const val LOTTIE_IMAGE = "lottie_websoso_loading.json"

app/src/main/java/com/into/websoso/ui/main/feed/FeedFragment.kt

Lines changed: 70 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,14 @@
11
package com.into.websoso.ui.main.feed
22

33
import android.annotation.SuppressLint
4-
import android.content.Intent
54
import android.os.Bundle
65
import android.view.LayoutInflater
76
import android.view.View
87
import android.view.ViewGroup
98
import android.view.WindowManager
109
import android.widget.PopupWindow
1110
import android.widget.TextView
12-
import androidx.activity.result.ActivityResultLauncher
11+
import androidx.activity.result.ActivityResult
1312
import androidx.activity.result.contract.ActivityResultContracts.StartActivityForResult
1413
import androidx.core.view.children
1514
import androidx.core.view.isVisible
@@ -32,11 +31,8 @@ import com.into.websoso.core.common.ui.base.BaseFragment
3231
import com.into.websoso.core.common.ui.custom.WebsosoChip
3332
import com.into.websoso.core.common.ui.model.ResultFrom.BlockUser
3433
import com.into.websoso.core.common.ui.model.ResultFrom.CreateFeed
35-
import com.into.websoso.core.common.ui.model.ResultFrom.FeedDetailBack
3634
import com.into.websoso.core.common.ui.model.ResultFrom.FeedDetailError
3735
import com.into.websoso.core.common.ui.model.ResultFrom.FeedDetailRemoved
38-
import com.into.websoso.core.common.ui.model.ResultFrom.NovelDetailBack
39-
import com.into.websoso.core.common.ui.model.ResultFrom.OtherUserProfileBack
4036
import com.into.websoso.core.common.ui.model.ResultFrom.WithdrawUser
4137
import com.into.websoso.core.common.util.InfiniteScrollListener
4238
import com.into.websoso.core.common.util.SingleEventHandler
@@ -50,6 +46,7 @@ import com.into.websoso.databinding.FragmentFeedBinding
5046
import com.into.websoso.databinding.MenuFeedPopupBinding
5147
import com.into.websoso.ui.createFeed.CreateFeedActivity
5248
import com.into.websoso.ui.feedDetail.FeedDetailActivity
49+
import com.into.websoso.ui.feedDetail.FeedDetailActivity.Companion.FEED_ID
5350
import com.into.websoso.ui.feedDetail.model.EditFeedModel
5451
import com.into.websoso.ui.main.feed.adapter.FeedAdapter
5552
import com.into.websoso.ui.main.feed.adapter.FeedType.Feed
@@ -80,7 +77,69 @@ class FeedFragment : BaseFragment<FragmentFeedBinding>(fragment_feed) {
8077
private val feedViewModel: FeedViewModel by viewModels()
8178
private val feedAdapter: FeedAdapter by lazy { FeedAdapter(onClickFeedItem()) }
8279
private val singleEventHandler: SingleEventHandler by lazy { SingleEventHandler.from() }
83-
private lateinit var activityResultCallback: ActivityResultLauncher<Intent>
80+
private val activityResultCallback by lazy {
81+
registerForActivityResult(StartActivityForResult()) { result ->
82+
handleActivityResult(result)
83+
}
84+
}
85+
86+
private fun handleActivityResult(result: ActivityResult) {
87+
when (result.resultCode) {
88+
CreateFeed.RESULT_OK -> {
89+
feedViewModel.updateRefreshedFeeds(true)
90+
// TODO: 피드 아예 초기화
91+
92+
showWebsosoSnackBar(
93+
view = binding.root,
94+
message = getString(feed_create_done),
95+
icon = ic_novel_detail_check,
96+
)
97+
}
98+
99+
FeedDetailRemoved.RESULT_OK -> {
100+
val removedFeedId = result.data?.getLongExtra(FEED_ID, -1) ?: -1
101+
feedViewModel.updateRefreshedFeeds(removedFeedId)
102+
103+
showWebsosoSnackBar(
104+
view = binding.root,
105+
message = getString(feed_removed_feed_snackbar),
106+
icon = ic_blocked_user_snack_bar,
107+
)
108+
}
109+
110+
FeedDetailError.RESULT_OK -> {
111+
val removedFeedId = result.data?.getLongExtra(FEED_ID, -1) ?: -1
112+
feedViewModel.updateRefreshedFeeds(removedFeedId)
113+
114+
showWebsosoSnackBar(
115+
view = binding.root,
116+
message = getString(feed_server_error),
117+
icon = ic_blocked_user_snack_bar,
118+
)
119+
}
120+
121+
BlockUser.RESULT_OK -> {
122+
val nickname = result.data?.getStringExtra(USER_NICKNAME).orEmpty()
123+
val removedFeedId = result.data?.getLongExtra(FEED_ID, -1) ?: -1
124+
125+
feedViewModel.updateRefreshedFeeds(removedFeedId)
126+
127+
showWebsosoSnackBar(
128+
view = binding.root,
129+
message = getString(block_user_success_message, nickname),
130+
icon = ic_novel_detail_check,
131+
)
132+
}
133+
134+
WithdrawUser.RESULT_OK -> {
135+
showWebsosoSnackBar(
136+
view = binding.root,
137+
message = getString(R.string.other_user_page_withdraw_user),
138+
icon = ic_blocked_user_snack_bar,
139+
)
140+
}
141+
}
142+
}
84143

85144
override fun onCreateView(
86145
inflater: LayoutInflater,
@@ -134,7 +193,8 @@ class FeedFragment : BaseFragment<FragmentFeedBinding>(fragment_feed) {
134193
false -> likeCount + 1
135194
}
136195

137-
view.findViewById<TextView>(tv_feed_thumb_up_count).text = updatedLikeCount.toString()
196+
view.findViewById<TextView>(tv_feed_thumb_up_count).text =
197+
updatedLikeCount.toString()
138198
view.isSelected = !view.isSelected
139199

140200
singleEventHandler.debounce(coroutineScope = lifecycleScope) {
@@ -296,73 +356,10 @@ class FeedFragment : BaseFragment<FragmentFeedBinding>(fragment_feed) {
296356

297357
initView()
298358
setupObserver()
299-
refreshView()
359+
activityResultCallback
300360
tracker.trackEvent("feed_all")
301361
}
302362

303-
private fun refreshView() {
304-
if (::activityResultCallback.isInitialized.not()) {
305-
activityResultCallback = registerForActivityResult(StartActivityForResult()) { result ->
306-
when (result.resultCode) {
307-
FeedDetailBack.RESULT_OK,
308-
NovelDetailBack.RESULT_OK,
309-
OtherUserProfileBack.RESULT_OK,
310-
-> feedViewModel.updateRefreshedFeeds(false)
311-
312-
CreateFeed.RESULT_OK -> {
313-
feedViewModel.updateRefreshedFeeds(true)
314-
315-
showWebsosoSnackBar(
316-
view = binding.root,
317-
message = getString(feed_create_done),
318-
icon = ic_novel_detail_check,
319-
)
320-
}
321-
322-
FeedDetailRemoved.RESULT_OK -> {
323-
feedViewModel.updateRefreshedFeeds(false)
324-
325-
showWebsosoSnackBar(
326-
view = binding.root,
327-
message = getString(feed_removed_feed_snackbar),
328-
icon = ic_blocked_user_snack_bar,
329-
)
330-
}
331-
332-
FeedDetailError.RESULT_OK -> {
333-
feedViewModel.updateRefreshedFeeds(false)
334-
335-
showWebsosoSnackBar(
336-
view = binding.root,
337-
message = getString(feed_server_error),
338-
icon = ic_blocked_user_snack_bar,
339-
)
340-
}
341-
342-
BlockUser.RESULT_OK -> {
343-
feedViewModel.updateRefreshedFeeds(false)
344-
345-
val nickname = result.data?.getStringExtra(USER_NICKNAME).orEmpty()
346-
347-
showWebsosoSnackBar(
348-
view = binding.root,
349-
message = getString(block_user_success_message, nickname),
350-
icon = ic_novel_detail_check,
351-
)
352-
}
353-
354-
WithdrawUser.RESULT_OK -> {
355-
showWebsosoSnackBar(
356-
view = binding.root,
357-
message = getString(R.string.other_user_page_withdraw_user),
358-
icon = ic_blocked_user_snack_bar,
359-
)
360-
}
361-
}
362-
}
363-
}
364-
}
365-
366363
private fun initView() {
367364
binding.onWriteClick = { singleEventHandler.throttleFirst { navigateToFeedWriting() } }
368365
setupAdapter()
@@ -433,7 +430,8 @@ class FeedFragment : BaseFragment<FragmentFeedBinding>(fragment_feed) {
433430
val chip = it as Chip
434431
chip.isSelected = chip.text == selectedCategory.category.krTitle
435432
}
436-
433+
// TODO: 최초로 init할 때 전체상태로 updateFeeds 호출함 -> 리프레시되어야하기 때문에 true 설정
434+
// TODO: 뷰모델 init으로 옮기기, isRefreshed 상태 없애기
437435
feedViewModel.updateFeeds(true)
438436
}
439437
}

app/src/main/java/com/into/websoso/ui/main/feed/FeedViewModel.kt

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,10 @@ class FeedViewModel @Inject constructor(
5151
}
5252

5353
fun updateFeeds(isRefreshed: Boolean = false) {
54+
// TODO: 피드 아이템 더 불러오기 함수
55+
// TODO: 카테고리 누를 시 init 함수
56+
// TODO: 새로고침 함수
57+
// TODO: 모두 분리하기
5458
feedUiState.value?.let { feedUiState ->
5559
if (!feedUiState.isLoadable) return
5660

@@ -63,7 +67,7 @@ class FeedViewModel @Inject constructor(
6367
when (feedUiState.feeds.isNotEmpty()) {
6468
true -> getFeedsUseCase(
6569
selectedCategory.enTitle,
66-
feedUiState.feeds.minOf { it.id }
70+
feedUiState.feeds.minOf { it.id },
6771
)
6872

6973
false -> getFeedsUseCase(selectedCategory.enTitle)
@@ -147,6 +151,14 @@ class FeedViewModel @Inject constructor(
147151
}
148152
}
149153

154+
fun updateRefreshedFeeds(feedId: Long) {
155+
feedUiState.value?.let { feedUiState ->
156+
_feedUiState.value = feedUiState.copy(
157+
feeds = feedUiState.feeds.filterNot { it.id == feedId },
158+
)
159+
}
160+
}
161+
150162
fun updateLike(selectedFeedId: Long, isLiked: Boolean, updatedLikeCount: Int) {
151163
feedUiState.value?.let { feedUiState ->
152164
val selectedFeed = feedUiState.feeds.find { feedModel ->
@@ -227,7 +239,7 @@ class FeedViewModel @Inject constructor(
227239
}.onSuccess {
228240
_feedUiState.value = feedUiState.copy(
229241
loading = false,
230-
feeds = feedUiState.feeds.filter { it.id != feedId }
242+
feeds = feedUiState.feeds.filter { it.id != feedId },
231243
)
232244
}.onFailure {
233245
_feedUiState.value = feedUiState.copy(

0 commit comments

Comments
 (0)