package Ġcom . lo f tech s . sample . model . api Ċ Ċ import Ġandroid . app . Notification Manager Ċ import Ġandroid . app . Pending Intent Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Intent Ċ import Ġandroid . media . Audio Manager Ċ import Ġandroid . media . MediaPlayer Ċ import Ġandroid . media . Ring tone Manager Ċ import Ġandroid . os . V ibration Effect Ċ import Ġandroid . os . V ibr ator Ċ import Ġandroidx . core . app . Notification Compat Ċ import Ġandroidx . core . content . Context Compat Ċ import Ġcom . lo f tech s . sample . LT SDK Manager Ċ import Ġcom . lo f tech s . sample . LT SDK Manager . sdk Observable Ċ import Ġcom . lo f tech s . sample . R Ċ import Ġcom . lo f tech s . sample . Sample App Ċ import Ġcom . lo f tech s . sample . call . list . Call Log Data Ċ import Ġcom . lo f tech s . sample . call . list . Call State Ċ import Ġcom . lo f tech s . sample . call . voice . Voice Call Activity Ċ import Ġcom . lo f tech s . sample . common . Intent Key Ċ import Ġcom . lo f tech s . sample . common . event . Call CD RE vent Ċ import Ġcom . lo f tech s . sample . common . event . Call State ChangeEvent Ċ import Ġcom . lo f tech s . sample . extensions . log Debug Ċ import Ġcom . lo f tech s . sdk . LT SDK Ċ import Ġcom . lo f tech s . sdk . call .* Ċ import Ġcom . lo f tech s . sdk . call . LT Call Options . UserID Builder Ċ import Ġcom . lo f tech s . sdk . call . core . LT Call Ċ import Ġcom . lo f tech s . sdk . call . core . LT Call State Ċ import Ġcom . lo f tech s . sdk . call . core . LT MediaType Ċ import Ġcom . lo f tech s . sdk . call . message . LT Call CDR Notification Message Ċ import Ġcom . lo f tech s . sdk . call . message . LT Call Notification Message Ċ import Ġcom . lo f tech s . sdk . call . route . LTA udio Route Ċ import Ġio . reactivex . Observable Ċ import Ġio . reactivex . Observer Ċ import Ġio . reactivex . dis pos ables . Disposable Ċ import Ġio . reactivex . functions . Bi Consumer Ċ import Ġorg . green robot . event bus . EventBus Ċ import Ġtim ber . log . Tim ber Ċ import Ġjava . io . IOException Ċ import Ġjava . util .* Ċ Ċ object ĠCall Manager Ġ: ĠLT Call State Listener , ĠLT Call Notification Listener Ġ{ ĊĠĠĠ Ġprivate Ġval ĠTAG Ġ= ĠCall Manager :: class . java . simple Name ĊĠĠĠ Ġvar Ġlt Call : ĠLT Call ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġaudio Manager : ĠAudio Manager ĊĠĠĠ Ġprivate Ġvar Ġr inger Player : ĠMedia Player ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġvi br ator : ĠV ibr ator ? ĊĠĠĠ Ġprivate Ġvar Ġis Ring ing Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġlt Call Center Manager : ĠLT Call Center Manager Ġ= ĠLT SDK . getInstance (). get Call Center Manager () ĊĠĠĠ Ġvar Ġmajor Call ID : ĠString ? Ġ= Ġnull ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġlog Debug (" Call Manager Ġ++ ") ĊĠĠĠĠĠĠĠ Ġaudio Manager Ġ= ĠSample App . context . getSystem Service ( Context . AUDIO _ SERVICE ) Ġas ĠAudio Manager ĊĠĠĠĠĠĠĠ Ġvi br ator Ġ= ĠSample App . context . getSystem Service ( Context . V IB R ATOR _ SERVICE ) Ġas ĠV ibr ator ĊĠĠĠĠĠĠĠ Ġget Call Manager () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . call Notification Listener Ġ= Ġthis @ Call Manager ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe () ĊĠĠĠĠĠĠĠ Ġreset Status () ĊĠĠĠĠĠĠĠ Ġlog Debug (" Call Manager -- ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Call Manager (): ĠObservable < LT Call Center Manager > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠLT SDK Manager . get Call Center Manager () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. do OnError Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . tag ( TAG ). e (" init Ġcall Center Manager ĠException : Ġ${ it . message }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġparse F CM Call Message ( message Json : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsdk Observable ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe ( object Ġ: ĠObserver < LT SDK > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Subscribe ( d : ĠDis posable ) Ġ{} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Next ( lts dk : ĠLT SDK ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog Debug (" parse F CM Call Message Ġmessage Json Ġ: Ġ$ message Json ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġl ts dk . parse Incoming Push With Notify ( message Json ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonError ( e : ĠThrowable ) Ġ{} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonComplete () Ġ{} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdo Outgoing Call With UserID ( receiver ID : ĠString , Ġaccount : ĠString , ĠuserID : ĠString ): ĠObservable < Boolean > Ġ{ ĊĠĠĠĠĠĠĠ Ġlog Debug (" do Outgoing Call With UserID Ġuser : Ġ$ userID , Ġcall Count : Ġ${ lt Call Center Manager . active Call Count }") ĊĠĠĠĠĠĠĠ Ġif Ġ( lt Call Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠObservable . just ( false ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġcall Options Ġ= ĠUser ID Builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set UserID ( userID ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġlog Debug (" getNumberOf Calls : Ġ${ lt Call Center Manager . active Call Count }") ĊĠĠĠĠĠĠĠ Ġreturn Ġget Call Manager () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog Debug (" start Ġa Ġoutgoing Ġ$ it ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= Ġset Notification Builder ( receiver ID , ĠuserID , Ġ"", Ġaccount , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . set Android Notification ( builder , Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlt Call Ġ= Ġit . start Call With UserID ( receiver ID , Ġcall Options , Ġthis @ Call Manager ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlt Call ?. let Ġ{ Ġcall Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmajor Call ID Ġ= Ġcall . call ID ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠObservable . just ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. do OnError Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . tag ( TAG ). e (" get Call Center Manager Ġerror : Ġ$ it ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdo Incoming Call ( incoming Call Message : ĠLT Call Notification Message ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! incoming Call Message . is Incoming Call Message ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . tag ( TAG ). e (" Not ĠIncoming Call ĠMessage ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġget Call Manager () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe ( object Ġ: ĠObserver < LT Call Center Manager > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Subscribe ( d : ĠDis posable ) Ġ{} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Next ( center Manager : ĠLT Call Center Manager ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnumber Ġ= Ġif Ġ(! incoming Call Message . call Options . semi UID . isNull OrEmpty ()) Ġincoming Call Message . call Options . semi UID Ġelse Ġincoming Call Message . call Options . phoneNumber ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( lt Call Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= Ġset Notification Builder ( incoming Call Message . receiver , Ġincoming Call Message . call Options . userID , Ġ"", Ġnumber ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġ"", Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcenter Manager . set Android Notification ( builder , Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtemp Incoming Call Ġ= Ġcenter Manager . start Call With Notification Message ( incoming Call Message , Ġthis @ Call Manager ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( temp Incoming Call Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog Debug (" getNumberOf Calls : Ġ${ center Manager . active Call Count }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( center Manager . active Call Count Ġ>= Ġ 2 Ġ|| Ġlt Call Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog Debug (" busy Call Ġcall ID : Ġ${ temp Incoming Call . call ID }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtemp Incoming Call . busy Call () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlt Call Ġ= Ġtemp Incoming Call ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmajor Call ID Ġ= Ġlt Call ?. call ID ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Call Activity ( get Call Intent ( incoming Call Message . receiver , Ġincoming Call Message . call Options . userID , ĠCall State . IN )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog Debug (" start Ġa Ġincoming Ġcall : Ġ${ lt Call ?. call ID }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Ring ing () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonError ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . tag ( TAG ). e (" get Call Center Manager Ġerror : Ġ$ e ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonComplete () Ġ{} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġstart Call Activity ( intent : ĠIntent ) Ġ{ ĊĠĠĠĠĠĠĠ ĠSample App . context . startActivity ( intent ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Call Intent ( receiver ID : ĠString , Ġcall UserID : ĠString , Ġcall State : ĠCall State ): ĠIntent Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent (). add Flags ( Intent . FLAG _ ACTIVITY _ NEW _ TASK ) ĊĠĠĠĠĠĠĠ Ġintent . set Class ( Sample App . context , ĠVoice Call Activity :: class . java ) ĊĠĠĠĠĠĠĠ Ġintent . putExtra ( Intent Key . EXTRA _ RECE IVER _ ID , Ġreceiver ID ) ĊĠĠĠĠĠĠĠ Ġintent . putExtra ( Intent Key . EXTRA _ CALL _ USER _ ID , Ġcall UserID ) ĊĠĠĠĠĠĠĠ Ġintent . putExtra ( Intent Key . EXTRA _ CALL _ STATE _ TYPE , Ġcall State . ordinal ) ĊĠĠĠĠĠĠĠ Ġreturn Ġintent ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġcall State : ĠLT Call State ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġlt Call ?. lt Call State Ġ?: ĠLT Call State . IDLE ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdo Accept () Ġ{ ĊĠĠĠĠĠĠĠ Ġlt Call ?. accept Call () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdo Hang up () Ġ{ ĊĠĠĠĠĠĠĠ Ġlt Call ?. hang up Call () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġis Call Mut ed : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġlt Call ?. is Call Mut ed Ġ?: Ġfalse ĊĠĠĠĠĠĠĠ Ġset ( mute ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlt Call ?. is Call Mut ed Ġ= Ġmute ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġis Call Hel d : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġlt Call ?. is Call Hel d Ġ?: Ġfalse ĊĠĠĠĠĠĠĠ Ġset ( hold ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlt Call ?. is Call Hel d Ġ= Ġhold ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġis Speaker On : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġlt Call ?. speaker Status Ġ?: Ġfalse ĊĊĠĠĠ Ġfun Ġroute Audio ToS peaker () Ġ{ ĊĠĠĠĠĠĠĠ Ġlt Call ?. set Audio Route ( LTA udio Route . LTA udio Route Speaker ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġroute Audio To Receiver () Ġ{ ĊĠĠĠĠĠĠĠ Ġlt Call ?. set Audio Route ( LTA udio Route . LTA udio Route Builtin ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Call Log ( receiver ID : ĠString , ĠstartTime : ĠLong , Ġcount : ĠInt ): ĠObservable < ArrayList < Call Log Data >> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġlt Call Center Manager . query CDR With UserID ( receiver ID , ĠstartTime , Ġcount ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġ! it . cdr Messages . isNull OrEmpty () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Iterable Ġ{ Ġit . cdr Messages Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCall Log Data ( it . sender ID , Ġit . call ID , Ġit . call StartTime , Ġit . call EndTime , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . callee Info , Ġit . caller Info , Ġit . billing Second , Ġget Call Type ( receiver ID , Ġit . caller Info . userID , Ġit . billing Second . to Long ())) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. collect ({ ĠArrayList () Ġ}, ĠBi Consumer ( ArrayList < Call Log Data >:: add ) Ġas ĠBi Consumer < ArrayList < Call Log Data >, ĠCall Log Data >) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. to Observable () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Call Type ( receiver ID : ĠString , ĠuserID : ĠString , Ġbilling Second : ĠLong ): ĠCall State Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠuserID Ġ== Ġreceiver ID Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCall State . OUT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbilling Second Ġ== Ġ 0 L Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCall State . MIS S ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCall State . IN ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadjust Volume ( i : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Ring ing ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaudio Manager . adjust Stream Volume ( Audio Manager . STREAM _ RING , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( i Ġ< Ġ 0 ) ĠAudio Manager . ADJ UST _ LOWER Ġelse ĠAudio Manager . ADJ UST _ RAI SE , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAudio Manager . FLAG _ SHOW _ UI ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaudio Manager . adjust Stream Volume ( Audio Manager . STREAM _ VOICE _ CALL , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( i Ġ< Ġ 0 ) ĠAudio Manager . ADJ UST _ LOWER Ġelse ĠAudio Manager . ADJ UST _ RAI SE , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAudio Manager . FLAG _ SHOW _ UI ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . tag ( TAG ). w (" adjust Volume ĠException : Ġ${ e . message }") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġreset Status () Ġ{ ĊĠĠĠĠĠĠĠ Ġlt Call Ġ= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġprivate Ġfun Ġstart Ring ing () Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(( audio Manager . ring er Mode Ġ== ĠAudio Manager . RING ER _ MODE _ V IB RATE Ġ|| Ġaudio Manager . ring er Mode Ġ== ĠAudio Manager . RING ER _ MODE _ NORMAL ) Ġ&& Ġvi br ator Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpattern Ġ= Ġlong ArrayOf ( 0 , Ġ 1 0 0 0 , Ġ 1 0 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( android . os . Build . VERSION . SDK _ INT Ġ>= Ġandroid . os . Build . VERSION _ CODES . O ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvi br ator ?. vi br ate ( V ibration Effect . create Wave form ( pattern , Ġ 0 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvi br ator ?. vi br ate ( pattern , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġr inger Player ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . i (" already Ġring ing ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġr inger Player Ġ= ĠMedia Player () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġr inger Player ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . set Audio Stream Type ( Audio Manager . STREAM _ RING ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon R inger Player Created ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . prepare () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . is Loop ing Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . start () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . tag ( TAG ). e (" cannot Ġhandle Ġincoming Ġcall Ġ: Ġ$ e ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġis Ring ing Ġ= Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġprivate Ġfun Ġstop Ring ing () Ġ{ ĊĠĠĠĠĠĠĠ Ġr inger Player ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . stop () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . release () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġr inger Player Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġvi br ator ?. cancel () ĊĠĠĠĠĠĠĠ Ġis Ring ing Ġ= Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon R inger Player Created ( media Player : ĠMedia Player ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġring tone Uri Ġ= ĠRing tone Manager . getDefault Uri ( Ring tone Manager . TYPE _ RING T ONE ) ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Player . set DataSource ( Sample App . context , Ġring tone Uri ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . tag ( TAG ). e (" cannot Ġset Ġring tone ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġset Notification Builder ( receiver ID : ĠString , Ġcall UserID : ĠString , Ġcontent : ĠString , ĠdisplayName : ĠString , Ġis Incoming Call : ĠBoolean ): ĠNotification Compat . Builder ? Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġnotify Message Ġ= Ġcontent ĊĠĠĠĠĠĠĠ Ġval ĠappName Ġ= ĠSample App . context . application Info . load Label ( Sample App . context . package Manager ). toString () ĊĠĠĠĠĠĠĠ Ġvar Ġbuilder : ĠNotification Compat . Builder ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġvar Ġcall State Ġ= Ġif Ġ( is Incoming Call ) ĠCall State . IN Ġelse ĠCall State . OUT ĊĠĠĠĠĠĠĠ Ġif Ġ( notify Message . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnotify Message Ġ= Ġif Ġ( is Incoming Call ) Ġ" Ġ: ĠIncoming ĠCall " Ġelse Ġ" Ġ: ĠCall ĠOut " ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcall State Ġ= ĠCall State . IN ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġactivity Intent Ġ= Ġget Call Intent ( receiver ID , Ġcall UserID , Ġcall State ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnotification Content Intent Ġ= ĠPending Intent . getActivity ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLT SDK . getContext (), Ġ 0 , Ġactivity Intent , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPending Intent . FLAG _ UPDATE _ CURRENT ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder Ġ= Ġget Notification Builder (" ch ID " Ġ+ ĠappName Ġ+ Ġ" LP ", Ġ" ch Name " Ġ+ ĠappName Ġ+ Ġ" LP ", ĠNotification Manager . IMPORT ANCE _ LOW ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . set Small Icon ( R . drawable . notif _ call ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setAuto Cancel ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setColor ( Context Compat . getColor ( Sample App . context , ĠR . color . color Default Theme )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Sound ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setContent Title ( appName ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setContent Text ( displayName Ġ+ Ġnotify Message ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setContent Intent ( notification Content Intent ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( exc : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog Debug (" custom Notification Channel Ġerror Ġ$ exc ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġbuilder ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠStarting Ġin ĠAndroid Ġ 8 . 0 Ġ( API Ġlevel Ġ 2 6 ), Ġall Ġnotifications Ġmust Ġbe Ġassigned Ġto Ġa Ġchannel Ġor Ġit Ġwill Ġnot Ġappear . ĊĠĠĠĠ Ġ* ĠBy Ġc ateg oriz ing Ġnotifications Ġinto Ġchannels , Ġusers Ġcan Ġdisable Ġspecific Ġnotification Ġchannels Ġfor Ġyour Ġapp Ġ( instead Ġof Ġdisabling Ġall Ġyour Ġnotifications ), ĊĠĠĠĠ Ġ* Ġand Ġusers Ġcan Ġcontrol Ġthe Ġvisual Ġand Ġaudit ory Ġoptions Ġfor Ġeach Ġchannel âĢĶ all Ġfrom Ġthe ĠAndroid Ġsystem Ġsettings . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġget Notification Builder ( channel ID : ĠString , Ġchannel Name : ĠString , Ġimportance : ĠInt ): ĠNotification Compat . Builder Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠNotification Compat . Builder ( Sample App . context , Ġchannel ID ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠisValid LT Call Manager ( call : ĠLT Call ?, Ġcall StatusCode : ĠLT Call StatusCode ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( call Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog Debug (" isValid LT Call Manager Ġcall Ġnull ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( call . call ID . isNull OrEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( call . is Group Call Ġ&& Ġmajor Call ID . isNull OrEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmajor Call ID Ġ= Ġcall . call ID ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġcall . call ID Ġ== Ġmajor Call ID ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon LT Call State Registered ( call : ĠLT Call ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! isValid LT Call Manager ( call , ĠLT Call StatusCode . NULL )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġlog Debug (" on LT Call State Registered Ġcall ID : Ġ${ call . call ID }, Ġtype : Ġ${ call . call Type }") ĊĠĠĠĠĠĠĠ Ġcall . set Audio Route ( LTA udio Route . LTA udio Route Bluetooth ) Ġ// Ġbluetooth åĦ ª åħĪ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon LT Call State Connected ( call : ĠLT Call ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! isValid LT Call Manager ( call , ĠLT Call StatusCode . NULL )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġlog Debug (" on LT Call State Connected Ġcall ID : Ġ${ call . call ID }") ĊĠĠĠĠĠĠĠ Ġstop Ring ing () ĊĠĠĠĠĠĠĠ Ġif Ġ( call . current Audio Route Ġ!= ĠL TA udio Route . LTA udio Route Speaker ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcall . set Audio Route ( LTA udio Route . LTA udio Route Bluetooth ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= Ġset Notification Builder ( lt Call Center Manager . main UserID , Ġcall . call Options . userID , Ġ" In ĠCall ", Ġ"", Ġfalse ) ĊĠĠĠĠĠĠĠ Ġlt Call Center Manager . set Android Notification ( builder , Ġ 1 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon LT Call State Terminated ( call : ĠLT Call , Ġcall StatusCode : ĠLT Call StatusCode ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! isValid LT Call Manager ( call , Ġcall StatusCode )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġlog Debug (" on LT Call State Terminated Ġcall ID : Ġ${ call . call ID }, Ġcall StatusCode : Ġ$ call StatusCode ") ĊĠĠĠĠĠĠĠ Ġstop Ring ing () ĊĠĠĠĠĠĠĠ ĠEvent Bus . getDefault (). post ( Call State ChangeEvent ( call StatusCode , Ġ- 1 )) ĊĠĠĠĠĠĠĠ Ġ// release Ġmajor Ġcall ĊĠĠĠĠĠĠĠ Ġlt Call Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġmajor Call ID Ġ= Ġ"" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon LT Call State Warning ( warn ed Call : ĠLT Call , Ġcall StatusCode : ĠLT Call StatusCode ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlog Debug (" on LT Call State Warning : Ġcall ID : Ġ${ warn ed Call . call ID }, Ġcall StatusCode : Ġ$ call StatusCode ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon LT Call Media StateChanged ( media Changed Call : ĠLT Call , Ġmedia Type : ĠLT MediaType ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlog Debug (" on LT Media StateChange : Ġcall ID : Ġ${ media Changed Call . call ID }, Ġmedia Type : Ġ$ media Type ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon LT Call Connection Duration ( call : ĠLT Call , Ġduration : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! isValid LT Call Manager ( call , ĠLT Call StatusCode . NULL )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( call . call ID Ġ== Ġmajor Call ID ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEvent Bus . getDefault (). post ( Call State ChangeEvent ( null , Ġduration )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon LT Call Notification ( call Notification Message : ĠLT Call Notification Message ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdo Incoming Call ( call Notification Message ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon LT Call CDR Notification ( call CDR Notification Message : ĠLT Call CDR Notification Message ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlog Debug (" on LT Call CDR Notification Ġ: Ġ$ call CDR Notification Message ") ĊĠĠĠĠĠĠĠ ĠEvent Bus . getDefault (). post ( Call CD RE vent ( call CDR Notification Message . receiver , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCall Log Data ( call CDR Notification Message . sender ID , Ġcall CDR Notification Message . call ID , Ġcall CDR Notification Message . call StartTime , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall CDR Notification Message . call EndTime , Ġcall CDR Notification Message . callee Info , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall CDR Notification Message . caller Info , Ġcall CDR Notification Message . billing Second , Ġget Call Type ( call CDR Notification Message . receiver , Ġcall CDR Notification Message . caller Info . userID , Ġcall CDR Notification Message . billing Second . to Long ())) )) ĊĠĠĠ Ġ} Ċ }