package Ġcom . li or hass . android . med s stock tracker . edit med icine Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroid . view . input method . Input Method Manager Ċ import Ġandroidx . appcompat . app . AlertDialog Ċ import Ġandroidx . fragment . app . Fragment Ċ import Ġandroidx . lifecycle . ViewModel Provider Ċ import Ġandroidx . navigation . fragment . find Nav Controller Ċ import Ġandroidx . navigation . fragment . nav Args Ċ import Ġcom . google . android . material . dialog . Material AlertDialog Builder Ċ import Ġcom . li or hass . android . med s stock tracker . M ST Application Ċ import Ġcom . li or hass . android . med s stock tracker . MainActivity Ċ import Ġcom . li or hass . android . med s stock tracker . R Ċ import Ġcom . li or hass . android . med s stock tracker . database . App Database Ċ import Ġcom . li or hass . android . med s stock tracker . databinding . Dialog AddTo Med icine Stock Binding Ċ import Ġcom . li or hass . android . med s stock tracker . databinding . Fragment Edit Med icine Binding Ċ import Ġcom . li or hass . android . med s stock tracker . util . Navigation Dest inations Ċ import Ġcom . li or hass . android . med s stock tracker . util . Navigation Event With No Arguments Ċ import Ġcom . li or hass . android . med s stock tracker . util . One Time Event Ċ // import Ġkotlinx . android . synt hetic . main . activity _ main _ app _ screen .* Ċ import Ġtim ber . log . Tim ber Ċ Ċ class ĠEdit Med icine Fragment Ġ: ĠFragment () Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġargs : ĠEdit Med icine Fragment Args Ġby Ġnav Args () Ġ// ĠAutomatically Ġgenerated Ġby Ġthe Ġsafe Args Ġplugin ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġbinding : ĠFragment Edit Med icine Binding ĊĠĠĠ Ġprivate Ġlateinit Ġvar ĠviewModel : ĠEdit Med icine ViewModel ĊĠĠĠ Ġprivate Ġvar ĠaddTo Stock Dialog : ĠAlertDialog ? Ġ= Ġnull ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate View ( ĊĠĠĠĠĠĠĠ Ġinflater : ĠLayoutInflater , Ġcontainer : ĠViewGroup ?, ĊĠĠĠĠĠĠĠ ĠsavedInstanceState : ĠBundle ? ĊĠĠĠ Ġ): ĠView Ġ{ ĊĠĠĠĠĠĠĠ Ġbinding Ġ= ĠFragment Edit Med icine Binding . inflate ( in flater , Ġcontainer , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġbinding . lifecycle Owner Ġ= Ġview Lifecycle Owner ĊĊĠĠĠĠĠĠĠ Ġval Ġapplication Ġ= Ġrequire NotNull ( this . activity ). application Ġas ĠM ST Application ĊĠĠĠĠĠĠĠ Ġval Ġmedic ine Dao Ġ= ĠApp Database . getInstance ( application ). med icine Dao ĊĠĠĠĠĠĠĠ Ġval Ġlogged Events Dao Ġ= ĠApp Database . getInstance ( application ). logged Event Dao ĊĠĠĠĠĠĠĠ Ġval Ġmedic ine Id Ġ= Ġargs . med icine Id ĊĠĠĠĠĠĠĠ Ġval Ġv ew Model Factory Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEdit Med icine ViewModel Factory ( med icine Id , Ġmedic ine Dao , Ġlogged Events Dao , Ġapplication ) ĊĠĠĠĠĠĠĠ ĠviewModel Ġ= ĠViewModel Provider ( this , Ġv ew Model Factory ). get ( Edit Med icine ViewModel :: class . java ) ĊĠĠĠĠĠĠĠ ĠviewModel . navigation Trigger . observe ( view Lifecycle Owner , Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnavigate To Destination ( it ) ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ ĠviewModel . med icine Name Input Error . observe ( view Lifecycle Owner , Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmedic ine Name Input Error ( it ) ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ ĠviewModel . daily D ose Input Error . observe ( view Lifecycle Owner , Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdaily D ose Input Error ( it ) ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ ĠviewModel . current Stock Input Error . observe ( view Lifecycle Owner , Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Stock Input Error ( it ) ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ ĠviewModel . reset Input Errors . observe ( view Lifecycle Owner , Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreset Error Mark ings ( it ) ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ ĠviewModel . show Dialog . observe ( view Lifecycle Owner , Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshow Dialog ( it ) ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ ĠviewModel . close Dialog . observe ( view Lifecycle Owner , Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclose Dialog ( it ) ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġbinding . viewModel Ġ= ĠviewModel ĊĠĠĠĠĠĠĠ Ġbinding . form Fields Ġ= ĠviewModel . form Fields ĊĊĠĠĠĠĠĠĠ Ġreturn Ġbinding . root ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon View Created ( view : ĠView , ĠsavedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on View Created ( view , ĠsavedInstanceState ) ĊĠĠĠĠĠĠĠ Ġset Screen Title () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠSome Ġinput Ġerror Ġin Ġthe Ġmedic ine Ġname Ġfield Ġ( prob ably Ġwas Ġleft Ġempty ). ĠWe Ġshould Ġdisplay Ġan ĊĠĠĠ Ġ// Ġerror Ġmessage . ĊĠĠĠ Ġprivate Ġfun Ġmedic ine Name Input Error ( one Time Event : ĠOne Time Event < Edit Med icine ViewModel . ErrorCode s >) Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠerrorCode Ġ= Ġone Time Event . getContent IfNot Handled () ĊĠĠĠĠĠĠĠ Ġif Ġ( errorCode Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" med icine Name Input Error () Ġsetting Ġerror Ġfield ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġerror Msg Ġ= Ġwhen Ġ( errorCode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEdit Med icine ViewModel . ErrorCode s . NO _ NAME Ġ-> ĠgetString ( R . string . err _ msg _ invalid _ med icine _ name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEdit Med icine ViewModel . ErrorCode s . NAME _ AL READY _ EXIST Ġ-> ĠgetString ( R . string . err _ msg _ duplicate _ med icine _ name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . med icine Name Layout . error Ġ= Ġerror Msg ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠSome Ġinput Ġerror Ġin Ġthe Ġdaily Ġdo se Ġfield Ġ( prob ably Ġwas Ġleft Ġempty ). ĠWe Ġshould Ġdisplay Ġan ĊĠĠĠ Ġ// Ġerror Ġmessage . ĊĠĠĠ Ġprivate Ġfun Ġdaily D ose Input Error ( one Time Event : ĠOne Time Event < Boolean >) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( one Time Event . getContent IfNot Handled () Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" daily D ose Input Error () Ġsetting Ġerror Ġfield ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . daily D ose Layout . error Ġ= ĠgetString ( R . string . err _ msg _ daily _ dose ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠSome Ġinput Ġerror Ġin Ġthe Ġcurrent Ġstock Ġfield Ġ( prob ably Ġwas Ġleft Ġempty ). ĠWe Ġshould Ġdisplay Ġan ĊĠĠĠ Ġ// Ġerror Ġmessage . ĊĠĠĠ Ġprivate Ġfun Ġcurrent Stock Input Error ( one Time Event : ĠOne Time Event < Boolean >) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( one Time Event . getContent IfNot Handled () Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" current Stock Input Error () Ġsetting Ġerror Ġfield ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . current Stock Layout . error Ġ= ĠgetString ( R . string . err _ msg _ current _ stock ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠThis Ġis Ġneeded Ġbecause Ġif Ġthe Ġuser Ġhad Ġerrors , Ġand Ġre - submit s Ġthe Ġform , Ġwe Ġneed Ġto Ġclear ĊĠĠĠ Ġ// Ġthe Ġerror Ġmark ings Ġbefore Ġwe Ġre - evaluate Ġthe Ġform . ĠOtherwise Ġthe Ġold Ġerror Ġmark ings Ġremain ĊĠĠĠ Ġ// Ġon Ġthe Ġscreen . ĊĠĠĠ Ġprivate Ġfun Ġreset Error Mark ings ( one Time Event : ĠOne Time Event < Boolean >) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( one Time Event . getContent IfNot Handled () Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" reset Error Mark ings () Ġclearing Ġerror Ġfield ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . med icine Name Layout . error Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . daily D ose Layout . error Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . current Stock Layout . error Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠSet Ġthe Ġscreen Ġtitle Ġ( on Ġthe Ġtoolbar ) Ġto Ġeither Ġ" Edit ĠMed icine " Ġor Ġ" New ĠMed icine " Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġset Screen Title () Ġ{ ĊĠĠĠĠĠĠĠ Ġ( require Activity () Ġas ĠMainActivity ). support ActionBar ?. title Ġ= ĠviewModel . get Screen Title () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġnavigate To Destination ( navigation Event : ĠOne Time Event < Navigation Event With No Arguments >) Ġ{ ĊĠĠĠĠĠĠĠ Ġnavigation Event . getContent IfNot Handled () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . let Ġ{ Ġevent Ġ-> Ġ// ĠOnly Ġproceed Ġif Ġthe Ġevent Ġhas Ġnever Ġbeen Ġhandled ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( event . destination ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNavigation Dest inations . NAV IG ATION _ DEST INATION _ MED IC INE _ LIST _ FRAGMENT Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfind Nav Controller (). navigate ( Edit Med icine Fragment Directions . action Edit Med icine Fragment To Med icine List Fragment ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠTim ber . w tf (" navigate To Destination (): ĠUnknown Ġdestination : Ġ${ event . destination }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshow Dialog ( dialog Info Event : ĠOne Time Event < Edit Med icine ViewModel . Dialog Info >) Ġ{ ĊĠĠĠĠĠĠĠ Ġdialog Info Event . getContent IfNot Handled ()?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( it . type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEdit Med icine ViewModel . Dialog Types . HELP _ DIALOG Ġ-> Ġshow Help Dialog ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEdit Med icine ViewModel . Dialog Types . ADD _ TO _ STO CK Ġ-> Ġshow AddTo Stock Dialog () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshow Help Dialog ( dialog Info : ĠEdit Med icine ViewModel . Dialog Info ) Ġ{ ĊĠĠĠĠĠĠĠ ĠTim ber . v (" show Help Dialog () ") ĊĠĠĠĠĠĠĠ ĠMaterial AlertDialog Builder ( require Context (), ĠR . style . Theme Overlay _ Med s Stock Tracker _ Material AlertDialog ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. setTitle ( dialog Info . title ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. setMessage ( dialog Info . message ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Negative Button ( dialog Info . dismiss ButtonText ) Ġ{ Ġ_, Ġ_ Ġ-> Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. show () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshow AddTo Stock Dialog () Ġ{ ĊĠĠĠĠĠĠĠ ĠTim ber . v (" show AddTo Stock Dialog () ") ĊĠĠĠĠĠĠĠ Ġval Ġdialog Binding = ĠDialog AddTo Med icine Stock Binding . inflate ( LayoutInflater . from ( require Context ())) ĊĠĠĠĠĠĠĠ Ġdialog Binding . viewModel Ġ= ĠviewModel ĊĊĠĠĠĠĠĠĠ Ġval Ġdialog Builder Ġ= ĠMaterial AlertDialog Builder ( require Context (), ĠR . style . Theme Overlay _ Med s Stock Tracker _ Material AlertDialog ) ĊĠĠĠĠĠĠĠ Ġdialog Builder . setView ( dialog Binding . root ) ĊĠĠĠĠĠĠĠ ĠaddTo Stock Dialog Ġ= Ġdialog Builder . create () ĊĠĠĠĠĠĠĠ ĠaddTo Stock Dialog ?. show () ĊĠĠĠĠĠĠĠ Ġ// ĠPlace Ġfocus Ġon Ġthe Ġtext Ġfield Ġand Ġopen Ġthe Ġkeyboard Ġto Ġsave Ġthe Ġuser Ġa Ġredundant Ġclick . ĠFrom : Ġhttps :// stackoverflow . com / a / 1 3 0 5 6 2 5 9 / 1 0 7 1 1 1 7 ĊĠĠĠĠĠĠĠ Ġdialog Binding . user Input . setOn Focus ChangeListener Ġ{ Ġview , Ġhas Focus Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( has Focus ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview . post Ġ{ Ġ Ġ// ĠPost Ġa Ġrunnable Ġthat Ġwill Ġshow Ġthe Ġsoft Ġkeyboard . ĠIgnore Ġexceptions Ġsince Ġthis Ġis Ġonly Ġa Ġnice - to - have Ġ( e . g . Ġonly Ġgod Ġknows Ġwhat Ġwill Ġhappen Ġon Ġa Ġdevice Ġwith Ġhardware Ġkeyboard ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( activity ?. getSystem Service ( Context . INPUT _ METHOD _ SERVICE ) Ġas ĠInput Method Manager ). show Soft Input ( view , ĠInput Method Manager . SHOW _ IMP LICIT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{/* ignore */ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġdialog Binding . user Input . request Focus () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġclose Dialog ( one Time Event : ĠOne Time Event < Boolean >) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( one Time Event . getContent IfNot Handled () Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠaddTo Stock Dialog ?. dismiss () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠaddTo Stock Dialog Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ