package Ġcom . mat he ws achin . f ate grand autom ata . accessibility Ċ Ċ import Ġandroid . annotation . Suppress Lint Ċ import Ġandroid . app . Service Ċ import Ġandroid . graphics . Color Ċ import Ġandroid . graphics . PixelFormat Ċ import Ġandroid . os . Build Ċ import Ġandroid . provider . Settings Ċ import Ġandroid . util . Display Metrics Ċ import Ġandroid . view .* Ċ import Ġandroid . widget . Frame Layout Ċ import Ġandroid . widget . Image Button Ċ import Ġandroid . widget . LinearLayout Ċ import Ġandroidx . core . graphics . Blend Mode Color Filter Compat Ċ import Ġandroidx . core . graphics . Blend Mode Compat Ċ import Ġandroidx . core . view . post Delayed Ċ import Ġcom . mat he ws achin . f ate grand autom ata . R Ċ import Ġcom . mat he ws achin . f ate grand autom ata . ui . Highlight Manager Ċ import Ġcom . mat he ws achin . lib autom ata . Location Ċ import Ġdagger . h ilt . android . scopes . Service Scoped Ċ import Ġjavax . inject . Inject Ċ import Ġkotlin . math . round ToInt Ċ import Ġkotlin . time . Duration Ċ import Ġkotlin . time . Time Source . Mon otonic Ċ import Ġkotlin . time . milliseconds Ċ Ċ @ Service Scoped Ċ class ĠScript Runner User Interface Ġ@ Inject Ġconstructor ( ĊĠĠĠ Ġval ĠService : ĠService , ĊĠĠĠ Ġval Ġhighlight Manager : ĠHighlight Manager , ĊĠĠĠ Ġval Ġwindow Manager : ĠWindow Manager Ċ ) Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġoverlay Type : ĠInt ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Suppress (" DE PREC ATION ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . O ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠWindow Manager . LayoutParams . TYPE _ APPLICATION _ OVER LAY ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse ĠWindow Manager . LayoutParams . TYPE _ PHONE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġmetrics : ĠDisplay Metrics ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġres Ġ= ĠDisplay Metrics () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwindow Manager . default Display . get Real Metrics ( res ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġres ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠUsed Ġwith ĠMedia Projection Ġso Ġthat Ġwe Ġonly Ġget Ġlandscape Ġimages , ĊĠĠĠĠ Ġ* Ġsince Ġthe Ġframe Ġsize Ġcan 't Ġbe Ġchanged Ġduring Ġa Ġprojection . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġmedia Projection Metrics : ĠDisplay Metrics ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġres Ġ= Ġmetrics ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRetrieve Ġimages Ġin ĠLand scape ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( res . height Pixels Ġ> Ġres . width Pixels ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġres . let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtemp Ġ= Ġit . width Pixels ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . width Pixels Ġ= Ġit . height Pixels ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . height Pixels Ġ= Ġtemp ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġres ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġscript Ctrl Btn Layout Ġ= ĠFrame Layout ( Service ) ĊĠĠĠ Ġprivate Ġvar Ġscript Ctrl Btn : ĠImage Button ĊĠĠĠ Ġprivate Ġvar Ġscript Pause Btn : ĠImage Button ĊĊĠĠĠ Ġprivate Ġval Ġscript Ctrl Btn LayoutParams Ġ= ĠWindow Manager . LayoutParams (). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġtype Ġ= Ġoverlay Type ĊĠĠĠĠĠĠĠ Ġformat Ġ= ĠPixel Format . TRANSL UC ENT ĊĠĠĠĠĠĠĠ Ġflags Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠWindow Manager . LayoutParams . FLAG _ NOT _ TO UCH _ MOD AL Ġor ĠWindow Manager . LayoutParams . FLAG _ NOT _ FOCUS ABLE ĊĠĠĠĠĠĠĠ Ġwidth Ġ= ĠWindow Manager . LayoutParams . WRAP _ CONTENT ĊĠĠĠĠĠĠĠ Ġheight Ġ= ĠWindow Manager . LayoutParams . WRAP _ CONTENT ĊĠĠĠĠĠĠĠ Ġ@ Suppress Lint (" R tl Hard coded ") ĊĠĠĠĠĠĠĠ Ġgravity Ġ= ĠGr avity . LEFT Ġor ĠGr avity . TOP ĊĠĠĠĠĠĠĠ Ġx Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġy Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġwindow Animations Ġ= Ġandroid . R . style . Animation _ Toast ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġhighlight LayoutParams Ġ= ĠWindow Manager . LayoutParams (). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġtype Ġ= Ġoverlay Type ĊĠĠĠĠĠĠĠ Ġformat Ġ= ĠPixel Format . TRANSL UC ENT ĊĠĠĠĠĠĠĠ Ġflags Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠWindow Manager . LayoutParams . FLAG _ NOT _ FOCUS ABLE Ġor ĠWindow Manager . LayoutParams . FLAG _ NOT _ TO UCH ABLE ĊĠĠĠĠĠĠĠ Ġwidth Ġ= ĠWindow Manager . LayoutParams . MATCH _ PARENT ĊĠĠĠĠĠĠĠ Ġheight Ġ= ĠWindow Manager . LayoutParams . MATCH _ PARENT ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire ( Service Ġis ĠScript Runner Service ) ĊĊĠĠĠĠĠĠĠ Ġval Ġinflater Ġ= ĠLayoutInflater . from ( Service ) ĊĠĠĠĠĠĠĠ Ġinflater . inflate ( R . layout . script _ runner , Ġscript Ctrl Btn Layout ) ĊĊĠĠĠĠĠĠĠ Ġscript Ctrl Btn Layout . findViewById < LinearLayout >( R . id . script _ ctrl _ container ). let Ġ{ Ġcontainer Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġratio Ġ= Ġmedia Projection Metrics . width Pixels Ġ/ Ġmedia Projection Metrics . height Pixels . toDouble () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġ 1 7 : 9 Ġor Ġw ider , Ġwe Ġhave Ġenough Ġspace Ġto Ġshow ĠP LAY Ġand ĠPA USE Ġbuttons Ġvert ically ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontainer . orientation Ġ= Ġif Ġ( ratio Ġ> Ġ 1 7 Ġ/ Ġ 9 . 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLinearLayout . VERTICAL ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse ĠLinearLayout . HORIZONTAL ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġscript Ctrl Btn Ġ= Ġscript Ctrl Btn Layout . findViewById < Image Button >( R . id . script _ toggle _ btn ). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠService . register Script Ctrl Btn Listeners ( it ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . setOn Touch Listener (:: script Ctrl Btn On Touch ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġscript Pause Btn Ġ= Ġscript Ctrl Btn Layout . findViewById < Image Button >( R . id . script _ pause _ btn ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvisibility Ġ= ĠView . GONE ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠService . register Script Pause Btn Listeners ( this ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠBy Ġdefault Ġput Ġthe Ġbutton Ġon Ġbottom - left Ġcorner ĊĠĠĠĠĠĠĠ Ġval Ġm Ġ= Ġmetrics ĊĠĠĠĠĠĠĠ Ġscript Ctrl Btn LayoutParams . y Ġ= Ġmax Of ( m . width Pixels , Ġm . height Pixels ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġshown Ġ= Ġfalse ĊĊĠĠĠ Ġfun Ġshow () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! shown Ġ&& ĠSettings . can Draw Overlay s ( Service )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwindow Manager . addView ( highlight Manager . highlight View , Ġhighlight LayoutParams ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwindow Manager . addView ( script Ctrl Btn Layout , Ġscript Ctrl Btn LayoutParams ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġshown Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġhide () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( shown Ġ&& ĠSettings . can Draw Overlay s ( Service )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwindow Manager . remove View ( script Ctrl Btn Layout ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwindow Manager . remove View ( highlight Manager . highlight View ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġshown Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġis Pause Button Visible ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġscript Pause Btn . visibility Ġ== ĠView . VISIBLE ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscript Pause Btn . post Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscript Pause Btn . visibility Ġ= Ġif Ġ( value ) ĠView . VISIBLE Ġelse ĠView . GONE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġis Play Button Enabled ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġscript Ctrl Btn . isEnabled ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscript Ctrl Btn . post Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscript Ctrl Btn . isEnabled Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Play Icon () Ġ{ ĊĠĠĠĠĠĠĠ Ġscript Ctrl Btn . post Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscript Ctrl Btn . setImage Resource ( R . drawable . ic _ play ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Stop Icon () Ġ{ ĊĠĠĠĠĠĠĠ Ġscript Ctrl Btn . setImage Resource ( R . drawable . ic _ stop ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Pause Icon () Ġ{ ĊĠĠĠĠĠĠĠ Ġscript Pause Btn . setImage Resource ( R . drawable . ic _ pause ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Resume Icon () Ġ{ ĊĠĠĠĠĠĠĠ Ġscript Pause Btn . setImage Resource ( R . drawable . ic _ play ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġshow As Recording () Ġ{ ĊĠĠĠĠĠĠĠ Ġscript Ctrl Btn . drawable . color Filter Ġ= ĠBlend Mode Color Filter Compat ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. create Blend Mode Color Filter Compat ( Color . RED , ĠBlend Mode Compat . SRC _ AT OP ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġpost Delayed ( Delay : ĠDuration , ĠAction : Ġ() Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġscript Ctrl Btn . post Delayed ( Delay . to Long Milliseconds (), ĠAction ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġthe Ġmaximum Ġvalues Ġof Ġ( X , ĠY ) Ġcoordinates Ġthe Ġ[ script Ctrl Btn ] Ġcan Ġtake . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun ĠgetMax Btn Coordinates (): ĠLocation Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġm Ġ= Ġmetrics ĊĊĠĠĠĠĠĠĠ Ġval Ġx Ġ= Ġm . width Pixels Ġ- Ġscript Ctrl Btn Layout . meas ured Width ĊĠĠĠĠĠĠĠ Ġval Ġy Ġ= Ġm . height Pixels Ġ- Ġscript Ctrl Btn Layout . meas ured Height ĊĊĠĠĠĠĠĠĠ Ġreturn ĠLocation ( x , Ġy ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġd X Ġ= Ġ 0 f ĊĠĠĠ Ġprivate Ġvar Ġd Y Ġ= Ġ 0 f ĊĠĠĠ Ġprivate Ġvar Ġlast Action Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġdrag Time Mark Ġ= ĠMon otonic . mark Now () ĊĠĠĠ Ġprivate Ġvar Ġdrag Max Loc Ġ= ĠLocation () ĊĊĠĠĠ Ġprivate Ġfun Ġscript Ctrl Btn On Touch (@ Suppress (" UNUSED _ PARAMETER ") Ġ_ View : ĠView , ĠEvent : ĠMotion Event ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( Event . action Mask ed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ DOWN Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdrag Max Loc Ġ= ĠgetMax Btn Coordinates () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġd X Ġ= Ġscript Ctrl Btn LayoutParams . x . coerce In ( 0 , Ġdrag Max Loc . X ) Ġ- ĠEvent . raw X ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġd Y Ġ= Ġscript Ctrl Btn LayoutParams . y . coerce In ( 0 , Ġdrag Max Loc . Y ) Ġ- ĠEvent . raw Y ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Action Ġ= ĠMotion Event . ACTION _ DOWN ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdrag Time Mark Ġ= ĠMon otonic . mark Now () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ MOVE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew X Ġ= ĠEvent . raw X Ġ+ Ġd X ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Y Ġ= ĠEvent . raw Y Ġ+ Ġd Y ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( drag Time Mark . elapsed Now () Ġ> ĠView Configuration . getLong Press Timeout (). milliseconds ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscript Ctrl Btn LayoutParams . x Ġ= Ġnew X . round ToInt (). coerce In ( 0 , Ġdrag Max Loc . X ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscript Ctrl Btn LayoutParams . y Ġ= Ġnew Y . round ToInt (). coerce In ( 0 , Ġdrag Max Loc . Y ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwindow Manager . update View Layout ( script Ctrl Btn Layout , Ġscript Ctrl Btn LayoutParams ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Action Ġ= ĠMotion Event . ACTION _ MOVE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ UP Ġ-> Ġlast Action Ġ== ĠMotion Event . ACTION _ MOVE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }