package Ġcom . this al v . ge tr ange Ċ Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . text . Editable Ċ import Ġandroid . text . Text Watcher Ċ import Ġandroid . widget . EditText Ċ import Ġandroid . widget . LinearLayout Ċ import Ġcom . this al v . b oo y ah . Char Details Ċ import Ġcom . this al v . b oo y ah . Json Chars Provider Ċ import Ġcom . this al v . ge tr ange . databinding . View Char Entry Binding Ċ import Ġkotlinx . serialization . decode FromString Ċ import Ġkotlinx . serialization . json . Json Ċ import Ġjava . lang . Exception Ċ Ċ /** Ċ Ġ* ĠLaunch er Ġapp Ġactivity , Ġwhere Ġuser Ġcan Ġselect Ġa Ġcharacter Ġwithin Ġthe Ġloaded Ġones Ġby Ġsearching Ġa Ċ Ġ* Ġcharacter Ġusing Ġits Ġname . Ċ Ġ* Ċ Ġ* Ġ@ author ĠThis AL V , Ġhttps :// github . com / This AL V / Ċ Ġ*/ Ċ class ĠChar Select Activity Ġ: ĠAppCompatActivity () Ġ{ ĊĠĠĠ Ġ// ĠList Ġof Ġloaded Ġcharacters , Ġempty Ġuntil Ġactivity Ġcreation Ġon Ġstack ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġdatabase : ĠChar Search Db ĊĊĠĠĠ Ġ// ĠLoads Ġand Ġretrieves Ġlist Ġcharacter Ġentries Ġfrom Ġresource Ġfile ĊĠĠĠ Ġprivate Ġfun Ġload Characters Db (): ĠArray < Char Details > Ġ{ ĊĠĠĠĠĠĠĠ Ġresources . open Raw Resource ( R . raw . characters ). use Ġ{ Ġ// ĠStream Ġauto - closure ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠJson Chars Provider ( it )() ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠLoads Ġand Ġretrieves Ġdictionary Ġof Ġoptional Ġaliases Ġon Ġeach Ġcharacter Ġwho Ġhas Ġany ĊĠĠĠ Ġprivate Ġfun Ġload Aliases (): ĠMap < String , ĠArray < String >> Ġ{ ĊĠĠĠĠĠĠĠ Ġresources . open Raw Resource ( R . raw . aliases ). use Ġ{ Ġ// ĠStream Ġauto - closure ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠGet Ġreader Ġfrom Ġstream , Ġthen Ġread Ġtext Ġwith Ġit Ġand Ġdecode Ġit Ġusing Ġthe Ġmethod Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġtype Ġto Ġinfer Ġdecode FromString () Ġreturn Ġtype ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠJson . decode FromString ( it . buffered Reader (). read Text ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠRe sets ĠLinearLayout Ġholding Ġthe Ġprevious Ġresult Ġand Ġinfl ates Ġview Ġfor Ġthe Ġnew Ġones ĊĠĠĠ Ġprivate Ġfun Ġupdate Results ( new Results : ĠArray < Char Details >) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠProvides Ġthe ĠViewGroup Ġholding Ġthe Ġcharacters Ġviews ĊĠĠĠĠĠĠĠ Ġval Ġchars Container Ġ= ĠfindViewById < LinearLayout >( R . id . chars Select Root ) ĊĠĠĠĠĠĠĠ Ġ// ĠRe sets Ġprevious Ġresults ĊĠĠĠĠĠĠĠ Ġchars Container . removeAll Views () ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( char Entry Ġin Ġnew Results ) Ġ{ Ġ// ĠFor Ġeach Ġnew Ġcharacter Ġinside Ġresult , Ġdisplays Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ ĠView Char Entry Binding . inflate ( layout Inflater , Ġchars Container , Ġtrue ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . char Entry Ġ= Ġchar Entry ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠLayout Ġmust Ġbe Ġcalculated Ġagain , Ġand Ġview Ġmust Ġbe Ġredraw n ĊĠĠĠĠĠĠĠ Ġchars Container . request Layout () ĊĠĠĠĠĠĠĠ Ġchars Container . invalidate () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠHandles Ġwhen Ġname Search Input Ġtext Ġis Ġmodified Ġby Ġuser Ġto Ġgenerated Ġa Ġnew Ġcharacters Ġsearch ĊĠĠĠ Ġprivate Ġinner Ġclass ĠName Search Listener Ġ: ĠText Watcher Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠUses Ġthe Ġtext Ġis Ġthe Ġgiven ĠEdit able Ġto Ġmake Ġa Ġnew Ġsearch Ġand Ġupdate Ġactivity Ġwith Ġthis ĊĠĠĠĠĠĠĠ Ġ// Ġsearch Ġresults ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġafter TextChanged ( s : ĠEdit able ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ Char Select Activity . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAvoid Ġhandling Ġcase Ġwhere Ġno Ġstring Ġis Ġprovided Ġfor Ġwhatever Ġreason , Ġalso Ġavoid ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcase Ġwhere Ġsearch Ġis Ġempty Ġbecause Ġall Ġcharacters Ġwould Ġfit Ġand Ġit Ġwould Ġtake Ġa ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġlong Ġtime Ġto Ġprocess ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( s . isNull OrEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWe Ġget Ġthe Ġtext Ġon Ġthe Ġsearch Ġfield Ġand Ġuse Ġit Ġto Ġmake Ġa Ġnew Ġname Ġsearch , Ġthen ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwe Ġupdate Ġview Ġwith Ġthese Ġnew Ġresults ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Results ( database . startsWith ( s . toString ()). to Typed Array ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠC ases Ġnot Ġhandled ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon TextChanged ( s : ĠCharSequence ?, Ġstart : ĠInt , Ġbefore : ĠInt , Ġcount : ĠInt ) Ġ{} ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġbefore TextChanged ( s : ĠCharSequence ?, Ġstart : ĠInt , Ġcount : ĠInt , Ġafter : ĠInt ) Ġ{} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠLoads Ġcharacters ĠB oo y ah Ġentries Ġfrom Ġlocal Ġ` characters . json ` Ġress ource Ġand Ġadd Ġa ĊĠĠĠĠ Ġ* Ġcorresponding ĠUI Ġelement Ġfor Ġeach Ġone Ġof Ġthem . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ ĠsetContentView ( R . layout . activity _ char _ select ) ĊĠĠĠĠĠĠĠ ĠsetShow When Locked ( true ) ĊĊĠĠĠĠĠĠĠ Ġval Ġchars Db Ġ= Ġload Characters Db () Ġ// ĠCh ars Ġare Ġrequired , Ġerrors Ġare Ġfatal ĊĊĠĠĠĠĠĠĠ Ġvar Ġaliases Ġ= Ġempty Map < String , ĠArray < String >>() ĊĠĠĠĠĠĠĠ Ġtry Ġ{ Ġ// ĠAli ases Ġaren 't Ġrequired , Ġso Ġerrors Ġshould Ġonly Ġbe Ġlogged Ġand Ġapp Ġmust Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaliases Ġ= Ġload Aliases () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . err . println ("${ e . java Class . canonical Name }: Ġ${ e . message }") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠTODO ĠAvoid Ġre loading Ġat Ġeach ĠonCreate () Ġusing ĠBundle Ġarg ĊĠĠĠĠĠĠĠ Ġdatabase Ġ= ĠChar Search Db ( chars Db , Ġaliases ) Ġ// ĠReset Ġdb Ġwith Ġnew Ġdata ĊĊĠĠĠĠĠĠĠ Ġ// ĠW atches Ġfor Ġany Ġchange Ġon Ġname Ġsearch Ġinput Ġfield , Ġso Ġwe Ġcan Ġmake Ġthe Ġsearch Ġrequested ĊĠĠĠĠĠĠĠ Ġ// Ġby Ġthe Ġuser ĊĠĠĠĠĠĠĠ ĠfindViewById < EditText >( R . id . name Search Input ). add TextChanged Listener ( Name Search Listener ()) ĊĠĠĠ Ġ} Ċ }