package Ġcom . react native vo ise k app extension Ċ Ċ import Ġandroid . Manifest Ċ import Ġandroid . app . Activity Ċ import Ġandroid . app . role . Role Manager Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Intent Ċ import Ġandroid . content . pm . PackageManager Ċ import Ġandroid . os . Build Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . tele com . Call Screen ing Service Ċ import Ġandroid . text . TextUtils Ċ import Ġandroid . util . Log Ċ import Ġcom . facebook . react . Head less Js Task Service Ċ import Ġcom . facebook . react . bridge .* Ċ import Ġcom . facebook . react . module . annotations . React Module Ċ import Ġcom . facebook . react . modules . core . Permission Aware Activity Ċ import Ġcom . facebook . react . modules . core . Permission Listener Ċ import Ġcom . react native vo ise k app extension . call state . Vo ise k Call State Head less Task Service Ċ import Ġcom . react native vo ise k app extension . notification . Vo ise k Notification Service Ċ import Ġcom . react native vo ise k app extension . utils . Constants Ċ import Ġjava . util .* Ċ import Ġkotlin . concurrent . schedule ĊĊ Ċ @ React Module ( name Ġ= ĠVo ise k App Extension Module . NAME ) Ċ class ĠVo ise k App Extension Module ( react Context : ĠReact ApplicationContext ) Ġ: ĊĠ ĠReact Context Base Java Module ( react Context ), ĠPermission Listener , ĠActivity EventListener , ĊĠ ĠLifecycle EventListener Ġ{ ĊĠ Ġprivate Ġlateinit Ġvar Ġmain Activity : ĠActivity ĊĠ Ġprivate Ġvar Ġcallback Success Init Call Service : ĠCallback ? Ġ= Ġnull ĊĠ Ġprivate Ġvar Ġcallback Fail Init Call Service : ĠCallback ? Ġ= Ġnull ĊĠ Ġprivate Ġval Ġneeded Per ms Ġ= ĠarrayOf ( ĊĠĠĠ ĠManifest . permission . READ _ CONTACT S , ĊĠĠĠ ĠManifest . permission . READ _ CALL _ LOG , ĊĠĠĠ ĠManifest . permission . READ _ PHONE _ STATE ĊĠ Ġ) ĊĠ Ġprivate Ġvar Ġis On Play Ġ= Ġtrue ; ĊĠ Ġprivate Ġvar Ġis OnInit Ġ= Ġfalse ; ĊĊĠ Ġoverride Ġfun Ġinitialize () Ġ{ ĊĠĠĠ Ġsuper . initialize () ĊĠĠĠ Ġcurrent Activity . let Ġ{ ĊĠĠĠĠĠ Ġit ĊĠĠĠĠĠ Ġif Ġ( it Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmain Activity Ġ= Ġit ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreact ApplicationContext ?. add Activity EventListener ( this ) ĊĠĠĠ Ġreact ApplicationContext ?. add Lifecycle EventListener ( this ); ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun ĠgetName (): ĠString Ġ{ ĊĠĠĠ Ġreturn ĠNAME ĊĠ Ġ} ĊĊĠ Ġ@ React Method ĊĠ Ġfun Ġinit Call Service ( ĊĠĠĠ Ġgroup AppName : ĠString ?, ĊĠĠĠ Ġdirectory Extension Id : ĠString ?, ĊĠĠĠ Ġrequest Call Service : ĠBoolean ?, ĊĠĠĠ Ġcallback Success : ĠCallback ?, ĊĠĠĠ Ġcallback Fail : ĠCallback ? ĊĠ Ġ) Ġ{ ĊĠĠĠ Ġcurrent Activity . let Ġ{ ĊĠĠĠĠĠ Ġit ĊĠĠĠĠĠ Ġif Ġ( it Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcallback Fail ?. invoke (" Fail ") ĊĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġis OnInit Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġmain Activity Ġ= Ġit ĊĠĠĠĠĠĠĠ Ġcallback Success Init Call Service Ġ= Ġcallback Success ĊĠĠĠĠĠĠĠ Ġcallback Fail Init Call Service Ġ= Ġcallback Fail ĊĠĠĠĠĠĠĠ Ġcancel Notifications ( 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġshared Preferences Options Ġ= Ġreact ApplicationContext . get SharedPreferences ( ĊĠĠĠĠĠĠĠĠĠ ĠConstants . CALL ER _ OPTIONS _ KEY , ĊĠĠĠĠĠĠĠĠĠ ĠContext . MODE _ PRIVATE ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġeditor Options Ġ= Ġshared Preferences Options . edit (); ĊĠĠĠĠĠĠĠ Ġval Ġshared Preferences Request Data Ġ= Ġreact ApplicationContext . get SharedPreferences ( ĊĠĠĠĠĠĠĠĠĠ ĠConstants . REQUEST _ DATA _ KEY , ĊĠĠĠĠĠĠĠĠĠ ĠContext . MODE _ PRIVATE ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġeditor Request Data Ġ= Ġshared Preferences Request Data . edit () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( request Call Service Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġeditor Request Data . put Boolean ( Constants . OPTION _ CAN _ REQUEST _ ROLE , Ġrequest Call Service ) ĊĠĠĠĠĠĠĠĠĠ Ġeditor Options . put Boolean ( Constants . OPTION _ CAN _ CHECK _ CALL _ STATE , Ġrequest Call Service ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġeditor Request Data . put Boolean ( Constants . OPTION _ CAN _ REQUEST _ ROLE , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠ Ġeditor Options . put Boolean ( Constants . OPTION _ CAN _ CHECK _ CALL _ STATE , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġeditor Options . apply () ĊĠĠĠĠĠĠĠ Ġeditor Request Data . apply () ĊĠĠĠĠĠĠĠ Ġval Ġactivity : ĠPermission Aware Activity Ġ= Ġcurrent Activity Ġas ĠPermission Aware Activity ĊĠĠĠĠĠĠĠ Ġactivity . request Permissions ( needed Per ms , ĠConstants . PHONE _ NE EDED _ PERM , Ġthis ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ@ React Method ĊĠ Ġfun Ġset Notification Data ( ĊĠĠĠ Ġlistening Channel Title : ĠString ?, ĊĠĠĠ Ġlistening Channel Desc : ĠString ?, ĊĠĠĠ Ġlistening Background Not Title : ĠString ?, ĊĠĠĠ Ġlistening Background Not Desc : ĠString ?, ĊĠĠĠ Ġlistening Start Not Title : ĠString ?, ĊĠĠĠ Ġlistening Start Not Desc : ĠString ?, ĊĠĠĠ Ġlistening End Not Title : ĠString ?, ĊĠĠĠ Ġlistening End Not Desc : ĠString ? ĊĠ Ġ) Ġ{ ĊĠĠĠ Ġval Ġshared Preferences Not Data Ġ= Ġreact ApplicationContext . get SharedPreferences ( ĊĠĠĠĠĠ ĠConstants . NOT _ SHARED _ PRE F _ DATA , ĊĠĠĠĠĠ ĠContext . MODE _ PRIVATE ĊĠĠĠ Ġ) ĊĠĠĠ Ġval Ġeditor Not Data Ġ= Ġshared Preferences Not Data . edit () ĊĊĠĠĠ Ġ// Notification ĠChannel ĠText ĊĠĠĠ Ġif Ġ( list ening Channel Title Ġ!= Ġnull Ġ&& Ġ! TextUtils . isEmpty ( list ening Channel Title )) Ġ{ ĊĠĠĠĠĠ Ġeditor Not Data . putString ( Constants . NOT _ CHANNEL _ NAME _ KEY , Ġlistening Channel Title ) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠ Ġeditor Not Data . putString ( Constants . NOT _ CHANNEL _ NAME _ KEY , ĠConstants . NOT _ CHANNEL _ NAME ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( list ening Channel Desc Ġ!= Ġnull Ġ&& Ġ! TextUtils . isEmpty ( list ening Channel Desc )) Ġ{ ĊĠĠĠĠĠ Ġeditor Not Data . putString ( Constants . NOT _ CHANNEL _ DESC _ KEY , Ġlistening Channel Desc ) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠ Ġeditor Not Data . putString ( Constants . NOT _ CHANNEL _ DESC _ KEY , ĠConstants . NOT _ CHANNEL _ DESC ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Go ing Ġbackground ĠNotification ĠText ĊĠĠĠ Ġif Ġ( list ening Background Not Title Ġ!= Ġnull Ġ&& Ġ! TextUtils . isEmpty ( list ening Background Not Title )) Ġ{ ĊĠĠĠĠĠ Ġeditor Not Data . putString ( ĊĠĠĠĠĠĠĠ ĠConstants . NOT _ NAME _ LIST EN ING _ BACKGROUND _ KEY , ĊĠĠĠĠĠĠĠ Ġlistening Background Not Title ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠ Ġeditor Not Data . putString ( ĊĠĠĠĠĠĠĠ ĠConstants . NOT _ NAME _ LIST EN ING _ BACKGROUND _ KEY , ĊĠĠĠĠĠĠĠ ĠConstants . NOT _ NAME _ LIST EN ING _ BACKGROUND ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( list ening Background Not Desc Ġ!= Ġnull Ġ&& Ġ! TextUtils . isEmpty ( list ening Background Not Desc )) Ġ{ ĊĠĠĠĠĠ Ġeditor Not Data . putString ( ĊĠĠĠĠĠĠĠ ĠConstants . NOT _ DESC _ LIST EN ING _ BACKGROUND _ KEY , ĊĠĠĠĠĠĠĠ Ġlistening Background Not Desc ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠ Ġeditor Not Data . putString ( ĊĠĠĠĠĠĠĠ ĠConstants . NOT _ DESC _ LIST EN ING _ BACKGROUND _ KEY , ĊĠĠĠĠĠĠĠ ĠConstants . NOT _ DESC _ LIST EN ING _ BACKGROUND ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Start ĠList ening ĠNotification ĠText ĊĠĠĠ Ġif Ġ( list ening Start Not Title Ġ!= Ġnull Ġ&& Ġ! TextUtils . isEmpty ( list ening Start Not Title )) Ġ{ ĊĠĠĠĠĠ Ġeditor Not Data . putString ( Constants . NOT _ NAME _ LIST EN ING _ INIT _ KEY , Ġlistening Start Not Title ) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠ Ġeditor Not Data . putString ( ĊĠĠĠĠĠĠĠ ĠConstants . NOT _ NAME _ LIST EN ING _ INIT _ KEY , ĊĠĠĠĠĠĠĠ ĠConstants . NOT _ NAME _ LIST EN ING _ INIT ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( list ening Start Not Desc Ġ!= Ġnull Ġ&& Ġ! TextUtils . isEmpty ( list ening Start Not Desc )) Ġ{ ĊĠĠĠĠĠ Ġeditor Not Data . putString ( Constants . NOT _ DESC _ LIST EN ING _ INIT _ KEY , Ġlistening Start Not Desc ) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠ Ġeditor Not Data . putString ( ĊĠĠĠĠĠĠĠ ĠConstants . NOT _ DESC _ LIST EN ING _ INIT _ KEY , ĊĠĠĠĠĠĠĠ ĠConstants . NOT _ DESC _ LIST EN ING _ INIT ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// End ĠList ening ĠNotification ĠText ĊĠĠĠ Ġif Ġ( list ening End Not Title Ġ!= Ġnull Ġ&& Ġ! TextUtils . isEmpty ( list ening End Not Title )) Ġ{ ĊĠĠĠĠĠ Ġeditor Not Data . putString ( Constants . NOT _ NAME _ LIST EN ING _ END _ KEY , Ġlistening End Not Title ) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠ Ġeditor Not Data . putString ( ĊĠĠĠĠĠĠĠ ĠConstants . NOT _ NAME _ LIST EN ING _ END _ KEY , ĊĠĠĠĠĠĠĠ ĠConstants . NOT _ NAME _ LIST EN ING _ END ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( list ening End Not Desc Ġ!= Ġnull Ġ&& Ġ! TextUtils . isEmpty ( list ening End Not Desc )) Ġ{ ĊĠĠĠĠĠ Ġeditor Not Data . putString ( Constants . NOT _ DESC _ LIST EN ING _ END _ KEY , Ġlistening End Not Desc ) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠ Ġeditor Not Data . putString ( ĊĠĠĠĠĠĠĠ ĠConstants . NOT _ DESC _ LIST EN ING _ END _ KEY , ĊĠĠĠĠĠĠĠ ĠConstants . NOT _ DESC _ LIST EN ING _ END ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġeditor Not Data . apply () ĊĠ Ġ} ĊĊĊĠ Ġ@ React Method ĊĠ Ġfun Ġstop Call Service () Ġ{ ĊĠĠĠ Ġval Ġshared Preferences Options Ġ= Ġreact ApplicationContext . get SharedPreferences ( ĊĠĠĠĠĠ ĠConstants . CALL ER _ OPTIONS _ KEY , ĊĠĠĠĠĠ ĠContext . MODE _ PRIVATE ĊĠĠĠ Ġ) ĊĠĠĠ Ġval Ġstop Service Ġ= ĠIntent ( react ApplicationContext , ĠVo ise k Notification Service :: class . java ) ĊĠĠĠ Ġstop Service . action Ġ= ĠConstants . NOT _ ACTION _ FO REG ROUND _ SERVICE _ STOP ; ĊĠĠĠ Ġreact ApplicationContext . start Service ( stop Service ) ĊĠĠĠ Ġval Ġeditor Options Ġ= Ġshared Preferences Options . edit () ĊĠĠĠ Ġeditor Options . put Boolean ( Constants . OPTION _ CAN _ CHECK _ CALL _ STATE , Ġfalse ) ĊĠĠĠ Ġeditor Options . put Boolean ( Constants . OPTION _ BLOCK _ CALL _ ON _ BLACK _ LIST , Ġfalse ) ĊĠĠĠ Ġeditor Options . apply () ĊĠ Ġ} ĊĊĠ Ġ@ React Method ĊĠ Ġfun Ġdo Active Block Call On List ( active : ĠBoolean ) Ġ{ ĊĠĠĠ Ġval Ġshared Preferences Options Ġ= Ġreact ApplicationContext . get SharedPreferences ( ĊĠĠĠĠĠ ĠConstants . CALL ER _ OPTIONS _ KEY , ĊĠĠĠĠĠ ĠContext . MODE _ PRIVATE ĊĠĠĠ Ġ) ĊĠĠĠ Ġval Ġeditor Options Ġ= Ġshared Preferences Options . edit () ĊĠĠĠ Ġeditor Options . put Boolean ( Constants . OPTION _ BLOCK _ CALL _ ON _ BLACK _ LIST , Ġactive ) ĊĠĠĠ Ġeditor Options . apply () ĊĠ Ġ} ĊĊĠ Ġ@ React Method ĊĠ Ġfun Ġadd Blocking Phone Numbers ( caller List : ĠRead able Array , Ġpromise : ĠPromise ) Ġ{ ĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠ Ġval Ġshared Preferences Blocking Numbers Ġ= Ġreact ApplicationContext . get SharedPreferences ( ĊĠĠĠĠĠĠĠ ĠConstants . CALL ER _ BLOCK _ KEY , ĊĠĠĠĠĠĠĠ ĠContext . MODE _ PRIVATE ĊĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġval Ġeditor Blocking Numbers Ġ= Ġshared Preferences Blocking Numbers . edit () ĊĠĠĠĠĠ Ġeditor Blocking Numbers . clear () ĊĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġcaller List . size ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcaller Ġ= Ġcaller List . getMap ( i ) ĊĠĠĠĠĠĠĠ Ġif Ġ( caller Ġ!= Ġnull Ġ&& Ġcaller . has Key (" category ") Ġ&& Ġcaller . has Key (" phoneNumber ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġval Ġcaller Name Ġ= Ġcaller . getString (" category ") ĊĠĠĠĠĠĠĠĠĠ Ġval Ġcaller Number Ġ= Ġcaller . getString (" phoneNumber ") ĊĠĠĠĠĠĠĠĠĠ Ġeditor Blocking Numbers . putString ( caller Number , Ġcaller Name ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġeditor Blocking Numbers . apply () ĊĠĠĠĠĠ Ġpromise . resolve (" Did ĠAdd Ġdata ") ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠ ĠLog . e (" CALL ER _ ID ", Ġe . localized Message ) ĊĠĠĠĠĠ Ġpromise . resolve ( e . localized Message ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ@ React Method ĊĠ Ġfun Ġadd Sp am Phone Numbers ( caller List : ĠRead able Array , Ġpromise : ĠPromise ) Ġ{ ĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠ Ġval Ġshared Preferences Blocking Numbers Ġ= Ġreact ApplicationContext . get SharedPreferences ( ĊĠĠĠĠĠĠĠ ĠConstants . CALL ER _ SP AM _ KEY , ĊĠĠĠĠĠĠĠ ĠContext . MODE _ PRIVATE ĊĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġval Ġeditor Blocking Numbers Ġ= Ġshared Preferences Blocking Numbers . edit () ĊĠĠĠĠĠ Ġeditor Blocking Numbers . clear () ĊĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġcaller List . size ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcaller Ġ= Ġcaller List . getMap ( i ) ĊĠĠĠĠĠĠĠ Ġif Ġ( caller Ġ!= Ġnull Ġ&& Ġcaller . has Key (" label ") Ġ&& Ġcaller . has Key (" phoneNumber ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġval Ġcaller Number Ġ= Ġcaller . getString (" phoneNumber ") ĊĠĠĠĠĠĠĠĠĠ Ġval Ġcaller Label Ġ= Ġcaller . getString (" label ") ĊĠĠĠĠĠĠĠĠĠ Ġeditor Blocking Numbers . putString ( caller Number , Ġcaller Label ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġeditor Blocking Numbers . apply () ĊĠĠĠĠĠ Ġpromise . resolve (" Did ĠAdd Ġdata ") ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠ ĠLog . e (" CALL ER _ ID ", Ġe . localized Message ) ĊĠĠĠĠĠ Ġpromise . resolve ( e . localized Message ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ@ React Method ĊĠ Ġfun Ġcancel Notifications ( timer For Not To Cancel : ĠInt ) Ġ{ ĊĠĠĠ ĠTimer (" Cancel Not ", Ġfalse ). schedule ( timer For Not To Cancel . to Long ()) Ġ{ ĊĠĠĠĠĠ Ġval Ġstop Service Ġ= ĠIntent ( react ApplicationContext , ĠVo ise k Notification Service :: class . java ) ĊĠĠĠĠĠ Ġreact ApplicationContext . stop Service ( stop Service ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ@ React Method ĊĠ Ġfun Ġshow A FullScreen Notification ( title : ĠString , Ġdesc : ĠString , Ġtimer For Not To Show : ĠInt ) Ġ{ ĊĠĠĠ ĠTimer (" Sending Not ", Ġfalse ). schedule ( timer For Not To Show . to Long ()) Ġ{ ĊĠĠĠĠĠ Ġval Ġnot Service Ġ= ĠIntent ( react ApplicationContext , ĠVo ise k Notification Service :: class . java ) ĊĠĠĠĠĠ Ġnot Service . action Ġ= ĠConstants . NOT _ ACTION _ FO REG ROUND _ SHOW _ NOT ; ĊĠĠĠĠĠ Ġnot Service . putExtra (" title ", Ġtitle ); ĊĠĠĠĠĠ Ġnot Service . putExtra (" desc ", Ġdesc ); ĊĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . O ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreact ApplicationContext . start Foreground Service ( not Service ) ĊĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġreact ApplicationContext . start Service ( not Service ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ@ React Method ĊĠ Ġfun Ġreload Call Extension (){ ĊĊĠ Ġ} ĊĊĠ Ġ@ React Method ĊĠ Ġfun Ġcheck Call Detection ( ĊĠĠĠ Ġcallback Success : ĠCallback ?, ĊĠĠĠ Ġcallback Fail : ĠCallback ? ){ ĊĠĠĠ Ġcallback Success ?. invoke ( true ); ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġrequest Role () Ġ{ ĊĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . Q Ġ&& Ġcan Request Role ()) Ġ{ ĊĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrole Manager Ġ= ĊĠĠĠĠĠĠĠĠĠ Ġreact ApplicationContext . getSystem Service ( Context . ROLE _ SERVICE ) Ġas ĠRole Manager ĊĠĠĠĠĠĠĠ Ġval Ġintent Ġ= Ġrole Manager . create Request Role Intent ( Role Manager . ROLE _ CALL _ SCREEN ING ) ĊĠĠĠĠĠĠĠ Ġreact ApplicationContext . startActivity For Result ( ĊĠĠĠĠĠĠĠĠĠ Ġintent , ĊĠĠĠĠĠĠĠĠĠ ĠConstants . REQUEST _ ID _ BE CO ME _ CALL _ SCREEN ER , ĊĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . e (" ROLE ", Ġe . localized Message ) ĊĠĠĠĠĠĠĠ Ġcallback Fail Init Call Service ?. invoke () ĊĠĠĠĠĠĠĠ Ġis OnInit Ġ= Ġfalse ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠ Ġcallback Success Init Call Service ?. invoke () ĊĠĠĠĠĠ Ġis OnInit Ġ= Ġfalse ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġcan Request Role (): ĠBoolean Ġ{ ĊĠĠĠ Ġval Ġshared Preferences Request Data Ġ= ĊĠĠĠĠĠ Ġreact ApplicationContext . get SharedPreferences ( Constants . REQUEST _ DATA _ KEY , ĠContext . MODE _ PRIVATE ) ĊĠĠĠ Ġreturn Ġshared Preferences Request Data . getBoolean ( Constants . OPTION _ CAN _ REQUEST _ ROLE , Ġfalse ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġis Can Call Check (): ĠBoolean Ġ{ ĊĠĠĠ Ġval Ġshared Preferences Options Ġ= Ġreact ApplicationContext . get SharedPreferences ( ĊĠĠĠĠĠ ĠConstants . CALL ER _ OPTIONS _ KEY , ĊĠĠĠĠĠ ĠCall Screen ing Service . MODE _ PRIVATE ĊĠĠĠ Ġ) ĊĠĠĠ Ġreturn Ġshared Preferences Options . getBoolean ( Constants . OPTION _ CAN _ CHECK _ CALL _ STATE , Ġfalse ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġkeep On Background () Ġ{ ĊĠĠĠ Ġif Ġ( is Can Call Check ()) Ġ{ ĊĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġservice Ġ= ĊĠĠĠĠĠĠĠĠĠ ĠIntent ( react ApplicationContext , ĠVo ise k Call State Head less Task Service :: class . java ) ĊĠĠĠĠĠĠĠ Ġval Ġbundle Ġ= ĠBundle () ĊĠĠĠĠĠĠĠ Ġbundle . putString (" going Background ", Ġ" going Background ") ĊĠĠĠĠĠĠĠ Ġservice . put Extras ( bundle ) ĊĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . O ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġreact ApplicationContext ?. start Foreground Service ( service ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġreact ApplicationContext ?. start Service ( service ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠHead less Js Task Service . acquire Wake Lock Now ( react ApplicationContext ) ĊĠĠĠĠĠĠĠ ĠLog . d (" Life ", Ġ" CALL ĠBACK GROUND ") ĊĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠIllegalStateException ) Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . e (" Life ", Ġ" ERROR ", Ġex ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġon Activity Result ( ĊĠĠĠ Ġactivity : ĠActivity , ĊĠĠĠ Ġrequest Code : ĠInt , ĊĠĠĠ ĠresultCode : ĠInt , ĊĠĠĠ Ġdata : ĠIntent ? ĊĠ Ġ) Ġ{ ĊĠĠĠ Ġif Ġ( request Code Ġ== ĠConstants . REQUEST _ ID _ BE CO ME _ CALL _ SCREEN ER ) Ġ{ ĊĠĠĠĠĠ Ġif Ġ( result Code Ġ!= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcallback Success Init Call Service ?. invoke () ĊĠĠĠĠĠĠĠ Ġis OnInit Ġ= Ġfalse ĊĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġcallback Fail Init Call Service ?. invoke () ĊĠĠĠĠĠĠĠ Ġis OnInit Ġ= Ġfalse ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġon New Intent ( intent : ĠIntent ) Ġ{} ĊĊĠ Ġoverride Ġfun Ġon Request Permissions Result ( ĊĠĠĠ Ġrequest Code : ĠInt , ĊĠĠĠ Ġpermissions : ĠArray < String >, ĊĠĠĠ Ġgrant Results : ĠInt Array ĊĠ Ġ): ĠBoolean Ġ{ ĊĠĠĠ Ġif Ġ( request Code Ġ== ĠConstants . PHONE _ NE EDED _ PERM ) Ġ{ ĊĠĠĠĠĠ Ġvar Ġhave Perm Ġ= Ġtrue ĊĠĠĠĠĠ Ġif Ġ( grant Results . size Ġ== Ġneeded Per ms . size ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( data Ġin Ġgrant Results ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( data Ġ!= ĠPackage Manager . PERMISSION _ GRAN TED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhave Perm Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġhave Perm Ġ= Ġfalse ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġif Ġ( have Perm ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġshared Preferences Options Ġ= Ġreact ApplicationContext . get SharedPreferences ( ĊĠĠĠĠĠĠĠĠĠ ĠConstants . CALL ER _ OPTIONS _ KEY , ĊĠĠĠĠĠĠĠĠĠ ĠContext . MODE _ PRIVATE ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġeditor Options Ġ= Ġshared Preferences Options . edit (); ĊĠĠĠĠĠĠĠ Ġeditor Options . put Boolean ( Constants . OPTION _ CAN _ CHECK _ CALL _ STATE , Ġtrue ) ĊĠĠĠĠĠĠĠ Ġeditor Options . apply () ĊĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . Q ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġrequest Role () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġcallback Success Init Call Service ?. invoke () ĊĠĠĠĠĠĠĠĠĠ Ġis OnInit Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġcallback Fail Init Call Service ?. invoke () ĊĠĠĠĠĠĠĠ Ġis OnInit Ġ= Ġfalse ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġtrue ĊĠ Ġ} ĊĊĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠ Ġconst Ġval ĠNAME Ġ= Ġ" Vo ise k App Extension " ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġon Host Resume () Ġ{ ĊĠĠĠ ĠLog . d (" Life ", Ġ" on Host Resume ") ĊĠĠĠ Ġis On Play Ġ= Ġtrue ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġon Host Pause () Ġ{ ĊĠĠĠ ĠLog . d (" Life ", Ġ" on Host Pause ") ĊĠĠĠ Ġif Ġ( is On Play Ġ&& Ġ! is OnInit ) Ġ{ ĊĠĠĠĠĠ Ġkeep On Background () ĊĠĠĠĠĠ Ġis On Play Ġ= Ġfalse ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġon Host Destroy () Ġ{ ĊĠĠĠ ĠLog . d (" Life ", Ġ" on Host Destroy ") ĊĠĠĠ Ġif Ġ( is On Play Ġ&& Ġ! is OnInit ) Ġ{ ĊĠĠĠĠĠ Ġkeep On Background () ĊĠĠĠĠĠ Ġis On Play Ġ= Ġfalse ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ Ċ } Ċ