From b0a50f9f500502f636b6360ae30ddb920665c1ed Mon Sep 17 00:00:00 2001 From: Lakoja Date: Thu, 27 Jul 2023 16:39:03 +0200 Subject: [PATCH] 3891: Add feedback (snackbars) for hashtag actions --- .../keylesspalace/tusky/StatusListActivity.kt | 26 +++++++++++++++++-- app/src/main/res/values/strings.xml | 6 +++++ 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/keylesspalace/tusky/StatusListActivity.kt b/app/src/main/java/com/keylesspalace/tusky/StatusListActivity.kt index c055043d1..ddf58ed7e 100644 --- a/app/src/main/java/com/keylesspalace/tusky/StatusListActivity.kt +++ b/app/src/main/java/com/keylesspalace/tusky/StatusListActivity.kt @@ -27,6 +27,7 @@ import at.connyduck.calladapter.networkresult.fold import com.google.android.material.snackbar.Snackbar import com.keylesspalace.tusky.appstore.EventHub import com.keylesspalace.tusky.appstore.PreferenceChangedEvent +import com.keylesspalace.tusky.components.filters.FiltersActivity import com.keylesspalace.tusky.components.timeline.TimelineFragment import com.keylesspalace.tusky.components.timeline.viewmodel.TimelineViewModel.Kind import com.keylesspalace.tusky.databinding.ActivityStatuslistBinding @@ -132,6 +133,8 @@ class StatusListActivity : BottomSheetActivity(), HasAndroidInjector { { followTagItem?.isVisible = false unfollowTagItem?.isVisible = true + + Snackbar.make(binding.root, getString(R.string.following_hashtag_success_format, tag), Snackbar.LENGTH_LONG).show() }, { Snackbar.make(binding.root, getString(R.string.error_following_hashtag_format, tag), Snackbar.LENGTH_SHORT).show() @@ -152,6 +155,8 @@ class StatusListActivity : BottomSheetActivity(), HasAndroidInjector { { followTagItem?.isVisible = true unfollowTagItem?.isVisible = false + + Snackbar.make(binding.root, getString(R.string.unfollowing_hashtag_success_format, tag), Snackbar.LENGTH_SHORT).show() }, { Snackbar.make(binding.root, getString(R.string.error_unfollowing_hashtag_format, tag), Snackbar.LENGTH_SHORT).show() @@ -219,8 +224,11 @@ class StatusListActivity : BottomSheetActivity(), HasAndroidInjector { private fun muteTag(): Boolean { val tag = hashtag ?: return true + val hashedTag = if (tag.startsWith('#')) tag else "#" + tag lifecycleScope.launch { + var filterCreateSuccess = false + mastodonApi.createFilter( title = "#$tag", context = listOf(FilterV1.HOME), @@ -230,8 +238,9 @@ class StatusListActivity : BottomSheetActivity(), HasAndroidInjector { { filter -> if (mastodonApi.addFilterKeyword(filterId = filter.id, keyword = tag, wholeWord = true).isSuccess) { mutedFilter = filter - updateTagMuteState(true) + // TODO the preference key here ("home") is not meaningful; should probably be another event if any eventHub.dispatch(PreferenceChangedEvent(filter.context[0])) + filterCreateSuccess = true } else { Snackbar.make(binding.root, getString(R.string.error_muting_hashtag_format, tag), Snackbar.LENGTH_SHORT).show() Log.e(TAG, "Failed to mute #$tag") @@ -248,8 +257,8 @@ class StatusListActivity : BottomSheetActivity(), HasAndroidInjector { ).fold( { filter -> mutedFilterV1 = filter - updateTagMuteState(true) eventHub.dispatch(PreferenceChangedEvent(filter.context[0])) + filterCreateSuccess = true }, { throwable -> Snackbar.make(binding.root, getString(R.string.error_muting_hashtag_format, tag), Snackbar.LENGTH_SHORT).show() @@ -262,6 +271,16 @@ class StatusListActivity : BottomSheetActivity(), HasAndroidInjector { } } ) + + if (filterCreateSuccess) { + updateTagMuteState(true) + Snackbar.make(binding.root, getString(R.string.muting_hashtag_success_format, tag), Snackbar.LENGTH_LONG).apply { + setAction(R.string.action_view_filters) { + startActivityWithSlideInAnimation(Intent(this@StatusListActivity, FiltersActivity::class.java)) + } + show() + } + } } return true @@ -281,6 +300,7 @@ class StatusListActivity : BottomSheetActivity(), HasAndroidInjector { } else { mastodonApi.deleteFilter(filter.id) } + } else if (mutedFilterV1 != null) { mutedFilterV1?.let { filter -> if (filter.context.size > 1) { @@ -307,6 +327,8 @@ class StatusListActivity : BottomSheetActivity(), HasAndroidInjector { eventHub.dispatch(PreferenceChangedEvent(Filter.Kind.HOME.kind)) mutedFilterV1 = null mutedFilter = null + + Snackbar.make(binding.root, getString(R.string.unmuting_hashtag_success_format, tag), Snackbar.LENGTH_SHORT).show() }, { throwable -> Snackbar.make(binding.root, getString(R.string.error_unmuting_hashtag_format, tag), Snackbar.LENGTH_SHORT).show() diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 06d25d4e7..30538f4ae 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -614,6 +614,12 @@ Filter Apply + Muting %s as a warning + Unmuting %s + View filters + Now following hashtag %s + No longer following hashtag %s + Compose post Compose