Skip to content

Commit

Permalink
- Code format
Browse files Browse the repository at this point in the history
  • Loading branch information
MayconCardoso committed Oct 14, 2020
1 parent c0f13f3 commit bcc7058
Show file tree
Hide file tree
Showing 12 changed files with 410 additions and 370 deletions.
1 change: 1 addition & 0 deletions build-dependencies.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ ext {
logger : ':libraries:library-logger',
loggerAndroid : ':libraries:library-logger-android',
designSystem : ':libraries:library-design-system',
chart : ':libraries:library-chart',
]

submodulesFeatures = [
Expand Down
1 change: 1 addition & 0 deletions features/feature-timeline-balance/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ android {
dependencies {
implementation project(path: submodulesPlatform.domain)
implementation project(path: submodulesLibraries.designSystem)
implementation project(path: submodulesLibraries.chart)

// Personal libs
implementation globalDependencies.mvvmArchitectureCore
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,21 +7,21 @@ import org.koin.androidx.viewmodel.dsl.viewModel
import org.koin.dsl.module

val timelineBalanceViewModel = module {
viewModel {
TimelineBalanceListViewModel(
getCurrentPeriodBalanceCase = get()
)
}
viewModel {
TimelineBalanceListViewModel(
getCurrentPeriodBalanceCase = get()
)
}

viewModel {
TimelineBalanceAddViewModel(
createPeriodCase = get()
)
}
viewModel {
TimelineBalanceAddViewModel(
createPeriodCase = get()
)
}

viewModel {
TimelineBalanceEditViewModel(
editPeriodCase = get()
)
}
viewModel {
TimelineBalanceEditViewModel(
editPeriodCase = get()
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,14 @@ import android.os.Bundle
import com.mctech.stocktradetracking.domain.timeline_balance.entity.TimelineBalance

interface TimelineBalanceNavigator {
fun fromTimelineToOpenPeriod()
fun fromTimelineToEditPeriod(currentPeriod: TimelineBalance)
fun navigateBack()
fun fromTimelineToOpenPeriod()
fun fromTimelineToEditPeriod(currentPeriod: TimelineBalance)
fun navigateBack()
}

fun timelinePeriodFromBundle(bundle: Bundle): TimelineBalance {
if (bundle.containsKey("currentPeriod")) {
return bundle.getSerializable("currentPeriod") as TimelineBalance
}
throw IllegalArgumentException("Required argument \"currentPeriod\" is missing and does not have an android:defaultValue")
if (bundle.containsKey("currentPeriod")) {
return bundle.getSerializable("currentPeriod") as TimelineBalance
}
throw IllegalArgumentException("Required argument \"currentPeriod\" is missing and does not have an android:defaultValue")
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,12 @@
package com.mctech.stocktradetracking.feature.timeline_balance.list_period

import android.os.Bundle
import android.view.*
import android.view.LayoutInflater
import android.view.Menu
import android.view.MenuInflater
import android.view.MenuItem
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import androidx.recyclerview.widget.DiffUtil
import com.mctech.architecture.mvvm.x.core.ComponentState
Expand All @@ -12,102 +17,113 @@ import com.mctech.stocktradetracking.feature.timeline_balance.R
import com.mctech.stocktradetracking.feature.timeline_balance.TimelineBalanceNavigator
import com.mctech.stocktradetracking.feature.timeline_balance.databinding.FragmentTimelineBalanceBinding
import com.mctech.stocktradetracking.feature.timeline_balance.databinding.ItemTimelinePeriodListBinding
import com.mctech.stocktradetracking.library.chart.money.MoneyVariationEntry
import org.koin.android.ext.android.inject
import org.koin.androidx.viewmodel.ext.android.sharedViewModel

class TimelineBalanceListFragment : Fragment() {
private val viewModel : TimelineBalanceListViewModel by sharedViewModel()
private val navigator : TimelineBalanceNavigator by inject()
private var binding : FragmentTimelineBalanceBinding? = null

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
setHasOptionsMenu(true)

return FragmentTimelineBalanceBinding.inflate(inflater, container, false).let {
binding = it
binding?.viewModel = viewModel
binding?.lifecycleOwner = this
it.root
}
}

override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
inflater.inflate(R.menu.timeline_balance_menu, menu)
}

override fun onOptionsItemSelected(item: MenuItem): Boolean {
when(item.itemId){
R.id.menu_add -> {
navigateToAddPositionFlow()
}
}
return true
}

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
bindState(viewModel.periodList){ handlePeriodListState(it) }
bindState(viewModel.finalBalance){ handleFinalBalanceState(it) }
bindListeners()
}

override fun onStart() {
super.onStart()
viewModel.interact(TimelineBalanceListInteraction.LoadTimelineComponent)
}

private fun handleFinalBalanceState(finalBalanceState: ComponentState<TimelineBalance?>) {
when(finalBalanceState){
is ComponentState.Success -> {
binding?.finalBalance = finalBalanceState.result
binding?.executePendingBindings()
}
}
}

private fun handlePeriodListState(state: ComponentState<List<TimelineBalance>>) {
when(state){
is ComponentState.Success -> {
renderStockList(state.result)
}
}
}

private fun renderStockList(result: List<TimelineBalance>) {
binding?.recyclerView?.attachSimpleDataBindingData(
items = result,
viewBindingCreator = { parent, inflater ->
ItemTimelinePeriodListBinding.inflate(inflater, parent, false)
},
prepareHolder = { item, viewBinding, _ ->
viewBinding.item = item
viewBinding.cardItem.setOnClickListener {
navigateToEditPosition(item)
}
},
updateCallback = object : DiffUtil.ItemCallback<TimelineBalance>() {
override fun areItemsTheSame(left: TimelineBalance, right: TimelineBalance) = left.periodTag == right.periodTag

override fun areContentsTheSame(left: TimelineBalance, right: TimelineBalance): Boolean {
return left.periodTag == right.periodTag
&& left.periodProfit == right.periodProfit
&& left.periodInvestment == right.periodInvestment
&& left.getFinalBalance() == right.getFinalBalance()
}
}
)
}

private fun bindListeners() {
binding?.btAddPeriod?.setOnClickListener {
navigateToAddPositionFlow()
}
}

private fun navigateToAddPositionFlow() {
navigator.fromTimelineToOpenPeriod()
}

private fun navigateToEditPosition(item: TimelineBalance) {
navigator.fromTimelineToEditPeriod(item)
}
private val viewModel: TimelineBalanceListViewModel by sharedViewModel()
private val navigator: TimelineBalanceNavigator by inject()
private var binding: FragmentTimelineBalanceBinding? = null

override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
setHasOptionsMenu(true)

return FragmentTimelineBalanceBinding.inflate(inflater, container, false).let {
binding = it
binding?.viewModel = viewModel
binding?.lifecycleOwner = this
it.root
}
}

override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
inflater.inflate(R.menu.timeline_balance_menu, menu)
}

override fun onOptionsItemSelected(item: MenuItem): Boolean {
when (item.itemId) {
R.id.menu_add -> {
navigateToAddPositionFlow()
}
}
return true
}

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
bindState(viewModel.periodList) { handlePeriodListState(it) }
bindState(viewModel.finalBalance) { handleFinalBalanceState(it) }
bindListeners()
}

override fun onStart() {
super.onStart()
viewModel.interact(TimelineBalanceListInteraction.LoadTimelineComponent)
}

private fun handleFinalBalanceState(finalBalanceState: ComponentState<TimelineBalance?>) {
when (finalBalanceState) {
is ComponentState.Success -> {
binding?.finalBalance = finalBalanceState.result
binding?.executePendingBindings()
}
}
}

private fun handlePeriodListState(state: ComponentState<List<TimelineBalance>>) {
when (state) {
is ComponentState.Success -> {
renderStockList(state.result)
renderChart(state.result)
}
}
}

private fun renderChart(result: List<TimelineBalance>) {
binding?.chartView?.setData(result.reversed().map { MoneyVariationEntry(it.getFinalProfit()) })
}

private fun renderStockList(result: List<TimelineBalance>) {
binding?.recyclerView?.attachSimpleDataBindingData(
items = result,
viewBindingCreator = { parent, inflater ->
ItemTimelinePeriodListBinding.inflate(inflater, parent, false)
},
prepareHolder = { item, viewBinding, _ ->
viewBinding.item = item
viewBinding.cardItem.setOnClickListener {
navigateToEditPosition(item)
}
},
updateCallback = object : DiffUtil.ItemCallback<TimelineBalance>() {
override fun areItemsTheSame(left: TimelineBalance, right: TimelineBalance) =
left.periodTag == right.periodTag

override fun areContentsTheSame(left: TimelineBalance, right: TimelineBalance): Boolean {
return left.periodTag == right.periodTag
&& left.periodProfit == right.periodProfit
&& left.periodInvestment == right.periodInvestment
&& left.getFinalBalance() == right.getFinalBalance()
}
}
)
}

private fun bindListeners() {
binding?.btAddPeriod?.setOnClickListener {
navigateToAddPositionFlow()
}
}

private fun navigateToAddPositionFlow() {
navigator.fromTimelineToOpenPeriod()
}

private fun navigateToEditPosition(item: TimelineBalance) {
navigator.fromTimelineToEditPeriod(item)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,5 @@ package com.mctech.stocktradetracking.feature.timeline_balance.list_period
import com.mctech.architecture.mvvm.x.core.UserInteraction

sealed class TimelineBalanceListInteraction : UserInteraction {
object LoadTimelineComponent : TimelineBalanceListInteraction()
object LoadTimelineComponent : TimelineBalanceListInteraction()
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import com.mctech.architecture.mvvm.x.core.BaseViewModel
import com.mctech.architecture.mvvm.x.core.ComponentState
import com.mctech.architecture.mvvm.x.core.UserInteraction
import com.mctech.architecture.mvvm.x.core.OnInteraction
import com.mctech.architecture.mvvm.x.core.ktx.changeToErrorState
import com.mctech.architecture.mvvm.x.core.ktx.changeToLoadingState
import com.mctech.architecture.mvvm.x.core.ktx.changeToSuccessState
Expand All @@ -13,43 +13,38 @@ import com.mctech.stocktradetracking.domain.timeline_balance.entity.TimelineBala
import com.mctech.stocktradetracking.domain.timeline_balance.interaction.GetCurrentPeriodBalanceCase

class TimelineBalanceListViewModel constructor(
private val getCurrentPeriodBalanceCase : GetCurrentPeriodBalanceCase
private val getCurrentPeriodBalanceCase: GetCurrentPeriodBalanceCase
) : BaseViewModel() {

private val currentListOfPeriods = mutableListOf<TimelineBalance>()
private val currentListOfPeriods = mutableListOf<TimelineBalance>()

private val _periodList: MutableLiveData<ComponentState<List<TimelineBalance>>> = MutableLiveData(ComponentState.Initializing)
val periodList: LiveData<ComponentState<List<TimelineBalance>>> = _periodList
private val _periodList: MutableLiveData<ComponentState<List<TimelineBalance>>> = MutableLiveData(ComponentState.Initializing)
val periodList: LiveData<ComponentState<List<TimelineBalance>>> = _periodList

private val _finalBalance: MutableLiveData<ComponentState<TimelineBalance?>> = MutableLiveData(ComponentState.Initializing)
val finalBalance: LiveData<ComponentState<TimelineBalance?>> = _finalBalance
private val _finalBalance: MutableLiveData<ComponentState<TimelineBalance?>> = MutableLiveData(ComponentState.Initializing)
val finalBalance: LiveData<ComponentState<TimelineBalance?>> = _finalBalance

override suspend fun handleUserInteraction(interaction: UserInteraction) {
when (interaction) {
is TimelineBalanceListInteraction.LoadTimelineComponent -> loadTimelineComponentInteraction()
}
}
@OnInteraction(TimelineBalanceListInteraction.LoadTimelineComponent::class)
private suspend fun loadTimelineComponentInteraction() {
_periodList.changeToLoadingState()
_finalBalance.changeToLoadingState()

private suspend fun loadTimelineComponentInteraction() {
_periodList.changeToLoadingState()
_finalBalance.changeToLoadingState()

when (val result = getCurrentPeriodBalanceCase.execute()) {
is Result.Success -> {
computeFinalBalance(result.result)
_periodList.changeToSuccessState(result.result)
}
is Result.Failure -> {
_periodList.changeToErrorState(result.throwable)
_finalBalance.changeToErrorState(result.throwable)
}
}
when (val result = getCurrentPeriodBalanceCase.execute()) {
is Result.Success -> {
computeFinalBalance(result.result)
_periodList.changeToSuccessState(result.result)
}
is Result.Failure -> {
_periodList.changeToErrorState(result.throwable)
_finalBalance.changeToErrorState(result.throwable)
}
}
}

private fun computeFinalBalance(result: List<TimelineBalance>) {
currentListOfPeriods.clear()
currentListOfPeriods.addAll(result)
private fun computeFinalBalance(result: List<TimelineBalance>) {
currentListOfPeriods.clear()
currentListOfPeriods.addAll(result)

_finalBalance.changeToSuccessState(result.firstOrNull())
}
_finalBalance.changeToSuccessState(result.firstOrNull())
}
}
Loading

0 comments on commit bcc7058

Please sign in to comment.