package Ġio . homeassistant . comp anion . android . notifications Ċ Ċ import Ġandroid . app . Notification Ċ import Ġandroid . app . Notification Channel Ċ import Ġandroid . app . Notification Manager Ċ import Ġandroid . app . Pending Intent Ċ import Ġandroid . bluetooth . Bluetooth Adapter Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Intent Ċ import Ġandroid . graphics . Bitmap Ċ import Ġandroid . graphics . Bitmap Factory Ċ import Ġandroid . graphics . Color Ċ import Ġandroid . media . Audio Attributes Ċ import Ġandroid . media . Audio Manager Ċ import Ġandroid . media . Ring tone Manager Ċ import Ġandroid . net . Uri Ċ import Ġandroid . os . Build Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . os . Handler Ċ import Ġandroid . os . Looper Ċ import Ġandroid . provider . Settings Ċ import Ġandroid . speech . tts . Text ToS peech Ċ import Ġandroid . speech . tts . Ut ter ance Progress Listener Ċ import Ġandroid . text . Sp anned Ċ import Ġandroid . util . Log Ċ import Ġandroid . widget . Toast Ċ import Ġandroidx . annotation . Requires Api Ċ import Ġandroidx . core . app . Notification Compat Ċ import Ġandroidx . core . app . Notification Manager Compat Ċ import Ġandroidx . core . app . Remote Input Ċ import Ġandroidx . core . content . Context Compat Ċ import Ġandroidx . core . text . Html Compat Ċ import Ġandroidx . core . text . is Digits Only Ċ import Ġcom . google . firebase . messaging . Firebase Messaging Service Ċ import Ġcom . google . firebase . messaging . Remote Message Ċ import Ġcom . vd urm ont . emoji . Emoji Parser Ċ import Ġio . homeassistant . comp anion . android . R Ċ import Ġio . homeassistant . comp anion . android . common . d agger . Graph Component Accessor Ċ import Ġio . homeassistant . comp anion . android . common . data . authentication . Authentication Repository Ċ import Ġio . homeassistant . comp anion . android . common . data . authentication . Session State Ċ import Ġio . homeassistant . comp anion . android . common . data . integration . Device Registration Ċ import Ġio . homeassistant . comp anion . android . common . data . integration . Integration Repository Ċ import Ġio . homeassistant . comp anion . android . common . data . url . Url Repository Ċ import Ġio . homeassistant . comp anion . android . database . App Database Ċ import Ġio . homeassistant . comp anion . android . database . notification . Notification Item Ċ import Ġio . homeassistant . comp anion . android . location . High Accuracy Location Service Ċ import Ġio . homeassistant . comp anion . android . sensors . Bluetooth Sensor Manager Ċ import Ġio . homeassistant . comp anion . android . sensors . Location Sensor Manager Ċ import Ġio . homeassistant . comp anion . android . util . Url Handler Ċ import Ġio . homeassistant . comp anion . android . util . cancel Ċ import Ġio . homeassistant . comp anion . android . util . cancel Group IfNeeded Ċ import Ġio . homeassistant . comp anion . android . util . getActive Notification Ċ import Ġio . homeassistant . comp anion . android . webview . WebView Activity Ċ import Ġjava . net . URL Ċ import Ġjava . util . Locale Ċ import Ġjavax . inject . Inject Ċ import Ġkotlinx . coroutines . Coroutine Scope Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . Job Ċ import Ġkotlinx . coroutines . launch Ċ import Ġkotlinx . coroutines . with Context Ċ Ċ class ĠMessaging Service Ġ: ĠFirebase Messaging Service () Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠTAG Ġ= Ġ" Messaging Service " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠTITLE Ġ= Ġ" title " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠMESSAGE Ġ= Ġ" message " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠSUB JECT Ġ= Ġ" subject " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠIMPORT ANCE Ġ= Ġ" import ance " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠTIME OUT Ġ= Ġ" timeout " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠIMAGE _ URL Ġ= Ġ" image " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠICON _ URL Ġ= Ġ" icon _ url " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠLED _ COLOR Ġ= Ġ" led Color " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠV IB RATION _ PATTERN Ġ= Ġ" vi br ation Pattern " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠPER SIST ENT Ġ= Ġ" persistent " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠC HR ON O METER Ġ= Ġ" chron ometer " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠWHEN Ġ= Ġ" when " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠGROUP _ PREFIX Ġ= Ġ" group _" ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠKEY _ TEXT _ REPLY Ġ= Ġ" key _ text _ reply " ĊĊĠĠĠĠĠĠĠ Ġ// Ġspecial Ġaction Ġconstants ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠREQUEST _ LOCATION _ UPDATE Ġ= Ġ" request _ location _ update " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠCLEAR _ NOTIFICATION Ġ= Ġ" clear _ notification " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠREMOVE _ CHANNEL Ġ= Ġ" remove _ channel " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠT TS Ġ= Ġ" TT S " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠCOMMAND _ D ND Ġ= Ġ" command _ d nd " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠCOMMAND _ RING ER _ MODE Ġ= Ġ" command _ ring er _ mode " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠCOMMAND _ BRO ADCAST _ INT ENT Ġ= Ġ" command _ broadcast _ intent " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠCOMMAND _ VOLUME _ LEVEL Ġ= Ġ" command _ volume _ level " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠCOMMAND _ BL U ETO OTH Ġ= Ġ" command _ bluetooth " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠCOMMAND _ BLE _ TRAN SM IT TER Ġ= Ġ" command _ ble _ transmit ter " ĊĊĠĠĠĠĠĠĠ Ġconst Ġval ĠCOMMAND _ HIGH _ AC CUR ACY _ MODE Ġ= Ġ" command _ high _ accuracy _ mode " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠCOMMAND _ ACTIVITY Ġ= Ġ" command _ activity " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠCOMMAND _ WEB VIEW Ġ= Ġ" command _ webview " ĊĊĠĠĠĠĠĠĠ Ġ// ĠD ND Ġcommands ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠD ND _ PRIORITY _ ONLY Ġ= Ġ" priority _ only " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠD ND _ AL AR MS _ ONLY Ġ= Ġ" al arms _ only " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠD ND _ ALL Ġ= Ġ" off " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠD ND _ NONE Ġ= Ġ" total _ sil ence " ĊĊĠĠĠĠĠĠĠ Ġ// ĠR inger Ġmode Ġcommands ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠRM _ NORMAL Ġ= Ġ" normal " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠRM _ SIL ENT Ġ= Ġ" silent " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠRM _ V IB RATE Ġ= Ġ" vi br ate " ĊĊĠĠĠĠĠĠĠ Ġ// ĠChannel Ġstreams ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠAL ARM _ STREAM Ġ= Ġ" alarm _ stream " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠAL ARM _ STREAM _ MAX Ġ= Ġ" alarm _ stream _ max " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠM US IC _ STREAM Ġ= Ġ" music _ stream " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠNOT IFICATION _ STREAM Ġ= Ġ" notification _ stream " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠR ING _ STREAM Ġ= Ġ" ring _ stream " ĊĊĠĠĠĠĠĠĠ Ġ// ĠEnable / Disable ĠCommands ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠT URN _ ON Ġ= Ġ" turn _ on " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠT URN _ OFF Ġ= Ġ" turn _ off " ĊĊĠĠĠĠĠĠĠ Ġ// ĠCommand Ġgroups ĊĠĠĠĠĠĠĠ Ġval ĠDEVICE _ COMMAND S Ġ= ĠlistOf ( COMMAND _ D ND , ĠCOMMAND _ RING ER _ MODE , ĠCOMMAND _ BRO ADCAST _ INT ENT , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCOMMAND _ VOLUME _ LEVEL , ĠCOMMAND _ BL U ETO OTH , ĠCOMMAND _ BLE _ TRAN SM IT TER , ĠCOMMAND _ HIGH _ AC CUR ACY _ MODE , ĠCOMMAND _ ACTIVITY , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCOMMAND _ WEB VIEW ) ĊĠĠĠĠĠĠĠ Ġval ĠD ND _ COMMAND S Ġ= ĠlistOf ( D ND _ AL AR MS _ ONLY , ĠD ND _ ALL , ĠD ND _ NONE , ĠD ND _ PRIORITY _ ONLY ) ĊĠĠĠĠĠĠĠ Ġval ĠRM _ COMMAND S Ġ= ĠlistOf ( RM _ NORMAL , ĠRM _ SIL ENT , ĠRM _ V IB RATE ) ĊĠĠĠĠĠĠĠ Ġval ĠCHAN NEL _ VOLUME _ STREAM Ġ= ĠlistOf ( ALARM _ STREAM , ĠM US IC _ STREAM , ĠNOT IFICATION _ STREAM , ĠR ING _ STREAM ) ĊĠĠĠĠĠĠĠ Ġval ĠENABLE _ COMMAND S Ġ= ĠlistOf ( T URN _ OFF , ĠT URN _ ON ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Inject ĊĠĠĠ Ġlateinit Ġvar Ġintegration UseCase : ĠIntegration Repository ĊĊĠĠĠ Ġ@ Inject ĊĠĠĠ Ġlateinit Ġvar Ġurl UseCase : ĠUrl Repository ĊĊĠĠĠ Ġ@ Inject ĊĠĠĠ Ġlateinit Ġvar Ġauthentication UseCase : ĠAuthentication Repository ĊĊĠĠĠ Ġprivate Ġval Ġmain Scope : ĠCor outine Scope Ġ= ĠCor outine Scope ( Dispatch ers . Main Ġ+ ĠJob ()) ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate () ĊĠĠĠĠĠĠĠ ĠD agger Service Component . builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. app Component (( application Context . application Context Ġas ĠGraph Component Accessor ). app Component ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. inject ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Message Received ( remote Message : ĠRemote Message ) Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" From : Ġ${ remote Message . from }") ĊĊĠĠĠĠĠĠĠ Ġ// ĠCheck Ġif Ġmessage Ġcontains Ġa Ġdata Ġpayload . ĊĠĠĠĠĠĠĠ Ġremote Message . data . let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Message Ġdata Ġpayload : Ġ" Ġ+ Ġremote Message . data ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnotification Dao Ġ= ĠApp Database . getInstance ( application Context ). notification Dao () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnow Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnotification Row Ġ= ĠNotification Item ( 0 , Ġnow , Ġit [ MESSAGE ]. toString (), Ġit . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnotification Dao . add ( notification Row ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit [ MESSAGE ] Ġ== ĠREQUEST _ LOCATION _ UPDATE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Request Ġlocation Ġupdate ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Acc ur ate Location Update () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit [ MESSAGE ] Ġ== ĠCLEAR _ NOTIFICATION Ġ&& Ġ! it [" tag "]. isNull Or Blank () Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Clear ing Ġnotification Ġwith Ġtag : Ġ${ it [" tag "] }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclear Notification ( it [" tag "] !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit [ MESSAGE ] Ġ== ĠREMOVE _ CHANNEL Ġ&& Ġ! it [" channel "]. isNull Or Blank () Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Removing ĠNotification Ġchannel Ġ${ it [" tag "] }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremove Notification Channel ( it [" channel "] !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit [ MESSAGE ] Ġ== ĠT TS Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Sending Ġnotification Ġtitle Ġto ĠT TS ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġspeak Notification ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit [ MESSAGE ] Ġin ĠDEVICE _ COMMAND S Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Processing Ġdevice Ġcommand ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( it [ MESSAGE ]) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCOMMAND _ D ND Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it [ TITLE ] Ġin ĠD ND _ COMMAND S ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . M ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Device Commands ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmain Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Post ing Ġnotification Ġto Ġdevice Ġas Ġit Ġdoes Ġnot Ġsupport ĠD ND Ġcommands ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend Notification ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmain Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Invalid ĠD ND Ġcommand Ġreceived , Ġposting Ġnotification Ġto Ġdevice ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend Notification ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCOMMAND _ RING ER _ MODE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it [ TITLE ] Ġin ĠRM _ COMMAND S ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Device Commands ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmain Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Invalid Ġr inger Ġmode Ġcommand Ġreceived , Ġposting Ġnotification Ġto Ġdevice ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend Notification ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCOMMAND _ BRO ADCAST _ INT ENT Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! it [ TITLE ]. isNull OrEmpty () Ġ&& Ġ! it [" channel "]. isNull OrEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Device Commands ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmain Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Invalid Ġbroadcast Ġcommand Ġreceived , Ġposting Ġnotification Ġto Ġdevice ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend Notification ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCOMMAND _ VOLUME _ LEVEL Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! it [" channel "]. isNull OrEmpty () Ġ&& Ġit [" channel "] Ġin ĠCHAN NEL _ VOLUME _ STREAM Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ! it [ TITLE ]. isNull OrEmpty () Ġ&& Ġit [ TITLE ]?. toInt OrNull () Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Device Commands ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmain Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Invalid Ġvolume Ġcommand Ġreceived , Ġposting Ġnotification Ġto Ġdevice ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend Notification ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCOMMAND _ BL U ETO OTH Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! it [ TITLE ]. isNull OrEmpty () Ġ&& Ġit [ TITLE ] Ġin ĠENABLE _ COMMAND S ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Device Commands ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmain Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Invalid Ġbluetooth Ġcommand Ġreceived , Ġposting Ġnotification Ġto Ġdevice ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend Notification ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCOMMAND _ BLE _ TRAN SM IT TER Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! it [ TITLE ]. isNull OrEmpty () Ġ&& Ġit [ TITLE ] Ġin ĠENABLE _ COMMAND S ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Device Commands ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmain Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Invalid Ġble Ġtransmit ter Ġcommand Ġreceived , Ġposting Ġnotification Ġto Ġdevice ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend Notification ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCOMMAND _ HIGH _ AC CUR ACY _ MODE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! it [ TITLE ]. isNull OrEmpty () Ġ&& Ġit [ TITLE ] Ġin ĠENABLE _ COMMAND S ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Device Commands ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmain Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTAG , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Invalid Ġhigh Ġaccuracy Ġmode Ġcommand Ġreceived , Ġposting Ġnotification Ġto Ġdevice " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCOMMAND _ ACTIVITY Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! it [" tag "]. isNull OrEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Device Commands ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmain Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Invalid Ġactivity Ġcommand Ġreceived , Ġposting Ġnotification Ġto Ġdevice ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend Notification ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCOMMAND _ WEB VIEW Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Device Commands ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠLog . d ( TAG , Ġ" No Ġcommand Ġreceived ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġmain Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Creating Ġnotification Ġwith Ġfollowing Ġdata : Ġ$ it ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend Notification ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrequest Acc ur ate Location Update () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( this , ĠLocation Sensor Manager :: class . java ) ĊĠĠĠĠĠĠĠ Ġintent . action Ġ= ĠLocation Sensor Manager . ACTION _ REQUEST _ AC CUR ATE _ LOCATION _ UPDATE ĊĊĠĠĠĠĠĠĠ Ġsend Broadcast ( intent ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġclear Notification ( tag : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnotification Manager Compat Ġ= ĠNotification Manager Compat . from ( this ) ĊĊĠĠĠĠĠĠĠ Ġval ĠmessageId Ġ= Ġtag . hashCode () ĊĊĠĠĠĠĠĠĠ Ġ// ĠClear Ġnotification ĊĠĠĠĠĠĠĠ Ġnotification Manager Compat . cancel ( tag , ĠmessageId , Ġtrue ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġremove Notification Channel ( channel Name : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnotification Manager Compat Ġ= ĠNotification Manager Compat . from ( this ) ĊĊĠĠĠĠĠĠĠ Ġval Ġchannel ID : ĠString Ġ= Ġcreate Channel ID ( channel Name ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . O ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnotification Manager Compat . delete Notification Channel ( channel ID ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġspeak Notification ( data : ĠMap < String , ĠString >) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġtext ToS peech : ĠText ToS peech ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġvar Ġt ts Ġ= Ġdata [ TITLE ] ĊĠĠĠĠĠĠĠ Ġval Ġaudio Manager Ġ= Ġapplication Context . getSystem Service ( Context . AUDIO _ SERVICE ) Ġas ĠAudio Manager ĊĠĠĠĠĠĠĠ Ġval Ġcurrent Alarm Volume Ġ= Ġaudio Manager . get Stream Volume ( Audio Manager . STREAM _ ALARM ) ĊĠĠĠĠĠĠĠ Ġval Ġmax Alarm Volume Ġ= Ġaudio Manager . get Stream Max Volume ( Audio Manager . STREAM _ ALARM ) ĊĠĠĠĠĠĠĠ Ġif Ġ( tts . isNull OrEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġt ts Ġ= ĠgetString ( R . string . tts _ no _ title ) ĊĠĠĠĠĠĠĠ Ġtext ToS peech Ġ= ĠText ToS peech ( application Context ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it Ġ== ĠText ToS peech . SUCCESS ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlistener Ġ= Ġobject Ġ: ĠUt ter ance Progress Listener () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonStart ( p 0 : ĠString ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( data [" channel "] Ġ== ĠAL ARM _ STREAM _ MAX ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaudio Manager . set Stream Volume ( Audio Manager . STREAM _ ALARM , Ġmax Alarm Volume , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Done ( p 0 : ĠString ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext ToS peech ?. stop () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext ToS peech ?. shutdown () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( data [" channel "] Ġ== ĠAL ARM _ STREAM _ MAX ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaudio Manager . set Stream Volume ( Audio Manager . STREAM _ ALARM , Ġcurrent Alarm Volume , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonError ( p 0 : ĠString ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext ToS peech ?. stop () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext ToS peech ?. shutdown () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( data [" channel "] Ġ== ĠAL ARM _ STREAM _ MAX ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaudio Manager . set Stream Volume ( Audio Manager . STREAM _ ALARM , Ġcurrent Alarm Volume , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext ToS peech ?. setOn Ut ter ance Progress Listener ( listener ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( data [" channel "] Ġ== ĠAL ARM _ STREAM Ġ|| Ġdata [" channel "] Ġ== ĠAL ARM _ STREAM _ MAX ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaudio Attributes Ġ= ĠAudio Attributes . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set ContentType ( Audio Attributes . CONTENT _ TYPE _ SON IFICATION ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Usage ( Audio Attributes . USAGE _ ALARM ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext ToS peech ?. set Audio Attributes ( audio Attributes ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext ToS peech ?. speak ( tts , ĠText ToS peech . QUEUE _ ADD , Ġnull , Ġ"") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" spe aking Ġnotification ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHandler ( Looper . get Main Looper ()). post Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapplication Context , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgetString ( R . string . tts _ error , Ġt ts ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . LENGTH _ LONG ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Device Commands ( data : ĠMap < String , ĠString >) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmessage Ġ= Ġdata [ MESSAGE ] ĊĠĠĠĠĠĠĠ Ġval Ġtitle Ġ= Ġdata [ TITLE ] ĊĠĠĠĠĠĠĠ Ġwhen Ġ( message ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCOMMAND _ D ND Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . M ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnotification Manager Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapplication Context . getSystem Service ( NOTIFICATION _ SERVICE ) Ġas ĠNotification Manager ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! notification Manager . is Notification Policy Access Granted ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest D ND Permission () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( title ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠD ND _ AL AR MS _ ONLY Ġ-> Ġnotification Manager . set Inter ruption Filter ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNotification Manager . INTERRUP TION _ FILTER _ AL AR MS ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠD ND _ ALL Ġ-> Ġnotification Manager . set Inter ruption Filter ( Notification Manager . INTERRUP TION _ FILTER _ ALL ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠD ND _ NONE Ġ-> Ġnotification Manager . set Inter ruption Filter ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNotification Manager . INTERRUP TION _ FILTER _ NONE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠD ND _ PRIORITY _ ONLY Ġ-> Ġnotification Manager . set Inter ruption Filter ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNotification Manager . INTERRUP TION _ FILTER _ PRIORITY ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠLog . d ( TAG , Ġ" Skipping Ġinvalid Ġcommand ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCOMMAND _ RING ER _ MODE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaudio Manager Ġ= Ġapplication Context . getSystem Service ( Context . AUDIO _ SERVICE ) Ġas ĠAudio Manager ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . M ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnotification Manager Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapplication Context . getSystem Service ( NOTIFICATION _ SERVICE ) Ġas ĠNotification Manager ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! notification Manager . is Notification Policy Access Granted ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest D ND Permission () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocess R inger Mode ( audio Manager , Ġtitle ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocess R inger Mode ( audio Manager , Ġtitle ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCOMMAND _ BRO ADCAST _ INT ENT Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠpackageName Ġ= Ġdata [" channel "] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( title ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġextras Ġ= Ġdata [" group "] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! extras . isNull OrEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġitems Ġ= Ġextras . split (',') ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( item Ġin Ġitems ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpair Ġ= Ġitem . split (": ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġintent . putExtra ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpair [ 0 ], ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pair [ 1 ]. is Digits Only ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpair [ 1 ]. toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ(( pair [ 1 ]. toLowerCase () Ġ== Ġ" true ") Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( pair [ 1 ]. toLowerCase () Ġ== Ġ" false ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpair [ 1 ]. to Boolean () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġpair [ 1 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġintent .` package ` Ġ= ĠpackageName ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Sending Ġbroadcast Ġintent ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapplication Context . send Broadcast ( intent ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" Unable Ġto Ġsend Ġbroadcast Ġintent Ġplease Ġcheck Ġcommand Ġformat ", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHandler ( Looper . get Main Looper ()). post Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapplication Context , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . string . broadcast _ intent _ error , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . LENGTH _ LONG ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCOMMAND _ VOLUME _ LEVEL Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaudio Manager Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapplication Context . getSystem Service ( Context . AUDIO _ SERVICE ) Ġas ĠAudio Manager ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . M ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnotification Manager Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapplication Context . getSystem Service ( NOTIFICATION _ SERVICE ) Ġas ĠNotification Manager ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! notification Manager . is Notification Policy Access Granted ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest D ND Permission () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Stream Volume ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaudio Manager , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata [" channel "]. toString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtitle !!. toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Stream Volume ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaudio Manager , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata [" channel "]. toString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtitle !!. toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCOMMAND _ BL U ETO OTH Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbluetooth Adapter Ġ= ĠBluetooth Adapter . getDefault Adapter () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( title Ġ== ĠT URN _ OFF ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbluetooth Adapter . disable () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( title Ġ== ĠT URN _ ON ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbluetooth Adapter . enable () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCOMMAND _ BLE _ TRAN SM IT TER Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( title Ġ== ĠT URN _ OFF ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBluetooth Sensor Manager . enable Disable BLE Transmit ter ( application Context , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( title Ġ== ĠT URN _ ON ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBluetooth Sensor Manager . enable Disable BLE Transmit ter ( application Context , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCOMMAND _ HIGH _ AC CUR ACY _ MODE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( title Ġ== ĠT URN _ OFF ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHigh Accuracy Location Service . stop Service ( application Context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLocation Sensor Manager . set High Accuracy Mode Setting ( application Context , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( title Ġ== ĠT URN _ ON ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHigh Accuracy Location Service . start Service ( application Context , ĠLocation Sensor Manager . get High Accuracy Mode Interval Setting ( application Context )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLocation Sensor Manager . set High Accuracy Mode Setting ( application Context , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCOMMAND _ ACTIVITY Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . M ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! Settings . can Draw Overlay s ( application Context )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest System Alert Permission () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Activity Command ( data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Activity Command ( data ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCOMMAND _ WEB VIEW Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . M ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! Settings . can Draw Overlay s ( application Context )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest System Alert Permission () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġopen Web view ( title ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġopen Web view ( title ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠLog . d ( TAG , Ġ" No Ġcommand Ġreceived ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCreate Ġand Ġshow Ġa Ġsimple Ġnotification Ġcontaining Ġthe Ġreceived ĠF CM Ġmessage . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġsend Notification ( data : ĠMap < String , ĠString >) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnotification Manager Compat Ġ= ĠNotification Manager Compat . from ( this ) ĊĊĠĠĠĠĠĠĠ Ġval Ġtag Ġ= Ġdata [" tag "] ĊĠĠĠĠĠĠĠ Ġval ĠmessageId Ġ= Ġtag ?. hashCode () Ġ?: ĠSystem . currentTimeMillis (). toInt () ĊĊĠĠĠĠĠĠĠ Ġvar Ġgroup Ġ= Ġdata [" group "] ĊĠĠĠĠĠĠĠ Ġvar ĠgroupId Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġprevious Group Ġ= Ġ"" ĊĠĠĠĠĠĠĠ Ġvar Ġprevious GroupId Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġif Ġ(! group . isNull Or Blank ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgroup Ġ= ĠGROUP _ PREFIX Ġ+ Ġgroup ĊĠĠĠĠĠĠĠĠĠĠĠ ĠgroupId Ġ= Ġgroup . hashCode () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . N ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnotification Ġ= Ġnotification Manager Compat . getActive Notification ( tag , ĠmessageId ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( notification Ġ!= Ġnull Ġ&& Ġnotification . is Group ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprevious Group Ġ= ĠGROUP _ PREFIX Ġ+ Ġnotification . tag ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprevious GroupId Ġ= Ġprevious Group . hashCode () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġchannel Id Ġ= Ġhandle Channel ( notification Manager Compat , Ġdata ) ĊĊĠĠĠĠĠĠĠ Ġval Ġnotification Builder Ġ= ĠNotification Compat . Builder ( this , Ġchannel Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Small Icon ( R . drawable . ic _ stat _ ic _ notification ) ĊĊĠĠĠĠĠĠĠ Ġhandle Sound ( notification Builder , Ġdata ) ĊĊĠĠĠĠĠĠĠ Ġhandle Persistent ( notification Builder , Ġtag , Ġdata ) ĊĊĠĠĠĠĠĠĠ Ġhandle Large Icon ( notification Builder , Ġdata ) ĊĊĠĠĠĠĠĠĠ Ġhandle Group ( notification Builder , Ġgroup ) ĊĊĠĠĠĠĠĠĠ Ġhandle Timeout ( notification Builder , Ġdata ) ĊĊĠĠĠĠĠĠĠ Ġhandle Color ( notification Builder , Ġdata ) ĊĊĠĠĠĠĠĠĠ Ġhandle Sticky ( notification Builder , Ġdata ) ĊĊĠĠĠĠĠĠĠ Ġhandle Text ( notification Builder , Ġdata ) ĊĊĠĠĠĠĠĠĠ Ġhandle Subject ( notification Builder , Ġdata ) ĊĊĠĠĠĠĠĠĠ Ġhandle Image ( notification Builder , Ġdata ) ĊĊĠĠĠĠĠĠĠ Ġhandle Actions ( notification Builder , Ġtag , ĠmessageId , Ġdata ) ĊĊĠĠĠĠĠĠĠ Ġhandle Delete Intent ( notification Builder , Ġdata , ĠmessageId , Ġgroup , ĠgroupId ) ĊĊĠĠĠĠĠĠĠ Ġhandle Content Intent ( notification Builder , ĠmessageId , Ġgroup , ĠgroupId , Ġdata ) ĊĊĠĠĠĠĠĠĠ Ġhandle Ch ron ometer ( notification Builder , Ġdata ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ< ĠBuild . VERSION _ CODES . O ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Legacy Priority ( notification Builder , Ġdata ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Legacy Led Color ( notification Builder , Ġdata ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Legacy V ibration Pattern ( notification Builder , Ġdata ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġnotification Manager Compat . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnotify ( tag , ĠmessageId , Ġnotification Builder . build ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( group Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnotify ( group , ĠgroupId , Ġget Group Notification Builder ( channelId , Ġgroup , Ġdata ). build ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! previous Group . isBlank ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnotification Manager Compat . cancel Group IfNeeded ( previous Group , Ġprevious GroupId ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Ch ron ometer ( ĊĠĠĠĠĠĠĠ Ġbuilder : ĠNotification Compat . Builder , ĊĠĠĠĠĠĠĠ Ġdata : ĠMap < String , ĠString > ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ Ġ// ĠWithout Ġthis , Ġa Ġnon - numeric Ġwhen Ġvalue Ġwill Ġcrash Ġthe Ġapp ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnotification When Ġ= Ġdata [ WHEN ]?. to Long OrNull ()?. times ( 1 0 0 0 ) Ġ?: Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuses Ch ron ometer Ġ= Ġdata [ CH RON O METER ]?. to Boolean () Ġ?: Ġfalse ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( notification When Ġ!= Ġ 0 L ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . set When ( notification When ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . set Uses Ch ron ometer ( uses Ch ron ometer ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . N ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcount down Ġ= Ġnotification When Ġ> ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . add Extras ( Bundle ()) Ġ// ĠWithout Ġthis Ġbuilder . set Ch ron ometer Count Down Ġthrows Ġa Ġnull Ġreference Ġexception ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . set Ch ron ometer Count Down ( countdown ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" Error Ġwhile Ġhandling Ġch ron ometer Ġnotification ", Ġe ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Content Intent ( ĊĠĠĠĠĠĠĠ Ġbuilder : ĠNotification Compat . Builder , ĊĠĠĠĠĠĠĠ ĠmessageId : ĠInt , ĊĠĠĠĠĠĠĠ Ġgroup : ĠString ?, ĊĠĠĠĠĠĠĠ ĠgroupId : ĠInt , ĊĠĠĠĠĠĠĠ Ġdata : ĠMap < String , ĠString > ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġaction Uri Ġ= Ġdata [" click Action "] ĊĠĠĠĠĠĠĠ Ġval Ġcontent Intent Ġ= ĠIntent ( this , ĠNotification Content Receiver :: class . java ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġput Extra ( Notification Content Receiver . EXTRA _ NOTIFICATION _ GROUP , Ġgroup ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġput Extra ( Notification Content Receiver . EXTRA _ NOTIFICATION _ GROUP _ ID , ĠgroupId ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġput Extra ( Notification Content Receiver . EXTRA _ NOTIFICATION _ ACTION _ URI , Ġaction Uri ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġcontent Pending Intent Ġ= ĠPending Intent . get Broadcast ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠmessageId , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Intent , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPending Intent . FLAG _ CANCEL _ CURRENT ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġbuilder . setContent Intent ( content Pending Intent ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Delete Intent ( ĊĠĠĠĠĠĠĠ Ġbuilder : ĠNotification Compat . Builder , ĊĠĠĠĠĠĠĠ Ġdata : ĠMap < String , ĠString >, ĊĠĠĠĠĠĠĠ ĠmessageId : ĠInt , ĊĠĠĠĠĠĠĠ Ġgroup : ĠString ?, ĊĠĠĠĠĠĠĠ ĠgroupId : ĠInt ĊĊĠĠĠ Ġ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġdelete Intent Ġ= ĠIntent ( this , ĠNotification Delete Receiver :: class . java ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġput Extra ( Notification Delete Receiver . EXTRA _ DATA , ĠHashMap ( data )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġput Extra ( Notification Delete Receiver . EXTRA _ NOTIFICATION _ GROUP , Ġgroup ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġput Extra ( Notification Delete Receiver . EXTRA _ NOTIFICATION _ GROUP _ ID , ĠgroupId ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġdelete Pending Intent Ġ= ĠPending Intent . get Broadcast ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠmessageId , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelete Intent , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPending Intent . FLAG _ CANCEL _ CURRENT ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġbuilder . set Delete Intent ( delete Pending Intent ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Persistent ( ĊĠĠĠĠĠĠĠ Ġbuilder : ĠNotification Compat . Builder , ĊĠĠĠĠĠĠĠ Ġtag : ĠString ?, ĊĠĠĠĠĠĠĠ Ġdata : ĠMap < String , ĠString > ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠOnly Ġset Ġongoing Ġ( persistent ) Ġproperty Ġif Ġtag Ġwas Ġsupplied . ĊĠĠĠĠĠĠĠ Ġ// ĠWithout Ġa Ġtag Ġthe Ġuser Ġcould Ġnot Ġclear Ġthe Ġnotification ĊĠĠĠĠĠĠĠ Ġif Ġ(! tag . isNull Or Blank ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpersistent Ġ= Ġdata [ PER SIST ENT ]?. to Boolean () Ġ?: Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . set O ngo ing ( persistent ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Group Notification Builder ( ĊĠĠĠĠĠĠĠ Ġchannel Id : ĠString , ĊĠĠĠĠĠĠĠ Ġgroup : ĠString , ĊĠĠĠĠĠĠĠ Ġdata : ĠMap < String , ĠString > ĊĠĠĠ Ġ): ĠNotification Compat . Builder Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġgroup Notification Builder Ġ= ĠNotification Compat . Builder ( this , Ġchannel Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Small Icon ( R . drawable . ic _ stat _ ic _ notification ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. setStyle ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNotification Compat . Big TextStyle () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Summary Text ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprepare Text ( group . substring ( GROUP _ PREFIX . length )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Group ( group ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Group Summary ( true ) ĊĊĠĠĠĠĠĠĠ Ġhandle Color ( group Notification Builder , Ġdata ) ĊĠĠĠĠĠĠĠ Ġreturn Ġgroup Notification Builder ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Sound ( ĊĠĠĠĠĠĠĠ Ġbuilder : ĠNotification Compat . Builder , ĊĠĠĠĠĠĠĠ Ġdata : ĠMap < String , ĠString > ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( data [" channel "] Ġ== ĠAL ARM _ STREAM ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . set Category ( Notification . CATEGORY _ ALARM ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . set Sound ( Ring tone Manager . getDefault Uri ( Ring tone Manager . TYPE _ ALARM ), ĠAudio Manager . STREAM _ ALARM ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . set Sound ( Ring tone Manager . getDefault Uri ( Ring tone Manager . TYPE _ NOTIFICATION )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Color ( ĊĠĠĠĠĠĠĠ Ġbuilder : ĠNotification Compat . Builder , ĊĠĠĠĠĠĠĠ Ġdata : ĠMap < String , ĠString > ĊĠĠĠ Ġ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġcolor String Ġ= Ġdata [" color "] ĊĠĠĠĠĠĠĠ Ġval Ġcolor Ġ= Ġparse Color ( color String , ĠR . color . color Primary ) ĊĠĠĠĠĠĠĠ Ġbuilder . color Ġ= Ġcolor ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġparse Color ( color String : ĠString ?, Ġdefault : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! color String . isNull Or Blank ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠColor . parse Color ( color String ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" Unable Ġto Ġparse Ġcolor ", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠContext Compat . getColor ( this , Ġdefault ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Legacy Led Color ( ĊĠĠĠĠĠĠĠ Ġbuilder : ĠNotification Compat . Builder , ĊĠĠĠĠĠĠĠ Ġdata : ĠMap < String , ĠString > ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġled Color Ġ= Ġdata [ LED _ COLOR ] ĊĠĠĠĠĠĠĠ Ġif Ġ(! led Color . isNull Or Blank ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . set Lights ( parse Color ( led Color , ĠR . color . color Primary ), Ġ 3 0 0 0 , Ġ 3 0 0 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Legacy V ibration Pattern ( ĊĠĠĠĠĠĠĠ Ġbuilder : ĠNotification Compat . Builder , ĊĠĠĠĠĠĠĠ Ġdata : ĠMap < String , ĠString > ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġvi br ation Pattern Ġ= Ġdata [ V IB RATION _ PATTERN ] ĊĠĠĠĠĠĠĠ Ġif Ġ(! vi br ation Pattern . isNull Or Blank ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġarr V ibration Pattern Ġ= Ġparse V ibration Pattern ( vi br ation Pattern ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( arr V ibration Pattern . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . set V ibrate ( arr V ibration Pattern ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Legacy Priority ( ĊĠĠĠĠĠĠĠ Ġbuilder : ĠNotification Compat . Builder , ĊĠĠĠĠĠĠĠ Ġdata : ĠMap < String , ĠString > ĊĠĠĠ Ġ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// ĠUse Ġimportance Ġproperty Ġfor Ġlegacy Ġpriority Ġsupport ĊĠĠĠĠĠĠĠ Ġval Ġpriority Ġ= Ġdata [ IMPORT ANCE ] ĊĊĠĠĠĠĠĠĠ Ġwhen Ġ( priority ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" high " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . priority Ġ= ĠNotification Compat . PRIORITY _ HIGH ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" low " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . priority Ġ= ĠNotification Compat . PRIORITY _ LOW ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" max " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . priority Ġ= ĠNotification Compat . PRIORITY _ MAX ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" min " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . priority Ġ= ĠNotification Compat . PRIORITY _ MIN ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . priority Ġ= ĠNotification Compat . PRIORITY _ DEFAULT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Requires Api ( Build . VERSION _ CODES . N ) ĊĠĠĠ Ġprivate Ġfun Ġhandle Import ance ( ĊĠĠĠĠĠĠĠ Ġdata : ĠMap < String , ĠString > ĊĠĠĠ Ġ): ĠInt Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġimportance Ġ= Ġdata [ IMPORT ANCE ] ĊĊĠĠĠĠĠĠĠ Ġwhen Ġ( import ance ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" high " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠNotification Manager . IMPORT ANCE _ HIGH ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" low " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠNotification Manager . IMPORT ANCE _ LOW ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" max " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠNotification Manager . IMPORT ANCE _ MAX ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" min " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠNotification Manager . IMPORT ANCE _ MIN ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠNotification Manager . IMPORT ANCE _ DEFAULT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Timeout ( ĊĠĠĠĠĠĠĠ Ġbuilder : ĠNotification Compat . Builder , ĊĠĠĠĠĠĠĠ Ġdata : ĠMap < String , ĠString > ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtimeout Ġ= Ġdata [ TIMEOUT ]?. to Long OrNull ()?. times ( 1 0 0 0 ) Ġ?: Ġ- 1 ĊĠĠĠĠĠĠĠ Ġif Ġ( timeout Ġ>= Ġ 0 ) Ġbuilder . setTimeout After ( timeout ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Group ( ĊĠĠĠĠĠĠĠ Ġbuilder : ĠNotification Compat . Builder , ĊĠĠĠĠĠĠĠ Ġgroup : ĠString ? ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! group . isNull Or Blank ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . set Group ( group ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Sticky ( ĊĠĠĠĠĠĠĠ Ġbuilder : ĠNotification Compat . Builder , ĊĠĠĠĠĠĠĠ Ġdata : ĠMap < String , ĠString > ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsticky Ġ= Ġdata [" sticky "] ?. to Boolean () Ġ?: Ġfalse ĊĠĠĠĠĠĠĠ Ġbuilder . setAuto Cancel (! sticky ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Subject ( ĊĠĠĠĠĠĠĠ Ġbuilder : ĠNotification Compat . Builder , ĊĠĠĠĠĠĠĠ Ġdata : ĠMap < String , ĠString > ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdata [ SUBJECT ]?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . setContent Text ( prepare Text ( it )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Text ( ĊĠĠĠĠĠĠĠ Ġbuilder : ĠNotification Compat . Builder , ĊĠĠĠĠĠĠĠ Ġdata : ĠMap < String , ĠString > ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdata [ TITLE ]?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . setContent Title ( prepare Text ( it )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġdata [ MESSAGE ]?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtext Ġ= Ġprepare Text ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . setContent Text ( text ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . setStyle ( Notification Compat . Big TextStyle (). big Text ( text )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprepare Text ( ĊĠĠĠĠĠĠĠ Ġtext : ĠString ĊĠĠĠ Ġ): ĠSp anned Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġemoji Parsed Text Ġ= ĠEmoji Parser . parse To Unicode ( text ) ĊĠĠĠĠĠĠĠ Ġreturn ĠHtml Compat . from Html ( emoji Parsed Text , ĠHtml Compat . FROM _ HTML _ MODE _ LEG ACY ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġhandle Large Icon ( ĊĠĠĠĠĠĠĠ Ġbuilder : ĠNotification Compat . Builder , ĊĠĠĠĠĠĠĠ Ġdata : ĠMap < String , ĠString > ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdata [ ICON _ URL ]?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġurl Ġ= ĠUrl Handler . handle ( url UseCase . getUrl (), Ġit ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbitmap Ġ= ĠgetImage Bitmap ( url , Ġ! Url Handler . is Absolute Url ( it )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( bitmap Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . set Large Icon ( bitmap ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġhandle Image ( ĊĠĠĠĠĠĠĠ Ġbuilder : ĠNotification Compat . Builder , ĊĠĠĠĠĠĠĠ Ġdata : ĠMap < String , ĠString > ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdata [ IMAGE _ URL ]?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġurl Ġ= ĠUrl Handler . handle ( url UseCase . getUrl (), Ġit ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbitmap Ġ= ĠgetImage Bitmap ( url , Ġ! Url Handler . is Absolute Url ( it )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( bitmap Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Large Icon ( bitmap ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setStyle ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNotification Compat . Big Picture Style () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. big Picture ( bitmap ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. big Large Icon ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun ĠgetImage Bitmap ( url : ĠURL ?, Ġrequires Auth : ĠBoolean Ġ= Ġfalse ): ĠBitmap ? Ġ= ĊĠĠĠĠĠĠĠ Ġwith Context ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDispatch ers . IO ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( url Ġ== Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ with Context Ġnull ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġimage : ĠBitmap ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuc Ġ= Ġurl . open Connection () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( requires Auth ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuc . setRequest Property (" Authorization ", Ġauthentication UseCase . build Bearer Token ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimage Ġ= ĠBitmap Factory . decode Stream ( uc . getInputStream ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" Couldn 't Ġdownload Ġimage Ġfor Ġnotification ", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ with Context Ġimage ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Actions ( ĊĠĠĠĠĠĠĠ Ġbuilder : ĠNotification Compat . Builder , ĊĠĠĠĠĠĠĠ Ġtag : ĠString ?, ĊĠĠĠĠĠĠĠ ĠmessageId : ĠInt , ĊĠĠĠĠĠĠĠ Ġdata : ĠMap < String , ĠString > ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 1 .. 3 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( data . containsKey (" action _${ i }_ key ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnotification Action Ġ= ĠNotification Action ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata [" action _${ i }_ key "]. toString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata [" action _${ i }_ title "]. toString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata [" action _${ i }_ uri "], ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaction Intent Ġ= ĠIntent ( this , ĠNotification Action Receiver :: class . java ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( notification Action . key Ġ== Ġ" URI ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNotification Action Receiver . OPEN _ URI ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNotification Action Receiver . FIRE _ EVENT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( data [" sticky "] ?. to Boolean () Ġ!= Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Extra ( Notification Action Receiver . EXTRA _ NOTIFICATION _ TAG , Ġtag ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Extra ( Notification Action Receiver . EXTRA _ NOTIFICATION _ ID , ĠmessageId ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Extra ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNotification Action Receiver . EXTRA _ NOTIFICATION _ ACTION , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnotification Action ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( notification Action . key Ġ!= Ġ" REPLY ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaction Pending Intent Ġ= ĠPending Intent . get Broadcast ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( notification Action . title . hashCode () Ġ+ ĠSystem . currentTimeMillis ()). toInt (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction Intent , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . addAction ( 0 , Ġnotification Action . title , Ġaction Pending Intent ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġremote Input : ĠRemote Input Ġ= ĠRemote Input . Builder ( KEY _ TEXT _ REPLY ). run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Label ( getString ( R . string . action _ reply )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuild () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreply Pending Intent Ġ= ĠPending Intent . get Broadcast ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction Intent , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPending Intent . FLAG _ UPDATE _ CURRENT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaction : ĠNotification Compat . Action Ġ= ĠNotification Compat . Action . Builder ( 0 , Ġ" reply ", Ġreply Pending Intent ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Remote Input ( remote Input ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . addAction ( action ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Channel ( ĊĠĠĠĠĠĠĠ Ġnotification Manager Compat : ĠNotification Manager Compat , ĊĠĠĠĠĠĠĠ Ġdata : ĠMap < String , ĠString > ĊĠĠĠ Ġ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠDefine Ġsome Ġvalues Ġfor Ġa Ġdefault Ġchannel ĊĠĠĠĠĠĠĠ Ġvar Ġchannel ID Ġ= Ġ" general " ĊĠĠĠĠĠĠĠ Ġvar Ġchannel Name Ġ= Ġ" General " ĊĊĠĠĠĠĠĠĠ Ġif Ġ( data . containsKey (" channel ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchannel ID Ġ= Ġcreate Channel ID ( data [" channel "]. toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchannel Name Ġ= Ġdata [" channel "]. toString (). trim () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠSince Ġandroid ĠO re o Ġnotification Ġchannel Ġis Ġneeded . ĊĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . O ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchannel Ġ= ĠNotification Channel ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchannel ID , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchannel Name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Import ance ( data ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( channel Name Ġ== ĠAL ARM _ STREAM ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Channel Sound ( channel ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Channel Led Color ( data , Ġchannel ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Channel V ibration Pattern ( data , Ġchannel ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnotification Manager Compat . create Notification Channel ( channel ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġchannel ID ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġset Channel Led Color ( ĊĠĠĠĠĠĠĠ Ġdata : ĠMap < String , ĠString >, ĊĠĠĠĠĠĠĠ Ġchannel : ĠNotification Channel ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . O ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġled Color Ġ= Ġdata [ LED _ COLOR ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! led Color . isNull Or Blank ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchannel . enable Lights ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchannel . light Color Ġ= Ġparse Color ( led Color , ĠR . color . color Primary ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġset Channel V ibration Pattern ( ĊĠĠĠĠĠĠĠ Ġdata : ĠMap < String , ĠString >, ĊĠĠĠĠĠĠĠ Ġchannel : ĠNotification Channel ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . O ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvi br ation Pattern Ġ= Ġdata [ V IB RATION _ PATTERN ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġarr V ibration Pattern Ġ= Ġparse V ibration Pattern ( vi br ation Pattern ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( arr V ibration Pattern . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchannel . vi br ation Pattern Ġ= Ġarr V ibration Pattern ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Requires Api ( Build . VERSION _ CODES . O ) ĊĠĠĠ Ġprivate Ġfun Ġhandle Channel Sound ( ĊĠĠĠĠĠĠĠ Ġchannel : ĠNotification Channel ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġaudio Attributes Ġ= ĠAudio Attributes . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set ContentType ( Audio Attributes . CONTENT _ TYPE _ SON IFICATION ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Flags ( Audio Attributes . FLAG _ AU DI B ILITY _ EN FOR CED ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Legacy Stream Type ( Audio Manager . STREAM _ ALARM ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Usage ( Audio Attributes . USAGE _ ALARM ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġchannel . set Sound ( Ring tone Manager . getDefault Uri ( Ring tone Manager . TYPE _ ALARM ), Ġaudio Attributes ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġparse V ibration Pattern ( ĊĠĠĠĠĠĠĠ Ġvi br ation Pattern : ĠString ? ĊĠĠĠ Ġ): ĠLong Array Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! vi br ation Pattern . isNull Or Blank ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpattern Ġ= Ġvi br ation Pattern . split ("," ). to Typed Array () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlist Ġ= Ġmutable ListOf < Long >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpattern . forEach Ġ{ Ġit Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġms Ġ= Ġit . trim (). to Long OrNull () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ms Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist . add ( ms ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( list . count () Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġlist . to Long Array () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠLong Array ( 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Channel ID ( ĊĠĠĠĠĠĠĠ Ġchannel Name : ĠString ĊĠĠĠ Ġ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġchannel Name ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. trim () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. toLowerCase ( Locale . ROOT ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. replace (" Ġ", Ġ"_ ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Requires Api ( Build . VERSION _ CODES . M ) ĊĠĠĠ Ġprivate Ġfun Ġrequest D ND Permission () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIntent ( Settings . ACTION _ NOTIFICATION _ POLICY _ ACCESS _ SETTINGS ) ĊĠĠĠĠĠĠĠ Ġintent . flags Ġ= ĠIntent . FLAG _ ACTIVITY _ NEW _ TASK ĊĠĠĠĠĠĠĠ ĠstartActivity ( intent ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Requires Api ( Build . VERSION _ CODES . M ) ĊĠĠĠ Ġprivate Ġfun Ġrequest System Alert Permission () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSettings . ACTION _ MANAGE _ OVER LAY _ PERMISSION , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠUri . parse (" package :$ packageName ")) ĊĠĠĠĠĠĠĠ Ġintent . flags Ġ= ĠIntent . FLAG _ ACTIVITY _ NEW _ TASK ĊĠĠĠĠĠĠĠ ĠstartActivity ( intent ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprocess R inger Mode ( audio Manager : ĠAudio Manager , Ġtitle : ĠString ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( title ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRM _ NORMAL Ġ-> Ġaudio Manager . ring er Mode Ġ= ĠAudio Manager . RING ER _ MODE _ NORMAL ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRM _ SIL ENT Ġ-> Ġaudio Manager . ring er Mode Ġ= ĠAudio Manager . RING ER _ MODE _ SIL ENT ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRM _ V IB RATE Ġ-> Ġaudio Manager . ring er Mode Ġ= ĠAudio Manager . RING ER _ MODE _ V IB RATE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠLog . d ( TAG , Ġ" Skipping Ġinvalid Ġcommand ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprocess Stream Volume ( audio Manager : ĠAudio Manager , Ġstream : ĠString , Ġvolume : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġvolume Level Ġ= Ġvolume ĊĠĠĠĠĠĠĠ Ġwhen Ġ( stream ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAL ARM _ STREAM Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( volume Level Ġ> Ġaudio Manager . get Stream Max Volume ( Audio Manager . STREAM _ ALARM )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvolume Level Ġ= Ġaudio Manager . get Stream Max Volume ( Audio Manager . STREAM _ ALARM ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ( volume Level Ġ< Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvolume Level Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaudio Manager . set Stream Volume ( Audio Manager . STREAM _ ALARM , Ġvolume Level , ĠAudio Manager . FLAG _ SHOW _ UI ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠM US IC _ STREAM Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( volume Level Ġ> Ġaudio Manager . get Stream Max Volume ( Audio Manager . STREAM _ M US IC )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvolume Level Ġ= Ġaudio Manager . get Stream Max Volume ( Audio Manager . STREAM _ M US IC ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ( volume Level Ġ< Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvolume Level Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaudio Manager . set Stream Volume ( Audio Manager . STREAM _ M US IC , Ġvolume Level , ĠAudio Manager . FLAG _ SHOW _ UI ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠNOT IFICATION _ STREAM Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( volume Level Ġ> Ġaudio Manager . get Stream Max Volume ( Audio Manager . STREAM _ NOTIFICATION )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvolume Level Ġ= Ġaudio Manager . get Stream Max Volume ( Audio Manager . STREAM _ NOTIFICATION ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ( volume Level Ġ< Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvolume Level Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaudio Manager . set Stream Volume ( Audio Manager . STREAM _ NOTIFICATION , Ġvolume Level , ĠAudio Manager . FLAG _ SHOW _ UI ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR ING _ STREAM Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( volume Level Ġ> Ġaudio Manager . get Stream Max Volume ( Audio Manager . STREAM _ RING )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvolume Level Ġ= Ġaudio Manager . get Stream Max Volume ( Audio Manager . STREAM _ RING ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ( volume Level Ġ< Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvolume Level Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaudio Manager . set Stream Volume ( Audio Manager . STREAM _ RING , Ġvolume Level , ĠAudio Manager . FLAG _ SHOW _ UI ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠLog . d ( TAG , Ġ" Skipping Ġcommand Ġdue Ġto Ġinvalid Ġchannel Ġstream ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprocess Activity Command ( data : ĠMap < String , ĠString >) Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠpackageName Ġ= Ġdata [" channel "] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaction Ġ= Ġdata [" tag "] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintent Uri Ġ= Ġif Ġ(! data [ TITLE ]. isNull OrEmpty ()) ĠUri . parse ( data [ TITLE ]) Ġelse Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintent Ġ= Ġif Ġ( intent Uri Ġ!= Ġnull ) ĠIntent ( action , Ġintent Uri ) Ġelse ĠIntent ( action ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Ġ= Ġdata [" subject "] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! type . isNull OrEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġintent . type Ġ= Ġtype ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġextras Ġ= Ġdata [" group "] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! extras . isNull OrEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġitems Ġ= Ġextras . split (',') ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( item Ġin Ġitems ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpair Ġ= Ġitem . split (": ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġintent . putExtra ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpair [ 0 ], ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pair [ 1 ]. is Digits Only ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpair [ 1 ]. toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ(( pair [ 1 ]. toLowerCase () Ġ== Ġ" true ") Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( pair [ 1 ]. toLowerCase () Ġ== Ġ" false ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpair [ 1 ]. to Boolean () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġpair [ 1 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġintent . flags Ġ= ĠIntent . FLAG _ ACTIVITY _ NEW _ TASK ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! packageName . isNull OrEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġintent . set Package ( packageName ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity ( intent ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( intent . resolve Activity ( application Context . package Manager ) Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity ( intent ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmain Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Post ing Ġnotification Ġas Ġwe Ġdo Ġnot Ġhave Ġenough Ġdata Ġto Ġstart Ġthe Ġactivity ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend Notification ( data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" Unable Ġto Ġsend Ġactivity Ġintent Ġplease Ġcheck Ġcommand Ġformat ", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠHandler ( Looper . get Main Looper ()). post Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapplication Context , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . string . activity _ intent _ error , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . LENGTH _ LONG ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). show () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġopen Web view ( title : ĠString ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintent Ġ= Ġif Ġ( title . isNull OrEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠWebView Activity . newInstance ( application Context ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠWebView Activity . newInstance ( application Context , Ġtitle ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġintent . flags Ġ= ĠIntent . FLAG _ ACTIVITY _ NEW _ TASK ĊĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity ( intent ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" Unable Ġto Ġopen Ġweb view ", Ġe ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCalled Ġif ĠInstance ID Ġtoken Ġis Ġupdated . ĠThis Ġmay Ġoccur Ġif Ġthe Ġsecurity Ġof ĊĠĠĠĠ Ġ* Ġthe Ġprevious Ġtoken Ġhad Ġbeen Ġcomp romise d . ĠNote Ġthat Ġthis Ġis Ġcalled Ġwhen Ġthe ĠInstance ID Ġtoken ĊĠĠĠĠ Ġ* Ġis Ġinitially Ġgenerated Ġso Ġthis Ġis Ġwhere Ġyou Ġwould Ġretrieve Ġthe Ġtoken . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġon New Token ( token : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmain Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Ref reshed Ġtoken : Ġ$ token ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( authentication UseCase . getSession State () Ġ== ĠSession State . AN ONY MO US ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Not Ġtrying Ġto Ġupdate Ġregistration Ġsince Ġwe Ġaren 't Ġauthenticated .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ launch ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġintegration UseCase . update Registration ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDevice Registration ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpush Token Ġ= Ġtoken ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : ĠStore Ġfor Ġupdate Ġlater ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" Issue Ġupdating Ġtoken ", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ