Skip to content

Commit

Permalink
Merge pull request #62 from fesave/feature/edit_new_dashboard_cell
Browse files Browse the repository at this point in the history
Edit cell when creating new board
  • Loading branch information
fesave committed Jul 15, 2023
2 parents 2739896 + e91a825 commit fcbd81d
Show file tree
Hide file tree
Showing 9 changed files with 81 additions and 38 deletions.
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 ->
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

0 comments on commit fcbd81d

Please sign in to comment.