Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Edit cell when creating new board #62

Merged
merged 5 commits into from
Jul 15, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .idea/misc.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.architectcoders.aacboard.di

import androidx.lifecycle.SavedStateHandle
import com.architectcoders.aacboard.ui.fragments.EditBoardCellFragmentArgs
import com.architectcoders.aacboard.ui.fragments.viewmodel.EditBoardCellViewModel
import com.architectcoders.aacboard.ui.fragments.viewmodel.EditDashBoardViewModel
import com.architectcoders.aacboard.ui.fragments.viewmodel.ListDashboardsViewModel
Expand All @@ -14,9 +15,11 @@ val viewModelModule = module {
viewModel { ListDashboardsViewModel(get(), get(), get()) }
viewModel { MainDashboardViewModel(get()) }
viewModel { SearchPictogramsViewModel(get(), get()) }
viewModel { (handle: SavedStateHandle) ->
viewModel { params->
EditBoardCellViewModel(
handle,
dashBoardId = params.component1(),
row = params.component2(),
column = params.component3(),
get(),
get(),
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import androidx.navigation.fragment.navArgs
import com.architectcoders.aacboard.R
import com.architectcoders.aacboard.databinding.FragmentEditBoardCellBinding
import com.architectcoders.aacboard.ui.fragments.stateholder.EditBoardCellState
Expand All @@ -14,12 +15,17 @@ import com.architectcoders.aacboard.ui.model.PictogramUI
import com.architectcoders.aacboard.ui.utils.diff
import com.architectcoders.aacboard.ui.utils.loadUrl
import org.koin.androidx.viewmodel.ext.android.viewModel
import org.koin.core.parameter.parametersOf

class EditBoardCellFragment : Fragment(R.layout.fragment_edit_board_cell) {
private var _binding: FragmentEditBoardCellBinding? = null
private val binding get() = _binding!!

private val viewModel: EditBoardCellViewModel by viewModel()
private val args by navArgs<EditBoardCellFragmentArgs>()

private val viewModel: EditBoardCellViewModel by viewModel() {
parametersOf(args.dashboardId, args.row, args.column)
}

private lateinit var editBoardCellState: EditBoardCellState

Expand Down Expand Up @@ -50,29 +56,32 @@ class EditBoardCellFragment : Fragment(R.layout.fragment_edit_board_cell) {
editBoardCellState.onCancel()
}
}

onColumnChanged()
onRowChanged()
}

private fun collectState() {
viewModel.state.let { uiStateFlow ->
diff(uiStateFlow, { it.column }, ::onColumnChanged)
diff(uiStateFlow, { it.row }, ::onRowChanged)
diff(uiStateFlow, { it.pictogram }, ::onPictogramChanged)
diff(uiStateFlow, { it.exit }, ::onExitChanged)
}
}

private fun onColumnChanged(column: Int) {
binding.columnLabel.text = getString(R.string.column_label, column)
private fun onColumnChanged() {
binding.columnLabel.text = getString(R.string.column_label, viewModel.getColumn())
}

private fun onRowChanged(row: Int) {
binding.rowLabel.text = getString(R.string.row_label, row)
private fun onRowChanged() {
binding.rowLabel.text = getString(R.string.row_label, viewModel.getRow())
}

private fun onPictogramChanged(pictogram: PictogramUI?) {
pictogram?.let {
binding.pictogram.loadUrl(it.url)
binding.keyword.setText(it.keyword)
if(!it.url.isNullOrEmpty()){
binding.pictogram.loadUrl(it.url)
binding.keyword.setText(it.keyword)
}
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@ import androidx.recyclerview.widget.GridLayoutManager
import com.architectcoders.aacboard.R
import com.architectcoders.aacboard.databinding.FragmentEditDashboardBinding
import com.architectcoders.aacboard.ui.fragments.adapter.DashboardCellsAdapter
import com.architectcoders.aacboard.ui.fragments.stateholder.EditDashboardState
import com.architectcoders.aacboard.ui.fragments.stateholder.buildEditDashboardState
import com.architectcoders.aacboard.ui.fragments.viewmodel.EditDashBoardViewModel
import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.launch
Expand All @@ -27,10 +29,16 @@ class EditDashboardFragment : Fragment() {

private val args by navArgs<EditDashboardFragmentArgs>()

private val state: EditDashboardState by lazy {
buildEditDashboardState()
}

private val viewModel: EditDashBoardViewModel by viewModel {
parametersOf(args.dashBoardId)
}
private val dashboardCellsAdapter = DashboardCellsAdapter { }
private val dashboardCellsAdapter = DashboardCellsAdapter { cell ->

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

for consistency i would move this to an state holder as the in the other fragments

state.onCellClicked(args.dashBoardId, cell.column, cell.row)
}

override fun onCreateView(
inflater: LayoutInflater,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ class MainDashboardFragment : Fragment() {

private val viewModel: MainDashboardViewModel by viewModel()

private val dashboardCellsAdapter = DashboardCellsAdapter { viewModel.onPictogramClicked(it) }
private val dashboardCellsAdapter = DashboardCellsAdapter { viewModel.onPictogramClicked(it.cellPictogram) }

override fun onCreateView(
inflater: LayoutInflater,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ import com.architectcoders.aacboard.ui.utils.getScreenSize
import com.architectcoders.aacboard.ui.utils.loadUrl

class DashboardCellsAdapter(
private val onPictogramClicked: (CellPictogram?) -> Unit,
private val onPictogramClicked: (Cell) -> Unit,
) : RecyclerView.Adapter<DashboardCellsAdapter.ViewHolder>() {

companion object {
Expand Down Expand Up @@ -65,7 +65,7 @@ class DashboardCellsAdapter(
with(binding) {
item.cellPictogram?.url?.let { url -> cellPictogram.loadUrl(url) }
item.cellPictogram?.keyword?.let { cellPictogramKeyword.text = it }
root.setOnClickListener { onPictogramClicked(item.cellPictogram) }
root.setOnClickListener { onPictogramClicked(item) }
}
binding.cellPictogram.layoutParams.width = minOf(finalWidth, finalHeight)
binding.cellPictogram.layoutParams.height = minOf(finalWidth, finalHeight)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package com.architectcoders.aacboard.ui.fragments.stateholder

import android.content.Context
import androidx.fragment.app.Fragment
import androidx.navigation.NavController
import androidx.navigation.fragment.findNavController
import com.architectcoders.aacboard.R
import com.architectcoders.aacboard.ui.fragments.EditDashboardFragmentDirections

class EditDashboardState(
private val navController: NavController,
) {

fun onCellClicked(dashBoardId: Int, row: Int, column: Int) {
val action = EditDashboardFragmentDirections.actionEditDashboardToEditBoardCell(
dashBoardId,
row,
column
)
navController.navigate(action)
}
}

fun Fragment.buildEditDashboardState(
navController: NavController = findNavController(),
) = EditDashboardState(navController)
Original file line number Diff line number Diff line change
@@ -1,13 +1,11 @@
package com.architectcoders.aacboard.ui.fragments.viewmodel

import androidx.lifecycle.SavedStateHandle
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.architectcoders.aacboard.domain.data.cell.Cell
import com.architectcoders.aacboard.domain.data.cell.CellPictogram
import com.architectcoders.aacboard.domain.use_case.cell.get.GetCellUseCase
import com.architectcoders.aacboard.domain.use_case.cell.save.SaveCellUseCase
import com.architectcoders.aacboard.ui.fragments.EditBoardCellFragmentArgs
import com.architectcoders.aacboard.ui.model.PictogramUI
import com.architectcoders.aacboard.ui.model.toUIPictogram
import kotlinx.coroutines.flow.MutableStateFlow
Expand All @@ -17,7 +15,9 @@ import kotlinx.coroutines.flow.update
import kotlinx.coroutines.launch

class EditBoardCellViewModel(
savedStateHandle: SavedStateHandle,
private val dashBoardId: Int,
private val row: Int,
private val column: Int,
private val saveCellUseCase: SaveCellUseCase,
private val getCellUseCase: GetCellUseCase,
) : ViewModel() {
Expand All @@ -26,30 +26,29 @@ class EditBoardCellViewModel(
EditBoardCellUiState(),
)
val state: StateFlow<EditBoardCellUiState> get() = _state.asStateFlow()
private val dashboardId: Int

init {
EditBoardCellFragmentArgs.fromSavedStateHandle(savedStateHandle).apply {
this@EditBoardCellViewModel.dashboardId = dashboardId
viewModelScope.launch {
val cell: Cell = getCellUseCase(dashboardId, row, column) ?: Cell(row, column, null)
updateUiState(
_state.value.copy(
row = row,
column = column,
pictogram = cell.cellPictogram?.toUIPictogram()
)
viewModelScope.launch {
val cell: Cell? = getCellUseCase(dashBoardId, row, column)
updateUiState(
_state.value.copy(
row = row,
column = column,
pictogram = cell?.cellPictogram?.toUIPictogram()
)
}
)
}
}

fun getColumn() = column
fun getRow() = row

fun onSaveClicked(keyword: String) {
_state.value.apply {
pictogram?.let {
viewModelScope.launch {
saveCellUseCase(
dashboardId,
dashBoardId,
Cell(row, column, CellPictogram(keyword, it.url))
)
updateUiState(_state.value.copy(exit = true))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,6 @@ class EditBoardCellViewModelTest {
@get:Rule
val coroutinesTestRule = CoroutinesTestRule()

val stateHandle: SavedStateHandle =
SavedStateHandle(mapOf("dashboardId" to 1, "row" to 2, "column" to 3))

@Mock
lateinit var saveCellUseCase: SaveCellUseCase
Expand All @@ -49,7 +47,7 @@ class EditBoardCellViewModelTest {
onBlocking { getCellUseCase(1, 2, 3) }.doReturn(null)
}

viewModel = EditBoardCellViewModel(stateHandle, saveCellUseCase, getCellUseCase)
viewModel = EditBoardCellViewModel(1, 2, 3, saveCellUseCase, getCellUseCase)

viewModel.state.test {
assertEquals(EditBoardCellUiState(), awaitItem())
Expand All @@ -68,7 +66,7 @@ class EditBoardCellViewModelTest {
onBlocking { getCellUseCase(1, 2, 3) }.doReturn(Cell(2, 3, sampleCellPictogram))
}

viewModel = EditBoardCellViewModel(stateHandle, saveCellUseCase, getCellUseCase)
viewModel = EditBoardCellViewModel(1, 2, 3, saveCellUseCase, getCellUseCase)

viewModel.state.test {
assertEquals(EditBoardCellUiState(), awaitItem())
Expand All @@ -91,7 +89,7 @@ class EditBoardCellViewModelTest {
onBlocking { getCellUseCase(1, 2, 3) }.doReturn(Cell(2, 3, sampleCellPictogram))
}

viewModel = EditBoardCellViewModel(stateHandle, saveCellUseCase, getCellUseCase)
viewModel = EditBoardCellViewModel(1, 2, 3, saveCellUseCase, getCellUseCase)

viewModel.state.test {
assertEquals(EditBoardCellUiState(), awaitItem())
Expand Down Expand Up @@ -119,7 +117,7 @@ class EditBoardCellViewModelTest {
onBlocking { getCellUseCase(1, 2, 3) }.doReturn(Cell(2, 3, sampleCellPictogram))
}

viewModel = EditBoardCellViewModel(stateHandle, saveCellUseCase, getCellUseCase)
viewModel = EditBoardCellViewModel(1, 2, 3, saveCellUseCase, getCellUseCase)

viewModel.state.test {
assertEquals(EditBoardCellUiState(), awaitItem())
Expand Down
Loading