package Ġcom . and ry oga . safe box . ui . view . choose Master P sw rd Ċ Ċ import Ġandroidx . lifecycle .* Ċ import Ġcom . and ry oga . safe box . common . Constants . IS _ SIGN _ UP _ REQUIRED Ċ import Ġcom . and ry oga . safe box . data . repository . interfaces . UserDetails Repository Ċ import Ġcom . and ry oga . safe box . providers . interfaces . Encrypted Preference Provider Ċ import Ġcom . and ry oga . safe box . ui . view . choose Master P sw rd . Password Validation Failure Code .* Ċ import Ġdagger . h ilt . android . lifecycle . H ilt ViewModel Ċ import Ġkotlinx . coroutines . launch Ċ import Ġtim ber . log . Tim ber Ċ import Ġjavax . inject . Inject Ċ Ċ @ H ilt ViewModel Ċ class ĠChoose Master P sw rd ViewModel Ġ@ Inject Ġconstructor ( ĊĠĠĠ Ġprivate Ġval Ġencrypted Preference Provider : ĠEn crypted Preference Provider , ĊĠĠĠ Ġprivate Ġval Ġuser Details Repository : ĠUser Details Repository Ċ ) Ġ: ĠViewModel () Ġ{ ĊĊĠĠĠ Ġobject ĠConstants Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval Ġmin Password Length Ġ= Ġ 8 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġ_ is Save Button Enabled Ġ= ĠMutable LiveData < Boolean >( false ) ĊĠĠĠ Ġval Ġis Save Button Enabled : ĠLive Data < Boolean > Ġ= Ġ_ is Save Button Enabled ĊĊĠĠĠ Ġprivate Ġval Ġ_ navigate To Home Ġ= ĠMutable LiveData < Boolean >() ĊĠĠĠ Ġval Ġnavigate To Home : ĠLive Data < Boolean > Ġ= Ġ_ navigate To Home ĊĊĠĠĠ Ġval Ġp sw rd Ġ= ĠMutable LiveData < String >(" ") ĊĠĠĠ Ġval Ġconfirm P sw rd Ġ= ĠMutable LiveData < String >(" ") ĊĊĠĠĠ Ġval Ġp sw rd Validation Failures : ĠLive Data < List < Password Validation Failure Code >> Ġ= ĊĠĠĠĠĠĠĠ ĠTransform ations . map ( ps w rd ) Ġ{ Ġcurr P sw rd Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalidation Failures Ġ= Ġevaluate Password Validation Rules ( curr P sw rd ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ is Save Button Enabled . value Ġ= Ġvalidation Failures . isNull OrEmpty () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ map Ġvalidation Failures ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġis Both Password s Match Ġ= ĠTransform ations . map ( confirm P sw rd ) Ġ{ Ġconfirm P sw rd Text Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġis Both Match Ġ= Ġconfirm P sw rd Text Ġ== Ġp sw rd . value ĊĠĠĠĠĠĠĠ Ġ_ is Save Button Enabled . value Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġp sw rd . value ?. let Ġ{ Ġevaluate Password Validation Rules ( it ). isNull OrEmpty () Ġ} ĊĠĠĠĠĠĠĠ Ġreturn @ map Ġis Both Match ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġevaluate Password Validation Rules ( ps w rd : ĠString ): ĠList < Password Validation Failure Code > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlist Ġ= Ġmutable ListOf < Password Validation Failure Code >() ĊĊĠĠĠĠĠĠĠ Ġif Ġ( ps w rd . length Ġ<= ĠConstants . min Password Length ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlist . add ( LOW _ PASSWORD _ LENGTH ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġvar Ġregex Ġ= ĠRegex ("[ \$ & + ,: ; =? @ # |' < >. ^ * () % ! - ]") ĊĠĠĠĠĠĠĠ Ġvar ĠnumOf Special Char Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġregex . findAll ( ps w rd ). iterator (). forEach Ġ{ Ġ_ Ġ-> ĠnumOf Special Char ++ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( num Of Special Char Ġ< Ġ 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlist . add ( LESS _ SPECIAL _ CHAR _ COUNT ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġregex Ġ= ĠRegex ("[ A - Z ]") ĊĠĠĠĠĠĠĠ Ġval Ġcontains UpperCase Ġ= Ġregex . contains Match In ( ps w rd ) ĊĊĠĠĠĠĠĠĠ Ġregex Ġ= ĠRegex ("[ a - z ]") ĊĠĠĠĠĠĠĠ Ġval Ġcontains LowerCase Ġ= Ġregex . contains Match In ( ps w rd ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! contains LowerCase Ġ|| Ġ! contains UpperCase ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlist . add ( NOT _ MIX _ CASE ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġregex Ġ= ĠRegex ("[ 0 - 9 ]") ĊĠĠĠĠĠĠĠ Ġvar Ġnumeric Count Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġregex . findAll ( ps w rd ). iterator (). forEach Ġ{ Ġ_ Ġ-> Ġnumeric Count ++ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( numeric Count Ġ<= Ġ 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlist . add ( LESS _ NUMERIC _ COUNT ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfor Ġ(( index , Ġchar ) Ġin Ġp sw rd . with Index ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnext Char Ġ= Ġchar Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnext To Next Char Ġ= Ġchar Ġ+ Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ps w rd . indexOf ("" Ġ+ Ġnext Char Ġ+ Ġnext To Next Char ) Ġ== Ġindex Ġ+ Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist . add ( ALTER N ATE _ CHAR _ FOUND ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( ps w rd Ġ!= Ġconfirm P sw rd . value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlist . add ( PASSWORD _ DO _ NOT _ MATCH ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġlist ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/* ĊĠĠĠ Ġ* ĠAdd Ġpassword Ġin ĠDB Ġand Ġupdate Ġpref Ġflag Ġso Ġthat Ġnext Ġtime Ġapp Ġasks Ġuser Ġto Ġlogin ĊĠĠĠ Ġ* Ġinstead Ġof Ġsign Ġup ĊĠĠĠ Ġ* Ġ*/ ĊĠĠĠ Ġfun Ġon Save Click () Ġ{ ĊĠĠĠĠĠĠĠ ĠTim ber . i (" save Ġpassword Ġclicked ") ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġuser Details Repository . insert UserDetails Data ( ps w rd . value !! , Ġ" ADD ĠH INT ĠIN ĠUI ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġencrypted Preference Provider . upsert Boolean Pref ( IS _ SIGN _ UP _ REQUIRED , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . i (" Added Ġp sw rd Ġin Ġdb ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ navigate To Home . value Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ