package Ġcom . the wiz rd . simple we ar . services Ċ Ċ import Ġandroid . annotation . Suppress Lint Ċ import Ġandroid . app .* Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Intent Ċ import Ġandroid . media . Audio Manager Ċ import Ġandroid . media . session . Media Controller Ċ import Ġandroid . media . session . Media Session Manager Ċ import Ġandroid . os . Build Ċ import Ġandroid . os . Handler Ċ import Ġandroid . os . Looper Ċ import Ġandroid . tele com . Call Audio State Ċ import Ġandroid . tele com . Tele com Manager Ċ import Ġandroid . tele phony . Phone State Listener Ċ import Ġandroid . tele phony . Tele phony Callback Ċ import Ġandroid . tele phony . Tele phony Manager Ċ import Ġandroid . util . Log Ċ import Ġandroid . view . KeyEvent Ċ import Ġandroidx . annotation . Requires Api Ċ import Ġandroidx . core . app . Notification Compat Ċ import Ġandroidx . core . content . Context Compat Ċ import Ġandroidx . lifecycle . Lifecycle Service Ċ import Ġcom . google . android . gms . we arable .* Ċ import Ġcom . the wiz rd . shared _ resources . helpers . In Call UI Helper Ċ import Ġcom . the wiz rd . shared _ resources . helpers . W ear able Helper Ċ import Ġcom . the wiz rd . shared _ resources . helpers . to Immutable Compat Flag Ċ import Ġcom . the wiz rd . shared _ resources . utils . Logger Ċ import Ġcom . the wiz rd . shared _ resources . utils . boolean ToBytes Ċ import Ġcom . the wiz rd . shared _ resources . utils . bytes To Bool Ċ import Ġcom . the wiz rd . shared _ resources . utils . bytes To Char Ċ import Ġcom . the wiz rd . simple we ar . R Ċ import Ġcom . the wiz rd . simple we ar . helpers . Phone Status Helper Ċ import Ġcom . the wiz rd . simple we ar . preferences . Settings Ċ import Ġcom . the wiz rd . simple we ar . we arable . W ear able Manager Ċ import Ġkotlinx . coroutines .* Ċ import Ġkotlinx . coroutines . tasks . await Ċ import Ġtim ber . log . Tim ber Ċ import Ġjava . util . concurrent . Executors Ċ Ċ class ĠCall Controller Service Ġ: ĠLifecycle Service (), ĠMessage Client . On Message Received Listener , ĊĠĠĠ ĠMedia Session Manager . On Active Sessions Changed Listener Ġ{ ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġm Audio Manager : ĠAudio Manager ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġm Notification Manager : ĠNotification Manager ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġm Media Session Manager : ĠMedia Session Manager ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġm Tele phony Manager : ĠTele phony Manager ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġm Tele com Manager : ĠTele com Manager ĊĊĠĠĠ Ġprivate Ġvar Ġm Foreground Notification : ĠNotification ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġval Ġscope Ġ= ĠCor outine Scope ( ĊĠĠĠĠĠĠĠ ĠSuper visor Job () Ġ+ ĠExec utors . new Single Thread Executor (). as Coroutine Dispatcher () ĊĠĠĠ Ġ) ĊĠĠĠ Ġprivate Ġvar Ġdisconnect Job : ĠJob ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġm Main Handler : ĠHandler ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġm W ear able Manager : ĠW ear able Manager ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġm Data Client : ĠData Client ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġm Message Client : ĠMessage Client ĊĊĠĠĠ Ġprivate Ġvar Ġm Phone State Listener : ĠPhone State Listener ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġm Tele phony Callback : ĠTele phony Callback ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġm Tele com Media Ctrl r : ĠMedia Controller ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġm In Call Manager Adapter : ĠIn Call Manager Adapter ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠTAG Ġ= Ġ" Call Controller Service " ĊĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠJOB _ ID Ġ= Ġ 1 0 0 3 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠNOT _ CHANNEL _ ID Ġ= Ġ" Simple W ear . call controllers ervice " ĊĊĠĠĠĠĠĠĠ Ġconst Ġval ĠACTION _ CONNECT CONTROLLER Ġ= Ġ" Simple W ear . Droid . action . CONNECT _ CONTROLLER " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠACTION _ DIS CONNECT CONTROLLER Ġ= Ġ" Simple W ear . Droid . action . DIS CONNECT _ CONTROLLER " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠACTION _ TO GG LEM UTE Ġ= Ġ" Simple W ear . Droid . action . TO GGLE _ M UTE " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠACTION _ TO GGLE SPE AK ER Ġ= Ġ" Simple W ear . Droid . action . TO GGLE _ SPE AK ER " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠACTION _ H ANG UP CALL Ġ= Ġ" Simple W ear . Droid . action . H ANG UP _ CALL " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠEX TRA _ TO GGLE STATE Ġ= Ġ" Simple W ear . Droid . extra . TO GGLE _ STATE " ĊĊĠĠĠĠĠĠĠ Ġconst Ġval ĠEX TRA _ FOR CED IS CONNECT Ġ= Ġ" Simple W ear . Droid . extra . FORCE _ DIS CONNECT " ĊĊĠĠĠĠĠĠĠ Ġfun Ġenqueue Work ( context : ĠContext , Ġwork : ĠIntent ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( has Permissions ( context )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠContext Compat . start Foreground Service ( context , Ġwork ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġhas Permissions ( context : ĠContext ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠPhone Status Helper . call State Permission Enabled ( context ) Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNotification Listener . isEnabled ( context ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Requires Api ( Build . VERSION _ CODES . O ) ĊĠĠĠ Ġprivate Ġfun Ġinit Channel () Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġm Channel Ġ= Ġm Notification Manager . get Notification Channel ( NOT _ CHANNEL _ ID ) ĊĠĠĠĠĠĠĠ Ġval Ġnot Channel Name Ġ= Ġapplication Context . getString ( R . string . not _ channel _ name _ call controller ) ĊĠĠĠĠĠĠĠ Ġif Ġ( m Channel Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Channel Ġ= ĠNotification Channel ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNOT _ CHANNEL _ ID , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnot Channel Name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNotification Manager . IMPORT ANCE _ DEFAULT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠConfigure Ġchannel ĊĠĠĠĠĠĠĠ Ġm Channel . name Ġ= Ġnot Channel Name ĊĠĠĠĠĠĠĠ Ġm Channel . set Show Badge ( false ) ĊĠĠĠĠĠĠĠ Ġm Channel . enable Lights ( false ) ĊĠĠĠĠĠĠĠ Ġm Channel . enable V ibration ( false ) ĊĠĠĠĠĠĠĠ Ġm Notification Manager . create Notification Channel ( m Channel ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Foreground Notification (): ĠNotification Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( m Foreground Notification Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontext Ġ= Ġapplication Context ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Foreground Notification Ġ= ĠNotification Compat . Builder ( context , ĠNOT _ CHANNEL _ ID ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Small Icon ( R . drawable . ic _ settings _ phone _ 2 4 dp ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Content Title ( context . getString ( R . string . not _ title _ call controller _ running )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Only Alert Once ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Sil ent ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpriority Ġ= ĠNotification Compat . PRIORITY _ DEFAULT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Action ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . getString ( R . string . action _ disconnect ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPending Intent . getService ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext , Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIntent ( context , ĠCall Controller Service :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setAction ( ACTION _ DIS CONNECT CONTROLLER ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPending Intent . FLAG _ UPDATE _ CURRENT . to Immutable Compat Flag () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. build () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġm Foreground Notification !! ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate Notification ( context : ĠContext , Ġcall Active : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnot if Ġ= ĠNotification Compat . Builder ( context , ĠNOT _ CHANNEL _ ID ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Small Icon ( R . drawable . ic _ settings _ phone _ 2 4 dp ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Content Title ( context . getString ( if Ġ( call Active ) ĠR . string . message _ call active Ġelse ĠR . string . not _ title _ call controller _ running )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Only Alert Once ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Sil ent ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpriority Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( call Active ) ĠNotification Compat . PRIORITY _ MAX Ġelse ĠNotification Compat . PRIORITY _ DEFAULT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( call Active ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmic Mut ed Ġ= Ġis Micro phone Mute () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġspeaker On Ġ= Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . S ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Speaker Phone Enabled () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Action ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . getString ( if Ġ( mic Mut ed ) ĠR . string . action _ un mute Ġelse ĠR . string . action _ mute ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPending Intent . getService ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext , ĠACTION _ TO GG LEM UTE . hashCode (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIntent ( context , ĠCall Controller Service :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setAction ( ACTION _ TO GG LEM UTE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. putExtra ( EXTRA _ TO GGLE STATE , Ġ! mic Mut ed ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPending Intent . FLAG _ UPDATE _ CURRENT . to Immutable Compat Flag () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( supports Speaker Toggle ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Action ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . getString ( if Ġ( speaker On ) ĠR . string . action _ speaker phone _ off Ġelse ĠR . string . action _ speaker phone _ on ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPending Intent . getService ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext , ĠACTION _ TO GGLE SPE AK ER . hashCode (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIntent ( context , ĠCall Controller Service :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setAction ( ACTION _ TO GGLE SPE AK ER ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. putExtra ( EXTRA _ TO GGLE STATE , Ġ! speaker On ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPending Intent . FLAG _ UPDATE _ CURRENT . to Immutable Compat Flag () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Action ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . getString ( R . string . action _ hang up ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPending Intent . getService ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext , ĠACTION _ H ANG UP CALL . hashCode (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIntent ( context , ĠCall Controller Service :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setAction ( ACTION _ H ANG UP CALL ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPending Intent . FLAG _ UPDATE _ CURRENT . to Immutable Compat Flag () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Action ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . getString ( R . string . action _ disconnect ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPending Intent . getService ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext , ĠACTION _ DIS CONNECT CONTROLLER . hashCode (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIntent ( context , ĠCall Controller Service :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setAction ( ACTION _ DIS CONNECT CONTROLLER ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPending Intent . FLAG _ UPDATE _ CURRENT . to Immutable Compat Flag () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġm Foreground Notification Ġ= Ġnot if . build () ĊĠĠĠĠĠĠĠ Ġm Notification Manager . notify ( JOB _ ID , Ġm Foreground Notification !! ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate () ĊĊĠĠĠĠĠĠĠ Ġm Main Handler Ġ= ĠHandler ( Looper . get Main Looper ()) ĊĠĠĠĠĠĠĠ Ġm Audio Manager Ġ= Ġget System Service ( Audio Manager :: class . java ) ĊĠĠĠĠĠĠĠ Ġm Notification Manager Ġ= Ġget System Service ( Notification Manager :: class . java ) ĊĠĠĠĠĠĠĠ Ġm Media Session Manager Ġ= Ġget System Service ( Media Session Manager :: class . java ) ĊĠĠĠĠĠĠĠ Ġm Tele phony Manager Ġ= Ġget System Service ( Tele phony Manager :: class . java ) ĊĠĠĠĠĠĠĠ Ġm Tele com Manager Ġ= Ġget System Service ( Tele com Manager :: class . java ) ĊĊĠĠĠĠĠĠĠ Ġm W ear able Manager Ġ= ĠW ear able Manager ( this ) ĊĠĠĠĠĠĠĠ Ġm Data Client Ġ= ĠW ear able . getData Client ( this ) ĊĠĠĠĠĠĠĠ Ġm Message Client Ġ= ĠW ear able . getMessage Client ( this ) ĊĠĠĠĠĠĠĠ Ġm Message Client . addListener ( this ) ĊĊĠĠĠĠĠĠĠ Ġm In Call Manager Adapter Ġ= ĠIn Call Manager Adapter . getInstance () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . O ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinit Channel () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġstart Foreground ( JOB _ ID , Ġget Foreground Notification ()) ĊĊĠĠĠĠĠĠĠ Ġregister Media Controller Listener () ĊĠĠĠĠĠĠĠ Ġregister Phone State Listener () ĊĠĠĠĠĠĠĠ ĠO ngo ing Call . call State . observe ( this , Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Call StateChanged ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ ĠO ngo ing Call . call Audio State . observe ( this , Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm W ear able Manager . sendMessage ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIn Call UI Helper . Mute Mic Status Path , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . is Mut ed . boolean ToBytes () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm W ear able Manager . sendMessage ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIn Call UI Helper . Speaker phone Status Path , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( it . route Ġ== ĠCall Audio State . ROUTE _ SPE AK ER ). boolean ToBytes () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonStart Command ( intent : ĠIntent ?, Ġflags : ĠInt , Ġstart Id : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onStart Command ( intent , Ġflags , Ġstart Id ) ĊĠĠĠĠĠĠĠ Ġdisconnect Job ?. cancel () ĊĠĠĠĠĠĠĠ Ġstart Foreground ( JOB _ ID , Ġget Foreground Notification ()) ĊĊĠĠĠĠĠĠĠ ĠLogger . write Line ( Log . INFO , Ġ"${ TAG }: ĠIntent Ġaction Ġ= Ġ${ intent ?. action }") ĊĊĠĠĠĠĠĠĠ Ġwhen Ġ( intent ?. action ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠACTION _ CONNECT CONTROLLER Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Tele com Media Ctrl r Ġ= Ġm Media Session Manager . getActive Sessions ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNotification Listener . getComponent Name ( this @ Call Controller Service ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). first OrNull Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . packageName Ġ== Ġ" com . android . server . tele com " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSend Ġcall Ġstate ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend Call State ( m Tele phony Manager . call State , Ġ"") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm W ear able Manager . sendMessage ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIn Call UI Helper . Mute Mic Status Path , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Micro phone Mute (). boolean ToBytes () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . S ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm W ear able Manager . sendMessage ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIn Call UI Helper . Speaker phone Status Path , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Speaker Phone Enabled (). boolean ToBytes () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠACTION _ DIS CONNECT CONTROLLER Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdisconnect Ġ= Ġintent . getBoolean Extra ( EXTRA _ FOR CED IS CONNECT , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( disconnect ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdisconnect Job Ġ= Ġscope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDelay Ġin Ġcase Ġservice Ġwas Ġjust Ġstarted Ġas Ġforeground ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( 1 5 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstop Self () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠACTION _ H ANG UP CALL Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend Hang up Event () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠACTION _ TO GG LEM UTE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( intent . has Extra ( EXTRA _ TO GGLE STATE )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtoggle Ġ= Ġintent . getBoolean Extra ( EXTRA _ TO GGLE STATE , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoggle Mic Mute ( mute Ġ= Ġtoggle ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠACTION _ TO GGLE SPE AK ER Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( intent . has Extra ( EXTRA _ TO GGLE STATE )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtoggle Ġ= Ġintent . getBoolean Extra ( EXTRA _ TO GGLE STATE , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . S ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoggle Speaker phone ( on Ġ= Ġtoggle ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠSTART _ STICK Y ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy () Ġ{ ĊĠĠĠĠĠĠĠ Ġremove Call State () ĊĊĠĠĠĠĠĠĠ Ġunregister Phone State Listener () ĊĠĠĠĠĠĠĠ Ġunregister Media Controller Listener () ĊĠĠĠĠĠĠĠ Ġm Message Client . remove Listener ( this ) ĊĠĠĠĠĠĠĠ Ġm W ear able Manager . unregister () ĊĊĠĠĠĠĠĠĠ Ġstop Foreground ( true ) ĊĠĠĠĠĠĠĠ Ġscope . cancel () ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġremove Call State () Ġ{ ĊĠĠĠĠĠĠĠ Ġscope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . tag ( TAG ). d (" remove Call State ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun Catch ing Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Data Client . delete Data Items ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠW ear able Helper . get W ear Data Uri ( In Call UI Helper . Call State Path ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). await () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. on Failure Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . write Line ( Log . ERROR , Ġit ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġregister Phone State Listener () Ġ{ ĊĠĠĠĠĠĠĠ Ġm Tele phony Manager ?. let Ġ{ Ġtm Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . S ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Tele phony Callback Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ: ĠTele phony Callback (), ĠTele phony Callback . Call State Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Call StateChanged ( state : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ Call Controller Service . on Call StateChanged ( state , Ġ"") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtm . register Tele phony Callback ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠExec utors . new Single Thread Executor (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Tele phony Callback !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Phone State Listener Ġ= Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . Q ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ: ĠPhone State Listener ( Executors . new Single Thread Executor ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Call StateChanged ( state : ĠInt , ĠphoneNumber : ĠString ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Call StateChanged ( state , ĠphoneNumber ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ Call Controller Service . on Call StateChanged ( state , ĠphoneNumber ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ: ĠPhone State Listener () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Call StateChanged ( state : ĠInt , ĠphoneNumber : ĠString ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Call StateChanged ( state , ĠphoneNumber ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ Call Controller Service . on Call StateChanged ( state , ĠphoneNumber ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtm . listen ( m Phone State Listener !! , ĠPhone State Listener . LIST EN _ CALL _ STATE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġunregister Phone State Listener () Ġ{ ĊĠĠĠĠĠĠĠ Ġm Tele phony Manager ?. let Ġ{ Ġtm Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . S ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Tele phony Callback ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtm . unregister Tele phony Callback ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Phone State Listener ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtm . listen ( it , ĠPhone State Listener . LIST EN _ NONE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġregister Media Controller Listener () Ġ{ ĊĠĠĠĠĠĠĠ Ġm Media Session Manager . add On Active Sessions Changed Listener ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠNotification Listener . getComponent Name ( this ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġunregister Media Controller Listener () Ġ{ ĊĠĠĠĠĠĠĠ Ġm Media Session Manager . remove On Active Sessions Changed Listener ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon Call StateChanged ( newState : ĠInt , Ġphone No : ĠString ? Ġ= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( newState ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTele phony Manager . CALL _ STATE _ IDLE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNo Ġcall Ġactive ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTele phony Manager . CALL _ STATE _ OFF HOOK Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCall Ġis Ġactive ; Ġno Ġother Ġcalls Ġor Ġring ing Ġor Ġwaiting ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTele phony Manager . CALL _ STATE _ RING ING Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠA Ġnew Ġcall Ġis Ġring ing Ġor Ġone Ġcall Ġis Ġactive Ġand Ġnew Ġcall Ġis Ġwaiting ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġscope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsend Call State ( newState , Ġphone No ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġupdate Notification ( this , ĠnewState Ġ!= ĠTele phony Manager . CALL _ STATE _ IDLE ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġsend Call State ( state : ĠInt ? Ġ= Ġnull , Ġphone No : ĠString ? Ġ= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmap Request Ġ= ĠPut DataMap Request . create ( In Call UI Helper . Call State Path ) ĊĊĠĠĠĠĠĠĠ Ġmap Request . data Map . putString ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIn Call UI Helper . KEY _ CALL ER NAME , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . R ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠO ngo ing Call . call ?. details ?. contact DisplayName ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: ĠO ngo ing Call . call ?. details ?. caller DisplayName Ġ?: Ġphone No Ġ?: Ġ"" ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġcall State Ġ= Ġstate Ġ?: ĠO ngo ing Call . call ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . S ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . details . state ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . state ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġ?: ĠTele phony Manager . CALL _ STATE _ IDLE ĊĊĠĠĠĠĠĠĠ Ġval Ġcall Active Ġ= Ġcall State Ġ!= ĠTele phony Manager . CALL _ STATE _ IDLE ĊĠĠĠĠĠĠĠ Ġmap Request . data Map . put Boolean ( In Call UI Helper . KEY _ CALL ACTIVE , Ġcall Active ) ĊĊĠĠĠĠĠĠĠ Ġvar Ġsupported Features Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġif Ġ( supports Speaker Toggle ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsupported Features Ġ+= ĠIn Call UI Helper . IN CALL _ FEATURE _ SPE AK ER PHONE ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( O ngo ing Call . call Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsupported Features Ġ+= ĠIn Call UI Helper . IN CALL _ FEATURE _ DT MF ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġmap Request . data Map . put Int ( In Call UI Helper . KEY _ SUPPORTED FEATURES , Ġsupported Features ) ĊĊĠĠĠĠĠĠĠ Ġmap Request . set U rg ent () ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Data Client . delete Data Items ( map Request . uri ). await () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Data Client . put Data Item ( map Request . as Put Data Request ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. await () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( call Active ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Settings . is Bridge Calls Enabled ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Data Client . put Data Item ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPut Data Request . create ( In Call UI Helper . Call State Bridge Path ). set U rg ent () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). await () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Data Client . delete Data Items ( W ear able Helper . get W ear Data Uri ( In Call UI Helper . Call State Bridge Path )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. await () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . write Line ( Log . ERROR , Ġe ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Message Received ( message Event : ĠMessage Event ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( message Event . path ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIn Call UI Helper . End Call Path Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend Hang up Event () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIn Call UI Helper . Mute Mic Path Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtoggle Ġ= Ġmessage Event . data . bytes To Bool () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoggle Mic Mute ( message Event . source NodeId , Ġtoggle ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIn Call UI Helper . Mute Mic Status Path Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm W ear able Manager . sendMessage ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Event . source NodeId , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIn Call UI Helper . Mute Mic Status Path , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Micro phone Mute (). boolean ToBytes () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIn Call UI Helper . Speaker phone Path Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtoggle Ġ= Ġmessage Event . data . bytes To Bool () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . S ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoggle Speaker phone ( message Event . source NodeId , Ġtoggle ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIn Call UI Helper . Speaker phone Status Path Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . S ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm W ear able Manager . sendMessage ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Event . source NodeId , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIn Call UI Helper . Speaker phone Status Path , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Speaker Phone Enabled (). boolean ToBytes () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIn Call UI Helper . DT MF Path Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( val Ġchar Ġ= Ġmessage Event . data . bytes To Char ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ' 0 ', Ġ' 1 ', Ġ' 2 ', Ġ' 3 ', Ġ' 4 ', Ġ' 5 ', Ġ' 6 ', Ġ' 7 ', Ġ' 8 ', Ġ' 9 ', Ġ'*', Ġ'#' Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠO ngo ing Call . call ?. run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplay D tm f Tone ( char ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstop D tm f Tone () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġno - op ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsend Hang up Event () Ġ{ ĊĠĠĠĠĠĠĠ ĠO ngo ing Call . call ?. disconnect () Ġ?: Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Tele com Media Ctrl r ?. dispatch Media Button Event ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKeyEvent ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKeyEvent . ACTION _ DOWN , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKeyEvent . KEYCODE _ HEAD SE TH O OK ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Tele com Media Ctrl r ?. dispatch Media Button Event ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKeyEvent ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKeyEvent . ACTION _ UP , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKeyEvent . KEYCODE _ HEAD SE TH O OK ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġtoggle Mic Mute ( node ID : ĠString ? Ġ= Ġnull , Ġmute : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . S Ġ&& Ġm In Call Manager Adapter . isIn Call Service Available ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm In Call Manager Adapter . mute ( mute ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPhone Status Helper . mute Micro phone ( this , Ġmute ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġscope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm W ear able Manager . sendMessage ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode ID , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIn Call UI Helper . Mute Mic Status Path , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Micro phone Mute (). boolean ToBytes () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġupdate Notification ( this , ĠisIn Call ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġis Micro phone Mute (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . S Ġ&& Ġm In Call Manager Adapter . isIn Call Service Available ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm In Call Manager Adapter . get Audio State ()?. is Mut ed Ġ?: Ġfalse ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Audio Manager . is Micro phone Mute ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Requires Api ( Build . VERSION _ CODES . S ) ĊĠĠĠ Ġprivate Ġfun Ġtoggle Speaker phone ( node ID : ĠString ? Ġ= Ġnull , Ġon : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġm In Call Manager Adapter . set Speaker Phone Enabled ( on ) ĊĠĠĠĠĠĠĠ Ġscope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm W ear able Manager . sendMessage ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode ID , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIn Call UI Helper . Speaker phone Status Path , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Speaker Phone Enabled (). boolean ToBytes () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġupdate Notification ( this , ĠisIn Call ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Requires Api ( Build . VERSION _ CODES . S ) ĊĠĠĠ Ġprivate Ġfun Ġis Speaker Phone Enabled (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġm In Call Manager Adapter . get Audio State ()?. route Ġ== ĠCall Audio State . ROUTE _ SPE AK ER ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Active Sessions Changed ( controllers : ĠMutable List < Media Controller > ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġm Tele com Media Ctrl r Ġ= Ġcontrollers ?. first OrNull Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . packageName Ġ== Ġ" com . android . server . tele com " ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress Lint (" Missing Permission ") ĊĠĠĠ Ġprivate Ġfun ĠisIn Call (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġrun Catch ing Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Tele com Manager . isIn Call ĊĠĠĠĠĠĠĠ Ġ}. get OrDefault ( m Tele phony Manager . call State Ġ!= ĠTele phony Manager . CALL _ STATE _ IDLE ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress Lint (" Missing Permission ") ĊĠĠĠ Ġprivate Ġfun Ġsupports Speaker Toggle (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġrun Catch ing Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBuild . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . S Ġ&& Ġm In Call Manager Adapter . isIn Call Service Available () ĊĠĠĠĠĠĠĠ Ġ}. get OrDefault ( false ) ĊĠĠĠ Ġ} Ċ }