/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 1 7 ĠL uke ĠK linker Ċ Ġ* Ċ Ġ* Ġ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 Ġxyz . k linker . messenger . shared . service Ċ Ċ import Ġandroid . app . Service Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Intent Ċ import Ġandroid . os . Build Ċ import Ġandroid . os . IB inder Ċ import Ġandroidx . core . app . Notification Compat Ċ import Ġandroidx . core . app . Notification Manager Compat Ċ import Ġandroid . util . Log Ċ Ċ import Ġcom . google . firebase . auth . Firebase Auth Ċ Ċ import Ġjava . io . IOException Ċ import Ġjava . util . ArrayList Ċ Ċ import Ġretrofit 2 . Response Ċ import Ġxyz . k linker . messenger . api . entity .* Ċ import Ġxyz . k linker . messenger . api . implementation . Login Activity Ċ import Ġxyz . k linker . messenger . api . implementation . firebase . Firebase Upload Callback Ċ import Ġxyz . k linker . messenger . shared . R Ċ import Ġxyz . k linker . messenger . api . implementation . Api Utils Ċ import Ġxyz . k linker . messenger . api . implementation . Account Ċ import Ġxyz . k linker . messenger . shared . data . Color Set Ċ import Ġxyz . k linker . messenger . shared . data . DataSource Ċ import Ġxyz . k linker . messenger . shared . data . MimeType Ċ import Ġxyz . k linker . messenger . encryption . Encryption Utils Ċ import Ġxyz . k linker . messenger . api . implementation . Binary Utils Ċ import Ġxyz . k linker . messenger . shared . data . model .* Ċ import Ġxyz . k linker . messenger . shared . util .* Ċ Ċ open Ġclass ĠApi Upload Service Ġ: ĠService () Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġencryption Utils : ĠEncryption Utils ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġcompleted Media Upload s Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġfinished Ġ= Ġfalse ĊĊĠĠĠ Ġoverride Ġfun Ġon Bind ( intent : ĠIntent ): ĠI Binder ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonStart Command ( intent : ĠIntent ?, Ġflags : ĠInt , Ġstart Id : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġupload Data () ĊĠĠĠĠĠĠĠ Ġreturn Ġsuper . onStart Command ( intent , Ġflags , Ġstart Id ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupload Data () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnotification Ġ= ĠNotification Compat . Builder ( this , ĠNotification Utils . ACCOUNT _ ACTIVITY _ CHANNEL _ ID ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setContent Title ( getString ( R . string . encrypt ing _ and _ upload ing )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Small Icon ( R . drawable . ic _ upload ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Progress ( 0 , Ġ 0 , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Local Only ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setColor ( Color Set . DEFAULT ( this ). color ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set O ngo ing ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠ Ġstart Foreground ( MESSAGE _ UPLOAD _ ID , Ġnotification ) ĊĊĠĠĠĠĠĠĠ Ġencryption Utils Ġ= ĠAccount . encrypt or ĊĠĠĠĠĠĠĠ Ġif Ġ( encryption Utils Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( this , ĠLogin Activity :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġintent . flags Ġ= ĠIntent . FLAG _ ACTIVITY _ NEW _ TASK ĊĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity ( intent ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠ ĠThread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠstartTime Ġ= ĠTime Utils . now ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġupload Messages () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupload Con versations () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupload Contacts ( this , Ġencryption Utils !! ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupload Black lists () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupload Scheduled Messages () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupload Draft s () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupload Templates () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupload Folders () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupload Auto Rep lies () ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . v ( TAG , Ġ" time Ġto Ġupload : Ġ" Ġ+ Ġ( Time Utils . now Ġ- ĠstartTime ) Ġ+ Ġ" Ġms ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġupload Media () ĊĠĠĠĠĠĠĠ Ġ}. start () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupload Messages () Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠstartTime Ġ= ĠTime Utils . now ĊĠĠĠĠĠĠĠ Ġval Ġcursor Ġ= ĠDataSource . get Messages ( this ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( cursor . moveTo First ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmessages Ġ= ĠArrayList < Message Body >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġfirebase Number Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġm Ġ= ĠMessage () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm . fill From Cursor ( cursor ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġinstead Ġof Ġsending Ġthe ĠURI , Ġwe 'll Ġupload Ġthese Ġimages Ġto Ġfirebase Ġand Ġretrieve ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthem Ġon Ġanother Ġdevice Ġbased Ġon Ġaccount Ġid Ġand Ġmessage Ġid . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m . mime Type Ġ!= ĠMime Type . TEXT _ PLAIN ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm . data Ġ= Ġ" firebase Ġ" Ġ+ Ġfirebase Number ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfirebase Number ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm . encrypt ( encryption Utils !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmessage Ġ= ĠMessage Body ( m . id , Ġm . conversation Id , Ġm . type , Ġm . data , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm . timestamp , Ġm . mime Type , Ġm . read , Ġm . seen , Ġm . from , Ġm . color , Ġ"- 1 ", Ġm . sim PhoneNumber ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessages . add ( message ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġwhile Ġ( cursor . moveTo Next ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġsuccess Pages Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġexpected Pages Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpages Ġ= ĠPagination Utils . get Pages ( messages , ĠMESSAGE _ UPLOAD _ PAGE _ SIZE ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( page Ġin Ġpages ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= ĠAdd Messages Request ( Account . accountId , Ġpage . to Typed Array ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= ĠApi Utils . api . message (). add ( request ). execute () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpected Pages ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Api Utils . is Call Successful ( response )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuccess Pages ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . v ( TAG , Ġ" uploaded Ġ" Ġ+ Ġpage . size Ġ+ Ġ" Ġmessages Ġfor Ġpage Ġ" Ġ+ Ġexpected Pages ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( success Pages Ġ!= Ġexpected Pages ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . v ( TAG , Ġ" failed Ġto Ġupload Ġmessages Ġin Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( Time Utils . now Ġ- ĠstartTime ) Ġ+ Ġ" Ġms ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . v ( TAG , Ġ" messages Ġupload Ġsuccessful Ġin Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( Time Utils . now Ġ- ĠstartTime ) Ġ+ Ġ" Ġms ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcursor . close Sil ent () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupload Con versations () Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠstartTime Ġ= ĠTime Utils . now ĊĠĠĠĠĠĠĠ Ġval Ġcursor Ġ= ĠDataSource . getAll Con versations ( this ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( cursor . moveTo First ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconversations Ġ= ĠarrayOf Null s < Conversation Body >( cursor . count ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġc Ġ= ĠCon versation () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc . fill From Cursor ( cursor ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc . encrypt ( encryption Utils !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconversation Ġ= ĠCon versation Body ( c . id , Ġc . colors . color , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc . colors . color Dark , Ġc . colors . color Light , Ġc . colors . color Accent , Ġc . led Color , Ġc . pinned , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc . read , Ġc . timestamp , Ġc . title , Ġc . phone Numbers , Ġc . snippet , Ġc . ring tone Uri , Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc . id Matcher , Ġc . mute , Ġc . archive , Ġc . private , Ġc . folder Id ) /* c . image Uri */ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconversations [ cursor . position ] Ġ= Ġconversation ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġwhile Ġ( cursor . moveTo Next ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= ĠAdd Conversation Request ( Account . accountId , Ġconversations ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġresult : ĠResponse < *> ? ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġerror Text : ĠString ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ= ĠApi Utils . api . conversation (). add ( request ). execute () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ= ĠApi Utils . api . conversation (). add ( request ). execute () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( x : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror Text Ġ= Ġe . message ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( result Ġ== Ġnull Ġ|| Ġ! Api Utils . is Call Successful ( result )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . v ( TAG , Ġ" failed Ġto Ġupload Ġconversations Ġin Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( Time Utils . now Ġ- ĠstartTime ) Ġ+ Ġ" Ġms ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . v ( TAG , Ġresult . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . v ( TAG , Ġ" con versations Ġupload Ġsuccessful Ġin Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( Time Utils . now Ġ- ĠstartTime ) Ġ+ Ġ" Ġms ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcursor . close Sil ent () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupload Black lists () Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠstartTime Ġ= ĠTime Utils . now ĊĠĠĠĠĠĠĠ Ġval Ġcursor Ġ= ĠDataSource . get Black lists ( this ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( cursor . moveTo First ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġblack lists Ġ= ĠarrayOf Null s < Black list Body >( cursor . count ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġb Ġ= ĠBlack list () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġb . fill From Cursor ( cursor ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġb . encrypt ( encryption Utils !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġblacklist Ġ= ĠBlack list Body ( b . id , Ġb . phoneNumber , Ġb . phrase ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblack lists [ cursor . position ] Ġ= Ġblacklist ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġwhile Ġ( cursor . moveTo Next ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= ĠAdd Black list Request ( Account . accountId , Ġblack lists ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApi Utils . api . blacklist (). add ( request ). execute () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( result Ġ== Ġnull Ġ|| Ġ! Api Utils . is Call Successful ( result )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . v ( TAG , Ġ" failed Ġto Ġupload Ġblack lists Ġin Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( Time Utils . now Ġ- ĠstartTime ) Ġ+ Ġ" Ġms ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . v ( TAG , Ġ" black lists Ġupload Ġsuccessful Ġin Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( Time Utils . now Ġ- ĠstartTime ) Ġ+ Ġ" Ġms ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcursor . close Sil ent () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupload Scheduled Messages () Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠstartTime Ġ= ĠTime Utils . now ĊĠĠĠĠĠĠĠ Ġval Ġcursor Ġ= ĠDataSource . get Scheduled Messages ( this ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( cursor . moveTo First ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmessages Ġ= ĠarrayOf Null s < Scheduled Message Body >( cursor . count ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġm Ġ= ĠScheduled Message () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm . fill From Cursor ( cursor ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm . encrypt ( encryption Utils !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmessage Ġ= ĠScheduled Message Body ( m . id , Ġm . to , Ġm . data , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm . mime Type , Ġm . timestamp , Ġm . title , Ġm . repeat ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessages [ cursor . position ] Ġ= Ġmessage ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġwhile Ġ( cursor . moveTo Next ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= ĠAdd Scheduled Message Request ( Account . accountId , Ġmessages ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApi Utils . api . scheduled (). add ( request ). execute () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( result Ġ== Ġnull Ġ|| Ġ! Api Utils . is Call Successful ( result )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . v ( TAG , Ġ" failed Ġto Ġupload Ġscheduled Ġmessages Ġin Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( Time Utils . now Ġ- ĠstartTime ) Ġ+ Ġ" Ġms ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . v ( TAG , Ġ" scheduled Ġmessages Ġupload Ġsuccessful Ġin Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( Time Utils . now Ġ- ĠstartTime ) Ġ+ Ġ" Ġms ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcursor . close Sil ent () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupload Draft s () Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠstartTime Ġ= ĠTime Utils . now ĊĠĠĠĠĠĠĠ Ġval Ġcursor Ġ= ĠDataSource . get Draft s ( this ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( cursor . moveTo First ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdraft s Ġ= ĠarrayOf Null s < Draft Body >( cursor . count ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġd Ġ= ĠDraft () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġd . fill From Cursor ( cursor ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġd . encrypt ( encryption Utils !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdraft Ġ= ĠDraft Body ( d . id , Ġd . conversation Id , Ġd . data , Ġd . mime Type ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdraft s [ cursor . position ] Ġ= Ġdraft ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġwhile Ġ( cursor . moveTo Next ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= ĠAdd Draft Request ( Account . accountId , Ġdraft s ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApi Utils . api . draft (). add ( request ). execute (). body () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( result Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . v ( TAG , Ġ" failed Ġto Ġupload Ġdraft s Ġin Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( Time Utils . now Ġ- ĠstartTime ) Ġ+ Ġ" Ġms ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . v ( TAG , Ġ" draft s Ġupload Ġsuccessful Ġin Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( Time Utils . now Ġ- ĠstartTime ) Ġ+ Ġ" Ġms ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcursor . close Sil ent () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupload Templates () Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠstartTime Ġ= ĠTime Utils . now ĊĠĠĠĠĠĠĠ Ġval Ġcursor Ġ= ĠDataSource . get Templates ( this ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( cursor . moveTo First ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtemplates Ġ= ĠarrayOf Null s < Template Body >( cursor . count ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġt Ġ= ĠTemplate () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġt . fill From Cursor ( cursor ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġt . encrypt ( encryption Utils !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtemplate Ġ= ĠTemplate Body ( t . id , Ġt . text ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtemplates [ cursor . position ] Ġ= Ġtemplate ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġwhile Ġ( cursor . moveTo Next ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= ĠAdd Template Request ( Account . accountId , Ġtemplates ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApi Utils . api . template (). add ( request ). execute (). body () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( result Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . v ( TAG , Ġ" failed Ġto Ġupload Ġtemplates Ġin Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( Time Utils . now Ġ- ĠstartTime ) Ġ+ Ġ" Ġms ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . v ( TAG , Ġ" template Ġupload Ġsuccessful Ġin Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( Time Utils . now Ġ- ĠstartTime ) Ġ+ Ġ" Ġms ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcursor . close Sil ent () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupload Folders () Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠstartTime Ġ= ĠTime Utils . now ĊĠĠĠĠĠĠĠ Ġval Ġcursor Ġ= ĠDataSource . get Folders ( this ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( cursor . moveTo First ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfolders Ġ= ĠarrayOf Null s < Folder Body >( cursor . count ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġf Ġ= ĠFolder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġf . fill From Cursor ( cursor ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġf . encrypt ( encryption Utils !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfolder Ġ= ĠFolder Body ( f . id , Ġf . name , Ġf . colors . color , Ġf . colors . color Dark , Ġf . colors . color Light , Ġf . colors . color Accent ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfolders [ cursor . position ] Ġ= Ġfolder ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġwhile Ġ( cursor . moveTo Next ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= ĠAdd Folder Request ( Account . accountId , Ġfolders ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApi Utils . api . folder (). add ( request ). execute (). body () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( result Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . v ( TAG , Ġ" failed Ġto Ġupload Ġfolders Ġin Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( Time Utils . now Ġ- ĠstartTime ) Ġ+ Ġ" Ġms ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . v ( TAG , Ġ" folder Ġupload Ġsuccessful Ġin Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( Time Utils . now Ġ- ĠstartTime ) Ġ+ Ġ" Ġms ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcursor . close Sil ent () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupload Auto Rep lies () Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠstartTime Ġ= ĠTime Utils . now ĊĠĠĠĠĠĠĠ Ġval Ġcursor Ġ= ĠDataSource . get Auto Rep lies ( this ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( cursor . moveTo First ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreplies Ġ= ĠarrayOf Null s < Auto Reply Body >( cursor . count ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġr Ġ= ĠAuto Reply () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġr . fill From Cursor ( cursor ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġr . encrypt ( encryption Utils !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreply Ġ= ĠAuto Reply Body ( r . id , Ġr . type , Ġr . pattern , Ġr . response ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreplies [ cursor . position ] Ġ= Ġreply ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġwhile Ġ( cursor . moveTo Next ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= ĠAdd Auto Reply Request ( Account . accountId , Ġreplies ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApi Utils . api . auto Reply (). add ( request ). execute (). body () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( result Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . v ( TAG , Ġ" failed Ġto Ġupload Ġauto Ġreplies Ġin Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( Time Utils . now Ġ- ĠstartTime ) Ġ+ Ġ" Ġms ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . v ( TAG , Ġ" auto Ġreply Ġupload Ġsuccessful Ġin Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( Time Utils . now Ġ- ĠstartTime ) Ġ+ Ġ" Ġms ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcursor . close Sil ent () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠMedia Ġwill Ġbe Ġuploaded Ġafter Ġthe Ġmessages Ġfinish Ġuploading ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġupload Media () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= ĠNotification Compat . Builder ( this , ĠNotification Utils . ACCOUNT _ ACTIVITY _ CHANNEL _ ID ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setContent Title ( getString ( R . string . encrypt ing _ and _ upload ing _ media )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Small Icon ( R . drawable . ic _ upload ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Progress ( 0 , Ġ 0 , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Local Only ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setColor ( Color Set . DEFAULT ( this ). color ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set O ngo ing ( true ) ĊĠĠĠĠĠĠĠ Ġval Ġmanager Ġ= ĠNotification Manager Compat . from ( this ) ĊĠĠĠĠĠĠĠ Ġstart Foreground ( MESSAGE _ UPLOAD _ ID , Ġbuilder . build ()) ĊĊĠĠĠĠĠĠĠ Ġval Ġauth Ġ= ĠFirebase Auth . getInstance () ĊĠĠĠĠĠĠĠ Ġauth . signIn Anonymous ly () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add On Success Listener Ġ{ Ġprocess Media Upload ( manager , Ġbuilder ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add On Failure Listener Ġ{ Ġe Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" failed Ġto Ġsign Ġin Ġto Ġfirebase ", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinish Media Upload ( manager ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprocess Media Upload ( manager : ĠNotification Manager Compat , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder : ĠNotification Compat . Builder ) Ġ{ ĊĠĠĠĠĠĠĠ ĠApi Utils . save Firebase Folder Ref ( Account . accountId ) ĊĊĠĠĠĠĠĠĠ ĠThread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠThread . sleep (( 1 0 0 0 Ġ* Ġ 6 0 Ġ* Ġ 2 ). to Long ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠInterruptedException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfinish Media Upload ( manager ) ĊĠĠĠĠĠĠĠ Ġ}. start () ĊĊĠĠĠĠĠĠĠ Ġval Ġmedia Ġ= ĠDataSource . getAll Media Messages ( this , ĠNUM _ MEDIA _ TO _ UPLOAD ) ĊĠĠĠĠĠĠĠ Ġif Ġ( media . moveTo First ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmedia Count Ġ= Ġif Ġ( media . count Ġ< ĠNUM _ MEDIA _ TO _ UPLOAD ) Ġmedia . count Ġelse ĠNUM _ MEDIA _ TO _ UPLOAD ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmessage Ġ= ĠMessage () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage . fill From Cursor ( media ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . v ( TAG , Ġ" started Ġuploading Ġ" Ġ+ Ġmessage . id ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbytes Ġ= ĠBinary Utils . get Media Bytes ( this , Ġmessage . data , Ġmessage . mime Type , Ġtrue ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApi Utils . upload Bytes To Firebase ( Account . accountId , Ġbytes , Ġmessage . id , Ġencryption Utils , ĠFirebase Upload Callback Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcompleted Media Upload s ++ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . set Progress ( media Count , Ġcompleted Media Upload s , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . setContent Title ( getString ( R . string . encrypt ing _ and _ upload ing _ count , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcompleted Media Upload s Ġ+ Ġ 1 , Ġmedia . count )) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( completed Media Upload s Ġ>= Ġmedia Count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinish Media Upload ( manager ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ(! finished ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Foreground ( MESSAGE _ UPLOAD _ ID , Ġbuilder . build ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġwhile Ġ( media . moveTo Next ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( media Count Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinish Media Upload ( manager ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfinish Media Upload ( manager ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġmedia . close Sil ent () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfinish Media Upload ( manager : ĠNotification Manager Compat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġstop Foreground ( true ) ĊĠĠĠĠĠĠĠ Ġstop Self () ĊĠĠĠĠĠĠĠ Ġfinished Ġ= Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġfun Ġstart ( context : ĠContext ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . O ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . start Foreground Service ( Intent ( context , ĠApi Upload Service :: class . java )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . start Service ( Intent ( context , ĠApi Upload Service :: class . java )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠTAG Ġ= Ġ" Api Upload Service " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠMESSAGE _ UPLOAD _ ID Ġ= Ġ 7 2 3 5 ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠNUM _ MEDIA _ TO _ UPLOAD Ġ= Ġ 2 0 ĊĊĠĠĠĠĠĠĠ Ġconst Ġval ĠMESSAGE _ UPLOAD _ PAGE _ SIZE Ġ= Ġ 3 0 0 ĊĊĠĠĠĠĠĠĠ Ġpublic Ġfun Ġupload Contacts ( context : ĠContext , Ġencryption Utils : ĠEncryption Utils ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcursor Ġ= ĠDataSource . get Contacts ( context ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cursor . moveTo First ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontacts Ġ= ĠArrayList < Contact Body >() ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġc Ġ= ĠContact () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc . fill From Cursor ( cursor ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc . encrypt ( encryption Utils ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontact Ġ= Ġif Ġ( c . type Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠContact Body ( c . id , Ġc . phoneNumber , Ġc . id Matcher , Ġc . name , Ġc . type !! , Ġc . colors . color , Ġc . colors . color Dark , Ġc . colors . color Light , Ġc . colors . color Accent ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠContact Body ( c . id , Ġc . phoneNumber , Ġc . id Matcher , Ġc . name , Ġc . colors . color , Ġc . colors . color Dark , Ġc . colors . color Light , Ġc . colors . color Accent ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontacts . add ( contact ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġwhile Ġ( cursor . moveTo Next ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupload Contacts ( contacts ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcursor . close Sil ent () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġupload Contacts ( contacts : ĠList < Contact Body >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠstartTime Ġ= ĠTime Utils . now ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġsuccess Pages Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġexpected Pages Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpages Ġ= ĠPagination Utils . get Pages ( contacts , ĠMESSAGE _ UPLOAD _ PAGE _ SIZE ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( page Ġin Ġpages ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= ĠAdd Contact Request ( Account . accountId , Ġpage . to Typed Array ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= ĠApi Utils . api . contact (). add ( request ). execute () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpected Pages ++ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Api Utils . is Call Successful ( response )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuccess Pages ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . v ( TAG , Ġ" uploaded Ġ" Ġ+ Ġpage . size Ġ+ Ġ" Ġcontacts Ġfor Ġpage Ġ" Ġ+ Ġexpected Pages ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( success Pages Ġ!= Ġexpected Pages ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . v ( TAG , Ġ" failed Ġto Ġupload Ġcontacts Ġin Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( Time Utils . now Ġ- ĠstartTime ) Ġ+ Ġ" Ġms ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . v ( TAG , Ġ" contacts Ġupload Ġsuccessful Ġin Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( Time Utils . now Ġ- ĠstartTime ) Ġ+ Ġ" Ġms ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ