/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 2 0 ĠThe ĠAndroid ĠOpen ĠSource ĠProject Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġcom . google . android . fil ament . liv ew all paper Ċ Ċ import Ġandroid . animation . Value Animator Ċ import Ġandroid . app . Service Ċ import Ġandroid . content . Context Ċ import Ġandroid . graphics . Color Ċ import Ġandroid . graphics . PixelFormat Ċ import Ġandroid . os . Build Ċ import Ġandroid . service . wall paper . Wall paper Service Ċ import Ġandroid . view . Ch oreo grapher Ċ import Ġandroid . view . Surface Ċ import Ġandroid . view . Surface Holder Ċ import Ġandroid . view . WindowManager Ċ import Ġandroid . view . animation . Linear Interpolator Ċ import Ġandroidx . annotation . Requires Api Ċ import Ġcom . google . android . fil ament .* Ċ import Ġcom . google . android . fil ament . android . Display Helper Ċ import Ġcom . google . android . fil ament . android . Ui Helper Ċ Ċ class ĠFil ament Live Wall paper Ġ: ĠWall paper Service () Ġ{ ĊĠĠĠ Ġ// ĠMake Ġsure Ġto Ġinitialize ĠFil ament Ġfirst ĊĠĠĠ Ġ// ĠThis Ġloads Ġthe ĠJNI Ġlibrary Ġneeded Ġby Ġmost ĠAPI Ġcalls ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFil ament . init () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate Engine (): ĠEngine Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠFil ament Wall paper Engine () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinner Ġclass ĠFil ament Wall paper Engine Ġ: ĠEngine () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// ĠUi Helper Ġis Ġprovided Ġby ĠFil ament Ġto Ġmanage ĠSurface Holder ĊĠĠĠĠĠĠĠ Ġprivate Ġlateinit Ġvar Ġui Helper : ĠUi Helper ĊĠĠĠĠĠĠĠ Ġ// ĠDisplay Helper Ġis Ġprovided Ġby ĠFil ament Ġto Ġmanage Ġthe Ġdisplay ĊĠĠĠĠĠĠĠ Ġprivate Ġlateinit Ġvar Ġdisplay Helper : ĠDisplay Helper ĊĠĠĠĠĠĠĠ Ġ// ĠCh oreo grapher Ġis Ġused Ġto Ġschedule Ġnew Ġframes ĊĠĠĠĠĠĠĠ Ġprivate Ġlateinit Ġvar Ġch oreo grapher : ĠCh oreo grapher ĊĊĠĠĠĠĠĠĠ Ġ// ĠEngine Ġcreates Ġand Ġdest ro ys ĠFil ament Ġresources ĊĠĠĠĠĠĠĠ Ġ// ĠEach Ġengine Ġmust Ġbe Ġaccessed Ġfrom Ġa Ġsingle Ġthread Ġof Ġyour Ġchoosing ĊĠĠĠĠĠĠĠ Ġ// ĠResources Ġcannot Ġbe Ġshared Ġacross Ġengines ĊĠĠĠĠĠĠĠ Ġprivate Ġlateinit Ġvar Ġengine : Ġcom . google . android . fil ament . Engine ĊĠĠĠĠĠĠĠ Ġ// ĠA Ġrenderer Ġinstance Ġis Ġtied Ġto Ġa Ġsingle Ġsurface Ġ( Surface View , ĠTexture View , Ġetc .) ĊĠĠĠĠĠĠĠ Ġprivate Ġlateinit Ġvar Ġrenderer : ĠRenderer ĊĠĠĠĠĠĠĠ Ġ// ĠA Ġscene Ġholds Ġall Ġthe Ġrender able , Ġlights , Ġetc . Ġto Ġbe Ġdrawn ĊĠĠĠĠĠĠĠ Ġprivate Ġlateinit Ġvar Ġscene : ĠScene ĊĠĠĠĠĠĠĠ Ġ// ĠA Ġview Ġdefines Ġa Ġviewport , Ġa Ġscene Ġand Ġa Ġcamera Ġfor Ġrendering ĊĠĠĠĠĠĠĠ Ġprivate Ġlateinit Ġvar Ġview : ĠView ĊĠĠĠĠĠĠĠ Ġ// ĠShould Ġbe Ġpretty Ġobvious Ġ:) ĊĠĠĠĠĠĠĠ Ġprivate Ġlateinit Ġvar Ġcamera : ĠCamera ĊĊĠĠĠĠĠĠĠ Ġ// ĠA Ġswap Ġchain Ġis ĠFil ament 's Ġrepresentation Ġof Ġa Ġsurface ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġswap Chain : ĠSwap Chain ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġ// ĠPerforms Ġthe Ġrendering Ġand Ġs chedules Ġnew Ġframes ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġframe Scheduler Ġ= ĠFrame Callback () ĊĊĠĠĠĠĠĠĠ Ġ// ĠWe 'll Ġuse Ġthis ĠValue Animator Ġto Ġsmooth ly Ġcycle Ġthe Ġbackground Ġbetween Ġh ues . ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġanim ator Ġ= ĠValue Animator . of Float ( 0 . 0 f , Ġ 3 6 0 . 0 f ) ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonCreate ( surface Holder : ĠSurface Holder ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . onCreate ( surface Holder ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsurface Holder . setSize From Layout () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsurface Holder . set Format ( PixelFormat . RGBA _ 8 8 8 8 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġch oreo grapher Ġ= ĠCh oreo grapher . getInstance () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġdisplay Helper Ġ= ĠDisplay Helper ( this @ Fil ament Live Wall paper ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġsetup Ui Helper () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsetup Fil ament () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsetup View () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsetup Scene () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġsetup Ui Helper () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġui Helper Ġ= ĠUi Helper ( Ui Helper . Context Error Policy . D ONT _ CHECK ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġui Helper . render Callback Ġ= ĠSurface Callback () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġui Helper . attach To ( surface Holder ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġsetup Fil ament () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġengine Ġ= Ġcom . google . android . fil ament . Engine . create () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrenderer Ġ= Ġengine . create Renderer () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscene Ġ= Ġengine . create Scene () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview Ġ= Ġengine . create View () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcamera Ġ= Ġengine . create Camera ( engine . entityManager . create ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġsetup View () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscene . sky box Ġ= ĠSky box . Builder (). build ( engine ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNOTE : ĠTry Ġto Ġdisable Ġpost - processing Ġ( tone - mapping , Ġetc .) Ġto Ġsee Ġthe Ġdifference ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġview . is Post Processing Enabled Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTell Ġthe Ġview Ġwhich Ġcamera Ġwe Ġwant Ġto Ġuse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview . camera Ġ= Ġcamera ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTell Ġthe Ġview Ġwhich Ġscene Ġwe Ġwant Ġto Ġrender ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview . scene Ġ= Ġscene ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġsetup Scene () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSet Ġthe Ġexposure Ġon Ġthe Ġcamera , Ġthis Ġexposure Ġfollows Ġthe Ġsun ny Ġf / 1 6 Ġrule ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcamera . set Exposure ( 1 6 . 0 f , Ġ 1 . 0 f Ġ/ Ġ 1 2 5 . 0 f , Ġ 1 0 0 . 0 f ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Animation () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġstart Animation () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAn imate Ġthe Ġcolor Ġof Ġthe ĠSky box . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġanim ator . interpol ator Ġ= ĠLinear Interpolator () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġanim ator . duration Ġ= Ġ 1 0 0 0 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġanim ator . repeat Mode Ġ= ĠValue Animator . RE START ĊĠĠĠĠĠĠĠĠĠĠĠ Ġanim ator . repeat Count Ġ= ĠValue Animator . INF IN ITE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġanim ator . add Update Listener Ġ{ Ġa Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhue Ġ= Ġa . animated Value Ġas ĠFloat ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcolor Ġ= ĠColor . H SV To Color ( float ArrayOf ( hue , Ġ 1 . 0 f , Ġ 1 . 0 f )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscene . sky box ?. setColor ( float ArrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠColor . red ( color ) ĠĠ Ġ/ Ġ 2 5 5 . 0 f , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠColor . green ( color ) Ġ/ Ġ 2 5 5 . 0 f , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠColor . blue ( color ) Ġ Ġ/ Ġ 2 5 5 . 0 f , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 . 0 f )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġanim ator . start () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Visibility Changed ( visible : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Visibility Changed ( visible ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( visible ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġch oreo grapher . post Frame Callback ( frame Scheduler ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanim ator . start () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġch oreo grapher . remove Frame Callback ( frame Scheduler ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanim ator . cancel () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Destroy () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Destroy () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠStop Ġthe Ġanimation Ġand Ġany Ġpending Ġframe ĊĠĠĠĠĠĠĠĠĠĠĠ Ġch oreo grapher . remove Frame Callback ( frame Scheduler ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġanim ator . cancel () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAlways Ġdetach Ġthe Ġsurface Ġbefore Ġdestroy ing Ġthe Ġengine ĊĠĠĠĠĠĠĠĠĠĠĠ Ġui Helper . detach () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCleanup Ġall Ġresources ĊĠĠĠĠĠĠĠĠĠĠĠ Ġengine . destroy Renderer ( renderer ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġengine . destroy View ( view ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġengine . destroy Scene ( scene ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġengine . destroy Camera Component ( camera . entity ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEntity Manager . get (). destroy ( camera . entity ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDestroy ing Ġthe Ġengine Ġwill Ġfree Ġup Ġany Ġresource Ġyou Ġmay Ġhave Ġforgot ten ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġto Ġdestroy , Ġbut Ġit 's Ġrecommended Ġto Ġdo Ġthe Ġcleanup Ġproperly ĊĠĠĠĠĠĠĠĠĠĠĠ Ġengine . destroy () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġinner Ġclass ĠFrame Callback Ġ: ĠCh oreo grapher . Frame Callback Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġdo Frame ( frame Time Nan os : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSchedule Ġthe Ġnext Ġframe ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġch oreo grapher . post Frame Callback ( this ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThis Ġcheck Ġguarantees Ġthat Ġwe Ġhave Ġa Ġswap Ġchain ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ui Helper . is Ready To Render ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġbegin Frame () Ġreturns Ġfalse Ġyou Ġshould Ġskip Ġthe Ġframe ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThis Ġmeans Ġyou Ġare Ġsending Ġframes Ġtoo Ġquickly Ġto Ġthe ĠGPU ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( renderer . begin Frame ( swap Chain !! , Ġframe Time Nan os )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrenderer . render ( view ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrenderer . end Frame () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġinner Ġclass ĠSurface Callback Ġ: ĠUi Helper . Renderer Callback Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Native Window Changed ( surface : ĠSurface ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġswap Chain ?. let Ġ{ Ġengine . destroy Swap Chain ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġswap Chain Ġ= Ġengine . create Swap Chain ( surface ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Suppress (" deprecation ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdisplay Ġ= Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= Ġ 3 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApi 3 0 Impl . getDisplay ( display Context !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( getSystem Service ( Service . WINDOW _ SERVICE ) Ġas ĠWindow Manager ). default Display ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdisplay Helper . attach ( renderer , Ġdisplay ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Detached From Surface () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdisplay Helper . detach () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġswap Chain ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġengine . destroy Swap Chain ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRequired Ġto Ġensure Ġwe Ġdon 't Ġreturn Ġbefore ĠFil ament Ġis Ġdone Ġexecuting Ġthe ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġdestroy Swap Chain Ġcommand , Ġotherwise ĠAndroid Ġmight Ġdestroy Ġthe ĠSurface ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġtoo Ġearly ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġengine . flush And Wait () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġswap Chain Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Res ized ( width : ĠInt , Ġheight : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaspect Ġ= Ġwidth . toDouble () Ġ/ Ġheight . toDouble () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcamera . set Projection ( 4 5 . 0 , Ġaspect , Ġ 0 . 1 , Ġ 2 0 . 0 , ĠCamera . F ov . VERTICAL ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview . viewport Ġ= ĠView port ( 0 , Ġ 0 , Ġwidth , Ġheight ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Requires Api ( 3 0 ) ĊĠĠĠ Ġclass ĠApi 3 0 Impl Ġ{ ĊĠĠĠĠĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġget Display ( context : ĠContext ) Ġ= Ġcontext . display !! ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ