/* Ċ Ġ* Ġ ĠCopyright Ġ 2 0 1 8 ĠK eval ĠP ate l . Ċ Ġ* Ċ Ġ* Ġ ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġ Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* Ġ ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* Ġ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠĠ ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* ĠĠ Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠĠ ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠĠ ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* ĠĠ Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ* Ċ Ġ*/ Ċ Ċ package Ġcom . stand up . app . authentication . device Reg Ċ Ċ import Ġandroid . annotation . Suppress Lint Ċ import Ġandroid . app . Application Ċ import Ġandroid . arch . lifecycle . Mutable LiveData Ċ import Ġandroid . support . annotation . Visible ForTesting Ċ import Ġcom . ke val p ate l 2 1 0 6 . common . Validator Ċ import Ġcom . ke val p ate l 2 1 0 6 . common . base . Base Application Ċ import Ġcom . ke val p ate l 2 1 0 6 . common . base . arch . Base ViewModel Ċ import Ġcom . ke val p ate l 2 1 0 6 . common . base . arch . ErrorMessage Ċ import Ġcom . ke val p ate l 2 1 0 6 . common . misc . lott ie . Lot tie Json Ċ import Ġcom . ke val p ate l 2 1 0 6 . common . prefs . Shared Preference Keys Ċ import Ġcom . ke val p ate l 2 1 0 6 . common . prefs . User Session Manager Ċ import Ġcom . ke val p ate l 2 1 0 6 . common . user Activity . repo . User Activity Repo Ċ import Ġcom . ke val p ate l 2 1 0 6 . utils . Shared Prefs Provider Ċ import Ġcom . stand up . app . authentication . R Ċ import Ġcom . stand up . app . authentication . di . D agger User Auth Component Ċ import Ġcom . stand up . app . authentication . repo . Device Register Request Ċ import Ġcom . stand up . app . authentication . repo . User Auth Repository Ċ import Ġcom . stand up . app . billing . repo . Billing Repo Ċ import Ġio . reactivex . android . schedul ers . Android Schedulers Ċ import Ġio . reactivex . schedul ers . Schedulers Ċ import Ġtim ber . log . Tim ber Ċ import Ġjavax . inject . Inject Ċ Ċ /** Ċ Ġ* ĠCreated Ġby ĠK eval Ġon Ġ 0 7 / 1 2 / 1 7 . Ċ Ġ* Ċ Ġ* Ġ@ author Ġ< a Ġhref =" https :// github . com / ke val p ate l 2 1 0 6 "> ke val p ate l 2 1 0 6 </ a > Ċ Ġ*/ Ċ internal Ġclass ĠDevice Reg ViewModel Ġ: ĠBase ViewModel Ġ{ ĊĊĠĠĠ Ġ@ Inject ĊĠĠĠ Ġlateinit Ġvar Ġuser Auth Repo : ĠUser Auth Repository ĊĊĠĠĠ Ġ@ Inject ĊĠĠĠ Ġlateinit Ġvar Ġshared Prefs Provider : ĠShared Prefs Provider ĊĊĠĠĠ Ġ@ Inject ĊĠĠĠ Ġlateinit Ġvar Ġuser Session Manager : ĠUser Session Manager ĊĊĠĠĠ Ġ@ Inject ĊĠĠĠ Ġlateinit Ġvar Ġapplication : ĠApplication ĊĊĠĠĠ Ġinternal Ġval Ġre pose Token Ġ= ĠMutable LiveData < String >() ĊĊĠĠĠ Ġinternal Ġval Ġsync Complete Ġ= ĠMutable LiveData < Boolean >() ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠBoolean Ġ[ Mutable LiveData ] Ġthat Ġwill Ġbe Ġset Ġas Ġtrue Ġif Ġthe Ġprem ium Ġitem Ġis Ġpurch ased Ġelse Ġit ĊĠĠĠĠ Ġ* Ġwill Ġremain Ġfalse . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinternal Ġval Ġis Prem ium Purchase d Ġ= ĠMutable LiveData < Boolean >() ĊĊĠĠĠ Ġconstructor () Ġ{ ĊĠĠĠĠĠĠĠ ĠD agger User Auth Component . builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. app Component ( Base Application . getApplication Component ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. inject ( this @ Device Reg ViewModel ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Visible ForTesting ĊĠĠĠ Ġconstructor ( application : ĠApplication , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuser Auth Repo : ĠUser Auth Repository , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshared Prefs Provider : ĠShared Prefs Provider , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuser Session Manager : ĠUser Session Manager ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . application Ġ= Ġapplication ĊĠĠĠĠĠĠĠ Ġthis . user Auth Repo Ġ= Ġuser Auth Repo ĊĠĠĠĠĠĠĠ Ġthis . shared Prefs Provider Ġ= Ġshared Prefs Provider ĊĠĠĠĠĠĠĠ Ġthis . user Session Manager Ġ= Ġuser Session Manager ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ@ Suppress Lint (" Visible For Tests ") ĊĠĠĠ Ġinternal Ġfun Ġregister ( deviceId : ĠString , Ġf cm Id : ĠString ?) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// Validate Ġdevice Ġid . ĊĠĠĠĠĠĠĠ Ġif Ġ(! Validator . isValid DeviceId ( deviceId )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshared Prefs Provider . save Preferences ( Shared Preference Keys . IS _ DEVICE _ REGISTER ED , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġerror Msg Ġ= ĠError Message ( R . string . device _ reg _ error _ invalid _ device _ id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror Msg . error Image Ġ= ĠL ot tie Json . WARNING ĊĠĠĠĠĠĠĠĠĠĠĠ ĠerrorMessage . value Ġ= Ġerror Msg ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Validate Ġthe ĠF CM ĠId . ĊĠĠĠĠĠĠĠ Ġif Ġ(! Validator . isValid F cm Id ( fc m Id )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshared Prefs Provider . save Preferences ( Shared Preference Keys . IS _ DEVICE _ REGISTER ED , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġerror Msg Ġ= ĠError Message ( R . string . device _ reg _ error _ invalid _ fc m _ id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror Msg . error Image Ġ= ĠL ot tie Json . WARNING ĊĠĠĠĠĠĠĠĠĠĠĠ ĠerrorMessage . value Ġ= Ġerror Msg ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Register Ġdevice Ġon Ġthe Ġserver ĊĠĠĠĠĠĠĠ Ġsend Device Data ToServer ( fc m Id !! , ĠdeviceId ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Visible ForTesting ĊĠĠĠ Ġinternal Ġfun Ġmark Device Reg Success () Ġ= Ġshared Prefs Provider . save Preferences ( Shared Preference Keys . IS _ DEVICE _ REGISTER ED , Ġtrue ) ĊĊĠĠĠ Ġinternal Ġfun Ġmark Device Reg Failed () Ġ= Ġshared Prefs Provider . save Preferences ( Shared Preference Keys . IS _ DEVICE _ REGISTER ED , Ġfalse ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSave Ġthe Ġdevice Ġinformation Ġand ĠF CM Ġid Ġto Ġthe Ġserver . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġreg Id ĠF CM Ġregistration Ġid . ĊĠĠĠĠ Ġ* Ġ@ param ĠdeviceId ĠUnique Ġid Ġof Ġthe Ġdevice . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Suppress Lint (" Hardware Ids ") ĊĠĠĠ Ġ@ Visible ForTesting ĊĠĠĠ Ġinternal Ġfun Ġsend Device Data ToServer ( reg Id : ĠString , ĠdeviceId : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Prepare Ġthe Ġrequest Ġobject ĊĠĠĠĠĠĠĠ Ġval Ġrequest Data Ġ= ĠDevice Register Request ( gcm Key Ġ= Ġreg Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠdeviceId Ġ= ĠdeviceId , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠuserId Ġ= Ġuser Session Manager . userId ) ĊĊĠĠĠĠĠĠĠ Ġ// Register Ġto Ġthe Ġserver ĊĠĠĠĠĠĠĠ Ġadd Disposable ( user Auth Repo ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. register Device ( request Data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe On ( Schedulers . io ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. observe On ( Android Schedulers . main Thread ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. do On Subscribe ({ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmark Device Reg Failed () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblock Ui . value Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. do After Terminate ({ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblock Ui . value Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe ({ Ġdata Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmark Device Reg Success () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuser Session Manager . token Ġ= Ġdata . token ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġre pose Token . value Ġ= Ġdata . token ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d ( it . printStackTrace (). toString ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġerror Msg Ġ= ĠError Message ( it . message ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror Msg . setError Btn ( R . string . error _ retry _ try _ again , Ġ{ Ġsend Device Data ToServer ( reg Id , ĠdeviceId ) Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror Msg . error Image Ġ= ĠL ot tie Json . WARNING ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠerrorMessage . value Ġ= Ġerror Msg ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ})) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSync Ġand Ġdownload Ġold Ġactivities Ġto Ġthe Ġdevice . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinternal Ġfun Ġsync Old Activities ( user Activity Repo : ĠUser Activity Repo ) Ġ{ ĊĠĠĠĠĠĠĠ Ġadd Disposable ( user Activity Repo ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. get Activities From Server () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe On ( Schedulers . io ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. observe On ( Android Schedulers . main Thread ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. do On Subscribe ({ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblock Ui . value Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsync Complete . value Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. do After Terminate ({ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblock Ui . value Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe ({ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsync Complete . value Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d ( it . printStackTrace (). toString ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġerror Msg Ġ= ĠError Message ( it . message ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror Msg . setError Btn ( R . string . error _ retry _ try _ again , Ġ{ Ġsync Old Activities ( user Activity Repo ) Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror Msg . error Image Ġ= ĠL ot tie Json . WARNING ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠerrorMessage . value Ġ= Ġerror Msg ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ})) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRestore Ġall Ġthe Ġold Ġpurch ases . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinternal Ġfun Ġrestore P urchases ( billing Repo : ĠBilling Repo ) Ġ{ ĊĠĠĠĠĠĠĠ Ġadd Disposable ( billing Repo ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. is Prem ium Purchase d ( application ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe On ( Android Schedulers . main Thread ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. observe On ( Android Schedulers . main Thread ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. do On Subscribe ({ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblock Ui . value Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. do After Terminate ({ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblock Ui . value Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe ({ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Prem ium Purchase d . value Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d ( it . printStackTrace (). toString ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġerror Msg Ġ= ĠError Message ( R . string . error _ cannot _ restore _ p urchases ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror Msg . setError Btn ( R . string . error _ retry _ try _ again , Ġ{ Ġrestore P urchases ( billing Repo ) Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror Msg . error Image Ġ= ĠL ot tie Json . WARNING ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠerrorMessage . value Ġ= Ġerror Msg ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ})) ĊĠĠĠ Ġ} Ċ } Ċ