Skip to content

Commit

Permalink
consolidate the ToolAdapterToolViewModels into a single ViewModel
Browse files Browse the repository at this point in the history
  • Loading branch information
frett committed Jan 29, 2021
1 parent ffd34f4 commit 4d5ffe2
Show file tree
Hide file tree
Showing 3 changed files with 74 additions and 84 deletions.
20 changes: 9 additions & 11 deletions app/src/main/java/org/cru/godtools/ui/tools/ToolsAdapter.kt
Expand Up @@ -17,16 +17,16 @@ import org.ccci.gto.android.common.recyclerview.advrecyclerview.draggable.Simple
import org.cru.godtools.databinding.ToolsListItemToolBinding
import org.cru.godtools.model.Tool

private const val VIEW_MODEL_KEY_PREFIX =
"org.cru.godtools.ui.tools.ToolsAdapter:org.cru.godtools.ui.tools.ToolsAdapterToolViewModel"
private typealias VH = DataBindingDraggableItemViewHolder<ToolsListItemToolBinding>

class ToolsAdapter(lifecycleOwner: LifecycleOwner, private val viewModelProvider: ViewModelProvider) :
class ToolsAdapter(lifecycleOwner: LifecycleOwner, viewModelProvider: ViewModelProvider) :
SimpleDataBindingDraggableItemAdapter<ToolsListItemToolBinding>(lifecycleOwner), Observer<List<Tool>> {
init {
setHasStableIds(true)
}

private val viewModel = viewModelProvider.get(ToolsAdapterViewModel::class.java)

val callbacks = ObservableField<ToolsAdapterCallbacks>()
private var tools: List<Tool>? = null
set(value) {
Expand Down Expand Up @@ -54,16 +54,14 @@ class ToolsAdapter(lifecycleOwner: LifecycleOwner, private val viewModelProvider

override fun onBindViewDataBinding(binding: ToolsListItemToolBinding, position: Int) {
val tool = getItem(position)
val code = tool?.code
val viewModel = viewModelProvider.get("$VIEW_MODEL_KEY_PREFIX:$code", ToolsAdapterToolViewModel::class.java)
.also { it.toolCode.value = code }
val toolViewModel = tool?.code?.let { viewModel.getToolViewModel(it) }

binding.tool = tool
binding.setDownloadProgress(viewModel.downloadProgress)
binding.setBanner(viewModel.banner)
binding.primaryTranslation = viewModel.firstTranslation
binding.parallelTranslation = viewModel.parallelTranslation
binding.parallelLanguage = viewModel.parallelLanguage
binding.setDownloadProgress(toolViewModel?.downloadProgress)
binding.setBanner(toolViewModel?.banner)
binding.primaryTranslation = toolViewModel?.firstTranslation
binding.parallelTranslation = toolViewModel?.parallelTranslation
binding.parallelLanguage = toolViewModel?.parallelLanguage
}

override fun onDetachedFromRecyclerView(recyclerView: RecyclerView) {
Expand Down

This file was deleted.

@@ -0,0 +1,65 @@
package org.cru.godtools.ui.tools

import androidx.lifecycle.ViewModel
import androidx.lifecycle.map
import androidx.lifecycle.switchMap
import dagger.hilt.android.lifecycle.HiltViewModel
import javax.inject.Inject
import org.ccci.gto.android.common.androidx.lifecycle.combineWith
import org.ccci.gto.android.common.androidx.lifecycle.emptyLiveData
import org.ccci.gto.android.common.androidx.lifecycle.orEmpty
import org.ccci.gto.android.common.androidx.lifecycle.switchCombineWith
import org.ccci.gto.android.common.db.Query
import org.ccci.gto.android.common.db.findLiveData
import org.ccci.gto.android.common.db.getAsLiveData
import org.cru.godtools.base.Settings
import org.cru.godtools.download.manager.GodToolsDownloadManager
import org.cru.godtools.model.Attachment
import org.cru.godtools.model.Language
import org.keynote.godtools.android.db.Contract.AttachmentTable
import org.keynote.godtools.android.db.Contract.ToolTable
import org.keynote.godtools.android.db.GodToolsDao

@HiltViewModel
class ToolsAdapterViewModel @Inject constructor(
private val dao: GodToolsDao,
private val downloadManager: GodToolsDownloadManager,
private val settings: Settings
) : ViewModel() {
private val toolViewModels = mutableMapOf<String, ToolViewModel>()
fun getToolViewModel(tool: String) = toolViewModels.getOrPut(tool) { ToolViewModel(tool) }

inner class ToolViewModel(private val tool: String) {
val banner = Query.select<Attachment>()
.join(AttachmentTable.SQL_JOIN_TOOL)
.where(
ToolTable.FIELD_CODE.eq(tool)
.and(ToolTable.FIELD_BANNER.eq(AttachmentTable.FIELD_ID))
.and(AttachmentTable.SQL_WHERE_DOWNLOADED)
)
.limit(1)
.getAsLiveData(dao)
.map { it.firstOrNull() }

private val primaryTranslation =
settings.primaryLanguageLiveData.switchMap { dao.getLatestTranslationLiveData(tool, it) }
private val defaultTranslation = dao.getLatestTranslationLiveData(tool, Settings.defaultLanguage)
internal val firstTranslation = primaryTranslation.combineWith(defaultTranslation) { p, d -> p ?: d }
internal val parallelTranslation =
settings.parallelLanguageLiveData.switchMap { dao.getLatestTranslationLiveData(tool, it) }

internal val parallelLanguage = parallelTranslation.switchMap { t ->
t?.languageCode?.let { dao.findLiveData<Language>(it) }.orEmpty()
}

internal val downloadProgress =
primaryTranslation.switchCombineWith(defaultTranslation, parallelTranslation) { prim, def, para ->
when {
prim != null -> downloadManager.getDownloadProgressLiveData(tool, prim.languageCode)
def != null -> downloadManager.getDownloadProgressLiveData(tool, def.languageCode)
para != null -> downloadManager.getDownloadProgressLiveData(tool, para.languageCode)
else -> emptyLiveData()
}
}
}
}

0 comments on commit 4d5ffe2

Please sign in to comment.