package Ġcom . di am ont . expense . tracker . initial Setup Ċ Ċ import Ġandroid . app . Application Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . SharedPreferences Ċ import Ġandroid . view . View Ċ import Ġandroidx . bio metric . Bio metric Manager Ċ import Ġandroidx . lifecycle .* Ċ import Ġcom . di am ont . expense . tracker . R Ċ import Ġcom . di am ont . expense . tracker . util .* Ċ import Ġcom . di am ont . expense . tracker . util . database . Transaction Database Dao Ċ import Ġkotlinx . coroutines . Coroutine Scope Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . Job Ċ import Ġkotlinx . coroutines . launch Ċ Ċ class ĠInitial Setup Fragment ViewModel ( ĊĠĠĠ Ġprivate Ġval Ġcontext : ĠContext , ĊĠĠĠ Ġprivate Ġval Ġshared Preferences : ĠSharedPreferences , ĊĠĠĠ Ġprivate Ġval Ġdatabase Dao : ĠTransaction Database Dao Ċ ) Ġ: ĠViewModel () Ġ{ ĊĊĠĠĠ Ġ/** ĠDeclare Ġthe Ġrequired Ġvariables Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġis Authentication Required Ġ: ĠBoolean Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġis Fingerprint Enabled Ġ: ĠBoolean Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġpin Code Ġ: ĠString Ġ= Ġ"" ĊĠĠĠ Ġprivate Ġvar Ġis First Pin Entry Accepted Ġ: ĠBoolean Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġselected Currency Ġ= ĠCurrency ( 0 ," "," ", Ġ"") ĊĠĠĠ Ġval Ġselected Currency Sign Ġ: ĠString ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġselected Currency . sign ĊĊĠĠĠ Ġprivate Ġvar Ġinitial Balance Cash Ġ: ĠFloat ? Ġ= Ġ 0 f ĊĠĠĠ Ġprivate Ġvar Ġinitial Balance Card Ġ: ĠFloat ? Ġ= Ġ 0 f ĊĊĠĠĠ Ġprivate Ġvar Ġ_ is Fingerprint Sensor Available Ġ: ĠBoolean Ġ= Ġfalse ĊĠĠĠ Ġval Ġis Fingerprint Sensor Available Ġ: ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ is Fingerprint Sensor Available ĊĊĠĠĠ Ġ/** ĠCreate Ġsome Ġlive Ġdata Ġfor Ġui Ġto Ġobserve Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġ_ set Or Confirm Pin Str Ġ= ĠMutable LiveData < String >( context . getString ( R . string . set _ pin _ code )) ĊĠĠĠ Ġval Ġset Or Confirm Pin Str Ġ: ĠLive Data < String > ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ set Or Confirm Pin Str ĊĊĠĠĠ Ġprivate Ġvar Ġ_ is Pin Code Saved Ġ= ĠMutable LiveData < Boolean >( false ) ĊĠĠĠ Ġval Ġis Pin Code Saved Ġ: ĠLive Data < Boolean > ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ is Pin Code Saved ĊĊĠĠĠ Ġprivate Ġvar Ġ_ active Page Ġ= ĠMutable LiveData < Int >( 0 ) ĊĠĠĠ Ġval Ġactive Page Ġ: ĠLive Data < Int > ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ active Page ĊĊĠĠĠ Ġprivate Ġvar Ġ_ is Setup Process Complete Ġ: ĠBoolean Ġ= Ġfalse ĊĠĠĠ Ġval Ġis Setup Process Complete Ġ: ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ is Setup Process Complete ĊĊĠĠĠ Ġprivate Ġvar Ġ_ is Pin Entry ErrorMessage Visible Ġ= ĠMutable LiveData < Boolean >( false ) ĊĠĠĠ Ġval Ġis Pin Entry ErrorMessage Visible Ġ= ĠTransform ations . map (_ is Pin Entry ErrorMessage Visible ){ ĊĠĠĠĠĠĠĠ Ġif ( it ){ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠView . VISIBLE ĊĠĠĠĠĠĠĠ Ġ} else { ĊĠĠĠĠĠĠĠĠĠĠĠ ĠView . IN VISIBLE ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSet Ġup Ġcoroutine Ġjob Ġand Ġthe Ġscope ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġvar ĠviewModel Job Ġ= ĠJob () ĊĠĠĠ Ġprivate Ġval Ġui Scope Ġ= ĠCor outine Scope ( Dispatch ers . Main Ġ+ ĠviewModel Job ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠConstructor ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinit { ĊĠĠĠĠĠĠĠ Ġ/** ĠCheck Ġif Ġbio metric Ġauthentication Ġis Ġavailable Ġ*/ ĊĠĠĠĠĠĠĠ Ġval Ġbio metric Manager Ġ= ĠBio metric Manager . from ( context ) ĊĊĠĠĠĠĠĠĠ Ġif ( bio metric Manager . can Authenticate ( Bio metric Manager . Auth entic ators . BIO METRIC _ WE AK ) ĊĠĠĠĠĠĠĠĠ Ġ== ĠBio metric Manager . BIO METRIC _ SUCCESS ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ is Fingerprint Sensor Available Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCall Ġthis Ġmethod Ġfrom Ġthe Ġfragments ĊĠĠĠĠ Ġ* Ġif Ġthe Ġuser Ġturns Ġthe Ġauthentication Ġon ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġset Authentication Required (){ ĊĠĠĠĠĠĠĠ Ġis Authentication Required Ġ= Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCall Ġthis Ġmethod Ġfrom Ġthe Ġfragments ĊĠĠĠĠ Ġ* Ġif Ġuser Ġenables Ġfingerprint Ġsensor ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġenable Fingerprint Sensor (){ ĊĠĠĠĠĠĠĠ Ġis Fingerprint Enabled Ġ= Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCall Ġthis Ġmethod Ġto Ġset Ġthe Ġid Ġof Ġthe Ġselected Ġcurrency ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġcurrency ĠThe Ġid Ġof Ġthe Ġcurrency Ġset Ġint Ġthe Ġlist ĊĠĠĠĠ Ġ* Ġin ĠCurrency . available C urrencies ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun ĠsetSelected Currency Id ( currency Ġ: ĠCurrency ){ ĊĠĠĠĠĠĠĠ Ġselected Currency Ġ= Ġcurrency ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCall Ġthis Ġmethod Ġto Ġset Ġthe Ġinitial Ġbalance Ġdetails ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġset Initial Balance ( cash Ġ: ĠFloat ?, Ġcard : ĠFloat ? ){ ĊĠĠĠĠĠĠĠ Ġinitial Balance Cash Ġ= Ġcash ĊĠĠĠĠĠĠĠ Ġinitial Balance Card Ġ= Ġcard ĊĊĠĠĠĠĠĠĠ Ġ/** ĠWe Ġset Ġit Ġin Ġthe Ġlast Ġstep Ġso Ġsave Ġthe Ġvalues Ġ*/ ĊĠĠĠĠĠĠĠ Ġsave Initial Values () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCall Ġthis Ġmethod Ġto Ġset Ġthe Ġactive Ġpage . ĊĠĠĠĠ Ġ* ĠThis Ġis Ġused Ġfor Ġthe Ġdot Ġindicator . ĊĠĠĠĠ Ġ* ĠEach Ġfragment Ġshould Ġcall Ġit Ġwith Ġits Ġindex ĊĠĠĠĠ Ġ* Ġas Ġin Ġthe Ġinitial Ġsetup Ġflow . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġpage ĠThe Ġindex Ġof Ġthe Ġfragment Ġin Ġthe Ġflow . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġset Active Page ( page Ġ: ĠInt ){ ĊĠĠĠĠĠĠĠ Ġ_ active Page . value Ġ= Ġpage ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSave Ġthe Ġinitial Ġsetup Ġvalues ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġsave Initial Values (){ ĊĠĠĠĠĠĠĠ Ġwith ( shared Preferences . edit ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġput Boolean ( KEY _ PRE F _ INITIAL _ SETUP _ DONE , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġput Boolean ( KEY _ PRE F _ AUTHENT ICATION _ REQUIRED , Ġis Authentication Required ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġput Boolean ( KEY _ PRE F _ F ING ER PRINT _ ENABLED , Ġis Fingerprint Enabled ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// put Boolean ( KEY _ PRE F _ DARK _ THEME _ ENABLED , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġput String ( KEY _ PRE F _ PIN _ CODE , Ġpin Code ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġput Int ( KEY _ PRE F _ CUR RE NCY _ ID , Ġselected Currency . id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġput Float ( KEY _ PRE F _ INITIAL _ CARD , Ġinitial Balance Card Ġ?: Ġ 0 f ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġput Float ( KEY _ PRE F _ INITIAL _ C ASH , Ġinitial Balance Cash Ġ?: Ġ 0 f ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġapply () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġadd Default Categories () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCall Ġthis Ġmethod Ġto Ġadd Ġthe Ġdefault Ġcategories Ġto Ġthe Ġdatabase ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġadd Default Categories (){ ĊĠĠĠĠĠĠĠ Ġui Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdatabase Dao . add Default Categories Suspend ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ is Setup Process Complete Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCall Ġthis Ġmethod Ġif Ġthe Ġ ĠSet ĠPin ĠCode Ġ/ ĠConfirm ĠPin ĠCode Ġbutton Ġis Ġclicked ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġcode Ġ- ĠThe Ġvalue Ġthe Ġuser Ġhas Ġentered Ġin Ġthe ĠPin Code Input View ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġset Pin Button Clicked ( code Ġ: ĠString ){ ĊĠĠĠĠĠĠĠ Ġ/** ĠCheck Ġif Ġwe Ġshould ĠSet Ġor ĠConfirm ? */ ĊĠĠĠĠĠĠĠ Ġif ( is First Pin Entry Accepted ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/** ĠConfirm Ġso Ġcheck Ġif Ġthe Ġtwo Ġcode Ġmatches Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( code Ġ== Ġpin Code ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/** ĠCode s Ġmatch , Ġwe Ġare Ġready Ġto Ġcontinue Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ is Pin Code Saved . value Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} else { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/** ĠCode s Ġdon 't Ġmatch , Ġwe Ġset Ġthe Ġerror Ġmessage Ġand Ġrestart Ġprocess Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis First Pin Entry Accepted Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ set Or Confirm Pin Str . value Ġ= Ġcontext . getString ( R . string . set _ pin _ code ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ is Pin Entry ErrorMessage Visible . value Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} else { ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/** ĠSet Ġso Ġwe Ġsave Ġthe Ġfirst Ġentry Ġand Ġchange Ġtext */ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpin Code Ġ= Ġcode ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis First Pin Entry Accepted Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ set Or Confirm Pin Str . value Ġ= Ġcontext . getString ( R . string . confirm _ pin _ code ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ is Pin Entry ErrorMessage Visible . value Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġon Cle ared () Ġis Ġcalled Ġwhen Ġview Ġmodel Ġis Ġdestroyed ĊĠĠĠĠ Ġ* Ġin Ġthis Ġcase Ġwe Ġneed Ġto Ġcancel Ġcor outines ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġon Cle ared () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Cle ared () ĊĠĠĠĠĠĠĠ ĠviewModel Job . cancel () ĊĠĠĠ Ġ} Ċ }