/* Ċ Ġ* ĠCopyright Ġ 2 0 2 1 ĠCl iff ord ĠLi u Ċ Ġ* Ċ Ġ* Ġ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 . mad ness . collision . vers atile Ċ Ċ import Ġandroid . Manifest Ċ import Ġandroid . annotation . Target Api Ċ import Ġandroid . app . Pending Intent Ċ import Ġandroid . bluetooth . Bluetooth Device Ċ import Ġandroid . bluetooth . Bluetooth Profile Ċ import Ġandroid . content . Broadcast Receiver Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Intent Ċ import Ġandroid . provider . Settings Ċ import Ġandroid . service . controls . Control Ċ import Ġandroid . service . controls . Controls Provider Service Ċ import Ġandroid . service . controls . Device Types Ċ import Ġandroid . service . controls . actions . Boolean Action Ċ import Ġandroid . service . controls . actions . Control Action Ċ import Ġandroid . service . controls . actions . Float Action Ċ import Ġandroid . service . controls . templates .* Ċ import Ġandroid . text . format . Formatter Ċ import Ġandroid . widget . Toast Ċ import Ġandroidx . core . content . Context Compat Ċ import Ġandroidx . core . graphics . drawable . to Bitmap Ċ import Ġandroidx . core . graphics . drawable . to Icon Ċ import Ġcom . mad ness . collision . R Ċ import Ġcom . mad ness . collision . main . MainActivity Ċ import Ġcom . mad ness . collision . unit . Unit Ċ import Ġcom . mad ness . collision . unit . audio _ timer . Access AT Ċ import Ġcom . mad ness . collision . unit . audio _ timer . At Callback Ċ import Ġcom . mad ness . collision . unit . device _ manager . list . Device Item Ċ import Ġcom . mad ness . collision . unit . device _ manager . list . State Update Reg ulation Ċ import Ġcom . mad ness . collision . unit . device _ manager . list . State Update Reg ulator Ċ import Ġcom . mad ness . collision . unit . device _ manager . list . State Observable Ċ import Ġcom . mad ness . collision . unit . device _ manager . manager . Device Manager Ċ import Ġcom . mad ness . collision . util . Permission Utils Ċ import Ġcom . mad ness . collision . util . Sys Service Utils Ċ import Ġcom . mad ness . collision . util . System Util Ċ import Ġcom . mad ness . collision . util . notice . Toast Utils Ċ import Ġcom . mad ness . collision . util . os . Os Utils Ċ import Ġio . reactivex . rx java 3 . core . Flow able Ċ import Ġio . reactivex . rx java 3 . processors . Replay Processor Ċ import Ġkotlinx . coroutines .* Ċ import Ġorg . reactiv est ream s . Flow Adapters Ċ import Ġjava . util . concurrent . Flow Ċ import Ġjava . util . function . Consumer Ċ import Ġkotlin . math . min Ċ import Ġkotlin . math . round To Long Ċ Ċ @ Target Api ( Os Utils . R ) Ċ class ĠMy Control Service Ġ: ĠControls Provider Service (), ĠState Observable Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠDEV _ ID _ AT Ġ= Ġ" dev _ at _ timer " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠDEV _ ID _ MD U Ġ= Ġ" dev _ md u _ data " ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠSTATIC _ DEVICE _ IDS Ġ= ĠlistOf ( DEV _ ID _ AT , ĠDEV _ ID _ MD U ) ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠDEV _ PREFIX _ DM Ġ= Ġ" dev _ dm " ĊĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠARG _ DM _ DEV _ DEVICE Ġ= Ġ" dm _ dev _ device " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġupdate Publisher : ĠRe play Processor < Control >? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġval Ġat MaxValue Ġ= Ġ 1 2 0 f ĊĠĠĠ Ġprivate Ġval Ġat Step Value Ġ= Ġ 5 f ĊĠĠĠ Ġprivate Ġvar Ġat Current Value Ġ= Ġat MaxValue ĊĠĠĠ Ġprivate Ġvar Ġat Callback : ĠAt Callback ? Ġ= Ġnull ĊĠĠĠ Ġ// Ġblock Ġupdate Ġduring Ġtimer Ġduration Ġchange , Ġwhich Ġcauses Ġtemporary Ġshutdown Ġof Ġtimer , ĊĠĠĠ Ġ// Ġduring Ġwhich Ġtime Ġconstant Ġregular Ġstate Ġupdates Ġare Ġhappening , ĊĠĠĠ Ġ// Ġwhich Ġcauses Ġg lit ches Ġbecause Ġof Ġrapid Ġswitching Ġbetween Ġstates ĊĠĠĠ Ġprivate Ġvar Ġis At Update Blocked Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġdm Manager : ĠDevice Manager ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġdm Session No : ĠLong Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġval Ġdm Reg ulator : ĠState Update Reg ulator Ġby Ġlazy Ġ{ ĠState Update Reg ulator () Ġ} ĊĊĠĠĠ Ġoverride Ġval Ġstate Receiver : ĠBroadcast Receiver Ġ= Ġstate Receiver Imp ĊĊĠĠĠ Ġoverride Ġfun Ġon Bluetooth StateChanged ( state : ĠInt ) Ġ{ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Device StateChanged ( device : ĠBluetooth Device , Ġstate : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġupdate Publisher Ġ= Ġupdate Publisher Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġ// Ġmanager Ġnot Ġused Ġyet Ġand Ġno Ġdevice Ġadded ĊĠĠĠĠĠĠĠ Ġif Ġ( dm Session No Ġ== Ġ 0 L ) Ġreturn ĊĠĠĠĠĠĠĠ Ġval Ġcontext Ġ= Ġbase Context Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġprepare Dm Manager ( context , Ġdm Session No ) Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġval Ġid Ġ= Ġget Dm Device Ids (). find Ġ{ Ġget Dm Mac By DeviceId ( it ) Ġ== Ġdevice . address Ġ} Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġval Ġdevice Item Ġ= ĠDevice Item ( device ). apply Ġ{ Ġthis . state Ġ= Ġstate Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġreg ulation Ġ= ĠState Update Reg ulation ( 6 0 0 , Ġdevice Item ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith Context ( Dispatch ers . Default ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġargs Ġ= Ġmap Of ( ARG _ DM _ DEV _ DEVICE Ġto Ġdevice Item ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontrol Ġ= Ġget Control ( context , Ġid , Ġdm Session No , Ġargs Ġ= Ġargs ) Ġ?: Ġreturn @ with Context ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Publisher . onNext ( control ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠGlobal Scope . launch ( Dispatch ers . Default ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdm Reg ulator . reg ulate ( reg ulation ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Device Ids ( context : ĠContext , Ġsession No : ĠLong ): ĠList < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdm Manager Ġ= Ġprepare Dm Manager ( context , Ġsession No ) ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( dm Manager Ġ!= Ġnull ) ĠSTATIC _ DEVICE _ IDS Ġ+ Ġget Dm Device Ids () ĊĠĠĠĠĠĠĠ Ġelse ĠSTATIC _ DEVICE _ IDS ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Dm Device Ids (): ĠList < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdm Manager Ġ= Ġdm Manager Ġ?: Ġreturn Ġempty List () ĊĠĠĠĠĠĠĠ Ġreturn Ġdm Manager . get Pa ired Devices (). map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ DEV _ PREFIX _ DM }_${ it . address }" ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprepare Dm Manager ( context : ĠContext , Ġsession No : ĠLong ): ĠDevice Manager ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdm Manager Ġ= Ġthis . dm Manager Ġ?: ĠDevice Manager () ĊĠĠĠĠĠĠĠ Ġif Ġ( this . dm Manager Ġ== Ġnull ) Ġthis . dm Manager Ġ= Ġdm Manager ĊĠĠĠĠĠĠĠ Ġif Ġ( dm Manager . is Disabled ) Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ// Ġcheck Ġruntime Ġbluetooth Ġpermission Ġto Ġget Ġpaired Ġdevices ĊĠĠĠĠĠĠĠ Ġif Ġ( Os Utils . satisf y ( Os Utils . S )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpermission Ġ= ĠManifest . permission . BL U ETO OTH _ CONNECT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Permission Utils . check ( context , ĠarrayOf ( permission )). isNotEmpty ()) Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ(! dm Manager . has Proxy Ġ&& Ġsession No Ġ!= Ġdm Session No ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdm Session No Ġ= Ġsession No ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdm Manager . init Proxy ( context , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( dm Manager . has Proxy ) Ġdm Manager Ġelse Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Dm Mac By DeviceId ( deviceId : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdevice Ġ= Ġ"${ DEV _ PREFIX _ DM } _( .* ) ". to Regex (). find ( deviceId ) Ġ?: Ġreturn ĠdeviceId ĊĠĠĠĠĠĠĠ Ġreturn Ġdevice . de structured . component 1 () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠgetState ful Builder ( context : ĠContext , Ġcontrol Id : ĠString ): ĠControl . State ful Builder ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlocale Context Ġ= ĠSystem Util . getLocale Context Sys ( context ) ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen ( control Id ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDEV _ ID _ AT Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( context , ĠMainActivity :: class . java ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Extras ( MainActivity . for Item ( Unit . UNIT _ NAME _ AUDIO _ TIMER )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġflags Ġ= ĠIntent . FLAG _ ACTIVITY _ NEW _ TASK Ġor ĠIntent . FLAG _ ACTIVITY _ CLEAR _ TASK ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpi Mut ability Flag Ġ= Ġif Ġ( Os Utils . satisf y ( Os Utils . M )) ĠPending Intent . FLAG _ IM MUT ABLE Ġelse Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpi Ġ= ĠPending Intent . getActivity ( context , Ġ 0 , Ġintent , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPending Intent . FLAG _ UPDATE _ CURRENT Ġor Ġpi Mut ability Flag ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcolor Ġ= Ġcontext . getColor ( R . color . primary A White ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtitle Ġ= Ġlocale Context . getString ( R . string . unit _ audio _ timer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġicon Drawable Ġ= ĠContext Compat . get Drawable ( context , ĠR . drawable . ic _ timer _ 2 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġicon Drawable ?. set Tint ( color ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġicon Ġ= Ġicon Drawable ?. to Bitmap ()?. to Icon () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠControl . State ful Builder ( DEV _ ID _ AT , Ġpi ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setTitle ( title ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set DeviceType ( Device Types . TYPE _ GENERIC _ START _ STOP ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setStatus ( Control . STATUS _ OK ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Custom Icon ( icon ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDEV _ ID _ MD U Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( context , ĠMainActivity :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpi Mut ability Flag Ġ= Ġif Ġ( Os Utils . satisf y ( Os Utils . M )) ĠPending Intent . FLAG _ IM MUT ABLE Ġelse Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpi Ġ= ĠPending Intent . getActivity ( context , Ġ 0 , Ġintent , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPending Intent . FLAG _ UPDATE _ CURRENT Ġor Ġpi Mut ability Flag ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaction Desc Ġ= Ġlocale Context . getString ( R . string . vers atile _ device _ controls _ md u _ ctrl _ desc ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontrol Button Ġ= ĠControl Button ( false , Ġaction Desc ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcolor Ġ= Ġcontext . getColor ( R . color . primary A White ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtitle Ġ= Ġlocale Context . getString ( R . string . tile Data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtemplate Ġ= ĠToggle Template ( DEV _ ID _ MD U , Ġcontrol Button ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġicon Drawable Ġ= ĠContext Compat . get Drawable ( context , ĠR . drawable . ic _ data _ usage _ 2 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġicon Drawable ?. set Tint ( color ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġicon Ġ= Ġicon Drawable ?. to Bitmap ()?. to Icon () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠControl . State ful Builder ( DEV _ ID _ MD U , Ġpi ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setTitle ( title ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Subtitle ( context . getString ( R . string . vers atile _ device _ controls _ md u _ hint )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set DeviceType ( Device Types . TYPE _ GENERIC _ VIEW STREAM ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setStatus ( Control . STATUS _ OK ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Custom Icon ( icon ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Control Template ( template ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġif Ġ( control Id . startsWith ( DEV _ PREFIX _ DM )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( context , ĠMainActivity :: class . java ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Extras ( MainActivity . for Item ( Unit . UNIT _ NAME _ DEVICE _ MANAGER )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġflags Ġ= ĠIntent . FLAG _ ACTIVITY _ NEW _ TASK Ġor ĠIntent . FLAG _ ACTIVITY _ CLEAR _ TASK ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpi Mut ability Flag Ġ= Ġif Ġ( Os Utils . satisf y ( Os Utils . M )) ĠPending Intent . FLAG _ IM MUT ABLE Ġelse Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpi Ġ= ĠPending Intent . getActivity ( context , Ġ 0 , Ġintent , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPending Intent . FLAG _ UPDATE _ CURRENT Ġor Ġpi Mut ability Flag ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠControl . State ful Builder ( control Id , Ġpi ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set DeviceType ( Device Types . TYPE _ GENERIC _ ON _ OFF ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setStatus ( Control . STATUS _ OK ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠgetState less Builder ( context : ĠContext , Ġcontrol Id : ĠString ): ĠControl . State less Builder ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate () ĊĠĠĠĠĠĠĠ Ġval Ġcontext Ġ= Ġbase Context Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġregister State Receiver ( context ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcreate Publisher ForAll Available (): ĠFlow . Publisher < Control > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcontext Ġ= Ġbase Context ĊĠĠĠĠĠĠĠ Ġval Ġsession No Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠ Ġval Ġcontrols Ġ= Ġget Device Ids ( context , Ġsession No ). map NotNull Ġ{ Ġget Control ( context , Ġit , Ġsession No ) Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠFlow Adapters . to Flow Publisher ( Flow able . from Iterable ( controls )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcreate Publisher For ( control Ids : ĠMutable List < String >): ĠFlow . Publisher < Control > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcontext Ġ= Ġbase Context ĊĠĠĠĠĠĠĠ Ġval Ġupdate Publisher Ġ= ĠRe play Processor . create < Control >(). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Publisher Ġ= Ġit ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġsession No Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠ Ġcontrol Ids . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Control ( context , Ġit , Ġsession No )?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Publisher . onNext ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠFlow Adapters . to Flow Publisher ( update Publisher ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġperform Control Action ( control Id : ĠString , Ġaction : ĠControl Action , Ġconsumer : ĠConsumer < Int >) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġupdate Publisher Ġ= Ġupdate Publisher Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġval Ġcontext Ġ= Ġbase Context ĊĠĠĠĠĠĠĠ Ġ// ĠInform ĠSystem UI Ġthat Ġthe Ġaction Ġhas Ġbeen Ġreceived Ġand Ġis Ġbeing Ġprocessed ĊĠĠĠĠĠĠĠ Ġconsumer . accept ( Control Action . RESPONSE _ OK ) ĊĠĠĠĠĠĠĠ Ġval Ġsession No Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠ Ġget Control ( context , Ġcontrol Id , Ġsession No , Ġaction )?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Publisher . onNext ( this ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy () ĊĠĠĠĠĠĠĠ Ġdm Manager ?. close () ĊĠĠĠĠĠĠĠ Ġval Ġcontext Ġ= Ġbase Context Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġunregister State Receiver ( context ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Control ( context : ĠContext , Ġcontrol Id : ĠString , Ġsession No : ĠLong , Ġaction : ĠControl Action ? Ġ= Ġnull , Ġargs : ĠMap < String , ĠAny ?> ? Ġ= Ġnull ): ĠControl ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlocale Context Ġ= ĠSystem Util . getLocale Context Sys ( context ) ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen ( control Id ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDEV _ ID _ AT Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġis Running Ġ= ĠAccess AT . isRunning () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( isRunning Ġ&& Ġat Callback Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcallback Ġ= Ġobject Ġ: ĠAt Callback Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġvar Ġis Checked Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Tick ( target Time : ĠLong , Ġduration : ĠLong , Ġleft Time : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwhen Ġtimer Ġstops ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( left Time Ġ< Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAccess AT . remove Callback ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġat Callback Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġat Current Value Ġ= Ġat MaxValue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġleft Min Ġ= Ġ( left Time Ġ/ Ġ 6 0 0 0 0 ). toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Current Value Ġ= Ġmin ( left Min , Ġat MaxValue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcheck Ġreal Ġcurrent Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdo Update Ġ= Ġat Current Value Ġ- Ġnew Current Value Ġ>= Ġif Ġ(! isChecked ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Checked Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 0 2 f Ġ// Ġ 0 . 0 2 Ġmin Ġ-> Ġ 1 2 0 0 Ġms ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġat Step Value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġat Current Value Ġ= Ġnew Current Value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġupdate Ġcontrol Ġstatus ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! is At Update Blocked Ġ&& Ġdo Update ) Ġupdate Publisher ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Control ( context , Ġcontrol Id , Ġsession No )?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . onNext ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Tick ( display Text : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAccess AT . add Callback ( callback ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġat Callback Ġ= Ġcallback ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! isRunning ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġreset Ġcurrent Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġat Current Value Ġ= Ġat MaxValue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( action Ġ!= Ġnull ) Ġwhen ( action ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠBoolean Action Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Starting Ġ= Ġaction . newState ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Starting Ġ&& Ġ! isRunning ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAccess AT . start ( context , Ġat Current Value . round To Long () Ġ* Ġ 6 0 0 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( isRunning ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAccess AT . stop ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġreset Ġcurrent Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġat Current Value Ġ= Ġat MaxValue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Running Ġ= Ġis Starting ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠFloat Action Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( at Current Value Ġ!= Ġaction . newValue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġblock Ġupdate ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis At Update Blocked Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAccess AT . stop ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġat Current Value Ġ= Ġaction . newValue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGlobal Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( 5 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAccess AT . start ( context , Ġat Current Value . round To Long () Ġ* Ġ 6 0 0 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( 5 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis At Update Blocked Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Running Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠMode Action Ġ-> Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent Val Display Ġ= Ġif Ġ( at Current Value Ġ< Ġat Step Value ) Ġat Step Value Ġelse Ġat Current Value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġformat Res Ġ= ĠR . string . vers atile _ device _ controls _ at _ status _ on ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġformat String Ġ= Ġlocale Context . getString ( format Res ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsub Res Ġ= Ġif Ġ( isRunning ) ĠR . string . vers atile _ device _ controls _ at _ hint _ on ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĠR . string . vers atile _ device _ controls _ at _ hint _ off ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsub Ġ= Ġlocale Context . getString ( sub Res ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstatus Ġ= Ġif Ġ( isRunning ) Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġlocale Context . getString ( R . string . vers atile _ device _ controls _ at _ status _ off ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrange Template Ġ= ĠRange Template ( DEV _ ID _ AT , Ġat Step Value , Ġat MaxValue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Val Display , Ġat Step Value , Ġformat String ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaction Desc Res Ġ= Ġif Ġ( isRunning ) ĠR . string . vers atile _ device _ controls _ at _ ctrl _ desc _ on ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĠR . string . vers atile _ device _ controls _ at _ ctrl _ desc _ off ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaction Desc Ġ= Ġlocale Context . getString ( action Desc Res ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontrol Button Ġ= ĠControl Button ( isRunning , Ġaction Desc ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtoggle Range Template Ġ= ĠToggle Range Template ( DEV _ ID _ AT , Ġcontrol Button , Ġrange Template ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmode Flags Ġ= ĠTemperature Control Template . FLAG _ MODE _ CO OL Ġor Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTemperature Control Template . FLAG _ MODE _ HE AT Ġor Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTemperature Control Template . FLAG _ MODE _ E CO Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtemplate Ġ= ĠTemperature Control Template ( DEV _ ID _ AT , Ġtoggle Range Template , Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTemperature Control Template . MODE _ CO OL , Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTemperature Control Template . MODE _ CO OL , Ġmode Flags ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgetState ful Builder ( context , Ġcontrol Id )?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Subtitle ( sub ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠsetStatus Text ( status ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Control Template ( toggle Range Template ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDEV _ ID _ MD U Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhas Access Ġ= ĠPermission Utils . is Usage Access Per mitted ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdo Update Ġ= Ġaction Ġ!= Ġnull Ġ&& Ġaction Ġis ĠBoolean Action ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġask Ġpermission Ġonly Ġwhen Ġperforming Ġuser - requested Ġupdate Ġaction ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġto Ġavoid Ġpermission Ġrequest Ġwhen Ġadding Ġcontrols , Ġwhich Ġis Ġtoo Ġearly Ġand Ġunnecessary ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( do Update Ġ&& Ġ! has Access ) Ġget Permission () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( do Update Ġ&& Ġhas Access ) ĠGlobal Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( 8 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġupdate Publisher Ġ= Ġupdate Publisher Ġ?: Ġreturn @ launch ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Control ( context , Ġcontrol Id , Ġsession No )?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Publisher . onNext ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstatus Ġ= Ġif Ġ(! has Access ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocale Context . getString ( R . string . text _ access _ den ied ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( do Update ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" âĢ¦ " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( total Day , Ġtotal Month ) Ġ= ĠSys Service Utils . getData Usage ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġusage Day Ġ= ĠFormatter . format FileSize ( context , Ġtotal Day ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġusage Month Ġ= ĠFormatter . format FileSize ( context , Ġtotal Month ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ usage Day ĠâĢ¢ Ġ$ usage Month " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgetState ful Builder ( context , Ġcontrol Id )?. setStatus Text ( status ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġif Ġ( control Id . startsWith ( DEV _ PREFIX _ DM )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġdevice Item Ġ= Ġargs ?. get ( ARG _ DM _ DEV _ DEVICE ) Ġas ĠDevice Item ? ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġget Ġdevice Ġand Ġperform Ġaction ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( device Item Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdm Manager Ġ= Ġprepare Dm Manager ( context , Ġsession No ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( dm Manager Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmac Ġ= Ġget Dm Mac By DeviceId ( control Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdevice Ġ= Ġdm Manager . get Pa ired Devices (). find Ġ{ Ġit . address Ġ== Ġmac Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( device Ġ!= Ġnull ) Ġdevice Item Ġ= ĠDevice Item ( device ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Connected Ġ= Ġdm Manager . get Connected Devices (). any Ġ{ Ġit . address Ġ== Ġmac Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdevice Item ?. state Ġ= Ġif Ġ( isConnected ) ĠBluetooth Profile . STATE _ CONNECTED ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĠBluetooth Profile . STATE _ DIS CONNECTED ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġperform Ġaction ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( action Ġ!= Ġnull Ġ&& Ġaction Ġis ĠBoolean Action Ġ&& Ġdevice Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdo Connect Ġ= Ġaction . newState ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( do Connect Ġ&& Ġ! isConnected ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdm Manager . connect ( device ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdevice Item ?. state Ġ= ĠBluetooth Profile . STATE _ CONNECT ING ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( isConnected ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdm Manager . disconnect ( device ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdevice Item ?. state Ġ= ĠBluetooth Profile . STATE _ DIS CONNECT ING ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse ĠGlobal Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġupdate Ġstatus Ġin Ġ 6 0 0 ms ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( 6 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġupdate Publisher Ġ= Ġupdate Publisher Ġ?: Ġreturn @ launch ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Control ( context , Ġcontrol Id , Ġsession No )?. let Ġ{ Ġc Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIndex OutOfBoundsException Ġ( Replay Processor . java : 7 7 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Publisher . onNext ( c ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIndex OutOfBoundsException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcolor Ġ= Ġcontext . getColor ( R . color . primary A White ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġicon Res Ġ= Ġdevice Item ?. icon Res Ġ?: ĠR . drawable . ic _ devices _ other _ 2 4 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġicon Drawable Ġ= ĠContext Compat . get Drawable ( context , Ġicon Res ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġicon Drawable ?. set Tint ( color ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġicon Ġ= Ġicon Drawable ?. to Bitmap ()?. to Icon () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Connected Ġ= Ġdevice Item ?. state Ġ== ĠBluetooth Profile . STATE _ CONNECTED ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtitle Ġ= Ġdevice Item ?. name Ġ?: Ġlocale Context . getString ( R . string . vers atile _ device _ controls _ dm _ title _ unknown ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsub Res Ġ= Ġif Ġ( isConnected ) ĠR . string . vers atile _ device _ controls _ dm _ hint _ on ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĠR . string . vers atile _ device _ controls _ dm _ hint _ off ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsub Ġ= Ġlocale Context . getString ( sub Res ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstatus Ġ= Ġwhen Ġ( device Item ?. state ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBluetooth Profile . STATE _ CONNECTED Ġ-> ĠR . string . dm _ list _ item _ state _ connected ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBluetooth Profile . STATE _ CONNECT ING Ġ-> ĠR . string . dm _ list _ item _ state _ connecting ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBluetooth Profile . STATE _ DIS CONNECT ING Ġ-> ĠR . string . dm _ list _ item _ state _ disconnect ing ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠR . string . dm _ list _ item _ state _ disconnected ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. let Ġ{ Ġlocale Context . getString ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaction Desc Res Ġ= Ġif Ġ( isConnected ) ĠR . string . vers atile _ device _ controls _ dm _ ctrl _ desc _ on ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĠR . string . vers atile _ device _ controls _ dm _ ctrl _ desc _ off ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaction Desc Ġ= Ġlocale Context . getString ( action Desc Res ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontrol Button Ġ= ĠControl Button ( isConnected , Ġaction Desc ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtoggle Template Ġ= ĠToggle Template ( control Id , Ġcontrol Button ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgetState ful Builder ( context , Ġcontrol Id )?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Custom Icon ( icon ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠsetTitle ( title ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Subtitle ( sub ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠsetStatus Text ( status ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Control Template ( toggle Template ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġnull ĊĠĠĠĠĠĠĠ Ġ} ?. build () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Permission () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaction Ġ= ĠSettings . ACTION _ USAGE _ ACCESS _ SETTINGS ĊĠĠĠĠĠĠĠĠĠĠĠ Ġflags Ġ= ĠIntent . FLAG _ ACTIVITY _ NEW _ TASK ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠstartActivity ( intent ) ĊĠĠĠĠĠĠĠ ĠGlobal Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( 1 0 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠToast Utils . toast ( application Context , ĠR . string . access _ sys _ usage , ĠToast . LENGTH _ LONG ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ } Ċ