package Ġuk . ac . n cl . open lab . ongo ing ness Ċ Ċ import Ġandroid . content .* Ċ import Ġandroid . graphics .* Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . support . we arable . watch face . Canvas Watch Face Service Ċ import Ġandroid . support . we arable . watch face . Watch Face Service Ċ import Ġandroid . support . we arable . watch face . Watch Face Style Ċ import Ġandroid . view . Surface Holder Ċ import Ġandroid . view . WindowManager Ċ import Ġandroidx . work .* Ċ import Ġuk . ac . n cl . open lab . ongo ing ness . Build Config . FL AV OR Ċ import Ġuk . ac . n cl . open lab . ongo ing ness . utilities .* Ċ import Ġuk . ac . n cl . open lab . ongo ing ness . utilities . Logger Ċ import Ġuk . ac . n cl . open lab . ongo ing ness . controllers . Watch Face Controller Ċ import Ġuk . ac . n cl . open lab . ongo ing ness . present ers . Cover Type Ċ import Ġuk . ac . n cl . open lab . ongo ing ness . present ers . Watch Face Presenter Ċ Ċ /** Ċ Ġ* ĠImport ant ĠNote : ĠBecause Ġwatch Ġface Ġapps Ġdo Ġnot Ġhave Ġa Ġdefault ĠActivity Ġin Ċ Ġ* Ġtheir Ġproject , Ġyou Ġwill Ġneed Ġto Ġset Ġyour ĠConfigur ations Ġto Ċ Ġ* Ġ" Do Ġnot Ġlaunch ĠActivity " Ġfor Ġboth Ġthe ĠW ear Ġand / or ĠApplication Ġmodules . ĠIf Ġyou Ċ Ġ* Ġare Ġunsure Ġhow Ġto Ġdo Ġthis , Ġplease Ġreview Ġthe Ġ" Run ĠSt arter Ġproject " Ġsection Ċ Ġ* Ġin Ġthe ĠGoogle ĠWatch ĠFace ĠCode ĠLab : Ċ Ġ* Ġhttps :// code labs . developers . google . com / code labs / watch face / index . html # 0 Ċ Ġ*/ Ċ Ċ /** Ċ Ġ* ĠMain Ġwatch Ġface Ġclass . ĠCh oo ses Ġwhat Ġcode Ġto Ġrun Ġbased Ġon Ġthe Ġselected Ġfl avour . Ċ Ġ* ĠIn Ġcharge Ġof Ġstarting Ġthe Ġpresenter Ġclass Ġand Ġhook ing Ġit Ġto Ġa Ġcontroller . Ċ Ġ* Ċ Ġ* Ġ@ author ĠL uis ĠCar val ho Ċ Ġ*/ Ċ class ĠWatch Face Ġ: ĠCanvas Watch Face Service () Ġ{ ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate Engine (): ĠEngine Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠEngine () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinner Ġclass ĠEngine Ġ: ĠCanvas Watch Face Service . Engine (), ĠWatch Face Presenter . Watch Face View Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠM ute Ġmode Ġflag . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġm Mute Mode : ĠBoolean Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠColor Ġof Ġthe Ġbackground . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġlateinit Ġvar Ġm Background Paint : ĠPaint ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠBitmap Ġto Ġbe Ġdisplayed Ġin Ġthe Ġbackground . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġlateinit Ġvar Ġm Background Bitmap : ĠBitmap ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠController Ġof Ġthe Ġwatch Ġface . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġlateinit Ġvar Ġcontroller : ĠWatch Face Controller ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠFalse Ġstart Ġavoid Ġcheck . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġfalse Start Release Interval Ġ= Ġ 4 0 0 0 L ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠTimestamp Ġof Ġthe Ġprevious Ġscreen Ġtap . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġprevious Tap Time : ĠLong ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonCreate ( holder : ĠSurface Holder ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . onCreate ( holder ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Watch Face Style ( Watch Face Style . Builder ( this @ Watch Face ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Accept s Tap Events ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Hide StatusBar ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Show Un read Count Indicator ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Hide Notification Indicator ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Start Ġthe Ġlogger ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . start ( application Context ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . log ( Log Type . STARTED _ WATCH FACE , ĠlistOf (), Ġapplication Context ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Set Ġthe Ġworkers Ġto Ġpull Ġand Ġpush Ġdata ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Work Manager () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen ( FL AV OR ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// A new ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" lock et _ touch ", Ġ" lock et _ touch _ inverted " Ġ-> Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpresenter Ġ= ĠWatch Face Presenter ( application Context , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBitmap . create Scaled Bitmap ( Bitmap Factory . decode Resource ( application Context . resources , ĠR . drawable . cover ), Ġget Screen Size (), Ġget Screen Size (), Ġfalse ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBitmap . create Scaled Bitmap ( Bitmap Factory . decode Resource ( application Context . resources , ĠR . drawable . cover _ white ), Ġget Screen Size (), Ġget Screen Size (), Ġfalse )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpresenter . attach View ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpresenter . display Cover ( Cover Type . BLACK ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontroller Ġ= ĠWatch Face Controller ( application Context , Ġtrue , Ġpresenter ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ref ind " Ġ-> Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpresenter Ġ= ĠWatch Face Presenter ( application Context , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBitmap . create Scaled Bitmap ( Bitmap Factory . decode Resource ( application Context . resources , ĠR . drawable . ref ind _ cover ), Ġget Screen Size (), Ġget Screen Size (), Ġfalse ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBitmap . create Scaled Bitmap ( Bitmap Factory . decode Resource ( application Context . resources , ĠR . drawable . ref ind _ cover _ white ), Ġget Screen Size (), Ġget Screen Size (), Ġfalse )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpresenter . attach View ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpresenter . display Cover ( Cover Type . BLACK ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontroller Ġ= ĠWatch Face Controller ( application Context , Ġfalse , Ġpresenter ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// I vv or ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" lock et _ touch _ s " Ġ-> Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpresenter Ġ= ĠWatch Face Presenter ( application Context , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBitmap . create Scaled Bitmap ( Bitmap Factory . decode Resource ( application Context . resources , ĠR . drawable . s _ cover ), Ġget Screen Size (), Ġget Screen Size (), Ġfalse ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBitmap . create Scaled Bitmap ( Bitmap Factory . decode Resource ( application Context . resources , ĠR . drawable . s _ cover _ white ), Ġget Screen Size (), Ġget Screen Size (), Ġfalse )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpresenter . attach View ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpresenter . display Cover ( Cover Type . BLACK ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontroller Ġ= ĠWatch Face Controller ( application Context , Ġtrue , Ġpresenter ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Destroy () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Destroy () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontroller . stop () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . log ( Log Type . STOP PED _ WATCH FACE , ĠlistOf (), Ġapplication Context ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġupdate Background With Bitmap ( new Background : ĠBitmap ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Background Bitmap Ġ= Ġnew Background ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinvalidate () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Properties Changed ( properties : ĠBundle ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Properties Changed ( properties ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġm Low Bit Ambient Ġ= Ġproperties . getBoolean ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠWatch Face Service . PROPERTY _ LOW _ BIT _ AM BI ENT , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġm Burn In Protection Ġ= Ġproperties . getBoolean ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠWatch Face Service . PROPERTY _ B URN _ IN _ PRO TE CTION , Ġfalse ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontroller . low Bit Ambient Changed ( m Low Bit Ambient ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontroller . burn In Protection Changed ( m Burn In Protection ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Time Tick () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Time Tick () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinvalidate () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Ambient Mode Changed ( in Ambient Mode : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Ambient Mode Changed ( in Ambient Mode ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontroller . ambient Mode Changed ( in Ambient Mode ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Inter ruption Filter Changed ( inter ruption Filter : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Inter ruption Filter Changed ( inter ruption Filter ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġin Mute Mode Ġ= Ġinter ruption Filter Ġ== ĠWatch Face Service . INTERRUP TION _ FILTER _ NONE ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/* ĠDim Ġdisplay Ġin Ġmute Ġmode . Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Mute Mode Ġ!= Ġin Mute Mode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Mute Mode Ġ= Ġin Mute Mode ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinvalidate () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠCapt ures ĠonTap Event Ġevent Ġ( and ĠonTap Event Ġtype ). ĠThe Ġ[ Watch Face Service . T AP _ TYPE _ T AP ] Ġcase Ġcan Ġbe ĊĠĠĠĠĠĠĠĠ Ġ* Ġused Ġfor Ġimplementing Ġspecific Ġlogic Ġto Ġhandle Ġthe Ġgesture . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonTap Command ( tap Type : ĠInt , Ġx : ĠInt , Ġy : ĠInt , Ġevent Time : ĠLong ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( previous Tap Time Ġ== Ġnull Ġ|| Ġ( previous Tap Time Ġ!= Ġnull Ġ&& Ġevent Time Ġ- Ġprevious Tap Time !! Ġ> Ġfalse Start Release Interval )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprevious Tap Time Ġ= Ġevent Time ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontroller . tap Event () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Draw ( canvas : ĠCanvas , Ġbounds : ĠRect ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdraw Background ( canvas ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠDraw Ġthe Ġbackground Ġof Ġthe Ġwatch Ġface . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġcanvas Ġcanvas Ġto Ġbe Ġdrawn . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġdraw Background ( canvas : ĠCanvas ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Background Paint Ġ= ĠPaint (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcolor Ġ= ĠColor . BLACK ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . draw Bitmap ( m Background Bitmap , Ġ 0 f , Ġ 0 f , Ġm Background Paint ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Visibility Changed ( visible : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Visibility Changed ( visible ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( visible ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinvalidate () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠGet Ġthe Ġscreen Ġsize Ġof Ġa Ġdevice . ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ return Ġthe Ġsize Ġof Ġthe Ġscreen . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Screen Size (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwindow Manager Ġ= Ġapplication Context . getSystem Service ( Context . WINDOW _ SERVICE ) Ġas ĠWindow Manager ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdisplay Ġ= Ġwindow Manager . default Display ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsize Ġ= ĠPoint () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdisplay . getSize ( size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsize . x ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠStarts Ġby Ġcancell ing Ġall Ġscheduled Ġworkers Ġand Ġs chedules Ġa Ġnew Ġone . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġset Work Manager () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠWork Manager . getInstance ( application Context ). cancel All Work () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( is Logging ( application Context )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Pull Media Push Logs Work Request ( application Context ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} Ċ } ĊĊĊ