package Ġcom . pq ix ing . a ex . door Ċ Ċ import Ġandroid . app . Activity Ċ import Ġandroid . app . AlertDialog Ċ import Ġandroid . content . Intent Ċ import Ġandroid . content . pm . PackageManager Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . text . Editable Ċ import Ġandroid . text . Text Watcher Ċ import Ġandroid . util . Log Ċ import Ġandroid . view . View Ċ import Ġandroid . widget . EditText Ċ import Ġandroid . widget . ListView Ċ import Ġandroid . widget . Toast Ċ import Ġjava . lang . reflect . Method Ċ import Ġjava . util .* Ċ Ċ class ĠDoor Activity Ġ: ĠActivity () Ġ{ ĊĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ Ġtitle Ġ= ĠpackageName ĊĠĠĠĠĠĠĠ ĠsetContentView ( R . layout . activity _ door ) ĊĊĠĠĠĠĠĠĠ Ġval Ġlv Class Ġ= ĠfindViewById < ListView >( R . id . lv Class ) ĊĠĠĠĠĠĠĠ Ġval Ġet Search Ġ= ĠfindViewById < EditText >( R . id . et Search ) ĊĊĊĠĠĠĠĠĠĠ Ġval Ġsp Ġ= Ġget SharedPreferences (" config ", Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġactivity s Ġ= Ġpackage Manager . get Package Info ( packageName , ĠPackage Manager . GET _ ACTIV ITIES ). activities ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĠTrip le ( it . name . substring After Last (". "), Ġit . name . substring Before Last (". "), Ġit . name ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. sorted By Ġ{ Ġit . third Ġ} ĊĠĠĠĠĠĠĠ Ġ// ç½® é¡¶ ç±» ĊĠĠĠĠĠĠĠ Ġval Ġpins Ġ= Ġsp . getString Set (" pin ", Ġempty Set ()) !!. to Mutable Set () ĊĠĠĠĠĠĠĠ Ġ// è¿ĩæ»¤ çļĦ group åĲįåŃĹ ĊĠĠĠĠĠĠĠ Ġval Ġgroups Ġ= Ġsp . getString Set (" group ", Ġempty Set ()) !!. to Mutable Set () ĊĊĠĠĠĠĠĠĠ Ġ// æľĢè¿ĳ çĤ¹åĩ» ï¼Į é»ĺè®¤ æİĴ æľĢ ä¸ĬéĿ¢ ĊĠĠĠĠĠĠĠ Ġval Ġrecent s Ġ= Ġsp . getString (" recent ", Ġ"") !!. split ("," ). to Mutable List () ĊĊĊĠĠĠĠĠĠĠ Ġval Ġcall Back Ġ= Ġobject Ġ: ĠDoor CallBack Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġre Load Filters (): ĠList < Triple < String , ĠString , ĠString >> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsearch Key Ġ= Ġet Search . text . toString (). trim () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsize Ġ= Ġrecent s . size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġactivity s . filter Ġ{ Ġgroups . isEmpty () Ġ|| Ġgroups . contains ( it . second ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġmatch ( search Key , Ġit . third ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// æİĴåºı ï¼Į åħĪ æĮīçħ§ ç±»åŀĭ æİĴ ä¸Ģ éģį ï¼Į åĨį æĮīçħ§ ç½® é¡¶ åĴĮ æľĢè¿ĳ åĪĹè¡¨ æİĴ ä¸Ĭ åİ» ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. sorted By Ġ{ Ġ( pins . indexOf ( it . third ) Ġ* Ġsize ) Ġ+ Ġrecent s . indexOf ( it . third ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġis Top ( clazz : ĠString ): ĠBoolean Ġ= Ġpins . contains ( clazz ) ĊĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Top Click ( clazz : ĠString , Ġposition : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Top ( clazz )) Ġpins . remove ( clazz ) Ġelse Ġpins . add ( clazz ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsp . edit (). putString Set (" pin ", Ġpins ). apply () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġadapter Ġ= ĠDoor Adapter ( call Back ) ĊĊĠĠĠĠĠĠĠ Ġet Search . add TextChanged Listener ( object Ġ: ĠText Watcher Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġbefore TextChanged ( s : ĠCharSequence ?, Ġstart : ĠInt , Ġcount : ĠInt , Ġafter : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon TextChanged ( s : ĠCharSequence ?, Ġstart : ĠInt , Ġbefore : ĠInt , Ġcount : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġafter TextChanged ( s : ĠEdit able ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadapter . notify DataSet Changed () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġlv Class . adapter Ġ= Ġadapter ĊĊĠĠĠĠĠĠĠ Ġlv Class . setOn ItemClickListener Ġ{ Ġparent , Ġview , Ġposition , Ġid Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠclassName Ġ= Ġadapter . getItem ( position ). third ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Start Activity ( className ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġrecent s . remove ( className ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrecent s . add ( className ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsp . edit (). putString (" recent ", Ġrecent s . join ToString ("," )). apply () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadapter . notify DataSet Changed () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġlv Class . setOn Item Long ClickListener Ġ{ Ġparent , Ġview , Ġposition , Ġid Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠclassName Ġ= Ġadapter . getItem ( position ). third ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Start Activity Custom ( className ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrecent s . remove ( className ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrecent s . add ( className ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsp . edit (). putString (" recent ", Ġrecent s . join ToString ("," )). apply () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadapter . notify DataSet Changed () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĊĠĠĠĠĠĠĠ ĠfindViewById < View >( R . id . iv Filter ). setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġall Groups Ġ= Ġactivity s . map Ġ{ Ġit . second Ġ}. distinct By Ġ{ Ġit Ġ}. sorted By Ġ{ Ġgroups . indexOf ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġselects Ġ= Ġall Groups . map Ġ{ Ġgroups . contains ( it ) Ġ}. to Boolean Array () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAlertDialog . Builder ( this ). setTitle (" Select ĠFilter ĠGroup ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Multi Choice Items ( all Groups . to Typed Array (), Ġselects ) Ġ{ Ġd , Ġi , Ġs Ġ-> Ġselects [ i ] Ġ= Ġs Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Negative Button ( android . R . string . cancel ) Ġ{ Ġd , Ġi Ġ-> Ġd . dismiss () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Positive Button ( android . R . string . ok ) Ġ{ Ġd , Ġi Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġd . dismiss () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgroups . clear () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgroups Ġ+= Ġall Groups . filter Indexed Ġ{ Ġindex , Ġs Ġ-> Ġselects [ index ] Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsp . edit (). putString Set (" group ", Ġgroups ). apply () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadapter . notify DataSet Changed () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. show () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġtry Start Activity Custom ( className : ĠString , Ġstart : Ġ() Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmethods Ġ= ĠClass . forName ( className ). declared Methods . filter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . startActivity () Ġ|| Ġit . get Intent () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( methods . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Start Activity ( className ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠAlertDialog . Builder ( this ). setTitle (" Select ĠStart ĠMethod Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Single Choice Items ( methods . map Ġ{ Ġ"${ it . returnType . simple Name } Ġ${ it . name } Ġ( Ġ${ it . parameter Types . first OrNull ()?. simple Name Ġ?: Ġ"" } Ġ)" Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. to Typed Array (), Ġ- 1 ) Ġ{ Ġd , Ġi Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġd . dismiss () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity By Method ( methods [ i ], ĠclassName ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. show () ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠstartActivity By Method ( method : ĠMethod , ĠclassName : ĠString ) Ġ= Ġsafe Run Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġfor Name Ġ= ĠClass . forName ( className ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( method . startActivity ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmethod . is Accessible Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmethod . invoke ( forName . newInstance (), Ġthis ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( method . get Intent ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintent Ġ= Ġmethod . invoke ( forName . newInstance ()) Ġas ĠIntent ĊĠĠĠĠĠĠĠĠĠĠĠ Ġintent . set Class ( this , ĠClass . forName ( className )) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity ( intent ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Start Activity ( className ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠMethod . startActivity (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtypes Ġ= Ġthis . parameter Types ĊĠĠĠĠĠĠĠ Ġreturn Ġtypes . size Ġ== Ġ 1 Ġ&& Ġtypes [ 0 ]. extends ( Activity :: class . java ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠMethod . get Intent (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġthis . returnType . extends ( Intent :: class . java ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġfun ĠClass < *> ?. extends ( clazz : ĠClass < *> ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( this Ġ== Ġnull ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġif Ġ( this Ġ== Ġclazz ) Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġif Ġ( this . super class . extends ( clazz )) Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġreturn Ġthis . interfaces . find Ġ{ Ġit . extends ( clazz ) Ġ} Ġ!= Ġnull ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġinline Ġfun Ġmatch ( search Key : ĠString , Ġmatch : ĠString ): ĠBoolean Ġ= Ġmatch ( search Key , ĠCollections . singletonList ( match )) ĊĊĠĠĠ Ġfun Ġmatch ( search Key : ĠString , Ġmatch s : ĠList < String >): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( search Key . isEmpty ()) Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġval Ġkey Ġ= Ġsearch Key . trim (). lowercase () ĊĠĠĠĠĠĠĠ Ġfor Ġ( m Ġin Ġmatch s ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġk Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġl Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġline Ġ= Ġm . lowercase () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ(++ l Ġ< Ġline . length ) Ġif Ġ( key [ k ] Ġ== Ġline [ l ] Ġ&& Ġ++ k Ġ== Ġkey . length ) Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġtry Start Activity ( className : ĠString ) Ġ= Ġsafe Run Ġ{ ĊĠĠĠĠĠĠĠ ĠstartActivity ( Intent ( this , ĠClass . forName ( className ))) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsafe Run ( block : Ġ() Ġ-> ĠUnit ) Ġ= Ġkotlin . run Catch ing Ġ{ Ġblock () Ġ}. on Failure Ġ{ ĊĠĠĠĠĠĠĠ ĠToast . makeText ( this , Ġ" Start ĠFail Ġ: Ġ${ it . message }", ĠToast . LENGTH _ SHORT ). show () ĊĠĠĠĠĠĠĠ ĠLog . w (" Door Activity ", Ġ" try Start Activity : Ġ", Ġit ) ĊĠĠĠ Ġ} Ċ }