rename module and classes to domainblocks

This commit is contained in:
Conny Duck 2023-07-04 19:41:36 +02:00
parent 626a8760ae
commit 4670964362
13 changed files with 62 additions and 63 deletions

View File

@ -148,7 +148,7 @@
<activity
android:name=".components.report.ReportActivity"
android:windowSoftInputMode="stateAlwaysHidden|adjustResize" />
<activity android:name=".components.instancemute.InstanceListActivity" />
<activity android:name=".components.domainblocks.DomainBlocksActivity" />
<activity android:name=".components.scheduled.ScheduledStatusActivity" />
<activity android:name=".components.announcements.AnnouncementsActivity" />
<activity android:name=".components.drafts.DraftsActivity" />

View File

@ -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<Any>
@ -28,7 +27,7 @@ class InstanceListActivity : BaseActivity(), HasAndroidInjector {
supportFragmentManager
.beginTransaction()
.replace(R.id.fragment_container, InstanceListFragment())
.replace(R.id.fragment_container, DomainBlocksFragment())
.commit()
}

View File

@ -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, BindingHolder<ItemMutedDomainBinding>>(STRING_COMPARATOR) {

View File

@ -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"
}
}

View File

@ -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<String, String>() {
class DomainBlocksPagingSource(private val viewModel: DomainBlocksViewModel) : PagingSource<String, String>() {
override fun getRefreshKey(state: PagingState<String, String>): String? = null
override suspend fun load(params: LoadParams<String>): LoadResult<String, String> {

View File

@ -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<String, String>() {
override suspend fun load(
loadType: LoadType,

View File

@ -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<String> = mutableListOf()
val uiEvents = MutableSharedFlow<InstanceMuteEvent>()
val uiEvents = MutableSharedFlow<DomainBlockEvent>()
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()
}

View File

@ -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,

View File

@ -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

View File

@ -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

View File

@ -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
}

View File

@ -5,7 +5,7 @@
android:layout_height="match_parent">
<ProgressBar
android:id="@+id/instanceProgressBar"
android:id="@+id/progressBar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center" />
@ -22,4 +22,4 @@
android:layout_gravity="center"
android:visibility="gone"
tools:visibility="visible" />
</FrameLayout>
</FrameLayout>

View File

@ -44,8 +44,8 @@
<string name="error_following_hashtags_unsupported">This instance does not support following hashtags.</string>
<string name="error_muting_hashtag_format">Error muting #%s</string>
<string name="error_unmuting_hashtag_format">Error unmuting #%s</string>
<string name="error_muting_domain">Failed to mute %s</string>
<string name="error_unmuting_domain">Failed to mute %s</string>
<string name="error_blocking_domain">Failed to mute %s</string>
<string name="error_unblocking_domain">Failed to unmute %s</string>
<string name="error_status_source_load">Failed to load the status source from the server.</string>
<string name="title_login">Login</string>