package Ġcom . app nd ig ital . am use push Ċ Ċ import Ġandroid . app . Application Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . pm . PackageManager Ċ import Ġandroid . util . Log Ċ import Ġcom . app nd ig ital . am use push . api . Am use Push Notification ApiService Ċ import Ġcom . app nd ig ital . am use push . api . Am use Push Notification Api ServiceImpl Ċ import Ġcom . app nd ig ital . am use push . exceptions . Device Unsupported Exception Ċ import Ġcom . app nd ig ital . am use push . exceptions . Google Play Services Not Installed Exception Ċ import Ġcom . app nd ig ital . am use push . exceptions . Google Play Services Out D ated Exception Ċ import Ġcom . app nd ig ital . am use push . helper . Google Play Helper Ċ import Ġcom . app nd ig ital . am use push . helper . Am use Push Utils Ċ import Ġcom . app nd ig ital . push notification . register notification . Am use Push Notification Service Ċ import Ġcom . app nd ig ital . push notification . register notification . Am use Push Notification ServiceImpl Ċ import Ġcom . google . android . gms . ads . identifier . Ad vertising Id Client Ċ import Ġcom . google . firebase . Firebase App Ċ import Ġio . reactivex . Comp letable Ċ import Ġio . reactivex . Observable Ċ import Ġio . reactivex . Single Ċ import Ġio . reactivex . dis pos ables . Composite Disposable Ċ import Ġio . reactivex . rx kotlin . subscribe By Ċ import Ġio . reactivex . schedul ers . Schedulers Ċ Ċ open Ġclass ĠAm use Push App Ġ: ĠApplication () Ġ{ ĊĊĠĠĠ Ġval ĠTAG Ġ= Ġ" Am use Push App " ĊĊĠĠĠ Ġval Ġcomposite Disposable Ġ= ĠComposite Disposable () ĊĊĠĠĠ Ġprivate Ġval Ġam use Push Notification Service : ĠAm use Push Notification Service Ġ= ĠAm use Push Notification ServiceImpl () ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġam use Push Notification ApiService : ĠAm use Push Notification ApiService ĊĠĠĠ Ġlateinit Ġvar Ġactivity T ola unch For Notification : ĠClass < *> ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġversion Ġ= Ġ" 1 . 0 " ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġfun Ġdefine Version ( context : ĠContext ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġp Info Ġ= Ġcontext . package Manager . get Package Info ( context . packageName , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġversion Ġ= Ġp Info . version Name ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠPackage Manager . Name NotFoundException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġoverride Ġfun ĠonCreate () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate () ĊĠĠĠĠĠĠĠ ĠAm use Push Utils . save Date Last Opening ( this ) ĊĠĠĠĠĠĠĠ ĠFirebase App . initialize App ( this ) ĊĠĠĠĠĠĠĠ Ġam use Push Notification ApiService Ġ= ĠAm use Push Notification Api ServiceImpl ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Terminate () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Terminate () ĊĠĠĠĠĠĠĠ Ġif Ġ(! composite Disposable . is Disposed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcomposite Disposable . dispose () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġfun Ġinit Am use Push (): ĠComp letable Ġ= ĠComp letable . create Ġ{ Ġemitter Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġprefs Ġ= Ġget SharedPreferences ( Constants . USER _ PREFER ENCES _ KEY , ĠContext . MODE _ PRIVATE ) ĊĠĠĠĠĠĠĠ Ġval Ġf cm Token Ġ= Ġprefs . getString ( Constants . F CM _ TOKEN _ PREFER ENCES _ KEY , Ġ"") ĊĠĠĠĠĠĠĠ Ġval Ġadvertising Id Client Ġ= Ġprefs . getString ( Constants . AD VERT ISING _ ID _ CLIENT _ PREFER ENCES _ KEY , Ġ"") ĊĊĠĠĠĠĠĠĠ ĠObservable . just ( ad vertising Id Client . isNotEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe On ( Schedulers . io ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Single Ġ{ Ġhas Ad vertising Id Client Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! has Ad vertising Id Client ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Ad vertising Id Client () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSingle . just ("") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. flatMap Single Ġ{ Ġadvertising Id Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ad vertising Id . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Success Ġ$ ad vertising Id ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprefs . edit () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. putString ( Constants . AD VERT ISING _ ID _ CLIENT _ PREFER ENCES _ KEY , Ġadvertising Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSingle . just ( fc m Token . isNotEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Single Ġ{ Ġhas F cm Token Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! has F cm Token ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGoogle Play Helper . verify Google Play Service ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. and Then ( am use Push Notification Service . getToken ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSingle . just ("") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. subscribe By ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Next Ġ= Ġ{ Ġf cm Token Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( fc m Token . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Success Ġ$ fc m Token ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprefs . edit () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. putString ( Constants . F CM _ TOKEN _ PREFER ENCES _ KEY , Ġf cm Token ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonComplete Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemitter . onComplete () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonError Ġ= Ġ{ Ġexception Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDevice Unsupported Exception () Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" vot re Ġportable Ġne Ġsupport e Ġpas ĠGoogle Ġservice ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGoogle Play Services Out D ated Exception (), ĠGoogle Play Services Not Installed Exception () Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" Google Ġplay Ġil Ġfa ut ĠtÃ© lÃ© ch arger Ġla Ġnouvel le Ġversion Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// todo ĠcrÃ©er Ġune Ġvariable Ġstatic Ġneed Google Play Ġet ĠcrÃ©er Ġune Ġabstract Ġact i iv ty Ġqui Ġau ĠonCreate Ġva Ġchecker Ġla Ġvariable ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// todo Ġet Ġdon c Ġpro poser Ġde Ġd dl Ġgoogle Ġplays Ġservice Ġsi Ġbes oin ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Google Api Availability . getInstance (). make Google Play Services Available ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" Error Ġin conn ue Ġ${ exception . localized Message } Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemitter . onError ( exception ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġfun Ġsave UserId ( id User : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġprefs Ġ= Ġget SharedPreferences ( Constants . USER _ PREFER ENCES _ KEY , ĠContext . MODE _ PRIVATE ) ĊĠĠĠĠĠĠĠ Ġprefs . edit () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. putString ( Constants . USER _ ID _ PREFER ENCES _ KEY , Ġid User ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply () ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġfun Ġsend F CM Token ToServer (): ĠComp letable Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġam use Push Notification ApiService ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. send F cm Token ToServer () ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġfun Ġsubscribe Tag ( id Tag : ĠInt , ĠtagName : ĠString ): ĠComp letable Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġam use Push Notification ApiService ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe User Tag ( id Tag , ĠtagName ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġfun Ġunsubscribe Tag ( id Tag : ĠInt ): ĠComp letable Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġam use Push Notification ApiService ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. unsubscribe User Tag ( id Tag ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Ad vertising Id Client (): ĠSingle < String > Ġ= ĠSingle . create Ġ{ Ġemitter Ġ-> ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġid Ġ= ĠAd vertising Id Client . get Ad vertising Id Info ( this ). id ĊĠĠĠĠĠĠĠĠĠĠĠ Ġemitter . on Success ( id ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" Failed Ġget Ad vertising Id Client : Ġ${ e . localized Message }") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} Ċ Ċ }