/* Ċ Ġ* ĠLicensed Ġunder ĠApache - 2 . 0 Ċ Ġ* Ċ Ġ* ĠDesign ed Ġand Ġdeveloped Ġby ĠA id an ĠFol le st ad Ġ(@ af ol le st ad ) Ċ Ġ*/ Ċ package Ġcom . af ol le st ad . icon request . loaders Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . pm . Application Info Ċ import Ġandroid . content . pm . PackageManager Ċ import Ġcom . af ol le st ad . icon request . App Model Ċ import Ġcom . af ol le st ad . icon request . Component Info Source Ċ import Ġcom . af ol le st ad . icon request . extensions . log Ċ import Ġjava . util . Collections Ċ import Ġjava . util . Comparator Ċ import Ġjava . util . HashSet Ċ Ċ /** Ġ@ author ĠA id an ĠFol le st ad Ġ( af ol le st ad ) Ġ*/ Ċ internal Ġclass ĠReal Component Info Source ( private Ġval Ġcontext : ĠContext ) Ġ: ĠComponent Info Source Ġ{ ĊĊĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠ Ġprivate Ġconst Ġval ĠTAG Ġ= Ġ" Real Component Info Source " ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġget Installed Apps ( filter : ĠHashSet < String >): ĠMutable List < App Model > Ġ{ ĊĠĠĠ Ġval Ġpm Ġ= Ġcontext . package Manager ĊĠĠĠ Ġval Ġapp Infos Ġ= Ġpm . get Installed Applications ( PackageManager . GET _ META _ DATA ) ĊĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠ ĠCollections . sort ( ĊĠĠĠĠĠĠĠĠĠ Ġapp Infos , ĊĠĠĠĠĠĠĠĠĠ ĠApp Info Comparator ( pm ) ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ġcatch Ġ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠ Ġt . printStackTrace () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġapps Ġ= Ġmutable ListOf < App Model >() ĊĠĠĠ Ġvar Ġfiltered Ġ= Ġ 0 ĊĊĠĠĠ Ġfor Ġ( ai Ġin Ġapp Infos ) Ġ{ ĊĠĠĠĠĠ Ġval Ġlaunch Intent Ġ= Ġpm . get Launch Intent For Package ( ai . packageName ) Ġ?: Ġcontinue ĊĊĠĠĠĠĠ Ġvar Ġlaunch Str Ġ= Ġlaunch Intent . toString () ĊĠĠĠĠĠ Ġlaunch Str Ġ= Ġlaunch Str . substring ( launch Str . indexOf (" cmp =") Ġ+ Ġ" cmp =". length ) ĊĠĠĠĠĠ Ġlaunch Str Ġ= Ġlaunch Str . substring ( 0 , Ġlaunch Str . length Ġ- Ġ 2 ) ĊĊĠĠĠĠĠ Ġval Ġsplit Code Ġ= Ġlaunch Str . split ("/ ". to Regex ()) ĊĠĠĠĠĠĠĠĠĠ Ġ. drop Last While Ġ{ Ġit . isEmpty () Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ. to Typed Array () ĊĠĠĠĠĠ Ġif Ġ( split Code [ 1 ]. startsWith (". ")) Ġ{ ĊĠĠĠĠĠĠĠ Ġlaunch Str Ġ= Ġ"${ split Code [ 0 ] }/${ split Code [ 0 ]} ${ split Code [ 1 ]}" ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġif Ġ( filter . contains ( launch Str )) Ġ{ ĊĠĠĠĠĠĠĠ Ġfiltered ++ ĊĠĠĠĠĠĠĠ Ġ" Filtered Ġ$ launch Str ". log ( TAG ) ĊĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġval Ġname Ġ= Ġai . load Label ( pm ) ĊĠĠĠĠĠĠĠĠĠ Ġ. toString () ĊĠĠĠĠĠ Ġapps . add ( App Model ( name , Ġlaunch Str , Ġai . packageName )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ" Loaded Ġ${ apps . size } Ġtotal Ġapp ( s ), Ġfiltered Ġout Ġ$ filtered Ġapp ( s ). ". log ( ĊĠĠĠĠĠĠĠ ĠTAG ĊĠĠĠ Ġ) ĊĠĠĠ Ġreturn Ġapps ĊĠ Ġ} ĊĊĠ Ġprivate Ġclass ĠApp Info Comparator Ġinternal Ġconstructor ( private Ġval Ġpackage Manager : ĠPackage Manager ) Ġ: ĊĠĠĠĠĠ ĠComparator < Application Info > Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġcompare ( ĊĠĠĠĠĠ Ġfirst Info : ĠApplication Info , ĊĠĠĠĠĠ Ġsecond Info : ĠApplication Info ĊĠĠĠ Ġ): ĠInt Ġ{ ĊĠĠĠĠĠ Ġval Ġsa : ĠCharSequence Ġ= Ġpackage Manager . getApplication Label ( first Info ) Ġ?: Ġfirst Info . packageName ĊĠĠĠĠĠ Ġval Ġsb : ĠCharSequence Ġ= ĊĠĠĠĠĠĠĠ Ġpackage Manager . getApplication Label ( second Info ) Ġ?: Ġsecond Info . packageName ĊĠĠĠĠĠ Ġreturn Ġsa . toString () ĊĠĠĠĠĠĠĠĠĠ Ġ. compareTo ( sb . toString ()) ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ } Ċ