Skip to content

Commit

Permalink
merged meruiden PR
Browse files Browse the repository at this point in the history
modified ViewHolderCreatorsStore to the new requirements introduced by meruiden PR
  • Loading branch information
idanatz committed Jan 10, 2020
2 parents 455ebad + a6e58c1 commit dbf7933
Show file tree
Hide file tree
Showing 8 changed files with 46 additions and 20 deletions.
@@ -1,9 +1,9 @@
package com.idanatz.oneadapter.tests.modules.empiness

import androidx.test.ext.junit.runners.AndroidJUnit4
import com.idanatz.oneadapter.external.holders.EmptyIndicator
import com.idanatz.oneadapter.external.modules.EmptinessModule
import com.idanatz.oneadapter.helpers.BaseTest
import com.idanatz.oneadapter.internal.holders.EmptyIndicator
import com.idanatz.oneadapter.internal.holders.ViewBinder
import com.idanatz.oneadapter.test.R
import org.amshove.kluent.shouldEqualTo
Expand Down
@@ -1,10 +1,10 @@
package com.idanatz.oneadapter.tests.modules.paging

import androidx.test.ext.junit.runners.AndroidJUnit4
import com.idanatz.oneadapter.external.holders.LoadingIndicator
import com.idanatz.oneadapter.external.modules.PagingModule
import com.idanatz.oneadapter.external.modules.PagingModuleConfig
import com.idanatz.oneadapter.helpers.BaseTest
import com.idanatz.oneadapter.internal.holders.LoadingIndicator
import com.idanatz.oneadapter.internal.holders.ViewBinder
import com.idanatz.oneadapter.test.R
import org.amshove.kluent.shouldEqualTo
Expand Down
15 changes: 15 additions & 0 deletions oneadapter/src/main/java/com/idanatz/oneadapter/OneAdapter.kt
Expand Up @@ -9,6 +9,7 @@ import com.idanatz.oneadapter.internal.utils.extensions.*
import com.idanatz.oneadapter.internal.utils.extensions.getIndexOfItem
import com.idanatz.oneadapter.external.MissingModuleDefinitionException
import com.idanatz.oneadapter.external.MultipleModuleConflictException
import com.idanatz.oneadapter.external.UnsupportedClassException

class OneAdapter(recyclerView: RecyclerView) {

Expand Down Expand Up @@ -117,4 +118,18 @@ class OneAdapter(recyclerView: RecyclerView) {
fun <M : Diffable> getVisibleItems(ofClass: Class<M>, requiredVisibilityPercentage: Float = 1f): List<M> {
return internalAdapter.holderVisibilityResolver.getItems(ofClass, requiredVisibilityPercentage)
}

fun getItemViewType(position: Int): Int {
return internalAdapter.getItemViewType(position)
}

/**
* Retrieves the view type of an item with a given class.
* Note that this class must implement the Diffable interface and the adapter must contain items of that class.
* @throws UnsupportedClassException if the class does not implement the Diffable interface
* or is not registered as an Module data type.
*/
fun getItemViewTypeFromClass(clazz: Class<*>): Int {
return internalAdapter.getItemViewTypeFromClass(clazz)
}
}
Expand Up @@ -3,4 +3,5 @@ package com.idanatz.oneadapter.external
class MissingConfigArgumentException(msg: String = "") : Throwable(msg)
class MissingLayoutManagerException(msg: String = "") : Throwable(msg)
class MissingModuleDefinitionException(msg: String = "") : Throwable(msg)
class MultipleModuleConflictException(msg: String = "") : Throwable(msg)
class MultipleModuleConflictException(msg: String = "") : Throwable(msg)
class UnsupportedClassException(msg: String = "") : Throwable(msg)
@@ -1,15 +1,15 @@
package com.idanatz.oneadapter.internal.holders
package com.idanatz.oneadapter.external.holders

import com.idanatz.oneadapter.external.interfaces.Diffable
import java.util.*

internal abstract class InternalHolderModel : Diffable {
abstract class OneHolderModel : Diffable {

private val uniqueId = UUID.randomUUID().mostSignificantBits

override fun getUniqueIdentifier() = uniqueId
override fun areContentTheSame(other: Any) = true
}

internal object LoadingIndicator : InternalHolderModel()
internal object EmptyIndicator : InternalHolderModel()
object LoadingIndicator : OneHolderModel()
object EmptyIndicator : OneHolderModel()
Expand Up @@ -11,8 +11,8 @@ import androidx.recyclerview.selection.StorageStrategy
import androidx.recyclerview.widget.ListUpdateCallback
import com.idanatz.oneadapter.external.interfaces.*
import com.idanatz.oneadapter.internal.diffing.OneDiffUtil
import com.idanatz.oneadapter.internal.holders.EmptyIndicator
import com.idanatz.oneadapter.internal.holders.LoadingIndicator
import com.idanatz.oneadapter.external.holders.EmptyIndicator
import com.idanatz.oneadapter.external.holders.LoadingIndicator
import com.idanatz.oneadapter.internal.holders.OneViewHolder
import com.idanatz.oneadapter.internal.interfaces.DiffUtilCallback
import com.idanatz.oneadapter.internal.holders_creators.ViewHolderCreator
Expand Down Expand Up @@ -133,11 +133,16 @@ internal class InternalAdapter(val recyclerView: RecyclerView) : RecyclerView.Ad
override fun getItemId(position: Int): Long {
val item = data[position]
// javaClass is used for lettings different Diffable models share the same unique identifier
return item.javaClass.simpleName.hashCode() + item.getUniqueIdentifier()
return item.javaClass.name.hashCode() + item.getUniqueIdentifier()
}

override fun getItemViewType(position: Int) = viewHolderCreatorsStore.getCreatorUniqueIndex(data[position].javaClass)

fun getItemViewTypeFromClass(clazz: Class<*>): Int {
Validator.validateModelClassIsDiffable(clazz)
return viewHolderCreatorsStore.getCreatorUniqueIndex(clazz as Class<Diffable>)
}

override fun onViewRecycled(holder: OneViewHolder<Diffable>) {
super.onViewRecycled(holder)
holder.onUnbind(holder.model)
Expand Down
@@ -1,5 +1,6 @@
package com.idanatz.oneadapter.internal.holders_creators

import com.idanatz.oneadapter.external.UnsupportedClassException
import com.idanatz.oneadapter.external.interfaces.Diffable

internal class ViewHolderCreatorsStore {
Expand All @@ -9,16 +10,17 @@ internal class ViewHolderCreatorsStore {

fun addCreator(clazz: Class<Diffable>, creator: ViewHolderCreator<Diffable>) {
holderCreators[clazz] = creator
if (!dataTypes.contains(clazz)) dataTypes.add(clazz)
}

fun getCreatorUniqueIndex(clazz: Class<Diffable>): Int {
if (dataTypes.indexOf(clazz) == -1) {
dataTypes.add(clazz)
if (!dataTypes.contains(clazz)) {
throw UnsupportedClassException("${clazz.simpleName} not registered as an Module data type.")
}
return dataTypes.indexOf(clazz)
}

fun getClassDataType(viewType: Int) = dataTypes[viewType]
fun getClassDataType(viewType: Int): Class<Diffable> = dataTypes[viewType]

fun getCreator(viewType: Int): ViewHolderCreator<Diffable>? = holderCreators[getClassDataType(viewType)]
}
Expand Up @@ -2,21 +2,18 @@ package com.idanatz.oneadapter.internal.validator

import android.content.Context
import androidx.recyclerview.widget.RecyclerView
import com.idanatz.oneadapter.external.MissingConfigArgumentException
import com.idanatz.oneadapter.external.MissingLayoutManagerException
import com.idanatz.oneadapter.external.MissingModuleDefinitionException
import com.idanatz.oneadapter.external.MultipleModuleConflictException
import com.idanatz.oneadapter.external.*
import com.idanatz.oneadapter.external.interfaces.Diffable
import com.idanatz.oneadapter.external.modules.ItemModule
import com.idanatz.oneadapter.internal.holders.InternalHolderModel
import com.idanatz.oneadapter.external.holders.OneHolderModel
import java.lang.NullPointerException

internal class Validator {

companion object {

fun validateItemsAgainstRegisteredModules(itemModulesMap: MutableMap<Class<*>, ItemModule<*>>, items: List<Diffable>) {
items.filterNot { it is InternalHolderModel }.find { !itemModulesMap.containsKey(it.javaClass) }?.let {
items.filterNot { it is OneHolderModel }.find { !itemModulesMap.containsKey(it.javaClass) }?.let {
throw MissingModuleDefinitionException("did you forget to attach ItemModule? (model: ${it.javaClass})")
}
}
Expand All @@ -38,5 +35,11 @@ internal class Validator {
fun validateLayoutManagerExists(recyclerView: RecyclerView): RecyclerView.LayoutManager {
return recyclerView.layoutManager ?: throw MissingLayoutManagerException("RecyclerView's Layout Manager must be configured")
}

fun validateModelClassIsDiffable(clazz: Class<*>) {
if (!Diffable::class.java.isAssignableFrom(clazz)) {
throw UnsupportedClassException("${clazz.simpleName} must implement Diffable interface")
}
}
}
}

0 comments on commit dbf7933

Please sign in to comment.