diff --git a/app/src/main/kotlin/me/tylerbwong/stack/data/content/ContentFilter.kt b/app/src/main/kotlin/me/tylerbwong/stack/data/content/ContentFilter.kt index 5600c2fe..39741628 100644 --- a/app/src/main/kotlin/me/tylerbwong/stack/data/content/ContentFilter.kt +++ b/app/src/main/kotlin/me/tylerbwong/stack/data/content/ContentFilter.kt @@ -19,9 +19,9 @@ class ContentFilter @Inject constructor( private val siteStore: SiteStore, @StackSharedPreferences private val preferences: SharedPreferences, ) { - val contentFilteredUpdated: LiveData + val contentFilteredUpdated: LiveData get() = _contentFilterUpdated - private val _contentFilterUpdated = MutableLiveData() + private val _contentFilterUpdated = MutableLiveData() val filteredQuestionIds: Set get() = getFilteredContent(QUESTION_ID_CONTENT_FILTER) @@ -117,7 +117,12 @@ class ContentFilter @Inject constructor( preferences.edit() .putStringSet(key, (currentIds + id).map { "${it},${siteStore.site}" }.toSet()) .apply() - _contentFilterUpdated.value = Unit + _contentFilterUpdated.value = ContentFilterData( + filteredQuestionIds = filteredQuestionIds, + filteredAnswerIds = filteredAnswerIds, + filteredCommentIds = filteredCommentIds, + filteredUserIds = filteredUserIds, + ) } } @@ -125,7 +130,27 @@ class ContentFilter @Inject constructor( preferences.edit() .putStringSet(key, emptySet()) .apply() - _contentFilterUpdated.value = Unit + _contentFilterUpdated.value = ContentFilterData( + filteredQuestionIds = filteredQuestionIds, + filteredAnswerIds = filteredAnswerIds, + filteredCommentIds = filteredCommentIds, + filteredUserIds = filteredUserIds, + ) + } + + data class ContentFilterData( + val filteredQuestionIds: Set, + val filteredAnswerIds: Set, + val filteredCommentIds: Set, + val filteredUserIds: Set, + ) { + val isEmpty: Boolean + get() = listOf( + filteredQuestionIds, + filteredAnswerIds, + filteredCommentIds, + filteredUserIds, + ).all { it.isEmpty() } } companion object { diff --git a/app/src/main/kotlin/me/tylerbwong/stack/ui/comments/CommentsBottomSheetDialogFragment.kt b/app/src/main/kotlin/me/tylerbwong/stack/ui/comments/CommentsBottomSheetDialogFragment.kt index da196ea2..7fa8305f 100644 --- a/app/src/main/kotlin/me/tylerbwong/stack/ui/comments/CommentsBottomSheetDialogFragment.kt +++ b/app/src/main/kotlin/me/tylerbwong/stack/ui/comments/CommentsBottomSheetDialogFragment.kt @@ -45,8 +45,23 @@ class CommentsBottomSheetDialogFragment : BottomSheetDialogFragment() { layoutManager = LinearLayoutManager(context) } binding.header.title.text = getString(R.string.comments) - viewModel.contentFilteredUpdated.observe(viewLifecycleOwner) { - viewModel.fetchComments() + viewModel.contentFilteredUpdated.observe(viewLifecycleOwner) { filterData -> + if (filterData.isEmpty) { + viewModel.fetchComments() + } else { + viewModel.data.value?.let { + adapter.submitList( + it.filter { item -> + if (item is CommentItem) { + item.comment.commentId !in filterData.filteredCommentIds && + item.comment.owner.userId !in filterData.filteredUserIds + } else { + true + } + } + ) + } + } } viewModel.refreshing.observe(viewLifecycleOwner) { isRefreshing -> if (isRefreshing) { diff --git a/app/src/main/kotlin/me/tylerbwong/stack/ui/comments/CommentsViewModel.kt b/app/src/main/kotlin/me/tylerbwong/stack/ui/comments/CommentsViewModel.kt index 296af4f3..840bc208 100644 --- a/app/src/main/kotlin/me/tylerbwong/stack/ui/comments/CommentsViewModel.kt +++ b/app/src/main/kotlin/me/tylerbwong/stack/ui/comments/CommentsViewModel.kt @@ -31,7 +31,7 @@ class CommentsViewModel @Inject constructor( get() = _data private val _data = MutableLiveData>() - internal val contentFilteredUpdated: LiveData + internal val contentFilteredUpdated: LiveData get() = contentFilter.contentFilteredUpdated val errorToast: LiveData diff --git a/app/src/main/kotlin/me/tylerbwong/stack/ui/home/HomeFragment.kt b/app/src/main/kotlin/me/tylerbwong/stack/ui/home/HomeFragment.kt index bbacef88..f7927a6d 100644 --- a/app/src/main/kotlin/me/tylerbwong/stack/ui/home/HomeFragment.kt +++ b/app/src/main/kotlin/me/tylerbwong/stack/ui/home/HomeFragment.kt @@ -48,8 +48,19 @@ class HomeFragment : BaseFragment( adapter.submitList(null) viewModel.fetchQuestions() } - viewModel.contentFilterUpdated.observe(viewLifecycleOwner) { - viewModel.fetchQuestions() + viewModel.contentFilterUpdated.observe(viewLifecycleOwner) { filterData -> + if (filterData.isEmpty) { + viewModel.fetchQuestions() + } else { + viewModel.questions.value?.let { + updateContent( + it.filter { question -> + question.questionId !in filterData.filteredQuestionIds && + question.owner.userId !in filterData.filteredUserIds + } + ) + } + } } viewModel.refreshing.observe(viewLifecycleOwner) { binding.refreshLayout.isRefreshing = it diff --git a/app/src/main/kotlin/me/tylerbwong/stack/ui/home/HomeViewModel.kt b/app/src/main/kotlin/me/tylerbwong/stack/ui/home/HomeViewModel.kt index a819fc50..39aa6373 100644 --- a/app/src/main/kotlin/me/tylerbwong/stack/ui/home/HomeViewModel.kt +++ b/app/src/main/kotlin/me/tylerbwong/stack/ui/home/HomeViewModel.kt @@ -26,7 +26,7 @@ internal class HomeViewModel @Inject constructor( internal val siteLiveData: LiveData get() = siteRepository.siteLiveData - internal val contentFilterUpdated: LiveData + internal val contentFilterUpdated: LiveData get() = contentFilter.contentFilteredUpdated @Sort diff --git a/app/src/main/kotlin/me/tylerbwong/stack/ui/profile/ProfileActivity.kt b/app/src/main/kotlin/me/tylerbwong/stack/ui/profile/ProfileActivity.kt index 57bdc7ca..6d584773 100644 --- a/app/src/main/kotlin/me/tylerbwong/stack/ui/profile/ProfileActivity.kt +++ b/app/src/main/kotlin/me/tylerbwong/stack/ui/profile/ProfileActivity.kt @@ -38,10 +38,6 @@ class ProfileActivity : BaseActivity(ActivityProfileBind } } - viewModel.contentFilterUpdated.observe(this) { - viewModel.fetchProfileData() - } - viewModel.userData.observe(this) { binding.toolbar.title = it.displayName.toHtml() binding.profileHeader.setContent { diff --git a/app/src/main/kotlin/me/tylerbwong/stack/ui/profile/ProfilePageFragment.kt b/app/src/main/kotlin/me/tylerbwong/stack/ui/profile/ProfilePageFragment.kt index b4a94164..6950dd26 100644 --- a/app/src/main/kotlin/me/tylerbwong/stack/ui/profile/ProfilePageFragment.kt +++ b/app/src/main/kotlin/me/tylerbwong/stack/ui/profile/ProfilePageFragment.kt @@ -36,6 +36,11 @@ class ProfilePageFragment : BaseFragment( viewModel.refreshing.observe(viewLifecycleOwner) { binding.refreshLayout.isRefreshing = it } + viewModel.contentFilterUpdated.observe(viewLifecycleOwner) { + if (viewModel.userId !in it.filteredUserIds) { + viewModel.fetchProfileData() + } + } viewModel.data.observe(viewLifecycleOwner) { adapter.submitList(it) } diff --git a/app/src/main/kotlin/me/tylerbwong/stack/ui/profile/ProfileViewModel.kt b/app/src/main/kotlin/me/tylerbwong/stack/ui/profile/ProfileViewModel.kt index 41136bde..ed8bc85a 100644 --- a/app/src/main/kotlin/me/tylerbwong/stack/ui/profile/ProfileViewModel.kt +++ b/app/src/main/kotlin/me/tylerbwong/stack/ui/profile/ProfileViewModel.kt @@ -35,7 +35,7 @@ class ProfileViewModel @Inject constructor( get() = _data private val _data = MutableLiveData>() - internal val contentFilterUpdated: LiveData + internal val contentFilterUpdated: LiveData get() = contentFilter.contentFilteredUpdated internal fun fetchUserData() { diff --git a/app/src/main/kotlin/me/tylerbwong/stack/ui/questions/detail/QuestionDetailActivity.kt b/app/src/main/kotlin/me/tylerbwong/stack/ui/questions/detail/QuestionDetailActivity.kt index 5db0011f..78c284cf 100755 --- a/app/src/main/kotlin/me/tylerbwong/stack/ui/questions/detail/QuestionDetailActivity.kt +++ b/app/src/main/kotlin/me/tylerbwong/stack/ui/questions/detail/QuestionDetailActivity.kt @@ -40,10 +40,7 @@ class QuestionDetailActivity : BaseActivity( if (viewModel.questionId == -1) { viewModel.questionId = intent.getIntExtra(QUESTION_ID, -1) - if (viewModel.questionId in contentFilter.filteredQuestionIds) { - Toast.makeText(this, R.string.hide_post_hidden, Toast.LENGTH_LONG).show() - finish() - } + checkContentFilter() } if (viewModel.answerId == -1) { @@ -104,6 +101,11 @@ class QuestionDetailActivity : BaseActivity( ) } + override fun onResume() { + super.onResume() + checkContentFilter() + } + override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) outState.putBoolean(IS_IN_ANSWER_MODE, viewModel.isInAnswerMode) @@ -169,6 +171,15 @@ class QuestionDetailActivity : BaseActivity( binding.postAnswerButton.hide() } + private fun checkContentFilter() { + val isQuestionIdHidden = viewModel.questionId in contentFilter.filteredQuestionIds + val isUserIdHidden = viewModel.question?.owner?.userId in contentFilter.filteredUserIds + if (isQuestionIdHidden || isUserIdHidden) { + Toast.makeText(this, R.string.hide_post_hidden, Toast.LENGTH_LONG).show() + finish() + } + } + companion object { internal const val QUESTION_ID = "question_id" internal const val ANSWER_ID = "answer_id" diff --git a/app/src/main/kotlin/me/tylerbwong/stack/ui/search/SearchViewModel.kt b/app/src/main/kotlin/me/tylerbwong/stack/ui/search/SearchViewModel.kt index 9b4e9322..69f76a85 100644 --- a/app/src/main/kotlin/me/tylerbwong/stack/ui/search/SearchViewModel.kt +++ b/app/src/main/kotlin/me/tylerbwong/stack/ui/search/SearchViewModel.kt @@ -36,7 +36,7 @@ class SearchViewModel @Inject constructor( internal val siteLiveData: LiveData get() = siteStore.siteLiveData - internal val contentFilteredUpdated: LiveData + internal val contentFilteredUpdated: LiveData get() = contentFilter.contentFilteredUpdated internal var searchPayload = SearchPayload.empty()