package Ġtk . zw ander . lock screen widgets . services Ċ Ċ import Ġandroid . accessibility service . Accessibility Service Ċ import Ġandroid . annotation . Suppress Lint Ċ import Ġandroid . app . Key guard Manager Ċ import Ġandroid . content .* Ċ import Ġandroid . os . Power Manager Ċ import Ġandroid . util . Log Ċ import Ġandroid . view .* Ċ import Ġandroid . view . accessibility . Accessibility Event Ċ import Ġandroid . view . accessibility . Accessibility NodeInfo Ċ import Ġandroid . view . accessibility . Accessibility Window Info Ċ import Ġandroidx . local broadcast manager . content . Local Broadcast Manager Ċ import Ġkotlinx . coroutines .* Ċ import Ġtk . zw ander . lock screen widgets . App Ċ import Ġtk . zw ander . lock screen widgets . activities . Dismiss Or Unlock Activity Ċ import Ġtk . zw ander . lock screen widgets . app widget . ID Widget Factory Ċ import Ġtk . zw ander . lock screen widgets . app widget . ID List Provider Ċ import Ġtk . zw ander . lock screen widgets . data . window . Window Info Ċ import Ġtk . zw ander . lock screen widgets . data . window . Window Root Pair Ċ import Ġtk . zw ander . lock screen widgets . util .* Ċ import Ġjava . lang . IllegalStateException Ċ import Ġjava . util . concurrent . Concurrent Linked Queue Ċ Ċ /** Ċ Ġ* ĠThis Ġis Ġwhere Ġa Ġlot Ġof Ġthe Ġmagic Ġhappens . Ċ Ġ* ĠIn ĠAndroid Ġ 5 . 1 +, Ġthere 's Ġa Ġspecial Ġoverlay Ġtype : Ġ[ WindowManager . LayoutParams . TYPE _ ACC ES SI B ILITY _ OVER LAY ]. Ċ Ġ* ĠAccessibility Ġoverlay s Ġcan Ġshow Ġover Ġalmost Ġall Ġother Ġwindows , Ġincluding ĠSystem ĠUI , Ġand Ġtherefore Ġthe Ġkey guard / lock Ġscreen . Ċ Ġ* ĠTo Ġactually Ġuse Ġthis Ġoverlay Ġtype , Ġwe Ġneed Ġan ĠAccessibility Service . Ċ Ġ* Ċ Ġ* ĠThis Ġservice Ġis Ġalso Ġused Ġto Ġdetect Ġwhat 's Ġon screen Ġand Ġrespond Ġappropriately . ĠFor Ġinstance , Ġif Ġthe Ġuser Ċ Ġ* Ġhas Ġenabled Ġthe Ġ" Hide ĠWhen ĠNotification ĠSh ade ĠSh own " Ġoption , Ġwe Ġuse Ġour Ġaccess Ġto Ġthe Ġscreen Ġcontent Ġto Ċ Ġ* Ġcheck Ġthat Ġthe Ġleft Ġlock Ġscreen Ġshortcut Ġis Ġno Ġlonger Ġvisible , Ġsince Ġit Ġhide s Ġwhen Ġthe Ġnotification Ġsh ade Ċ Ġ* Ġis Ġshown . Ċ Ġ*/ Ċ class ĠAccessibility Ġ: ĠAccessibility Service (), ĠSharedPreferences . On Shared Preference ChangeListener , ĠCor outine Scope Ġby ĠMain Scope () Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠACTION _ LOCK SCREEN _ DIS MIS SED Ġ= Ġ" LOCK SCREEN _ DIS MIS SED " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠOn ĠAndroid Ġ 8 . 0 +, Ġit 's Ġpretty Ġeasy Ġto Ġdismiss Ġthe Ġlock Ġscreen Ġwith Ġa Ġsimple ĠAPI Ġcall . ĊĠĠĠĠ Ġ* ĠOn Ġearlier ĠAndroid Ġversions , Ġit 's Ġnot Ġso Ġeasy , Ġand Ġwe Ġneed Ġa Ġway Ġto Ġdetect Ġwhen Ġthe ĊĠĠĠĠ Ġ* Ġlock Ġscreen Ġhas Ġsuccessfully Ġbeen Ġdis missed . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThis Ġis Ġjust Ġa Ġsimple Ġwrapper Ġclass Ġaround Ġa ĠBroadcast Receiver Ġfor Ġ[ Dismiss Or Unlock Activity ] ĊĠĠĠĠ Ġ* Ġto Ġimplement Ġso Ġit Ġcan Ġreceive Ġthe Ġkey guard Ġdismiss al Ġevent Ġwe Ġgenerate Ġfrom Ġthis Ġservice . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġabstract Ġclass ĠOn Lock screen Dismiss Listener Ġ: ĠBroadcast Receiver () Ġ{ ĊĠĠĠĠĠĠĠ Ġfinal Ġoverride Ġfun Ġon Receive ( context : ĠContext ?, Ġintent : ĠIntent ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( intent ?. action Ġ== ĠACTION _ LOCK SCREEN _ DIS MIS SED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Dis missed () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġregister ( context : ĠContext ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLocal Broadcast Manager . getInstance ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. register Receiver ( this , ĠIntent Filter ( ACTION _ LOCK SCREEN _ DIS MIS SED )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġunregister ( context : ĠContext ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLocal Broadcast Manager . getInstance ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. unregister Receiver ( this ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġabstract Ġfun Ġon Dis missed () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġk gm Ġby Ġlazy Ġ{ Ġget System Service ( Context . KEY GU ARD _ SERVICE ) Ġas ĠKey guard Manager Ġ} ĊĠĠĠ Ġprivate Ġval Ġwm Ġby Ġlazy Ġ{ Ġget System Service ( Context . WINDOW _ SERVICE ) Ġas ĠWindow Manager Ġ} ĊĠĠĠ Ġprivate Ġval Ġpower Ġby Ġlazy Ġ{ Ġget System Service ( Context . POWER _ SERVICE ) Ġas ĠPower Manager Ġ} ĊĠĠĠ Ġprivate Ġval Ġdelegate : ĠWidget Frame Delegate ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĠWidget Frame Delegate . getInstance ( this ) ĊĊĠĠĠ Ġ// Receive Ġupdates Ġfrom Ġour Ġnotification Ġlistener Ġservice Ġon Ġhow Ġmany ĊĠĠĠ Ġ// notifications Ġare Ġcurrently Ġshown Ġto Ġthe Ġuser . ĠThis Ġcount Ġexclude s ĊĠĠĠ Ġ// notifications Ġnot Ġvisible Ġon Ġthe Ġlock Ġscreen . ĊĠĠĠ Ġ// If Ġthe Ġnotification Ġcount Ġis Ġ> Ġ 0 , Ġand Ġthe Ġuser Ġhas Ġthe Ġoption Ġenabled , ĊĠĠĠ Ġ// make Ġsure Ġto Ġhide Ġthe Ġwidget Ġframe . ĊĠĠĠ Ġprivate Ġval Ġnotification Count Listener Ġ= ĊĠĠĠĠĠĠĠ Ġobject Ġ: ĠNotification Listener . Notification Count Listener () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonUpdate ( count : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelegate . notification Count Ġ= Ġcount ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pref Manager . hide On Notifications Ġ&& Ġcount Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremove Overlay () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( delegate . can Show ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Overlay () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Listen Ġfor Ġthe Ġscreen Ġturning Ġon Ġand Ġoff . ĊĠĠĠ Ġ// This Ġshouldn 't Ġreally Ġbe Ġnecessary , Ġbut Ġthere Ġare Ġsome Ġqu ir ks Ġin Ġhow ĊĠĠĠ Ġ// Android Ġworks Ġthat Ġmakes Ġit Ġhelpful . ĊĠĠĠ Ġprivate Ġval Ġscreen State Receiver Ġ= Ġobject Ġ: ĠBroadcast Receiver () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Receive ( context : ĠContext ?, Ġintent : ĠIntent ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( intent ?. action ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIntent . ACTION _ SCREEN _ OFF Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Some times ĠACTION _ SCREEN _ OFF Ġgets Ġreceived Ġ* after * Ġthe Ġdisplay Ġturns Ġon , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// so Ġthis Ġcheck Ġis Ġhere Ġto Ġmake Ġsure Ġthe Ġscreen Ġis Ġactually Ġoff Ġwhen Ġthis ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// action Ġis Ġreceived . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! power . is Interactive ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog Utils . debug Log (" Screen Ġoff ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaccessibility Job ?. cancel () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// If Ġthe Ġdevice Ġhas Ġsome Ġsort Ġof ĠA OD Ġor Ġambient Ġdisplay , Ġby Ġthe Ġtime Ġwe Ġreceive ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// an Ġaccessibility Ġevent Ġand Ġsee Ġthat Ġthe Ġdisplay Ġis Ġoff , Ġit 's Ġusually Ġtoo Ġlate ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// and Ġthe Ġcurrent Ġscreen Ġcontent Ġhas Ġ" frozen ," Ġcausing Ġthe Ġwidget Ġframe Ġto Ġshow ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// where Ġit Ġshouldn 't . ĠACTION _ SCREEN _ OFF Ġis Ġcalled Ġearly Ġenough Ġthat Ġwe Ġcan Ġremove ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// the Ġframe Ġbefore Ġit 's Ġfrozen Ġin Ġplace . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremove Overlay () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelegate . force Wake lock ( wm , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelegate . is Temp Hide Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelegate . is Screen On Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIntent . ACTION _ SCREEN _ ON Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlatest Screen On Time Ġ= ĠSystem . currentTimeMillis () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog Utils . debug Log (" Screen Ġon ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelegate . is Screen On Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( delegate . can Show ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaccessibility Job ?. cancel () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Overlay () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġshared Preferences Change Handler Ġ= ĠHandler Registry Ġ{ ĊĠĠĠĠĠĠĠ Ġhandler ( Pref Manager . KEY _ WIDGET _ FRAME _ ENABLED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( delegate . can Show ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Overlay () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremove Overlay () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġhandler ( Pref Manager . KEY _ ACC ES SI B ILITY _ EVENT _ DELAY ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġservice Info Ġ= Ġservice Info . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnotification Timeout Ġ= Ġpref Manager . accessibility Event Delay . to Long () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġhandler ( Pref Manager . KEY _ DEBUG _ LOG ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠID List Provider . send Update ( this @ Accessibility ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġlatest Screen On Time : ĠLong Ġ= Ġ 0 L ĊĊĠĠĠ Ġprivate Ġvar Ġaccessibility Job : ĠJob ? Ġ= Ġnull ĊĊĠĠĠ Ġ@ Suppress Lint (" Click ableView Accessibility ", Ġ" New Api ") ĊĠĠĠ Ġoverride Ġfun ĠonCreate () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate () ĊĊĠĠĠĠĠĠĠ Ġdelegate . onCreate () ĊĠĠĠĠĠĠĠ Ġpref Manager . prefs . register On Shared Preference ChangeListener ( this ) ĊĊĠĠĠĠĠĠĠ Ġdelegate . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . frame . on After Resize Listener Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadapter . on Resize Observable . notify Observer s () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelegate . update Wall paper Layer IfNeeded () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . frame . on After Move Listener Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelegate . update Wall paper Layer IfNeeded () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . frame . on Move Listener Ġ= Ġ{ Ġvel X , Ġvel Y Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparams . x Ġ+= Ġvel X . toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparams . y Ġ+= Ġvel Y . toInt () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Overlay () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpref Manager . set Correct Frame Pos ( save Mode , Ġparams . x , Ġparams . y ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . frame . on Left Drag Listener Ġ= Ġ{ Ġvel X Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparams . width Ġ-= Ġvel X ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparams . x Ġ+= Ġ( vel X Ġ/ Ġ 2 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpref Manager . set Correct Frame Width ( save Mode , Ġpx As Dp ( params . width )) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Overlay () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . frame . on Right Drag Listener Ġ= Ġ{ Ġvel X Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparams . width Ġ+= Ġvel X ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparams . x Ġ+= Ġ( vel X Ġ/ Ġ 2 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpref Manager . set Correct Frame Width ( save Mode , Ġpx As Dp ( params . width )) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Overlay () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . frame . on Top Drag Listener Ġ= Ġ{ Ġvel Y Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparams . height Ġ-= Ġvel Y ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparams . y Ġ+= Ġ( vel Y Ġ/ Ġ 2 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpref Manager . set Correct Frame Height ( save Mode , Ġpx As Dp ( params . height )) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Overlay () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . frame . on Bottom Drag Listener Ġ= Ġ{ Ġvel Y Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparams . height Ġ+= Ġvel Y ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparams . y Ġ+= Ġ( vel Y Ġ/ Ġ 2 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpref Manager . set Correct Frame Height ( save Mode , Ġpx As Dp ( params . height )) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Overlay () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . frame . on Intercept Listener Ġ= Ġ{ Ġdown Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġforce Wake lock ( wm , Ġdown ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . frame . on Temp Hide Listener Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Temp Hide Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremove Overlay () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġnotification Count Listener . register ( this ) ĊĠĠĠĠĠĠĠ Ġregister Receiver ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscreen State Receiver , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIntent Filter ( Intent . ACTION _ SCREEN _ OFF ). apply Ġ{ Ġadd Action ( Intent . ACTION _ SCREEN _ ON ) Ġ}) ĊĊĠĠĠĠĠĠĠ Ġdelegate . was On Key guard Ġ= Ġk gm . is Key guard Locked ĊĠĠĠĠĠĠĠ Ġdelegate . is Screen On Ġ= Ġpower . is Interactive ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Service Connected () Ġ{ ĊĠĠĠĠĠĠĠ Ġservice Info Ġ= Ġservice Info . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnotification Timeout Ġ= Ġpref Manager . accessibility Event Delay . to Long () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Accessibility Event ( event : ĠAccessibility Event ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Since Ġwe 're Ġlaunch ing Ġour Ġlogic Ġon Ġthe Ġmain ĠThread , Ġit 's Ġpossible ĊĠĠĠĠĠĠĠ Ġ// that Ġ[ event ] Ġwill Ġbe Ġreused Ġby ĠAndroid , Ġcausing Ġsome Ġcrash Ġissues . ĊĠĠĠĠĠĠĠ Ġ// Make Ġa Ġcopy Ġthat Ġis Ġre cyc led Ġlater . ĊĠĠĠĠĠĠĠ Ġval Ġevent Copy Ġ= ĠAccessibility Event . obtain ( event ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( System . currentTimeMillis () Ġ- Ġlatest Screen On Time Ġ< Ġ 1 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĊĠĠĠĠĠĠĠ Ġaccessibility Job ?. cancel () ĊĠĠĠĠĠĠĠ Ġaccessibility Job Ġ= Ġlaunch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// This Ġblock Ġhere Ġruns Ġeven Ġwhen Ġun locked , Ġbut Ġit Ġonly Ġtakes Ġa Ġmilli second Ġat Ġmost , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// so Ġit Ġshouldn 't Ġbe Ġnotice able Ġto Ġthe Ġuser . ĠWe Ġuse Ġthis Ġto Ġcheck Ġthe Ġcurrent Ġkey guard ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// state Ġand , Ġif Ġapplicable , Ġsend Ġthe Ġkey guard Ġdismiss al Ġbroadcast . ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Check Ġif Ġthe Ġscreen Ġis Ġon . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Screen On Ġ= Ġpower . is Interactive ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( delegate . is Screen On Ġ!= Ġis Screen On ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Make Ġsure Ġto Ġturn Ġoff Ġtemp Ġhide Ġif Ġit Ġwas Ġon . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelegate . is Temp Hide Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelegate . is Screen On Ġ= Ġis Screen On ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Check Ġif Ġthe Ġlock Ġscreen Ġis Ġshown . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis On Key guard Ġ= Ġk gm . is Key guard Locked ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is On Key guard Ġ!= Ġdelegate . was On Key guard ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelegate . was On Key guard Ġ= Ġis On Key guard ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Update Ġthe Ġkey guard Ġdismiss al ĠActivity Ġthat Ġthe Ġlock Ġscreen ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// has Ġbeen Ġdis missed . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! is On Key guard ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLocal Broadcast Manager . getInstance ( this @ Accessibility ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. send Broadcast ( Intent ( ACTION _ LOCK SCREEN _ DIS MIS SED )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelegate . screen Orientation Ġ= Ġdefault Display Compat . rotation ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog Utils . debug Log (" Accessibility Ġevent : Ġ$ event Copy , Ġis Screen On : Ġ${ is Screen On }, Ġwas On Key guard : Ġ$ is On Key guard ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// The Ġbelow Ġblock Ġcan Ġ( very Ġrare ly ) Ġtake Ġover Ġhalf Ġa Ġsecond Ġto Ġexecute , Ġso Ġonly Ġrun Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// if Ġwe Ġactually Ġneed Ġto Ġ( i . e . Ġon Ġthe Ġlock Ġscreen Ġand Ġscreen Ġis Ġon ). ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(( delegate . was On Key guard Ġ|| Ġpref Manager . show In Notification Center ) Ġ&& Ġis Screen On ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Retrieve Ġthe Ġcurrent Ġwindow Ġset . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwindows Ġ= Ġwindows . map Ġ{ ĠWindow Root Pair ( it , Ġit . safe Root ) Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Get Ġall Ġwindows Ġwith Ġthe ĠSystem ĠUI Ġpackage Ġname . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Get Ġthe Ġtop most Ġapplication Ġwindow . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Get Ġthe Ġtop most Ġwindow Ġthat Ġisn 't Ġan Ġapplication Ġand Ġdoesn 't Ġbelong Ġto ĠSystem ĠUI . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( sys Ui Windows , Ġapp Window , Ġnon App System Window ) Ġ= Ġget Windows ( windows ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Fl att ed Ġthe Ġnodes / Views Ġin Ġthe ĠSystem ĠUI Ġwindows Ġinto ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// a Ġsingle Ġlist Ġfor Ġeasier Ġhandling . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsys Ui Nodes Ġ= ĠConcurrent Linked Queue < Accessibility NodeInfo >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Get Ġall ĠView ĠIDs Ġfrom Ġsuccessfully - flatten ed ĠSystem ĠUI Ġnodes . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġitems Ġ= ĠConcurrent Linked Queue < String >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġawait s Ġ= ĠConcurrent Linked Queue < Deferred <* >>() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsys Ui Windows . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . root ?. let Ġ{ Ġroot Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd All Nodes ToList ( root , Ġsys Ui Nodes , Ġitems , Ġawait s ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġawait s . await All () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Update Ġany ĠID Ġlist Ġwidgets Ġon Ġthe Ġnew ĠIDs ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠID Widget Factory . s List . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclear () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd All ( items ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlaunch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠID List Provider . send Update ( this @ Accessibility ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( isDebug ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog Utils . debug Log ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsys Ui Nodes . filter Ġ{ Ġit . isVisible To User Ġ}. map Ġ{ Ġit . view Id ResourceName Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelegate . binding . frame . set New Debug Id Items ( items . toList ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// The Ġlogic Ġin Ġthis Ġblock Ġonly Ġneeds Ġto Ġrun Ġwhen Ġon Ġthe Ġlock Ġscreen . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Put Ġit Ġin Ġan Ġif - check Ġto Ġhelp Ġperformance . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is On Key guard ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Find Ġindex Ġof Ġthe Ġtop most Ġapplication Ġwindow Ġin Ġthe Ġset Ġof Ġall Ġwindows . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġapp Index Ġ= Ġwindows . indexOf ( app Window ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Find Ġthe Ġ* least * Ġindex Ġof Ġthe ĠSystem ĠUI Ġwindows Ġin Ġthe Ġset Ġof Ġall Ġwindows . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsys Ui Index Ġ= Ġsys Ui Windows . map NotNull Ġ{ Ġwindows . indexOf ( it ). run Ġ{ Ġif Ġ( this Ġ> Ġ- 1 ) Ġthis Ġelse Ġnull Ġ} Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. min OrNull () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Find Ġindex Ġof Ġthe Ġtop most Ġsystem Ġwindow . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsystem Index Ġ= Ġwindows . indexOf ( non App System Window ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// S amsung 's ĠScreen - Off ĠM emo Ġis Ġreally Ġjust Ġa Ġnormal ĠActivity Ġthat Ġshows Ġover Ġthe Ġlock Ġscreen . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// However , Ġit 's Ġnot Ġan ĠApplication - type Ġwindow Ġfor Ġsome Ġreason , Ġso Ġit Ġwon 't Ġhide Ġwith Ġthe ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// current App Layer Ġcheck . ĠExplicit ly Ġcheck Ġfor Ġits Ġexistence Ġhere . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelegate . is On Screen Off Memo Ġ= Ġwindows . any Ġ{ Ġwin Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwin . root ?. packageName Ġ== Ġ" com . s amsung . android . app . notes " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Generate Ġ" layer " Ġvalues Ġfor Ġthe ĠSystem ĠUI Ġwindow Ġand Ġfor Ġthe Ġtop most Ġapp Ġwindow , Ġif ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// it Ġexists . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// current App Layer Ġ* should * Ġbe Ġ- 1 Ġeven Ġif Ġthere 's Ġan Ġapp Ġopen Ġin Ġthe Ġbackground , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// since Ġget Windows () Ġis Ġonly Ġmeant Ġto Ġreturn Ġwindows Ġthat Ġcan Ġactually Ġbe ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// inter acted Ġwith . ĠThe Ġonly Ġtime Ġit Ġshould Ġbe Ġanything Ġelse Ġ( usually Ġ 1 ) Ġis ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// if Ġan Ġapp Ġis Ġdisplaying Ġabove Ġthe Ġkey guard , Ġsuch Ġas Ġthe Ġincoming Ġcall ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// screen Ġor Ġthe Ġcamera . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelegate . current App Layer Ġ= Ġif Ġ( app Index Ġ!= Ġ- 1 ) Ġwindows . size Ġ- Ġapp Index Ġelse Ġapp Index ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelegate . current Sys Ui Layer Ġ= Ġif Ġ( sys Ui Index Ġ!= Ġ- 1 ) Ġwindows . size Ġ- Ġsys Ui Index Ġelse Ġsys Ui Index ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelegate . current System Layer Ġ= Ġif Ġ( system Index Ġ!= Ġ- 1 ) Ġwindows . size Ġ- Ġsystem Index Ġelse Ġsystem Index ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Touch W iz ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsystem Root Ġ= Ġnon App System Window ?. root ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelegate . is On Edge Panel Ġ= Ġsystem Root ?. packageName Ġ== Ġ" com . s amsung . android . app . cock tail bar service " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġsystem Index Ġ== Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelegate . is On Edge Panel Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// This Ġis Ġmostly Ġa Ġdebug Ġvalue Ġto Ġsee Ġwhich Ġapp ĠL SW id g Ġthink s Ġis Ġon Ġtop . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelegate . current App Package Ġ= Ġapp Window ?. root ?. run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠpackageName ?. toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// If Ġthe Ġuser Ġhas Ġenabled Ġthe Ġoption Ġto Ġhide Ġthe Ġframe Ġon Ġsecurity Ġ( pin , Ġpattern , Ġpassword ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// input , Ġwe Ġneed Ġto Ġcheck Ġif Ġthey 're Ġon Ġthe Ġmain Ġlock Ġscreen . ĠThis Ġis Ġmore Ġreliable Ġthan ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// checking Ġfor Ġthe Ġexistence Ġof Ġa Ġsecurity Ġinput , Ġsince Ġthere Ġare Ġa Ġlot Ġof Ġdifferent Ġpossible ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// IDs , Ġand ĠO EM s Ġchange Ġthem . Ġ" notification _ panel " Ġand Ġ" left _ button " Ġare Ġlarge ly Ġunchanged , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// alth ough Ġthis Ġmethod Ġisn 't Ġperfect . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pref Manager . hide On Security Page ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelegate . on Main Lock screen Ġ= Ġsys Ui Nodes . any Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . has Visible Ids ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" com . android . system ui : id / notification _ panel ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" com . android . system ui : id / left _ button " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pref Manager . hide On Notification Shade ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Used Ġfor Ġ" Hide ĠWhen ĠNotification ĠSh ade ĠSh own " Ġso Ġwe Ġknow Ġwhen Ġit 's Ġactually Ġexpanded . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Some Ġdevices Ġdon 't Ġeven Ġhave Ġleft Ġshortcuts , Ġso Ġalso Ġcheck Ġfor Ġkey guard _ indic ation _ area . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Just Ġlike Ġthe Ġshowing Security Input Ġcheck , Ġthis Ġis Ġprobably Ġun reli able Ġfor Ġsome Ġdevices . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelegate . show ing Notifications Panel Ġ= Ġsys Ui Nodes . any Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . has Visible Ids ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" com . android . system ui : id / quick _ settings _ panel ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" com . android . system ui : id / settings _ button ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" com . android . system ui : id / tile _ label " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pref Manager . hide On Face Widgets ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelegate . is On Face Widgets Ġ= Ġwindows . any Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . root ?. packageName Ġ== Ġ" com . s amsung . android . app . a od service " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// If Ġwe 're Ġnot Ġon Ġthe Ġlock Ġscreen , Ġwhether Ġor Ġnot ĠScreen - Off ĠM emo Ġis Ġshowing ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// does n 't Ġmatter . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelegate . is On Screen Off Memo Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// If Ġthe Ġoption Ġto Ġshow Ġwhen Ġthe ĠNC Ġis Ġfully Ġexpanded Ġis Ġenabled , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// check Ġif Ġthe Ġframe Ġcan Ġactually Ġshow . ĠThis Ġchecks Ġto Ġthe Ġ" more _ button " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ID , Ġwhich Ġis Ġunique Ġto ĠOne ĠUI Ġ( it 's Ġthe Ġthree - dot Ġbutton ), Ġand Ġis Ġonly ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// visible Ġwhen Ġthe ĠNC Ġis Ġfully Ġexpanded . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pref Manager . show In Notification Center ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelegate . notifications Panel Fully Expanded Ġ= Ġsys Ui Nodes . any Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . has Visible Ids (" com . android . system ui : id / more _ button ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Check Ġto Ġsee Ġif Ġany Ġof Ġthe Ġuser - specified ĠIDs Ġare Ġpresent . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// If Ġany Ġare , Ġthe Ġframe Ġwill Ġbe Ġhidden . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpresent Ids Ġ= Ġpref Manager . present Ids ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( present Ids . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelegate . hide For Present Ids Ġ= Ġsys Ui Nodes . any Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . has Visible Ids ( present Ids ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Check Ġto Ġsee Ġif Ġany Ġof Ġthe Ġuser - specified ĠIDs Ġaren 't Ġpresent ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ( or Ġare Ġpresent Ġbut Ġnot Ġvisible ). ĠIf Ġany Ġaren 't , Ġthe Ġframe Ġwill Ġbe Ġhidden . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnon Present Ids Ġ= Ġpref Manager . non Present Ids ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( non Present Ids . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelegate . hide For Non Present Ids Ġ= Ġsys Ui Nodes . none Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnon Present Ids . contains ( it . view Id ResourceName ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġsys Ui Nodes . any Ġ{ Ġnon Present Ids . contains ( it . view Id ResourceName ) Ġ&& Ġ! it . isVisible To User Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Re cycle Ġall Ġwindows Ġand Ġnodes . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsys Ui Nodes . forEach Ġ{ Ġit . recycle () Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwindows . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . root ?. recycle () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIllegalStateException ) Ġ{} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . root ?. recycle () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIllegalStateException ) Ġ{} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Check Ġwhether Ġthe Ġframe Ġcan Ġshow . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( delegate . can Show ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelegate . update Accessibility Pass () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Overlay () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremove Overlay () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelegate . update Accessibility Pass () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Make Ġsure Ġto Ġre cycle Ġthe Ġcopy Ġof Ġthe Ġevent . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent Copy . recycle () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Interrupt () Ġ{} ĊĊĠĠĠ Ġoverride Ġfun Ġon Shared Preference Changed ( shared Preferences : ĠSharedPreferences , Ġkey : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġshared Preferences Change Handler . handle ( key ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy () ĊĊĠĠĠĠĠĠĠ Ġcancel () ĊĠĠĠĠĠĠĠ Ġpref Manager . prefs . unregister On Shared Preference ChangeListener ( this ) ĊĠĠĠĠĠĠĠ Ġnotification Count Listener . unregister ( this ) ĊĠĠĠĠĠĠĠ Ġunregister Receiver ( screen State Receiver ) ĊĠĠĠĠĠĠĠ Ġdelegate . on Destroy () ĊĊĠĠĠĠĠĠĠ ĠWidget Frame Delegate . invalidate Instance () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAdd Ġthe Ġwidget Ġframe Ġto Ġthe Ġdisplay . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġadd Overlay () Ġ{ ĊĠĠĠĠĠĠĠ Ġmain Handler . post Delayed ({ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelegate . add Window ( wm ) ĊĠĠĠĠĠĠĠ Ġ}, Ġ 1 0 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠUpdate Ġthe Ġwindow Ġmanager Ġon Ġany Ġparams Ġchanges ĊĠĠĠĠ Ġ* Ġthat Ġmay Ġhave Ġoccurred . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġupdate Overlay () Ġ{ ĊĠĠĠĠĠĠĠ Ġdelegate . binding . frame . update Window ( wm , Ġdelegate . params ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRemove Ġthe Ġwidget Ġframe Ġfrom Ġthe Ġdisplay . ĊĠĠĠĠ Ġ* ĠMake Ġsure Ġthe Ġediting ĠUI Ġis Ġhidden Ġif Ġcurrently ĊĠĠĠĠ Ġ* Ġdisplayed . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġremove Overlay () Ġ{ ĊĠĠĠĠĠĠĠ Ġlog Utils . debug Log (" Removing Ġoverlay ") ĊĊĠĠĠĠĠĠĠ Ġdelegate . adapter . current Editing Interface Position Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠ Ġdelegate . binding . frame . remove Window ( wm ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠFind Ġthe Ġ[ Accessibility Window Info ] Ġand Ġ[ Accessibility NodeInfo ] Ġobjects Ġcorresponding Ġto Ġthe ĠSystem ĠUI Ġwindows . ĊĠĠĠĠ Ġ* ĠFind Ġthe Ġ[ Accessibility Window Info ] Ġand Ġ[ Accessibility NodeInfo ] Ġcorresponding Ġto Ġthe Ġtop most Ġapp Ġwindow . ĊĠĠĠĠ Ġ* ĠFind Ġthe Ġ[ Accessibility Window Info ] Ġand Ġ[ Accessibility NodeInfo ] Ġcorresponding Ġto Ġthe Ġtop most Ġnon - System ĠUI Ġwindow . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġget Windows ( windows : ĠList < Window Root Pair >): ĠWindow Info Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsystem Ui Windows Ġ= ĠArrayList < Window Root Pair >() ĊĠĠĠĠĠĠĠ Ġvar Ġtop App Window : ĠWindow Root Pair ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġvar Ġtop Non Sys Ui Window : ĠWindow Root Pair ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġwindows . forEach Ġ{ Ġwindow Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsafe Root Ġ= Ġwindow . root ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Sys Ui Ġ= Ġsafe Root ?. packageName Ġ== Ġ" com . android . system ui " ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Sys Ui ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsystem Ui Windows . add ( window ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( top App Window Ġ== Ġnull Ġ&& Ġwindow . window . type Ġ== ĠAccessibility Window Info . TYPE _ APPLICATION ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtop App Window Ġ= Ġwindow ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( top Non Sys Ui Window Ġ== Ġnull Ġ&& Ġwindow . window . type Ġ!= ĠAccessibility Window Info . TYPE _ APPLICATION ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġwindow . window . type Ġ!= ĠAccessibility Window Info . TYPE _ ACC ES SI B ILITY _ OVER LAY ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! is Sys Ui ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtop Non Sys Ui Window Ġ= Ġwindow ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠWindow Info ( system Ui Windows , Ġtop App Window , Ġtop Non Sys Ui Window ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRe cursively Ġhide _ for _ ids Ġall Ġ[ Accessibility NodeInfo ] s Ġcontained Ġin Ġa Ġparent Ġto Ġa Ġlist . ĊĠĠĠĠ Ġ* ĠWe Ġuse Ġthis Ġinstead Ġof Ġ[ Accessibility NodeInfo . find Accessibility Node Infos By View Id ] ĊĠĠĠĠ Ġ* Ġfor Ġperformance Ġand Ġreli ability Ġreasons . ĊĠĠĠĠ Ġ* Ġ@ param Ġparent Node Ġthe Ġroot Ġ[ Accessibility NodeInfo ] Ġwhose Ġchildren Ġwe Ġwant Ġto Ġhide _ for _ ids Ġto ĊĠĠĠĠ Ġ* Ġa Ġlist . ĠList Ġwill Ġinclude Ġthis Ġnode Ġas Ġwell . ĊĠĠĠĠ Ġ* Ġ@ param Ġlist Ġthe Ġlist Ġthat Ġwill Ġcontain Ġthe Ġchild Ġnodes . ĊĠĠĠĠ Ġ* Ġ@ param Ġids Ġthe Ġlist Ġof Ġall Ġvisible ĠIDs ĊĠĠĠĠ Ġ* Ġ@ param Ġawait s Ġa Ġlist Ġof Ġall Ġrunning ĠJobs Ġhere . ĠThe Ġcaller Ġshould Ġuse Ġawait All (). ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠTODO : ĠThis Ġhas Ġto Ġrecursively Ġtraverse Ġthe ĠView Ġtree Ġit 's Ġgiven . Ġ[ Accessibility NodeInfo . getChild ] ĊĠĠĠĠ Ġ* ĠTODO : Ġcan Ġbe Ġpretty Ġslow . ĠAll Ġadjacent Ġnodes Ġof Ġthe Ġtree Ġare Ġprocessed Ġconcurrent ly , Ġbut Ġtheir ĊĠĠĠĠ Ġ* ĠTODO : Ġchildren Ġhave Ġto Ġbe Ġprocessed Ġlinear ly . ĠWe Ġneed Ġa Ġflatten ed Ġlist Ġof Ġ[ Accessibility NodeInfo ] Ġobjects ĊĠĠĠĠ Ġ* ĠTODO : Ġto Ġproperly Ġhandle Ġframe Ġvisibility , Ġbut Ġthere Ġmay Ġbe Ġa Ġbetter Ġway Ġto Ġdo Ġthat , Ġsince Ġthis Ġcan Ġtake ĊĠĠĠĠ Ġ* ĠTODO : Ġup Ġto Ġa Ġsecond Ġto Ġfinish Ġexecuting . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġadd All Nodes ToList ( ĊĠĠĠĠĠĠĠ Ġparent Node : ĠAccessibility NodeInfo , ĊĠĠĠĠĠĠĠ Ġlist : ĠConcurrent Linked Queue < Accessibility NodeInfo >, ĊĠĠĠĠĠĠĠ Ġids : ĠConcurrent Linked Queue < String >, ĊĠĠĠĠĠĠĠ Ġawait s : ĠConcurrent Linked Queue < Deferred <* >> ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcoroutine Scope Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġawait s . add ( async Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist . add ( parentNode ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( parentNode . isVisible To User Ġ&& Ġparent Node . view Id ResourceName Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġids . add ( parentNode . view Id ResourceName ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġparent Node . child Count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġawait s . add ( async Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchild Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparent Node . getChild ( i ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠSecurity Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Some times Ġa ĠSecurity Exception Ġgets Ġthrown Ġhere Ġ( on ĠHu awei Ġdevices ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// so Ġjust Ġreturn Ġnull Ġif Ġit Ġhappens ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠNullPointerException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Some times Ġa ĠNullPointerException Ġis Ġthrown Ġhere Ġwith Ġthis Ġerror : ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// " Attempt Ġto Ġread Ġfrom Ġfield Ġ' com . android . server . app widget . App Widget ServiceImpl $ Provider Id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// com . android . server . app widget . App Widget ServiceImpl $ Provider . id ' Ġon Ġa Ġnull Ġobject Ġreference " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// so Ġjust Ġreturn Ġnull Ġif Ġthat Ġhappens . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( child Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( child . child Count Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd All Nodes ToList ( child , Ġlist , Ġids , Ġawait s ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist . add ( child ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( child . isVisible To User Ġ&& Ġchild . view Id ResourceName Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġids . add ( child . view Id ResourceName ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }