/* Ċ Ġ* ĠĠĠĠ ĠThis Ġfile Ġis Ġpart Ġof ĠL awn ch air ĠLaunch er . Ċ Ġ* Ċ Ġ* ĠĠĠĠ ĠL awn ch air ĠLaunch er Ġis Ġfree Ġsoftware : Ġyou Ġcan Ġredistribute Ġit Ġand / or Ġmodify Ċ Ġ* ĠĠĠĠ Ġit Ġunder Ġthe Ġterms Ġof Ġthe ĠGNU ĠGeneral ĠPublic ĠLicense Ġas Ġpublished Ġby Ċ Ġ* ĠĠĠĠ Ġthe ĠFree ĠSoftware ĠFoundation , Ġeither Ġversion Ġ 3 Ġof Ġthe ĠLicense , Ġor Ċ Ġ* ĠĠĠĠ Ġ( at Ġyour Ġoption ) Ġany Ġlater Ġversion . Ċ Ġ* Ċ Ġ* ĠĠĠĠ ĠL awn ch air ĠLaunch er Ġis Ġdistributed Ġin Ġthe Ġhope Ġthat Ġit Ġwill Ġbe Ġuseful , Ċ Ġ* ĠĠĠĠ Ġbut ĠWITHOUT ĠANY ĠWARRANTY ; Ġwithout Ġeven Ġthe Ġimplied Ġwarranty Ġof Ċ Ġ* ĠĠĠĠ ĠMERCHANTABILITY Ġor ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE . Ġ ĠSee Ġthe Ċ Ġ* ĠĠĠĠ ĠGNU ĠGeneral ĠPublic ĠLicense Ġfor Ġmore Ġdetails . Ċ Ġ* Ċ Ġ* ĠĠĠĠ ĠYou Ġshould Ġhave Ġreceived Ġa Ġcopy Ġof Ġthe ĠGNU ĠGeneral ĠPublic ĠLicense Ċ Ġ* ĠĠĠĠ Ġalong Ġwith ĠL awn ch air ĠLaunch er . Ġ ĠIf Ġnot , Ġsee Ġ< https :// www . gnu . org / licenses />. Ċ Ġ*/ Ċ Ċ package Ġorg . zim mob . zim lx . predictions Ċ Ċ import Ġandroid . bluetooth . Bluetooth Head set Ċ import Ġandroid . bluetooth . Bluetooth Profile Ċ import Ġandroid . content .* Ċ import Ġandroid . content . pm . PackageManager Ċ import Ġandroid . os .* Ċ import Ġandroid . view . View Ċ import Ġcom . android . launcher 3 . Launcher AppState Ċ import Ġcom . android . launcher 3 . Utilities Ċ import Ġcom . android . launcher 3 . shortcuts . Deep Shortcut Manager Ċ import Ġcom . android . launcher 3 . util . Component Key Ċ import Ġcom . android . launcher 3 . util . Component Key Mapper Ċ import Ġcom . google . android . apps . nexus launcher . Custom App Predict or Ċ import Ġcom . google . android . apps . nexus launcher . all apps . Pred i ctions Floating Header Ċ import Ġorg . json . JSONObject Ċ import Ġorg . zim mob . zim lx . run On MainThread Ċ import Ġorg . zim mob . zim lx . settings . ui . Settings Activity Ċ import Ġjava . util . concurrent . TimeUnit Ċ Ċ // ĠTODO : ĠFix Ġaction Ġicons Ġbeing Ġloaded Ġtoo Ġearly , Ġleading Ġto Ġf * ck ed Ġicons Ġwhen Ġusing Ġse same Ċ /** Ċ Ġ* ĠF allback Ġapp Ġpredictor Ġfor Ġusers Ġwithout Ġquick switch Ċ Ġ*/ Ċ open Ġclass ĠZ im Event Predict or ( private Ġval Ġcontext : ĠContext ) Ġ: ĠCustom App Predict or ( context ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġpackage Manager Ġby Ġlazy Ġ{ Ġcontext . package Manager Ġ} ĊĠĠĠ Ġprivate Ġval Ġlauncher Ġby Ġlazy Ġ{ ĠLaunch er AppState . getInstance ( context ). launcher Ġ} ĊĠĠĠ Ġprivate Ġval Ġpredictions Header Ġby Ġlazy Ġ{ Ġlauncher . apps View . floating Header View Ġas ĠPred i ctions Floating Header Ġ} ĊĠĠĠ Ġprivate Ġval Ġdeep Shortcut Manager Ġby Ġlazy Ġ{ ĠDeep Shortcut Manager . getInstance ( context ) Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġhandler Thread Ġby Ġlazy Ġ{ ĠHandler Thread (" event - predictor "). apply Ġ{ Ġstart () Ġ}} ĊĠĠĠ Ġprivate Ġval Ġhandler Ġby Ġlazy Ġ{ ĠHandler ( handler Thread . lo oper ) Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġdevice Prefs Ġ= ĠUtilities . getDevice Prefs ( context ) ĊĠĠĠ Ġprivate Ġval Ġapps List Ġ= ĠCount Rank ed Array Preference ( device Prefs , Ġ" recent _ app _ la unches ", Ġ 2 5 0 ) ĊĠĠĠ Ġprivate Ġval Ġph ones List Ġ= ĠCount Rank ed Array Preference ( device Prefs , Ġ" plug ged _ app _ la unches ", Ġ 2 0 ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠTime Ġat Ġwhich Ġhead phones Ġhave Ġbeen Ġplug ged Ġin Ġ/ Ġconnected . Ġ 0 Ġif Ġdisconnected , Ġ- 1 Ġbefore Ġinitialized ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġph ones Connected At Ġ= Ġ- 1 L ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( value Ġ!= Ġ- 1 L ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġph ones La unches Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Pred i ctions () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( value Ġ!= Ġ 0 L ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠEnsure Ġtemporary Ġpredictions Ġget Ġremoved Ġagain Ġafter ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandler . post Delayed ( this :: update Pred i ctions , ĠD URATION _ REC ENT LY ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠWhether Ġhead phones Ġhave Ġjust Ġbeen Ġplug ged Ġin Ġ/ Ġconnected Ġ( in Ġthe Ġlast Ġtwo Ġminutes ) ĊĠĠĠĠ Ġ* ĠTODO : ĠIs Ġtwo Ġminutes Ġappropriate Ġor Ġdo Ġwe Ġwant Ġto Ġincrease Ġthis ? ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġph ones Just Connected Ġget () Ġ= Ġph ones Connected At Ġ> Ġ 0 Ġ&& ĠSystem Clock . uptime Millis () Ġin Ġph ones Connected At Ġuntil Ġph ones Connected At Ġ+ ĠD URATION _ REC ENT LY ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠWhether Ġor Ġnot Ġthe Ġcurrent Ġapp Ġlaunch Ġis Ġrelevant Ġfor Ġhead phone Ġsuggestions Ġor Ġnot ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġrelevant For Ph ones Ġget () Ġ= Ġph ones La unches Ġ< Ġ 2 Ġ&& Ġph ones Just Connected ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠNumber Ġof Ġla unches Ġrecorded Ġsince Ġhead phones Ġwere Ġconnected ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġph ones La unches Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġval Ġph ones StateChange Receiver Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġobject Ġ: ĠBroadcast Receiver () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġvar Ġfirst Receive Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Receive ( context : ĠContext , Ġintent : ĠIntent ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! first Receive ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġph ones Connected At Ġ= Ġwhen Ġ( intent . action ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIntent . ACTION _ HEAD SET _ PL UG Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( intent . getInt Extra (" state ", Ġ- 1 )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 Ġ-> ĠSystem Clock . currentThread Time Millis () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBluetooth Head set . ACTION _ CONNECTION _ STATE _ CHANGED Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( intent . getInt Extra ( Bluetooth Profile . EXTRA _ STATE , Ġ- 1 )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 2 Ġ-> ĠSystem Clock . currentThread Time Millis () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfirst Receive Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( is Predict or Enabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsetup Broadcast Receiver () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsetup Broadcast Receiver () Ġ{ ĊĠĠĠĠĠĠĠ Ġcontext . register Receiver ( Ġph ones StateChange Receiver , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIntent Filter ( Intent . ACTION _ HEAD SET _ PL UG ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Action ( Bluetooth Head set . ACTION _ CONNECTION _ STATE _ CHANGED ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġnull , Ġhandler ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠtearDown Broadcast Receiver () Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . unregister Receiver ( phones StateChange Receiver ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch ( ignored : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthere Ġis Ġapparently Ġno Ġway Ġto Ġreli ably Ġcheck Ġif Ġa Ġreceiver Ġis Ġactually Ġregistered Ġand ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġan Ġexception Ġis Ġthrown Ġwhen Ġtrying Ġto Ġunregister Ġone Ġthat Ġnever Ġwas ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġupdate Pred i ctions () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . update Pred i ctions () ĊĠĠĠĠĠĠĠ Ġif Ġ( is Predict or Enabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun On MainThread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpredictions Header . set Predict ed Apps ( is Predict or Enabled , Ġpredictions ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġlog App Launch ( v : ĠView ?, Ġintent : ĠIntent ?, Ġuser : ĠUser Handle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . log App Launch ( v , Ġintent , Ġuser ) ĊĠĠĠĠĠĠĠ Ġlog App Launch Impl ( v , Ġintent , Ġuser Ġ?: ĠProcess . my User Handle ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġlog App Launch Impl ( v : ĠView ?, Ġintent : ĠIntent ?, Ġuser : ĠUser Handle ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( is Predict or Enabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( intent ?. component Ġ!= Ġnull Ġ&& Ġm App Filter . should Show App ( intent . component , Ġuser )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclear Removed Components () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġchanged Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey Ġ= ĠComponent Key ( intent . component , Ġuser ). toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( recursive Is Drawer ( v )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapps List . add ( key ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchanged Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( relevant For Ph ones ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġph ones List . add ( key ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġph ones La unches ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchanged Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( changed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Pred i ctions () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠTODO : ĠThere Ġmust Ġbe Ġa Ġbetter , Ġmore Ġeleg ant Ġway Ġto Ġconcatenate Ġthese Ġlists ĊĠĠĠ Ġoverride Ġfun Ġget Pred i ctions (): ĠMutable List < Component Key Mapper > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( is Predict or Enabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclear Removed Components () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuser Ġ= ĠProcess . my User Handle () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġapp List Ġ= Ġif Ġ( phones Just Connected ) Ġph ones List . get Rank ed (). take ( MAX _ HEAD PHONE _ SU G GEST IONS ). to Mutable List () Ġelse Ġmutable ListOf () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapp List . addAll ( apps List . get Rank ed (). filter Not Ġ{ Ġapp List . contains ( it ) Ġ}. take ( MAX _ PRE DI CTION S Ġ- Ġapp List . size )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfull List Ġ= Ġapp List . map Ġ{ Ġget Component FromString ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Not Ġ{ Ġis Hidden App ( context , Ġit . key ) Ġ}. to Mutable List () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( full List . size Ġ< ĠMAX _ PRE DI CTION S ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfull List . addAll ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPL ACE _ HOLDER S . map NotNull Ġ{ Ġpackage Manager . get Launch Intent For Package ( it )?. component Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĠComponent Key Mapper ( context , ĠComponent Key ( it , Ġuser )) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfull List . take ( MAX _ PRE DI CTION S ). to Mutable List () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġmutable ListOf () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠTODO : ĠExtension Ġfunction ? ĊĠĠĠ Ġprivate Ġfun Ġclear Removed Components () Ġ{ ĊĠĠĠĠĠĠĠ Ġapps List . removeAll Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcomponent Ġ= Ġget Component FromString ( it ). key ?. component Name Ġ?: Ġreturn @ removeAll Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpackage Manager . getActivity Info ( component , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ignored : ĠPackage Manager . Name NotFoundException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintent Ġ= Ġpackage Manager . get Launch Intent For Package ( component . packageName ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( intent Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcomponent Info Ġ= Ġintent . component ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( component Info Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey Ġ= ĠComponent Key ( component Info , ĠProcess . my User Handle ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapps List . replace ( it , Ġkey . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ removeAll Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġph ones List . removeAll Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcomponent Ġ= Ġget Component FromString ( it ). key ?. component Name Ġ?: Ġreturn @ removeAll Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpackage Manager . getActivity Info ( component , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ignored : ĠPackage Manager . Name NotFoundException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintent Ġ= Ġpackage Manager . get Launch Intent For Package ( component . packageName ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( intent Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcomponent Info Ġ= Ġintent . component ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( component Info Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey Ġ= ĠComponent Key ( component Info , ĠProcess . my User Handle ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġph ones List . replace ( it , Ġkey . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ removeAll Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Shared Preference Changed ( shared Preferences : ĠSharedPreferences , Ġkey : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( key Ġ== ĠSettings Activity . SHOW _ PRE DI CTION S _ PRE F ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! is Predict or Enabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapps List . clear () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠtearDown Broadcast Receiver () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsetup Broadcast Receiver () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġis Predict or Enabled (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠOnly Ġenable Ġas Ġfallback , Ġthat Ġpref Ġwould Ġbe Ġset Ġto Ġa Ġproper Ġtimestamp Ġif Ġprediction Ġactually Ġworked . ĊĠĠĠĠĠĠĠ Ġreturn Ġsuper . is Predict or Enabled () Ġ&& ĠUtilities . get Reflection Prefs ( context ). getLong (" reflection _ most _ recent _ usage ", Ġ 0 L ) Ġ== Ġ 0 L ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠA Ġrank ed Ġlist Ġwith Ġroll Ġover Ġto Ġget / store Ġcurrently Ġrelevant Ġevents Ġand Ġrank Ġthem Ġby Ġocc uren ce ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinner Ġclass ĠCount Rank ed Array Preference ( private Ġval Ġprefs : ĠSharedPreferences , Ġprivate Ġval Ġkey : ĠString , Ġprivate Ġval ĠmaxSize : ĠInt Ġ= Ġ- 1 , Ġprivate Ġval Ġdelimiter : ĠString Ġ= Ġ"; ") Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġlist Ġ= Ġload () ĊĊĠĠĠĠĠĠĠ Ġfun Ġget Rank ed () Ġ: ĠSet < String > Ġ= Ġlist . distinct (). sorted By Ġ{ Ġvalue Ġ-> Ġlist . count Ġ{ Ġit Ġ== Ġvalue Ġ} Ġ}. reversed (). toSet () ĊĊĠĠĠĠĠĠĠ Ġfun Ġadd ( string : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlist . add ( 0 , Ġstring ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( maxSize Ġ>= Ġ 0 Ġ&& Ġlist . size Ġ> ĠmaxSize ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist Ġ= Ġlist . drop ( maxSize ). to Mutable List () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsave () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġclear () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlist . clear () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprefs . edit (). remove ( key ). apply () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfun Ġremove All ( filter : Ġ( String ) Ġ-> ĠBoolean ) Ġ= Ġlist . removeAll ( filter ) ĊĠĠĠĠĠĠĠ Ġfun Ġreplace ( filter : ĠString , Ġreplacement : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlist Ġ= Ġlist . map Ġ{ Ġif Ġ( it Ġ== Ġfilter ) Ġreplacement Ġelse Ġit Ġ}. to Mutable List () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfun Ġcontains ( element : ĠString ) Ġ= Ġlist . contains ( element ) ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġload () Ġ= Ġ( prefs . getString ( key , Ġ"") ?: Ġ""). split ( delimiter ). to Mutable List () ĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġsave () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstr Value Ġ= Ġlist . join ToString ( delimiter ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprefs . edit (). putString ( key , Ġstr Value ). apply () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġaction ToString ( id : ĠString , Ġpublisher : ĠString , Ġbadge : ĠString ) Ġ= ĠJSONObject (). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġput ( KEY _ ID , Ġid ) ĊĠĠĠĠĠĠĠ Ġput ( KEY _ PUBL IS HER , Ġpublisher ) ĊĠĠĠĠĠĠĠ Ġput ( KEY _ BAD GE , Ġbadge ) ĊĠĠĠ Ġ}. toString () ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠACTIONS _ PACKAGE Ġ= Ġ" com . google . android . as " ĊĊĠĠĠĠĠĠĠ Ġconst Ġval ĠKEY _ ID Ġ= Ġ" id " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠKEY _ EXPI RATION Ġ= Ġ" expiration " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠKEY _ PUBL IS HER Ġ= Ġ" publisher " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠKEY _ BAD GE Ġ= Ġ" badge " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠKEY _ POSITION Ġ= Ġ" position " ĊĊĠĠĠĠĠĠĠ Ġ// ĠTODO : ĠIncrease Ġto Ġtwo ? ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠMAX _ HEAD PHONE _ SU G GEST IONS Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġ// ĠOur Ġdefinition Ġof Ġ" Recent ly " ĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġval ĠD URATION _ REC ENT LY Ġ= ĠTimeUnit . MIN UTES . to Millis ( 2 ) ĊĠĠĠ Ġ} Ċ } Ċ