package Ġcom . b oring d roid . system ui Ċ Ċ import Ġandroid . app . Activity Manager Ċ import Ġandroid . app . Activity Manager . Running Task Info Ċ import Ġandroid . content . Clip Data Ċ import Ġandroid . content . Component Name Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Intent Ċ import Ġandroid . content . pm . Launcher Apps Ċ import Ġandroid . content . pm . PackageManager Ċ import Ġandroid . graphics . Canvas Ċ import Ġandroid . graphics . Color Ċ import Ġandroid . graphics . Point Ċ import Ġandroid . graphics . drawable . Color Drawable Ċ import Ġandroid . graphics . drawable . Drawable Ċ import Ġandroid . os . User Manager Ċ import Ġandroid . util . Attribute Set Ċ import Ġandroid . util . Log Ċ import Ġandroid . view . Drag Event Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroid . widget . ImageView Ċ import Ġandroidx . annotation . Visible ForTesting Ċ import Ġandroidx . recyclerview . widget . Linear LayoutManager Ċ import Ġandroidx . recyclerview . widget . RecyclerView Ċ import Ġcom . android . system ui . shared . system . Activity Manager Wrapper Ċ import Ġcom . android . system ui . shared . system . Task Stack ChangeListener Ċ import Ġjava . util . function . Consumer Ċ import Ġkotlin . math . abs Ċ Ċ class ĠApp State Layout Ġ@ Jvm Over loads Ġconstructor ( ĊĠĠĠ Ġcontext : ĠContext , ĊĠĠĠ Ġattrs : ĠAttributeSet ? Ġ= Ġnull , ĊĠĠĠ Ġdef Style Attr : ĠInt Ġ= Ġ 0 Ċ ) Ġ: ĠRecyclerView ( context , Ġattrs , Ġdef Style Attr ) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġm Activity Manager : ĠActivity Manager ĊĠĠĠ Ġprivate Ġval Ġm Listener Ġ= ĠApp State Listener () ĊĠĠĠ Ġprivate Ġval Ġm Launch Apps : ĠLaunch er Apps ĊĠĠĠ Ġprivate Ġval Ġm User Manager : ĠUser Manager ĊĠĠĠ Ġprivate Ġval Ġm Tasks : ĠMutable List < Task Info > Ġ= ĠArrayList () ĊĠĠĠ Ġprivate Ġval Ġm Adapter : ĠTask Adapter ? ĊĠĠĠ Ġoverride Ġfun Ġon Attached To Window () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Attached To Window () ĊĠĠĠĠĠĠĠ ĠAM _ WRAPPER . register Task Stack Listener ( m Listener ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Detached From Window () Ġ{ ĊĠĠĠĠĠĠĠ ĠAM _ WRAPPER . unregister Task Stack Listener ( m Listener ) ĊĠĠĠĠĠĠĠ Ġsuper . on Detached From Window () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġinit Tasks () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrunning Task Infos Ġ= Ġm Activity Manager . get Running Tasks ( MAX _ RUNNING _ TASK S ) ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġrunning Task Infos . indices . reversed ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrunning Task Info Ġ= Ġrunning Task Infos [ i ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( should Ignore Top Task ( running Task Info . top Activity )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtop Task ( running Task Info , Ġtrue ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġremove Task ( taskId : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġm Tasks . remove If Ġ{ Ġtask Info : ĠTask Info Ġ-> Ġtask Info . id Ġ== ĠtaskId Ġ} ĊĠĠĠĠĠĠĠ Ġm Adapter !!. setData ( m Tasks ) ĊĠĠĠĠĠĠĠ Ġm Adapter . notify DataSet Changed () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Running Task Info PackageName ( running Task Info : ĠRunning Task Info ): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( running Task Info . base Activity Ġ== Ġnull ) Ġnull Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrunning Task Info . base Activity !!. packageName ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġshould Ignore Top Task ( component Name : ĠComponent Name ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( component Name Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Ignore Ġinvalid Ġcomponent Ġname ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval ĠpackageName Ġ= Ġcomponent Name . packageName ĊĠĠĠĠĠĠĠ Ġif Ġ(" android " Ġ== ĠpackageName ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Ignore Ġandroid ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( is Special Launcher ( packageName )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Ignore Ġlauncher Ġ$ packageName ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( context Ġ!= Ġnull Ġ&& ĠpackageName . startsWith ( context . packageName )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Ignore Ġself Ġ$ packageName ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( is Launcher ( context , Ġcomponent Name )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Ignore Ġlauncher Ġ$ component Name ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( packageName . startsWith (" com . android . system ui ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Ignore Ġsystem ui Ġ$ packageName ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Don 't Ġignore Ġtop Ġtask Ġ$ packageName ") ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġtop Task ( running Task Info : ĠRunning Task Info , Ġskip Ignore Check : ĠBoolean Ġ= Ġfalse ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠpackageName Ġ= Ġget Running Task Info PackageName ( running Task Info ) ĊĠĠĠĠĠĠĠ Ġif Ġ(! skip Ignore Check Ġ&& Ġshould Ignore Top Task ( running Task Info . top Activity )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Adapter !!. set Top TaskId (- 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Adapter . notify DataSet Changed () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġtask Info Ġ= ĠTask Info () ĊĠĠĠĠĠĠĠ Ġtask Info . id Ġ= Ġrunning Task Info . id ĊĠĠĠĠĠĠĠ Ġtask Info . set Base Activity Component Name ( running Task Info . base Activity ) ĊĠĠĠĠĠĠĠ Ġtask Info . set Real Activity Component Name ( running Task Info . top Activity ) ĊĠĠĠĠĠĠĠ Ġtask Info . packageName Ġ= ĠpackageName ĊĠĠĠĠĠĠĠ Ġval Ġuser Handles Ġ= Ġm User Manager . user Profiles ĊĠĠĠĠĠĠĠ Ġfor Ġ( user Handle Ġin Ġuser Handles ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinfo List Ġ= Ġm Launch Apps . getActivity List ( packageName , Ġuser Handle ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( info List . size Ġ> Ġ 0 Ġ&& Ġinfo List [ 0 ] Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtask Info . icon Ġ= Ġinfo List [ 0 ] !!. get Icon ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġvar Ġicon Ġ= Ġtask Info . icon ĊĠĠĠĠĠĠĠ Ġicon Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( icon Ġ== Ġnull Ġ&& Ġcontext Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . get Drawable ( R . mip map . default _ icon _ round ) Ġelse Ġicon ĊĠĠĠĠĠĠĠ Ġif Ġ( icon Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ"$ packageName 's Ġicon Ġis Ġnull , Ġcontext Ġ$ context ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġtask Info . icon Ġ= Ġicon ĊĠĠĠĠĠĠĠ Ġval Ġindex Ġ= Ġm Tasks . indexOf ( task Info ) ĊĠĠĠĠĠĠĠ Ġm Tasks . remove ( task Info ) ĊĠĠĠĠĠĠĠ Ġm Tasks . add ( if Ġ( index Ġ>= Ġ 0 ) Ġindex Ġelse Ġm Tasks . size , Ġtask Info ) ĊĠĠĠĠĠĠĠ Ġm Adapter !!. setData ( m Tasks ) ĊĠĠĠĠĠĠĠ Ġm Adapter . set Top TaskId ( task Info . id ) ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Top Ġtask Ġ$ task Info ") ĊĠĠĠĠĠĠĠ Ġm Adapter . notify DataSet Changed () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġis Special Launcher ( packageName : ĠString ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(" com . far mer bb . task bar " Ġ== ĠpackageName ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ(" com . tes l aco il sw . launcher " Ġ== ĠpackageName ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġ" ch . de let escape . l awn ch air . pl ah " Ġ== ĠpackageName ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Visible ForTesting ĊĠĠĠ Ġfun Ġis Launcher ( context : ĠContext , Ġcomponent Name : ĠComponent Name ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( component Name Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval ĠpackageName Ġ= Ġcomponent Name . packageName ĊĠĠĠĠĠĠĠ Ġval ĠclassName Ġ= Ġcomponent Name . className ĊĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( Intent . ACTION _ MAIN ) ĊĠĠĠĠĠĠĠ Ġintent . add Category ( Intent . CATEGORY _ HOME ) ĊĠĠĠĠĠĠĠ Ġval Ġresolve Infos Ġ= Ġcontext . package Manager . query Intent Activities ( intent , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġfor Ġ( resolve Info Ġin Ġresolve Infos ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Found Ġlauncher Ġ$ resolve Info ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( resolve Info ?. activity Info Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġactivity Info Ġ= Ġresolve Info . activity Info ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( packageName Ġ== Ġactivity Info . packageName Ġ&& ĠclassName Ġ== Ġactivity Info . name ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġreload Activity Manager ( context : ĠContext ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġm Adapter ?. reload Activity Manager ( context ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinner Ġclass ĠApp State Listener Ġ: ĠTask Stack ChangeListener () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Task Created ( taskId : ĠInt , Ġcomponent Name : ĠComponent Name ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Task Created ( taskId , Ġcomponent Name ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" on Task Created Ġ$ taskId , Ġcm Ġ$ component Name ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Task Stack Changed () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Task Moved To Front ( taskId : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Task Moved To Front ( taskId ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" on Task MoveTo Front ĠtaskId Ġ$ taskId ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Task Stack Changed () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Task Moved To Front ( task Info : ĠRunning Task Info ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Task Moved To Front ( task Info ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" on Task Moved To Front Ġ$ task Info ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Task Stack Changed () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Task Stack Changed () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Task Stack Changed () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinfo Ġ= ĠAM _ WRAPPER . get Running Task ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" on Task Stack Changed Ġ$ info ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinfo ?. let Ġ{ Ġtop Task ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Task Removed ( taskId : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Task Removed ( taskId ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" on Task Removed Ġ$ taskId ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġremove Task ( taskId ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠTask Adapter ( private Ġval ĠmContext : ĠContext , Ġdrag Close Threshold : ĠInt ) Ġ: ĊĠĠĠĠĠĠĠ ĠAdapter < Task Adapter . ViewHolder >() Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġm Tasks : ĠMutable List < Task Info > Ġ= ĠArrayList () ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġm System UI Activity Manager : ĠActivity Manager ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġm PackageManager : ĠPackage Manager ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġm Top TaskId Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġm Drag Close Threshold : ĠInt ĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonCreate ViewHolder ( parent : ĠViewGroup , Ġview Type : ĠInt ): ĠViewHolder Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtask Info Layout Ġ= ĠLayoutInflater . from ( mContext ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. inflate ( R . layout . layout _ task _ info , Ġparent , Ġfalse ) Ġas ĠViewGroup ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠViewHolder ( task Info Layout ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Bind ViewHolder ( holder : ĠViewHolder , Ġposition : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtask Info Ġ= Ġm Tasks [ position ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠpackageName Ġ= Ġtask Info . packageName ĊĠĠĠĠĠĠĠĠĠĠĠ Ġholder . icon IV . setImage Drawable ( task Info . icon ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( task Info . id Ġ== Ġm Top TaskId ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġholder . high Light Line TV . setImage Resource ( R . drawable . line _ long ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġholder . high Light Line TV . setImage Resource ( R . drawable . line _ short ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġlabel : ĠCharSequence ? Ġ= ĠpackageName ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlabel Ġ= Ġm PackageManager . getApplication Label ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm PackageManager . getApplication Info ( packageName !! , ĠPackage Manager . GET _ META _ DATA ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠPackage Manager . Name NotFoundException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" Failed Ġto Ġget Ġlabel Ġfor Ġ$ packageName ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġholder . icon IV . tag Ġ= Ġtask Info . id ĊĠĠĠĠĠĠĠĠĠĠĠ Ġholder . icon IV . tooltip Text Ġ= Ġlabel ĊĠĠĠĠĠĠĠĠĠĠĠ Ġholder . icon IV . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm System UI Activity Manager . move Task To Front ( task Info . id , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠmContext . send Broadcast ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIntent (" com . b oring d roid . system ui . CLOSE _ REC ENTS ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġholder . icon IV . setOn Long ClickListener Ġ{ Ġv : ĠView Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġitem Ġ= ĠClip Data . Item ( TAG _ TASK _ ICON ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdrag Data Ġ= ĠClip Data ( TAG _ TASK _ ICON , ĠarrayOf (" unknown "), Ġitem ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġshadow : ĠDrag Shadow Builder Ġ= ĠDrag Drop Shadow Builder ( v ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġholder . icon IV . setOn Drag Listener ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDrag Drop Close Listener ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Drag Close Threshold , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Drag Close Threshold ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĠtaskId : ĠInt ? Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAM _ WRAPPER . remove Task ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠtaskId !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġv . start Drag And Drop ( drag Data , Ġshadow , Ġnull , ĠDR AG _ FLAG _ GLOBAL ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠgetItem Count (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġm Tasks . size ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun ĠsetData ( tasks : ĠList < Task Info > ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Tasks . clear () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Tasks . addAll ( tasks !! ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġset Top TaskId ( id : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Top TaskId Ġ= Ġid ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġreload Activity Manager ( context : ĠContext ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm System UI Activity Manager Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext !!. getSystem Service ( Context . ACTIVITY _ SERVICE ) Ġas ĠActivity Manager ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġclass ĠViewHolder ( task Info Layout : ĠViewGroup ) Ġ: ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRecyclerView . ViewHolder ( task Info Layout ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġicon IV : ĠImageView Ġ= Ġtask Info Layout . findViewById ( R . id . iv _ task _ info _ icon ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhigh Light Line TV : ĠImageView Ġ= Ġtask Info Layout . findViewById ( R . id . iv _ highlight _ line ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠTAG _ TASK _ ICON Ġ= Ġ" task _ icon " ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWe Ġwill Ġuse Ġreload Activity Manager Ġto Ġupdate Ġm System UI Activity Manager Ġwith ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġsystem ui Ġcontext . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm System UI Activity Manager Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠmContext . getSystem Service ( Context . ACTIVITY _ SERVICE ) Ġas ĠActivity Manager ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm PackageManager Ġ= ĠmContext . package Manager ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Drag Close Threshold Ġ= Ġdrag Close Threshold ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠDrag Drop Close Listener ( ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġm Width : ĠInt , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġm Height : ĠInt , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġm End Callback : ĠConsumer < Int ?> ? ĊĠĠĠ Ġ) Ġ: ĠOn Drag Listener Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġm Start X Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġm Start Y Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Drag ( v : ĠView , Ġevent : ĠDrag Event ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( event . action ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDrag Event . ACTION _ DR AG _ STARTED Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlocations Ġ= ĠInt Array ( 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġv . getLocation On Screen ( locations ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Start X Ġ= Ġlocations [ 0 ]. toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Start Y Ġ= Ġlocations [ 1 ]. toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDrag Event . ACTION _ DR AG _ ENDED Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġx Ġ= Ġevent . x ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġy Ġ= Ġevent . y ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( abs ( x Ġ- Ġm Start X ) Ġ< Ġm Width Ġ&& Ġabs ( y Ġ- Ġm Start Y ) Ġ< Ġm Height ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDo Ġnothing ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġv . setOn Drag Listener ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m End Callback Ġ!= Ġnull Ġ&& Ġv . tag Ġis ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm End Callback . accept ( v . tag Ġas ĠInt ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠDrag Drop Shadow Builder ( v : ĠView ?) Ġ: ĠDrag Shadow Builder ( v ) Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Provide Shadow Metrics ( size : ĠPoint , Ġtouch : ĠPoint ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwidth Ġ= Ġview . width ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġheight Ġ= Ġview . height ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Shadow . setBounds ( 0 , Ġ 0 , Ġwidth , Ġheight ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsize [ width ] Ġ= Ġheight ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtouch [ width Ġ/ Ġ 2 ] Ġ= Ġheight Ġ/ Ġ 2 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Draw Shadow ( canvas : ĠCanvas ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Shadow . draw ( canvas ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġlateinit Ġvar Ġm Shadow : ĠDrawable ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Shadow Ġ= Ġif Ġ( v Ġis ĠImageView Ġ&& Ġv . drawable Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġv . drawable . mutate (). constant State !!. new Drawable () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠColor Drawable ( Color . LT GRAY ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠTAG Ġ= Ġ" AppState Layout " ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠAM _ WRAPPER Ġ= ĠActivity Manager Wrapper . getInstance () ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠMAX _ RUNNING _ TASK S Ġ= Ġ 5 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġm Activity Manager Ġ= Ġcontext . getSystem Service ( Context . ACTIVITY _ SERVICE ) Ġas ĠActivity Manager ĊĠĠĠĠĠĠĠ Ġm Launch Apps Ġ= Ġcontext . getSystem Service ( Context . LA UNCH ER _ APPS _ SERVICE ) Ġas ĠLaunch er Apps ĊĠĠĠĠĠĠĠ Ġm User Manager Ġ= Ġcontext . getSystem Service ( Context . USER _ SERVICE ) Ġas ĠUser Manager ĊĠĠĠĠĠĠĠ Ġval Ġmanager Ġ= ĠLinearLayoutManager ( context , ĠH ORIZONTAL , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġlayout Manager Ġ= Ġmanager ĊĠĠĠĠĠĠĠ Ġset Has Fixed Size ( true ) ĊĠĠĠĠĠĠĠ Ġval Ġapp Info Icon Width Ġ= Ġcontext . resources . get Dimension Pixel Size ( R . dim en . app _ info _ icon _ width ) ĊĠĠĠĠĠĠĠ Ġm Adapter Ġ= ĠTask Adapter ( context , Ġ( app Info Icon Width Ġ* Ġ 5 )) ĊĠĠĠĠĠĠĠ Ġadapter Ġ= Ġm Adapter ĊĠĠĠ Ġ} Ċ } Ċ