kopia lustrzana https://github.com/ryukoposting/Signal-Android
Extract adapter creation from ContactSearchMediator.
rodzic
13f969b622
commit
8f49323648
|
@ -0,0 +1,23 @@
|
||||||
|
package org.thoughtcrime.securesms.contacts.paged
|
||||||
|
|
||||||
|
import android.view.View
|
||||||
|
import org.thoughtcrime.securesms.util.adapter.mapping.PagingMappingAdapter
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Default contact search adapter, using the models defined in `ContactSearchItems`
|
||||||
|
*/
|
||||||
|
class ContactSearchAdapter(
|
||||||
|
displayCheckBox: Boolean,
|
||||||
|
displaySmsTag: ContactSearchItems.DisplaySmsTag,
|
||||||
|
recipientListener: (View, ContactSearchData.KnownRecipient, Boolean) -> Unit,
|
||||||
|
storyListener: (View, ContactSearchData.Story, Boolean) -> Unit,
|
||||||
|
storyContextMenuCallbacks: ContactSearchItems.StoryContextMenuCallbacks,
|
||||||
|
expandListener: (ContactSearchData.Expand) -> Unit
|
||||||
|
) : PagingMappingAdapter<ContactSearchKey>() {
|
||||||
|
init {
|
||||||
|
ContactSearchItems.registerStoryItems(this, displayCheckBox, storyListener, storyContextMenuCallbacks)
|
||||||
|
ContactSearchItems.registerKnownRecipientItems(this, displayCheckBox, displaySmsTag, recipientListener)
|
||||||
|
ContactSearchItems.registerHeaders(this)
|
||||||
|
ContactSearchItems.registerExpands(this, expandListener)
|
||||||
|
}
|
||||||
|
}
|
|
@ -45,6 +45,18 @@ object ContactSearchItems {
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun registerKnownRecipientItems(
|
||||||
|
mappingAdapter: MappingAdapter,
|
||||||
|
displayCheckBox: Boolean,
|
||||||
|
displaySmsTag: DisplaySmsTag,
|
||||||
|
recipientListener: (View, ContactSearchData.KnownRecipient, Boolean) -> Unit
|
||||||
|
) {
|
||||||
|
mappingAdapter.registerFactory(
|
||||||
|
RecipientModel::class.java,
|
||||||
|
LayoutFactory({ KnownRecipientViewHolder(it, displayCheckBox, displaySmsTag, recipientListener) }, R.layout.contact_search_item)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
fun registerHeaders(mappingAdapter: MappingAdapter) {
|
fun registerHeaders(mappingAdapter: MappingAdapter) {
|
||||||
mappingAdapter.registerFactory(
|
mappingAdapter.registerFactory(
|
||||||
HeaderModel::class.java,
|
HeaderModel::class.java,
|
||||||
|
@ -52,21 +64,7 @@ object ContactSearchItems {
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun register(
|
fun registerExpands(mappingAdapter: MappingAdapter, expandListener: (ContactSearchData.Expand) -> Unit) {
|
||||||
mappingAdapter: MappingAdapter,
|
|
||||||
displayCheckBox: Boolean,
|
|
||||||
displaySmsTag: DisplaySmsTag,
|
|
||||||
recipientListener: RecipientClickListener,
|
|
||||||
storyListener: StoryClickListener,
|
|
||||||
storyContextMenuCallbacks: StoryContextMenuCallbacks,
|
|
||||||
expandListener: (ContactSearchData.Expand) -> Unit
|
|
||||||
) {
|
|
||||||
registerStoryItems(mappingAdapter, displayCheckBox, storyListener, storyContextMenuCallbacks)
|
|
||||||
mappingAdapter.registerFactory(
|
|
||||||
RecipientModel::class.java,
|
|
||||||
LayoutFactory({ KnownRecipientViewHolder(it, displayCheckBox, displaySmsTag, recipientListener) }, R.layout.contact_search_item)
|
|
||||||
)
|
|
||||||
registerHeaders(mappingAdapter)
|
|
||||||
mappingAdapter.registerFactory(
|
mappingAdapter.registerFactory(
|
||||||
ExpandModel::class.java,
|
ExpandModel::class.java,
|
||||||
LayoutFactory({ ExpandViewHolder(it, expandListener) }, R.layout.contacts_expand_item)
|
LayoutFactory({ ExpandViewHolder(it, expandListener) }, R.layout.contacts_expand_item)
|
||||||
|
@ -90,7 +88,7 @@ object ContactSearchItems {
|
||||||
/**
|
/**
|
||||||
* Story Model
|
* Story Model
|
||||||
*/
|
*/
|
||||||
private class StoryModel(val story: ContactSearchData.Story, val isSelected: Boolean, val hasBeenNotified: Boolean) : MappingModel<StoryModel> {
|
class StoryModel(val story: ContactSearchData.Story, val isSelected: Boolean, val hasBeenNotified: Boolean) : MappingModel<StoryModel> {
|
||||||
|
|
||||||
override fun areItemsTheSame(newItem: StoryModel): Boolean {
|
override fun areItemsTheSame(newItem: StoryModel): Boolean {
|
||||||
return newItem.story == story
|
return newItem.story == story
|
||||||
|
@ -226,7 +224,7 @@ object ContactSearchItems {
|
||||||
/**
|
/**
|
||||||
* Recipient model
|
* Recipient model
|
||||||
*/
|
*/
|
||||||
private class RecipientModel(val knownRecipient: ContactSearchData.KnownRecipient, val isSelected: Boolean, val shortSummary: Boolean) : MappingModel<RecipientModel> {
|
class RecipientModel(val knownRecipient: ContactSearchData.KnownRecipient, val isSelected: Boolean, val shortSummary: Boolean) : MappingModel<RecipientModel> {
|
||||||
|
|
||||||
override fun areItemsTheSame(newItem: RecipientModel): Boolean {
|
override fun areItemsTheSame(newItem: RecipientModel): Boolean {
|
||||||
return newItem.knownRecipient == knownRecipient
|
return newItem.knownRecipient == knownRecipient
|
||||||
|
@ -363,7 +361,7 @@ object ContactSearchItems {
|
||||||
/**
|
/**
|
||||||
* Mapping Model for section headers
|
* Mapping Model for section headers
|
||||||
*/
|
*/
|
||||||
private class HeaderModel(val header: ContactSearchData.Header) : MappingModel<HeaderModel> {
|
class HeaderModel(val header: ContactSearchData.Header) : MappingModel<HeaderModel> {
|
||||||
override fun areItemsTheSame(newItem: HeaderModel): Boolean {
|
override fun areItemsTheSame(newItem: HeaderModel): Boolean {
|
||||||
return header.sectionKey == newItem.header.sectionKey
|
return header.sectionKey == newItem.header.sectionKey
|
||||||
}
|
}
|
||||||
|
@ -407,7 +405,7 @@ object ContactSearchItems {
|
||||||
/**
|
/**
|
||||||
* Mapping Model for expandable content rows.
|
* Mapping Model for expandable content rows.
|
||||||
*/
|
*/
|
||||||
private class ExpandModel(val expand: ContactSearchData.Expand) : MappingModel<ExpandModel> {
|
class ExpandModel(val expand: ContactSearchData.Expand) : MappingModel<ExpandModel> {
|
||||||
override fun areItemsTheSame(newItem: ExpandModel): Boolean {
|
override fun areItemsTheSame(newItem: ExpandModel): Boolean {
|
||||||
return expand.contactSearchKey == newItem.expand.contactSearchKey
|
return expand.contactSearchKey == newItem.expand.contactSearchKey
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,26 +27,23 @@ class ContactSearchMediator(
|
||||||
displaySmsTag: ContactSearchItems.DisplaySmsTag,
|
displaySmsTag: ContactSearchItems.DisplaySmsTag,
|
||||||
mapStateToConfiguration: (ContactSearchState) -> ContactSearchConfiguration,
|
mapStateToConfiguration: (ContactSearchState) -> ContactSearchConfiguration,
|
||||||
private val contactSelectionPreFilter: (View?, Set<ContactSearchKey>) -> Set<ContactSearchKey> = { _, s -> s },
|
private val contactSelectionPreFilter: (View?, Set<ContactSearchKey>) -> Set<ContactSearchKey> = { _, s -> s },
|
||||||
performSafetyNumberChecks: Boolean = true
|
performSafetyNumberChecks: Boolean = true,
|
||||||
|
adapterFactory: AdapterFactory = DefaultAdapterFactory
|
||||||
) {
|
) {
|
||||||
|
|
||||||
private val viewModel: ContactSearchViewModel = ViewModelProvider(fragment, ContactSearchViewModel.Factory(selectionLimits, ContactSearchRepository(), performSafetyNumberChecks)).get(ContactSearchViewModel::class.java)
|
private val viewModel: ContactSearchViewModel = ViewModelProvider(fragment, ContactSearchViewModel.Factory(selectionLimits, ContactSearchRepository(), performSafetyNumberChecks)).get(ContactSearchViewModel::class.java)
|
||||||
|
|
||||||
init {
|
init {
|
||||||
|
val adapter = adapterFactory.create(
|
||||||
|
displayCheckBox,
|
||||||
|
displaySmsTag,
|
||||||
|
this::toggleSelection,
|
||||||
|
this::toggleStorySelection,
|
||||||
|
StoryContextMenuCallbacks()
|
||||||
|
) { viewModel.expandSection(it.sectionKey) }
|
||||||
|
|
||||||
val adapter = PagingMappingAdapter<ContactSearchKey>()
|
|
||||||
recyclerView.adapter = adapter
|
recyclerView.adapter = adapter
|
||||||
|
|
||||||
ContactSearchItems.register(
|
|
||||||
mappingAdapter = adapter,
|
|
||||||
displayCheckBox = displayCheckBox,
|
|
||||||
displaySmsTag = displaySmsTag,
|
|
||||||
recipientListener = this::toggleSelection,
|
|
||||||
storyListener = this::toggleStorySelection,
|
|
||||||
storyContextMenuCallbacks = StoryContextMenuCallbacks(),
|
|
||||||
expandListener = { viewModel.expandSection(it.sectionKey) }
|
|
||||||
)
|
|
||||||
|
|
||||||
val dataAndSelection: LiveData<Pair<List<ContactSearchData>, Set<ContactSearchKey>>> = LiveDataUtil.combineLatest(
|
val dataAndSelection: LiveData<Pair<List<ContactSearchData>, Set<ContactSearchKey>>> = LiveDataUtil.combineLatest(
|
||||||
viewModel.data,
|
viewModel.data,
|
||||||
viewModel.selectionState,
|
viewModel.selectionState,
|
||||||
|
@ -143,4 +140,32 @@ class ContactSearchMediator(
|
||||||
.show()
|
.show()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Wraps the construction of a PagingMappingAdapter<ContactSearchKey> so that it can
|
||||||
|
* be swapped for another implementation, allow listeners to be wrapped, etc.
|
||||||
|
*/
|
||||||
|
fun interface AdapterFactory {
|
||||||
|
fun create(
|
||||||
|
displayCheckBox: Boolean,
|
||||||
|
displaySmsTag: ContactSearchItems.DisplaySmsTag,
|
||||||
|
recipientListener: (View, ContactSearchData.KnownRecipient, Boolean) -> Unit,
|
||||||
|
storyListener: (View, ContactSearchData.Story, Boolean) -> Unit,
|
||||||
|
storyContextMenuCallbacks: ContactSearchItems.StoryContextMenuCallbacks,
|
||||||
|
expandListener: (ContactSearchData.Expand) -> Unit
|
||||||
|
): PagingMappingAdapter<ContactSearchKey>
|
||||||
|
}
|
||||||
|
|
||||||
|
private object DefaultAdapterFactory : AdapterFactory {
|
||||||
|
override fun create(
|
||||||
|
displayCheckBox: Boolean,
|
||||||
|
displaySmsTag: ContactSearchItems.DisplaySmsTag,
|
||||||
|
recipientListener: (View, ContactSearchData.KnownRecipient, Boolean) -> Unit,
|
||||||
|
storyListener: (View, ContactSearchData.Story, Boolean) -> Unit,
|
||||||
|
storyContextMenuCallbacks: ContactSearchItems.StoryContextMenuCallbacks,
|
||||||
|
expandListener: (ContactSearchData.Expand) -> Unit
|
||||||
|
): PagingMappingAdapter<ContactSearchKey> {
|
||||||
|
return ContactSearchAdapter(displayCheckBox, displaySmsTag, recipientListener, storyListener, storyContextMenuCallbacks, expandListener)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Ładowanie…
Reference in New Issue