/* ĠAuthor Ġ- ĠA yk ut ĠAs il (@ ay k utt as il ) Ġ*/ Ċ package Ġcom . ay k utt as il . sweet loc . service Ċ Ċ import Ġandroid . app . Notification Channel Ċ import Ġandroid . app . Notification Manager Ċ import Ġandroid . app . Pending Intent Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Intent Ċ import Ġandroid . graphics . Bitmap Factory Ċ import Ġandroid . graphics . Color Ċ import Ġandroid . os . Build Ċ import Ġandroid . text . TextUtils Ċ import Ġandroid . util . Log Ċ import Ġandroidx . core . app . Job Intent Service Ċ import Ġandroidx . core . app . Notification Compat Ċ import Ġandroidx . core . app . Task Stack Builder Ċ import Ġcom . ay k utt as il . sweet loc . R Ċ import Ġcom . ay k utt as il . sweet loc . ui . activity . main . MainActivity Ċ import Ġcom . ay k utt as il . sweet loc . util . Ge ofence Error Messages Ċ import Ġcom . google . android . gms . location . Ge ofence Ċ import Ġcom . google . android . gms . location . Ge of encing Event Ċ Ċ import Ġjava . util . ArrayList Ċ Ċ /** Ċ Ġ* ĠListener Ġfor Ġge ofence Ġtransition Ġchanges . Ċ Ġ* Ċ Ġ* Ċ Ġ* ĠRe ceiv es Ġge ofence Ġtransition Ġevents Ġfrom ĠLocation ĠServices Ġin Ġthe Ġform Ġof Ġan ĠIntent Ġcontaining Ċ Ġ* Ġthe Ġtransition Ġtype Ġand Ġge ofence Ġid ( s ) Ġthat Ġtriggered Ġthe Ġtransition . ĠCreates Ġa Ġnotification Ċ Ġ* Ġas Ġthe Ġoutput . Ċ Ġ*/ Ċ class ĠGe ofence Transitions Job Intent Service Ġ: ĠJob Intent Service () Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠHandles Ġincoming Ġintent s . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġintent Ġsent Ġby ĠLocation ĠServices . ĠThis ĠIntent Ġis Ġprovided Ġto ĠLocation ĊĠĠĠĠ Ġ* ĠServices Ġ( inside Ġa ĠPending Intent ) Ġwhen Ġadd Ge of ences () Ġis Ġcalled . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġon Handle Work ( intent : ĠIntent ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġge of encing Event Ġ= ĠGe of encing Event . from Intent ( intent ) ĊĠĠĠĠĠĠĠ Ġif Ġ( ge of encing Event . has Error ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠerrorMessage Ġ= ĠGe ofence Error Messages . getError String ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġge of encing Event . errorCode ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , ĠerrorMessage ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠGet Ġthe Ġtransition Ġtype . ĊĠĠĠĠĠĠĠ Ġval Ġge ofence Transition Ġ= Ġge of encing Event . ge ofence Transition ĊĊĠĠĠĠĠĠĠ Ġ// ĠTest Ġthat Ġthe Ġreported Ġtransition Ġwas Ġof Ġinterest . ĊĠĠĠĠĠĠĠ Ġif Ġ( ge ofence Transition Ġ== ĠGe ofence . GE OF ENCE _ TRANS ITION _ ENTER Ġ|| Ġge ofence Transition Ġ== ĠGe ofence . GE OF ENCE _ TRANS ITION _ EXIT ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠGet Ġthe Ġge of ences Ġthat Ġwere Ġtriggered . ĠA Ġsingle Ġevent Ġcan Ġtrigger Ġmultiple Ġge of ences . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtriggering Ge of ences Ġ= Ġge of encing Event . trigger ing Ge of ences ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠGet Ġthe Ġtransition Ġdetails Ġas Ġa ĠString . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġge ofence Transition Details Ġ= Ġget Ge ofence Transition Details ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġge ofence Transition , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtriggering Ge of ences ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSend Ġnotification Ġand Ġlog Ġthe Ġtransition Ġdetails . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsend Notification ( ge ofence Transition Details ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i ( TAG , Ġge ofence Transition Details ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠLog Ġthe Ġerror . ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , ĠgetString ( R . string . ge ofence _ transition _ invalid _ type , Ġge ofence Transition )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGets Ġtransition Ġdetails Ġand Ġreturns Ġthem Ġas Ġa Ġformatted Ġstring . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġge ofence Transition ĠThe ĠID Ġof Ġthe Ġge ofence Ġtransition . ĊĠĠĠĠ Ġ* Ġ@ param Ġtriggering Ge of ences ĠThe Ġge ofence ( s ) Ġtriggered . ĊĠĠĠĠ Ġ* Ġ@ return ĠThe Ġtransition Ġdetails Ġformatted Ġas ĠString . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġget Ge ofence Transition Details ( ĊĠĠĠĠĠ Ġge ofence Transition : ĠInt , ĊĠĠĠĠĠ Ġtriggering Ge of ences : ĠList < Ge ofence > ĊĠĠĠ Ġ): ĠString Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġge ofence Transition String Ġ= Ġget Transition String ( ge ofence Transition ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠGet Ġthe ĠI ds Ġof Ġeach Ġge ofence Ġthat Ġwas Ġtriggered . ĊĠĠĠĠĠĠĠ Ġval Ġtriggering Ge of ences Ids List Ġ= ĠArrayList < String >() ĊĠĠĠĠĠĠĠ Ġfor Ġ( ge ofence Ġin Ġtriggering Ge of ences ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtriggering Ge of ences Ids List . add ( ge ofence . requestId ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġtriggering Ge of ences Ids String Ġ= ĠText Utils . join (", Ġ", Ġtriggering Ge of ences Ids List ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġ"$ ge ofence Transition String : Ġ$ trigger ing Ge of ences Ids String " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠPosts Ġa Ġnotification Ġin Ġthe Ġnotification Ġbar Ġwhen Ġa Ġtransition Ġis Ġdetected . ĊĠĠĠĠ Ġ* ĠIf Ġthe Ġuser Ġclicks Ġthe Ġnotification , Ġcontrol Ġgoes Ġto Ġthe ĠMainActivity . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġsend Notification ( notification Details : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠGet Ġan Ġinstance Ġof Ġthe ĠNotification Ġmanager ĊĠĠĠĠĠĠĠ Ġval Ġm Notification Manager Ġ= Ġget System Service ( Context . NOTIFICATION _ SERVICE ) Ġas ĠNotification Manager ĊĊĠĠĠĠĠĠĠ Ġ// ĠAndroid ĠO Ġrequires Ġa ĠNotification ĠChannel . ĊĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . O ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= ĠgetString ( R . string . app _ name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCreate Ġthe Ġchannel Ġfor Ġthe Ġnotification ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġm Channel Ġ= ĠNotification Channel ( CHANNEL _ ID , Ġname , ĠNotification Manager . IMPORT ANCE _ DEFAULT ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSet Ġthe ĠNotification ĠChannel Ġfor Ġthe ĠNotification ĠManager . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Notification Manager . create Notification Channel ( m Channel ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠCreate Ġan Ġexplicit Ġcontent ĠIntent Ġthat Ġstarts Ġthe Ġmain ĠActivity . ĊĠĠĠĠĠĠĠ Ġval Ġnotification Intent Ġ= ĠIntent ( application Context , ĠMainActivity :: class . java ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠConstruct Ġa Ġtask Ġstack . ĊĠĠĠĠĠĠĠ Ġval Ġstack Builder Ġ= ĠTask Stack Builder . create ( this ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠAdd Ġthe Ġmain ĠActivity Ġto Ġthe Ġtask Ġstack Ġas Ġthe Ġparent . ĊĠĠĠĠĠĠĠ Ġstack Builder . add Parent Stack ( MainActivity :: class . java ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠPush Ġthe Ġcontent ĠIntent Ġonto Ġthe Ġstack . ĊĠĠĠĠĠĠĠ Ġstack Builder . add Next Intent ( notification Intent ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠGet Ġa ĠPending Intent Ġcontaining Ġthe Ġentire Ġback Ġstack . ĊĠĠĠĠĠĠĠ Ġval Ġnotification Pending Intent Ġ= Ġstack Builder . get Pending Intent ( 0 , ĠPending Intent . FLAG _ UPDATE _ CURRENT ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠGet Ġa Ġnotification Ġbuilder Ġthat 's Ġcompatible Ġwith Ġplatform Ġversions Ġ>= Ġ 4 ĊĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= ĠNotification Compat . Builder ( this ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠDefine Ġthe Ġnotification Ġsettings . ĊĠĠĠĠĠĠĠ Ġbuilder . set Small Icon ( R . drawable . ic _ account _ circle _ light _ blue _ 3 0 0 _ 2 4 dp ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIn Ġa Ġreal Ġapp , Ġyou Ġmay Ġwant Ġto Ġuse Ġa Ġlibrary Ġlike ĠVol ley ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġto Ġdecode Ġthe ĠBitmap . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Large Icon ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBitmap Factory . decode Resource ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresources , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . drawable . ic _ account _ circle _ light _ blue _ 3 0 0 _ 2 4 dp ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. setColor ( Color . RED ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. setContent Title ( notification Details ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. setContent Text ("") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. setContent Intent ( notification Pending Intent ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠSet Ġthe ĠChannel ĠID Ġfor ĠAndroid ĠO . ĊĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . O ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . set Channel Id ( CHANNEL _ ID ) Ġ// ĠChannel ĠID ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠDis miss Ġnotification Ġonce Ġthe Ġuser Ġto uches Ġit . ĊĠĠĠĠĠĠĠ Ġbuilder . setAuto Cancel ( true ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠIssue Ġthe Ġnotification ĊĠĠĠĠĠĠĠ Ġm Notification Manager . notify ( 0 , Ġbuilder . build ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠMaps Ġge ofence Ġtransition Ġtypes Ġto Ġtheir Ġhuman - readable Ġequivalent s . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġtransition Type ĠA Ġtransition Ġtype Ġconstant Ġdefined Ġin ĠGe ofence ĊĠĠĠĠ Ġ* Ġ@ return ĠA ĠString Ġindicating Ġthe Ġtype Ġof Ġtransition ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġget Transition String ( transition Type : ĠInt ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( transition Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGe ofence . GE OF ENCE _ TRANS ITION _ ENTER Ġ-> ĠgetString ( R . string . ge ofence _ transition _ enter ed ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGe ofence . GE OF ENCE _ TRANS ITION _ EXIT Ġ-> ĠgetString ( R . string . ge ofence _ transition _ exit ed ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠgetString ( R . string . unknown _ ge ofence _ transition ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠJOB _ ID Ġ= Ġ 5 7 3 ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠTAG Ġ= Ġ" Ge ofence Transitions IS " ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠCHAN NEL _ ID Ġ= Ġ" channel _ 0 1 " ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠConvenience Ġmethod Ġfor Ġen que uing Ġwork Ġin Ġto Ġthis Ġservice . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġenqueue Work ( context : ĠContext , Ġintent : ĠIntent ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠJob Intent Service . enqueue Work ( context , ĠGe ofence Transitions Job Intent Service :: class . java , ĠJOB _ ID , Ġintent ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ