diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 232bf491c..f88f1fc80 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -148,7 +148,7 @@ - + diff --git a/app/src/main/java/com/keylesspalace/tusky/components/instancemute/InstanceListActivity.kt b/app/src/main/java/com/keylesspalace/tusky/components/domainblocks/DomainBlocksActivity.kt similarity index 78% rename from app/src/main/java/com/keylesspalace/tusky/components/instancemute/InstanceListActivity.kt rename to app/src/main/java/com/keylesspalace/tusky/components/domainblocks/DomainBlocksActivity.kt index 667360c53..618174907 100644 --- a/app/src/main/java/com/keylesspalace/tusky/components/instancemute/InstanceListActivity.kt +++ b/app/src/main/java/com/keylesspalace/tusky/components/domainblocks/DomainBlocksActivity.kt @@ -1,15 +1,14 @@ -package com.keylesspalace.tusky.components.instancemute +package com.keylesspalace.tusky.components.domainblocks import android.os.Bundle import com.keylesspalace.tusky.BaseActivity import com.keylesspalace.tusky.R -import com.keylesspalace.tusky.components.instancemute.fragment.InstanceListFragment import com.keylesspalace.tusky.databinding.ActivityAccountListBinding import dagger.android.DispatchingAndroidInjector import dagger.android.HasAndroidInjector import javax.inject.Inject -class InstanceListActivity : BaseActivity(), HasAndroidInjector { +class DomainBlocksActivity : BaseActivity(), HasAndroidInjector { @Inject lateinit var androidInjector: DispatchingAndroidInjector @@ -28,7 +27,7 @@ class InstanceListActivity : BaseActivity(), HasAndroidInjector { supportFragmentManager .beginTransaction() - .replace(R.id.fragment_container, InstanceListFragment()) + .replace(R.id.fragment_container, DomainBlocksFragment()) .commit() } diff --git a/app/src/main/java/com/keylesspalace/tusky/components/instancemute/adapter/DomainMutesAdapter.kt b/app/src/main/java/com/keylesspalace/tusky/components/domainblocks/DomainBlocksAdapter.kt similarity index 92% rename from app/src/main/java/com/keylesspalace/tusky/components/instancemute/adapter/DomainMutesAdapter.kt rename to app/src/main/java/com/keylesspalace/tusky/components/domainblocks/DomainBlocksAdapter.kt index e4f15d54b..a4b21fc79 100644 --- a/app/src/main/java/com/keylesspalace/tusky/components/instancemute/adapter/DomainMutesAdapter.kt +++ b/app/src/main/java/com/keylesspalace/tusky/components/domainblocks/DomainBlocksAdapter.kt @@ -1,4 +1,4 @@ -package com.keylesspalace.tusky.components.instancemute.adapter +package com.keylesspalace.tusky.components.domainblocks import android.view.LayoutInflater import android.view.ViewGroup @@ -7,7 +7,7 @@ import com.keylesspalace.tusky.components.followedtags.FollowedTagsAdapter.Compa import com.keylesspalace.tusky.databinding.ItemMutedDomainBinding import com.keylesspalace.tusky.util.BindingHolder -class DomainMutesAdapter( +class DomainBlocksAdapter( private val onUnmute: (String) -> Unit ) : PagingDataAdapter>(STRING_COMPARATOR) { diff --git a/app/src/main/java/com/keylesspalace/tusky/components/instancemute/fragment/InstanceListFragment.kt b/app/src/main/java/com/keylesspalace/tusky/components/domainblocks/DomainBlocksFragment.kt similarity index 68% rename from app/src/main/java/com/keylesspalace/tusky/components/instancemute/fragment/InstanceListFragment.kt rename to app/src/main/java/com/keylesspalace/tusky/components/domainblocks/DomainBlocksFragment.kt index 71e1a0482..9d2d8686c 100644 --- a/app/src/main/java/com/keylesspalace/tusky/components/instancemute/fragment/InstanceListFragment.kt +++ b/app/src/main/java/com/keylesspalace/tusky/components/domainblocks/DomainBlocksFragment.kt @@ -1,4 +1,4 @@ -package com.keylesspalace.tusky.components.instancemute.fragment +package com.keylesspalace.tusky.components.domainblocks import android.os.Bundle import android.util.Log @@ -11,11 +11,7 @@ import androidx.recyclerview.widget.DividerItemDecoration import androidx.recyclerview.widget.LinearLayoutManager import com.google.android.material.snackbar.Snackbar import com.keylesspalace.tusky.R -import com.keylesspalace.tusky.components.followedtags.FollowedTagsActivity -import com.keylesspalace.tusky.components.instancemute.InstanceMuteEvent -import com.keylesspalace.tusky.components.instancemute.InstanceMuteViewModel -import com.keylesspalace.tusky.components.instancemute.adapter.DomainMutesAdapter -import com.keylesspalace.tusky.databinding.FragmentInstanceListBinding +import com.keylesspalace.tusky.databinding.FragmentDomainBlocksBinding import com.keylesspalace.tusky.di.Injectable import com.keylesspalace.tusky.di.ViewModelFactory import com.keylesspalace.tusky.util.hide @@ -26,17 +22,17 @@ import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.launch import javax.inject.Inject -class InstanceListFragment : Fragment(R.layout.fragment_instance_list), Injectable { +class DomainBlocksFragment : Fragment(R.layout.fragment_domain_blocks), Injectable { @Inject lateinit var viewModelFactory: ViewModelFactory - private val binding by viewBinding(FragmentInstanceListBinding::bind) + private val binding by viewBinding(FragmentDomainBlocksBinding::bind) - private val viewModel: InstanceMuteViewModel by viewModels { viewModelFactory } + private val viewModel: DomainBlocksViewModel by viewModels { viewModelFactory } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - val adapter = DomainMutesAdapter(viewModel::unmute) + val adapter = DomainBlocksAdapter(viewModel::unblock) binding.recyclerView.setHasFixedSize(true) binding.recyclerView.addItemDecoration(DividerItemDecoration(view.context, DividerItemDecoration.VERTICAL)) @@ -46,9 +42,9 @@ class InstanceListFragment : Fragment(R.layout.fragment_instance_list), Injectab viewLifecycleOwner.lifecycleScope.launch { viewModel.uiEvents.collect { event -> when (event) { - is InstanceMuteEvent.UnmuteError -> showUnmuteError(event.domain) - is InstanceMuteEvent.MuteError -> showMuteError(event.domain) - is InstanceMuteEvent.UnmuteSuccess -> showUnmuteSuccess(event.domain) + is DomainBlockEvent.UnblockError -> showUnmuteError(event.domain) + is DomainBlockEvent.BlockError -> showMuteError(event.domain) + is DomainBlockEvent.BlockSuccess -> showUnmuteSuccess(event.domain) } } } @@ -60,14 +56,14 @@ class InstanceListFragment : Fragment(R.layout.fragment_instance_list), Injectab } adapter.addLoadStateListener { loadState -> - binding.instanceProgressBar.visible(loadState.refresh == LoadState.Loading && adapter.itemCount == 0) + binding.progressBar.visible(loadState.refresh == LoadState.Loading && adapter.itemCount == 0) if (loadState.refresh is LoadState.Error) { binding.recyclerView.hide() binding.messageView.show() val errorState = loadState.refresh as LoadState.Error binding.messageView.setup(errorState.error) { adapter.retry() } - Log.w(FollowedTagsActivity.TAG, "error loading followed hashtags", errorState.error) + Log.w(TAG, "error loading blocked domains", errorState.error) } else if (loadState.refresh is LoadState.NotLoading && adapter.itemCount == 0) { binding.recyclerView.hide() binding.messageView.show() @@ -81,23 +77,23 @@ class InstanceListFragment : Fragment(R.layout.fragment_instance_list), Injectab private fun showUnmuteError(domain: String) { showSnackbar( - getString(R.string.error_unmuting_domain, domain), + getString(R.string.error_unblocking_domain, domain), R.string.action_retry - ) { viewModel.unmute(domain) } + ) { viewModel.unblock(domain) } } private fun showMuteError(domain: String) { showSnackbar( - getString(R.string.error_muting_domain, domain), + getString(R.string.error_blocking_domain, domain), R.string.action_retry - ) { viewModel.mute(domain) } + ) { viewModel.block(domain) } } private fun showUnmuteSuccess(domain: String) { showSnackbar( getString(R.string.confirmation_domain_unmuted, domain), R.string.action_undo - ) { viewModel.mute(domain) } + ) { viewModel.block(domain) } } private fun showSnackbar(message: String, actionText: Int, action: (View) -> Unit) { @@ -105,4 +101,8 @@ class InstanceListFragment : Fragment(R.layout.fragment_instance_list), Injectab .setAction(actionText, action) .show() } + + companion object { + private const val TAG = "DomainBlocksFragment" + } } diff --git a/app/src/main/java/com/keylesspalace/tusky/components/instancemute/InstanceMutePagingSource.kt b/app/src/main/java/com/keylesspalace/tusky/components/domainblocks/DomainBlocksPagingSource.kt similarity index 73% rename from app/src/main/java/com/keylesspalace/tusky/components/instancemute/InstanceMutePagingSource.kt rename to app/src/main/java/com/keylesspalace/tusky/components/domainblocks/DomainBlocksPagingSource.kt index e61617e6a..a0c1c5b54 100644 --- a/app/src/main/java/com/keylesspalace/tusky/components/instancemute/InstanceMutePagingSource.kt +++ b/app/src/main/java/com/keylesspalace/tusky/components/domainblocks/DomainBlocksPagingSource.kt @@ -1,9 +1,9 @@ -package com.keylesspalace.tusky.components.instancemute +package com.keylesspalace.tusky.components.domainblocks import androidx.paging.PagingSource import androidx.paging.PagingState -class InstanceMutePagingSource(private val viewModel: InstanceMuteViewModel) : PagingSource() { +class DomainBlocksPagingSource(private val viewModel: DomainBlocksViewModel) : PagingSource() { override fun getRefreshKey(state: PagingState): String? = null override suspend fun load(params: LoadParams): LoadResult { diff --git a/app/src/main/java/com/keylesspalace/tusky/components/instancemute/InstanceMuteRemoteMediator.kt b/app/src/main/java/com/keylesspalace/tusky/components/domainblocks/DomainBlocksRemoteMediator.kt similarity index 92% rename from app/src/main/java/com/keylesspalace/tusky/components/instancemute/InstanceMuteRemoteMediator.kt rename to app/src/main/java/com/keylesspalace/tusky/components/domainblocks/DomainBlocksRemoteMediator.kt index 62ac91b72..ecbb61104 100644 --- a/app/src/main/java/com/keylesspalace/tusky/components/instancemute/InstanceMuteRemoteMediator.kt +++ b/app/src/main/java/com/keylesspalace/tusky/components/domainblocks/DomainBlocksRemoteMediator.kt @@ -1,4 +1,4 @@ -package com.keylesspalace.tusky.components.instancemute +package com.keylesspalace.tusky.components.domainblocks import androidx.paging.ExperimentalPagingApi import androidx.paging.LoadType @@ -10,9 +10,9 @@ import retrofit2.HttpException import retrofit2.Response @OptIn(ExperimentalPagingApi::class) -class InstanceMuteRemoteMediator( +class DomainBlocksRemoteMediator( private val api: MastodonApi, - private val viewModel: InstanceMuteViewModel + private val viewModel: DomainBlocksViewModel ) : RemoteMediator() { override suspend fun load( loadType: LoadType, diff --git a/app/src/main/java/com/keylesspalace/tusky/components/instancemute/InstanceMuteViewModel.kt b/app/src/main/java/com/keylesspalace/tusky/components/domainblocks/DomainBlocksViewModel.kt similarity index 57% rename from app/src/main/java/com/keylesspalace/tusky/components/instancemute/InstanceMuteViewModel.kt rename to app/src/main/java/com/keylesspalace/tusky/components/domainblocks/DomainBlocksViewModel.kt index 84444d793..c70fa5077 100644 --- a/app/src/main/java/com/keylesspalace/tusky/components/instancemute/InstanceMuteViewModel.kt +++ b/app/src/main/java/com/keylesspalace/tusky/components/domainblocks/DomainBlocksViewModel.kt @@ -1,4 +1,4 @@ -package com.keylesspalace.tusky.components.instancemute +package com.keylesspalace.tusky.components.domainblocks import android.util.Log import androidx.lifecycle.ViewModel @@ -13,20 +13,20 @@ import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.launch import javax.inject.Inject -class InstanceMuteViewModel @Inject constructor( +class DomainBlocksViewModel @Inject constructor( private val api: MastodonApi ) : ViewModel() { val domains: MutableList = mutableListOf() - val uiEvents = MutableSharedFlow() + val uiEvents = MutableSharedFlow() var nextKey: String? = null - var currentSource: InstanceMutePagingSource? = null + var currentSource: DomainBlocksPagingSource? = null @OptIn(ExperimentalPagingApi::class) val pager = Pager( config = PagingConfig(pageSize = 20), - remoteMediator = InstanceMuteRemoteMediator(api, this), + remoteMediator = DomainBlocksRemoteMediator(api, this), pagingSourceFactory = { - InstanceMutePagingSource( + DomainBlocksPagingSource( viewModel = this ).also { source -> currentSource = source @@ -34,38 +34,38 @@ class InstanceMuteViewModel @Inject constructor( } ).flow.cachedIn(viewModelScope) - fun mute(domain: String) { + fun block(domain: String) { viewModelScope.launch { api.blockDomain(domain).fold({ domains.add(domain) currentSource?.invalidate() }, { e -> - Log.w(TAG, "Error muting domain $domain", e) - uiEvents.emit(InstanceMuteEvent.MuteError(domain)) + Log.w(TAG, "Error blocking domain $domain", e) + uiEvents.emit(DomainBlockEvent.BlockError(domain)) }) } } - fun unmute(domain: String) { + fun unblock(domain: String) { viewModelScope.launch { api.unblockDomain(domain).fold({ domains.remove(domain) currentSource?.invalidate() - uiEvents.emit(InstanceMuteEvent.UnmuteSuccess(domain)) + uiEvents.emit(DomainBlockEvent.BlockSuccess(domain)) }, { e -> - Log.w(TAG, "Error unmuting domain $domain", e) - uiEvents.emit(InstanceMuteEvent.UnmuteError(domain)) + Log.w(TAG, "Error unblocking domain $domain", e) + uiEvents.emit(DomainBlockEvent.UnblockError(domain)) }) } } companion object { - private const val TAG = "InstanceMuteViewModel" + private const val TAG = "DomainBlocksViewModel" } } -sealed class InstanceMuteEvent { - data class UnmuteSuccess(val domain: String) : InstanceMuteEvent() - data class UnmuteError(val domain: String) : InstanceMuteEvent() - data class MuteError(val domain: String) : InstanceMuteEvent() +sealed class DomainBlockEvent { + data class BlockSuccess(val domain: String) : DomainBlockEvent() + data class UnblockError(val domain: String) : DomainBlockEvent() + data class BlockError(val domain: String) : DomainBlockEvent() } diff --git a/app/src/main/java/com/keylesspalace/tusky/components/preference/AccountPreferencesFragment.kt b/app/src/main/java/com/keylesspalace/tusky/components/preference/AccountPreferencesFragment.kt index b0fedb2b1..629c3709d 100644 --- a/app/src/main/java/com/keylesspalace/tusky/components/preference/AccountPreferencesFragment.kt +++ b/app/src/main/java/com/keylesspalace/tusky/components/preference/AccountPreferencesFragment.kt @@ -30,9 +30,9 @@ import com.keylesspalace.tusky.R import com.keylesspalace.tusky.TabPreferenceActivity import com.keylesspalace.tusky.appstore.EventHub import com.keylesspalace.tusky.components.accountlist.AccountListActivity +import com.keylesspalace.tusky.components.domainblocks.DomainBlocksActivity import com.keylesspalace.tusky.components.filters.FiltersActivity import com.keylesspalace.tusky.components.followedtags.FollowedTagsActivity -import com.keylesspalace.tusky.components.instancemute.InstanceListActivity import com.keylesspalace.tusky.components.login.LoginActivity import com.keylesspalace.tusky.components.notifications.currentAccountNeedsMigration import com.keylesspalace.tusky.db.AccountManager @@ -156,7 +156,7 @@ class AccountPreferencesFragment : PreferenceFragmentCompat(), Injectable { setTitle(R.string.title_domain_mutes) setIcon(R.drawable.ic_mute_24dp) setOnPreferenceClickListener { - val intent = Intent(context, InstanceListActivity::class.java) + val intent = Intent(context, DomainBlocksActivity::class.java) activity?.startActivity(intent) activity?.overridePendingTransition( R.anim.slide_from_right, diff --git a/app/src/main/java/com/keylesspalace/tusky/di/ActivitiesModule.kt b/app/src/main/java/com/keylesspalace/tusky/di/ActivitiesModule.kt index 2ceb97213..02b4f6ea7 100644 --- a/app/src/main/java/com/keylesspalace/tusky/di/ActivitiesModule.kt +++ b/app/src/main/java/com/keylesspalace/tusky/di/ActivitiesModule.kt @@ -29,11 +29,11 @@ import com.keylesspalace.tusky.components.account.AccountActivity import com.keylesspalace.tusky.components.accountlist.AccountListActivity import com.keylesspalace.tusky.components.announcements.AnnouncementsActivity import com.keylesspalace.tusky.components.compose.ComposeActivity +import com.keylesspalace.tusky.components.domainblocks.DomainBlocksActivity import com.keylesspalace.tusky.components.drafts.DraftsActivity import com.keylesspalace.tusky.components.filters.EditFilterActivity import com.keylesspalace.tusky.components.filters.FiltersActivity import com.keylesspalace.tusky.components.followedtags.FollowedTagsActivity -import com.keylesspalace.tusky.components.instancemute.InstanceListActivity import com.keylesspalace.tusky.components.login.LoginActivity import com.keylesspalace.tusky.components.login.LoginWebViewActivity import com.keylesspalace.tusky.components.preference.PreferencesActivity @@ -113,7 +113,7 @@ abstract class ActivitiesModule { abstract fun contributesReportActivity(): ReportActivity @ContributesAndroidInjector(modules = [FragmentBuildersModule::class]) - abstract fun contributesInstanceListActivity(): InstanceListActivity + abstract fun contributesInstanceListActivity(): DomainBlocksActivity @ContributesAndroidInjector abstract fun contributesScheduledStatusActivity(): ScheduledStatusActivity diff --git a/app/src/main/java/com/keylesspalace/tusky/di/FragmentBuildersModule.kt b/app/src/main/java/com/keylesspalace/tusky/di/FragmentBuildersModule.kt index aee1feab4..3292bbfe8 100644 --- a/app/src/main/java/com/keylesspalace/tusky/di/FragmentBuildersModule.kt +++ b/app/src/main/java/com/keylesspalace/tusky/di/FragmentBuildersModule.kt @@ -20,7 +20,7 @@ import com.keylesspalace.tusky.components.account.list.ListsForAccountFragment import com.keylesspalace.tusky.components.account.media.AccountMediaFragment import com.keylesspalace.tusky.components.accountlist.AccountListFragment import com.keylesspalace.tusky.components.conversation.ConversationsFragment -import com.keylesspalace.tusky.components.instancemute.fragment.InstanceListFragment +import com.keylesspalace.tusky.components.domainblocks.DomainBlocksFragment import com.keylesspalace.tusky.components.notifications.NotificationsFragment import com.keylesspalace.tusky.components.preference.AccountPreferencesFragment import com.keylesspalace.tusky.components.preference.NotificationPreferencesFragment @@ -84,7 +84,7 @@ abstract class FragmentBuildersModule { abstract fun reportDoneFragment(): ReportDoneFragment @ContributesAndroidInjector - abstract fun instanceListFragment(): InstanceListFragment + abstract fun instanceListFragment(): DomainBlocksFragment @ContributesAndroidInjector abstract fun searchStatusesFragment(): SearchStatusesFragment diff --git a/app/src/main/java/com/keylesspalace/tusky/di/ViewModelFactory.kt b/app/src/main/java/com/keylesspalace/tusky/di/ViewModelFactory.kt index b14604c6a..f2ae58893 100644 --- a/app/src/main/java/com/keylesspalace/tusky/di/ViewModelFactory.kt +++ b/app/src/main/java/com/keylesspalace/tusky/di/ViewModelFactory.kt @@ -27,11 +27,11 @@ import com.keylesspalace.tusky.components.account.media.AccountMediaViewModel import com.keylesspalace.tusky.components.announcements.AnnouncementsViewModel import com.keylesspalace.tusky.components.compose.ComposeViewModel import com.keylesspalace.tusky.components.conversation.ConversationsViewModel +import com.keylesspalace.tusky.components.domainblocks.DomainBlocksViewModel import com.keylesspalace.tusky.components.drafts.DraftsViewModel import com.keylesspalace.tusky.components.filters.EditFilterViewModel import com.keylesspalace.tusky.components.filters.FiltersViewModel import com.keylesspalace.tusky.components.followedtags.FollowedTagsViewModel -import com.keylesspalace.tusky.components.instancemute.InstanceMuteViewModel import com.keylesspalace.tusky.components.login.LoginWebViewViewModel import com.keylesspalace.tusky.components.notifications.NotificationsViewModel import com.keylesspalace.tusky.components.report.ReportViewModel @@ -188,8 +188,8 @@ abstract class ViewModelModule { @Binds @IntoMap - @ViewModelKey(InstanceMuteViewModel::class) - internal abstract fun instanceMuteViewModel(viewModel: InstanceMuteViewModel): ViewModel + @ViewModelKey(DomainBlocksViewModel::class) + internal abstract fun instanceMuteViewModel(viewModel: DomainBlocksViewModel): ViewModel // Add more ViewModels here } diff --git a/app/src/main/res/layout/fragment_instance_list.xml b/app/src/main/res/layout/fragment_domain_blocks.xml similarity index 93% rename from app/src/main/res/layout/fragment_instance_list.xml rename to app/src/main/res/layout/fragment_domain_blocks.xml index 8270cee33..f82573e24 100644 --- a/app/src/main/res/layout/fragment_instance_list.xml +++ b/app/src/main/res/layout/fragment_domain_blocks.xml @@ -5,7 +5,7 @@ android:layout_height="match_parent"> @@ -22,4 +22,4 @@ android:layout_gravity="center" android:visibility="gone" tools:visibility="visible" /> - \ No newline at end of file + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 1ed16f2ea..6c1df77d4 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -44,8 +44,8 @@ This instance does not support following hashtags. Error muting #%s Error unmuting #%s - Failed to mute %s - Failed to mute %s + Failed to mute %s + Failed to unmute %s Failed to load the status source from the server. Login