rename module and classes to domainblocks
This commit is contained in:
parent
626a8760ae
commit
4670964362
|
@ -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" />
|
||||
|
|
|
@ -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()
|
||||
}
|
||||
|
|
@ -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) {
|
||||
|
|
@ -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"
|
||||
}
|
||||
}
|
|
@ -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> {
|
|
@ -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,
|
|
@ -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()
|
||||
}
|
|
@ -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,
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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>
|
|
@ -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>
|
||||
|
|
Loading…
Reference in New Issue