package Ġcom . ange lor ob son . product . presentation . view model Ċ Ċ import Ġandroid . app . Application Ċ import Ġandroidx . lifecycle . Android ViewModel Ċ import Ġandroidx . lifecycle . Mutable LiveData Ċ import Ġandroidx . lifecycle . viewModel Scope Ċ import Ġcom . ange lor ob son . core . utils . Callback Result Ċ import Ġcom . ange lor ob son . product . R Ċ import Ġcom . ange lor ob son . product . domain . use case . Insert Product UseCase Ċ import Ġcom . ange lor ob son . product . presentation . mapper . Object Save Product Presentation To Domain Mapper Ċ import Ġcom . ange lor ob son . product . presentation . model . Product To Save Presentation Ċ import Ġkotlinx . coroutines . flow .* Ċ import Ġkotlinx . coroutines . launch Ċ Ċ class ĠAdd Product ViewModel ( ĊĠĠĠ Ġprivate Ġval Ġuse Case : ĠInsert Product UseCase , ĊĠĠĠ Ġprivate Ġval Ġmapper : ĠObject Save Product Presentation To Domain Mapper , ĊĠĠĠ Ġapplication : ĠApplication Ċ ) Ġ: ĠAndroid ViewModel ( application ) Ġ{ ĊĊĠĠĠ Ġvar Ġname Ġ= ĠMutable LiveData < String >() ĊĠĠĠ Ġvar Ġdescription Ġ= ĠMutable LiveData < String >() ĊĠĠĠ Ġvar Ġprice Ġ= ĠMutable LiveData < String >() ĊĊĠĠĠ Ġprivate Ġval Ġ_ save Result Flow Ġ= ĠMutable State Flow < Callback Result < Long >>( Callback Result . Loading ()) ĊĠĠĠ Ġval Ġsave Result Flow : ĠState Flow < Callback Result < Long >> Ġget () Ġ= Ġ_ save Result Flow ĊĊĠĠĠ Ġfun Ġsave Product ( product : ĠProduct To Save Presentation ) Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Form Valid ( product )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġproduct Domain Ġ= Ġmapper . map ( product ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuse Case . invoke ( product Domain ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. onStart Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ save Result Flow . value Ġ= ĠCallback Result . Loading () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. catch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ save Result Flow . value Ġ= ĠCallback Result . Error ( it . localized Message ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. collect Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ save Result Flow . value Ġ= ĠCallback Result . Success ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġis Form Valid ( product : ĠProduct To Save Presentation ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġvalid Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġval Ġempty Text Ġ= Ġget Application < Application >(). getString ( R . string . empty _ field ) ĊĠĠĠĠĠĠĠ Ġval Ġgreater Than Zero Ġ= Ġget Application < Application >(). getString ( R . string . greater _ than _ zero ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( product . name . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġname . value Ġ= Ġempty Text ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalid Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( product . description . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdescription . value Ġ= Ġempty Text ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalid Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( product . price Ġ<= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprice . value Ġ= Ġgreater Than Zero ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalid Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġvalid ĊĠĠĠ Ġ} Ċ Ċ }