/* Ċ Ġ* ĠCopyright Ġ 2 0 2 0 ĠAC IN Q ĠSAS Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġfr . ac in q . phoenix . android . home Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroidx . bio metric . Bio metric Manager Ċ import Ġandroidx . bio metric . Bio metric Prompt Ċ import Ġandroidx . compose . material . Text Ċ import Ġandroidx . compose . runtime .* Ċ import Ġandroidx . compose . runtime . li ved ata . observe As State Ċ import Ġandroidx . compose . ui . platform . Local Context Ċ import Ġandroidx . compose . ui . res . string Resource Ċ import Ġfr . ac in q . phoenix . android .* Ċ import Ġfr . ac in q . phoenix . android . R Ċ import Ġfr . ac in q . phoenix . android . security . Encrypted Seed Ċ import Ġfr . ac in q . phoenix . android . security . Key State Ċ import Ġfr . ac in q . phoenix . android . security . Seed Manager Ċ import Ġfr . ac in q . phoenix . android . service . Wallet State Ċ import Ġfr . ac in q . phoenix . android . utils . Bio metrics Helper Ċ import Ġfr . ac in q . phoenix . android . utils . Prefs Ċ import Ġfr . ac in q . phoenix . android . utils . logger Ċ import Ġkotlinx . coroutines . Coroutine Scope Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . Experimental Cor outines Api Ċ import Ġkotlinx . coroutines . launch Ċ import Ġorg . kode in . log . Logger ĊĊ Ċ @ Opt In ( Experimental Cor outines Api :: class ) Ċ @ Composable Ċ fun ĠStartup View ( ĊĠĠĠ Ġmain Activity : ĠMainActivity , ĊĠĠĠ Ġapp VM : ĠApp ViewModel , ĊĠĠĠ Ġon Key Absent : Ġ() Ġ-> ĠUnit , ĊĠĠĠ Ġon Business Started : Ġ() Ġ-> ĠUnit , Ċ ) Ġ{ ĊĠĠĠ Ġval Ġlog Ġ= Ġlogger (" Startup View ") ĊĠĠĠ Ġval Ġcontext Ġ= ĠLocal Context . current ĊĠĠĠ Ġval Ġscope Ġ= Ġremember Coroutine Scope () ĊĠĠĠ Ġval Ġwallet State Ġ= Ġapp VM . wallet State . observe As State () ĊĠĠĠ Ġval Ġis Lock Active Ġby ĠP refs . getIs Screen Lock Active ( context ). collect As State ( initial Ġ= Ġnull ) ĊĊĠĠĠ Ġwhen Ġ( is Lock Active ) Ġ{ ĊĠĠĠĠĠĠĠ Ġnull Ġ-> ĠText ( string Resource ( id Ġ= ĠR . string . startup _ check _ lock )) ĊĠĠĠĠĠĠĠ Ġtrue Ġ-> Ġwhen Ġ( app VM . lock State ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠLock State . Locked Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLa unched Effect ( key 1 Ġ= Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprompt Info Ġ= ĠBio metric Prompt . Prompt Info . Builder (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠsetTitle ( context . getString ( R . string . auth prompt _ title )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Allowed Auth entic ators ( Bio metric Manager . Auth entic ators . DEVICE _ CRED ENTIAL Ġor ĠBio metric Manager . Auth entic ators . BIO METRIC _ WE AK ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. build () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBio metrics Helper . get Prompt ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactivity Ġ= Ġmain Activity , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonSuccess Ġ= Ġ{ Ġapp VM . lock State Ġ= ĠLock State . Unlock ed Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Failure Ġ= Ġ{ Ġapp VM . lock State Ġ= ĠLock State . Locked . WithError ( it ) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Cancel Ġ= Ġ{ Ġlog . debug Ġ{ Ġ" cancelled Ġauth Ġprompt " Ġ} Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). authenticate ( prompt Info ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠLock State . Unlock ed Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAttempt Start ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext Ġ= Ġcontext , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscope Ġ= Ġscope , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog Ġ= Ġlog , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapp VM Ġ= Ġapp VM , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwallet State Ġ= Ġwallet State . value , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Key Absent Ġ= Ġon Key Absent , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Business Started Ġ= Ġon Business Started ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfalse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAttempt Start ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext Ġ= Ġcontext , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscope Ġ= Ġscope , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog Ġ= Ġlog , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapp VM Ġ= Ġapp VM , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwallet State Ġ= Ġwallet State . value , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Key Absent Ġ= Ġon Key Absent , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Business Started Ġ= Ġon Business Started ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Composable Ċ private Ġfun ĠAttempt Start ( ĊĠĠĠ Ġcontext : ĠContext , ĊĠĠĠ Ġscope : ĠCor outine Scope , ĊĠĠĠ Ġlog : ĠLogger , ĊĠĠĠ Ġapp VM : ĠApp ViewModel , ĊĠĠĠ Ġwallet State : ĠWallet State ?, ĊĠĠĠ Ġon Key Absent : Ġ() Ġ-> ĠUnit , ĊĠĠĠ Ġon Business Started : Ġ() Ġ-> ĠUnit , Ċ ) Ġ{ ĊĠĠĠ Ġwhen Ġ( wallet State ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠWallet State . Off Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey State Ġ= Ġproduce State < Key State >( initial Value Ġ= ĠKey State . Unknown , Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= ĠSeed Manager . get Seed State ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. value ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( key State ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠKey State . Unknown Ġ-> ĠText ( string Resource ( id Ġ= ĠR . string . startup _ wait )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠKey State . Absent Ġ-> ĠLa unched Effect ( true ) Ġ{ Ġon Key Absent () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠKey State . Error . Un readable Ġ-> ĠText ( string Resource ( id Ġ= ĠR . string . startup _ error _ generic , Ġkey State . message Ġ?: Ġ"")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠKey State . Error . Unhandled Seed Type Ġ-> ĠText ( string Resource ( id Ġ= ĠR . string . startup _ error _ generic , Ġ" Unhandled Ġseed Ġtype ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠKey State . Present Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( val Ġencrypted Seed Ġ= Ġkey State . encrypted Seed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠEn crypted Seed . V 2 . No Auth Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText ( string Resource ( id Ġ= ĠR . string . startup _ starting )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLa unched Effect ( key 1 Ġ= Ġencrypted Seed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscope . launch ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . debug Ġ{ Ġ" decrypt ing Ġseed ..." Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġseed Ġ= Ġencrypted Seed . decrypt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . debug Ġ{ Ġ" seed Ġhas Ġbeen Ġdecrypted " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapp VM . service ?. start Business ( seed ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠEn crypted Seed . V 2 . With Auth Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText (" seed =${ key State . encrypted Seed } Ġversion Ġis Ġnot Ġhandled Ġyet ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġis ĠWallet State . Disconnected Ġ-> ĠText ( string Resource ( id Ġ= ĠR . string . startup _ binding _ service )) ĊĠĠĠĠĠĠĠ Ġis ĠWallet State . Bootstrap Ġ-> ĠText ( string Resource ( id Ġ= ĠR . string . startup _ starting )) ĊĠĠĠĠĠĠĠ Ġis ĠWallet State . Error . Generic Ġ-> ĠText ( string Resource ( id Ġ= ĠR . string . startup _ error _ generic , Ġwallet State . message )) ĊĠĠĠĠĠĠĠ Ġis ĠWallet State . Started Ġ-> ĠLa unched Effect ( true ) Ġ{ Ġon Business Started () Ġ} ĊĠĠĠ Ġ} Ċ } Ċ