From fc47d1d94ad9f4b78292570272fb2374cffa9d1a Mon Sep 17 00:00:00 2001 From: Levi Bard Date: Fri, 15 Jan 2021 21:05:36 +0100 Subject: [PATCH] Implement timed mutes. (#2035) Fixes #2033 --- .../com/keylesspalace/tusky/AccountActivity.kt | 4 ++-- .../tusky/components/search/SearchViewModel.kt | 4 ++-- .../search/fragments/SearchStatusesFragment.kt | 7 ++++--- .../keylesspalace/tusky/fragment/SFragment.java | 4 ++-- .../keylesspalace/tusky/network/MastodonApi.kt | 3 ++- .../keylesspalace/tusky/network/TimelineCases.kt | 6 +++--- .../keylesspalace/tusky/view/MuteAccountDialog.kt | 9 +++++++-- .../tusky/viewmodel/AccountViewModel.kt | 8 ++++---- app/src/main/res/layout/dialog_mute_account.xml | 15 ++++++++++++++- 9 files changed, 40 insertions(+), 20 deletions(-) diff --git a/app/src/main/java/com/keylesspalace/tusky/AccountActivity.kt b/app/src/main/java/com/keylesspalace/tusky/AccountActivity.kt index c52208b0..9deb2e17 100644 --- a/app/src/main/java/com/keylesspalace/tusky/AccountActivity.kt +++ b/app/src/main/java/com/keylesspalace/tusky/AccountActivity.kt @@ -866,8 +866,8 @@ class AccountActivity : BottomSheetActivity(), ActionButtonActivity, HasAndroidI showMuteAccountDialog( this, it.username - ) { notifications -> - viewModel.muteAccount(notifications) + ) { notifications, duration -> + viewModel.muteAccount(notifications, duration) } } } else { diff --git a/app/src/main/java/com/keylesspalace/tusky/components/search/SearchViewModel.kt b/app/src/main/java/com/keylesspalace/tusky/components/search/SearchViewModel.kt index 964abb62..83944575 100644 --- a/app/src/main/java/com/keylesspalace/tusky/components/search/SearchViewModel.kt +++ b/app/src/main/java/com/keylesspalace/tusky/components/search/SearchViewModel.kt @@ -194,8 +194,8 @@ class SearchViewModel @Inject constructor( return accountManager.getAllAccountsOrderedByActive() } - fun muteAccount(accountId: String, notifications: Boolean) { - timelineCases.mute(accountId, notifications) + fun muteAccount(accountId: String, notifications: Boolean, duration: Int) { + timelineCases.mute(accountId, notifications, duration) } fun muteConversation(status: Status, isMute: Boolean) { diff --git a/app/src/main/java/com/keylesspalace/tusky/components/search/fragments/SearchStatusesFragment.kt b/app/src/main/java/com/keylesspalace/tusky/components/search/fragments/SearchStatusesFragment.kt index bf042092..7213cd6d 100644 --- a/app/src/main/java/com/keylesspalace/tusky/components/search/fragments/SearchStatusesFragment.kt +++ b/app/src/main/java/com/keylesspalace/tusky/components/search/fragments/SearchStatusesFragment.kt @@ -373,9 +373,10 @@ class SearchStatusesFragment : SearchFragment viewModel.muteAccount(accountId, notifications) } - ) + accountUsername + ) { notifications, duration -> + viewModel.muteAccount(accountId, notifications, duration) + } } private fun accountIsInMentions(account: AccountEntity?, mentions: Array): Boolean { diff --git a/app/src/main/java/com/keylesspalace/tusky/fragment/SFragment.java b/app/src/main/java/com/keylesspalace/tusky/fragment/SFragment.java index d0572030..6a5d09b0 100644 --- a/app/src/main/java/com/keylesspalace/tusky/fragment/SFragment.java +++ b/app/src/main/java/com/keylesspalace/tusky/fragment/SFragment.java @@ -382,8 +382,8 @@ public abstract class SFragment extends BaseFragment implements Injectable { MuteAccountDialog.showMuteAccountDialog( this.getActivity(), accountUsername, - (notifications) -> { - timelineCases.mute(accountId, notifications); + (notifications, duration) -> { + timelineCases.mute(accountId, notifications, duration); return Unit.INSTANCE; } ); diff --git a/app/src/main/java/com/keylesspalace/tusky/network/MastodonApi.kt b/app/src/main/java/com/keylesspalace/tusky/network/MastodonApi.kt index a690e46b..bf8e2eff 100644 --- a/app/src/main/java/com/keylesspalace/tusky/network/MastodonApi.kt +++ b/app/src/main/java/com/keylesspalace/tusky/network/MastodonApi.kt @@ -332,7 +332,8 @@ interface MastodonApi { @POST("api/v1/accounts/{id}/mute") fun muteAccount( @Path("id") accountId: String, - @Field("notifications") notifications: Boolean? = null + @Field("notifications") notifications: Boolean? = null, + @Field("duration") duration: Int? = null ): Single @POST("api/v1/accounts/{id}/unmute") diff --git a/app/src/main/java/com/keylesspalace/tusky/network/TimelineCases.kt b/app/src/main/java/com/keylesspalace/tusky/network/TimelineCases.kt index 40dbca53..f1387497 100644 --- a/app/src/main/java/com/keylesspalace/tusky/network/TimelineCases.kt +++ b/app/src/main/java/com/keylesspalace/tusky/network/TimelineCases.kt @@ -34,7 +34,7 @@ interface TimelineCases { fun favourite(status: Status, favourite: Boolean): Single fun bookmark(status: Status, bookmark: Boolean): Single fun muteConversation(status: Status, mute: Boolean) - fun mute(id: String, notifications: Boolean) + fun mute(id: String, notifications: Boolean, duration: Int) fun block(id: String) fun delete(id: String): Single fun pin(status: Status, pin: Boolean) @@ -107,8 +107,8 @@ class TimelineCasesImpl( .addTo(cancelDisposable) } - override fun mute(id: String, notifications: Boolean) { - mastodonApi.muteAccount(id, notifications) + override fun mute(id: String, notifications: Boolean, duration: Int) { + mastodonApi.muteAccount(id, notifications, duration) .subscribe({ eventHub.dispatch(MuteEvent(id, true)) }, { t -> diff --git a/app/src/main/java/com/keylesspalace/tusky/view/MuteAccountDialog.kt b/app/src/main/java/com/keylesspalace/tusky/view/MuteAccountDialog.kt index 2702a333..2cf8ad6e 100644 --- a/app/src/main/java/com/keylesspalace/tusky/view/MuteAccountDialog.kt +++ b/app/src/main/java/com/keylesspalace/tusky/view/MuteAccountDialog.kt @@ -4,6 +4,7 @@ package com.keylesspalace.tusky.view import android.app.Activity import android.widget.CheckBox +import android.widget.Spinner import android.widget.TextView import androidx.appcompat.app.AlertDialog import com.keylesspalace.tusky.R @@ -11,7 +12,7 @@ import com.keylesspalace.tusky.R fun showMuteAccountDialog( activity: Activity, accountUsername: String, - onOk: (notifications: Boolean) -> Unit + onOk: (notifications: Boolean, duration: Int) -> Unit ) { val view = activity.layoutInflater.inflate(R.layout.dialog_mute_account, null) (view.findViewById(R.id.warning) as TextView).text = @@ -21,7 +22,11 @@ fun showMuteAccountDialog( AlertDialog.Builder(activity) .setView(view) - .setPositiveButton(android.R.string.ok) { _, _ -> onOk(checkbox.isChecked) } + .setPositiveButton(android.R.string.ok) { _, _ -> + val spinner: Spinner = view.findViewById(R.id.duration) + val durationValues = activity.resources.getIntArray(R.array.mute_duration_values) + onOk(checkbox.isChecked, durationValues[spinner.selectedItemPosition]) + } .setNegativeButton(android.R.string.cancel, null) .show() } \ No newline at end of file diff --git a/app/src/main/java/com/keylesspalace/tusky/viewmodel/AccountViewModel.kt b/app/src/main/java/com/keylesspalace/tusky/viewmodel/AccountViewModel.kt index 90e8026d..934d6868 100644 --- a/app/src/main/java/com/keylesspalace/tusky/viewmodel/AccountViewModel.kt +++ b/app/src/main/java/com/keylesspalace/tusky/viewmodel/AccountViewModel.kt @@ -119,8 +119,8 @@ class AccountViewModel @Inject constructor( } } - fun muteAccount(notifications: Boolean) { - changeRelationship(RelationShipAction.MUTE, notifications) + fun muteAccount(notifications: Boolean, duration: Int) { + changeRelationship(RelationShipAction.MUTE, notifications, duration) } fun unmuteAccount() { @@ -187,7 +187,7 @@ class AccountViewModel @Inject constructor( /** * @param parameter showReblogs if RelationShipAction.FOLLOW, notifications if MUTE */ - private fun changeRelationship(relationshipAction: RelationShipAction, parameter: Boolean? = null) { + private fun changeRelationship(relationshipAction: RelationShipAction, parameter: Boolean? = null, duration: Int? = null) { val relation = relationshipData.value?.data val account = accountData.value?.data val isMastodon = relationshipData.value?.data?.notifying != null @@ -227,7 +227,7 @@ class AccountViewModel @Inject constructor( RelationShipAction.UNFOLLOW -> mastodonApi.unfollowAccount(accountId) RelationShipAction.BLOCK -> mastodonApi.blockAccount(accountId) RelationShipAction.UNBLOCK -> mastodonApi.unblockAccount(accountId) - RelationShipAction.MUTE -> mastodonApi.muteAccount(accountId, parameter ?: true) + RelationShipAction.MUTE -> mastodonApi.muteAccount(accountId, parameter ?: true, duration) RelationShipAction.UNMUTE -> mastodonApi.unmuteAccount(accountId) RelationShipAction.SUBSCRIBE -> { if(isMastodon) diff --git a/app/src/main/res/layout/dialog_mute_account.xml b/app/src/main/res/layout/dialog_mute_account.xml index 673fc9e4..b58a277c 100644 --- a/app/src/main/res/layout/dialog_mute_account.xml +++ b/app/src/main/res/layout/dialog_mute_account.xml @@ -22,4 +22,17 @@ app:buttonTint="@color/compound_button_color" android:text="@string/dialog_mute_hide_notifications"/> - \ No newline at end of file + + + + +