/* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 1 9 . ĠAll Ġrights Ġreserved . ĠL ai ĠJ iew en Ġ< alan lj w 1 2 3 4 5 @ gmail . com > Ċ Ġ*/ Ċ Ċ package Ġme . ct kn ight . upload manager Ċ Ċ import Ġandroid . app . job . Job Parameters Ċ import Ġandroid . app . job . JobService Ċ import Ġandroid . util . Log Ċ import Ġandroid . util . Sparse Array Ċ import Ġandroidx . annotation . Gu arded By Ċ import Ġcom . squareup . sql de light . Query Ċ import Ġme . ct kn ight . upload manager . internal . Database Ċ import Ġme . ct kn ight . upload manager . internal . Helpers Ċ import Ġme . ct kn ight . upload manager . internal . Upload Notifier Ċ import Ġme . ct kn ight . upload manager . internal . Upload Thread Ċ import Ġme . ct kn ight . upload manager . util . Log Utils Ċ import Ġme . ct kn ight . upload manager . util . Network Utils Ċ Ċ class ĠUpload JobService Ġ: ĠJob Service () Ġ{ ĊĠ Ġprivate Ġval Ġm Database : ĠUpload Database Ġ= ĠDatabase . getInstance ( this ) ĊĠ Ġ@ Gu arded By (" m Active Threads ") ĊĠ Ġprivate Ġval Ġm Active Threads Ġ= ĠSparse Array < Upload Thread >() ĊĠ Ġprivate Ġlateinit Ġvar Ġm Notification Query : ĠQuery < Upload Record > ĊĊĠ Ġprivate Ġval Ġm Observer Ġ= Ġobject Ġ: ĠQuery . Listener Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġquery Results Changed () Ġ{ Ċ // ĠĠĠĠĠ ĠHelpers . s Async Handler . post Ġ{ ĊĠĠĠĠĠĠĠ ĠUpload Notifier . getInstance ( this @ Upload JobService ). update () Ċ // ĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun ĠonCreate () Ġ{ ĊĠĠĠ Ġsuper . onCreate () ĊĊĠĠĠ Ġ// ĠWhile Ġsomeone Ġis Ġbound Ġto Ġus , Ġwatch Ġfor Ġdatabase Ġchanges Ġthat Ġshould ĊĠĠĠ Ġ// Ġtrigger Ġnotification Ġupdates . ĊĠĠĠ Ġm Notification Query Ġ= Ġm Database ĊĠĠĠĠĠĠĠ Ġ. upload Manager Queries ĊĠĠĠĠĠĠĠ Ġ. select Not Deleted () ĊĊĠĠĠ Ġm Notification Query . addListener ( m Observer ) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġon Destroy () Ġ{ ĊĠĠĠ Ġsuper . on Destroy () ĊĠĠĠ Ġm Notification Query . remove Listener ( m Observer ) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun ĠonStart Job ( params : ĠJob Parameters ): ĠBoolean Ġ{ ĊĠĠĠ Ġval Ġid Ġ= Ġparams . jobId ĊĊĠĠĠ Ġ// ĠSpin Ġup Ġthread Ġto Ġhandle Ġthis Ġdownload ĊĠĠĠ Ġval Ġinfo Ġ= Ġget Record ById ( id ) Ġas ĠUpload Record . Impl ? ĊĠĠĠ Ġif Ġ( info Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠ ĠLog . w ( TAG , Ġ" Odd , Ġno Ġdetails Ġfound Ġfor Ġupload Ġ$ id ") ĊĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġthread : ĠUpload Thread ĊĠĠĠ Ġsynchronized ( m Active Threads ) Ġ{ ĊĠĠĠĠĠ Ġif Ġ( m Active Threads . indexOf Key ( id ) Ġ>= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . w ( TAG , Ġ" Odd , Ġalready Ġrunning Ġupload Ġ$ id ") ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ// ĠTODO : Ġadd ĠAPI Ġfor Ġcustom Ġnetwork Client ĊĠĠĠĠĠ Ġthread Ġ= ĠUpload Thread ( this , ĠNetwork Utils . s Network Client , Ġparams , Ġinfo ) ĊĠĠĠĠĠ Ġm Active Threads . put ( id , Ġthread ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġthread . start () ĊĊĠĠĠ Ġreturn Ġtrue ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġon Stop Job ( params : ĠJob Parameters ): ĠBoolean Ġ{ ĊĠĠĠĠ Ġval Ġid Ġ= Ġparams . jobId ĊĊĠĠĠ Ġval Ġthread : ĠUpload Thread ? ĊĠĠĠ Ġsynchronized ( m Active Threads ) Ġ{ ĊĠĠĠĠĠ Ġthread Ġ= Ġm Active Threads . get ( id ) ĊĠĠĠĠĠ Ġm Active Threads . delete ( id ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( thread Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġ// ĠIf Ġthe Ġthread Ġis Ġstill Ġrunning , Ġask Ġit Ġto Ġgrace fully Ġshutdown , ĊĠĠĠĠĠ Ġ// Ġand Ġre schedule Ġourselves Ġto Ġresume Ġin Ġthe Ġfuture . ĊĠĠĠĠĠ Ġthread . request Shutdown () ĊĊĠĠĠĠĠ ĠHelpers . schedule Job ( this , Ġget Record ById ( id )) ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġfalse ĊĠ Ġ} ĊĊĠ Ġfun Ġjob Finished Internal ( params : ĠJob Parameters , Ġneeds Res chedule : ĠBoolean ) Ġ{ ĊĠĠĠ Ġval Ġid Ġ= Ġparams . jobId ĊĊĠĠĠ Ġsynchronized ( m Active Threads ) Ġ{ ĊĠĠĠĠĠ Ġm Active Threads . remove ( params . jobId ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( needs Res chedule ) Ġ{ ĊĠĠĠĠĠ ĠHelpers . schedule Job ( this , Ġget Record ById ( id )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠUpdate Ġnotifications Ġone Ġlast Ġtime Ġwhile Ġjob Ġis Ġprotect ing Ġus ĊĠĠĠ Ġm Observer . query Results Changed () ĊĊĠĠĠ Ġ// ĠWe Ġdo Ġour Ġown Ġre scheduling Ġabove ĊĠĠĠ Ġjob Finished ( params , Ġfalse ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġget Record ById ( id : ĠInt ) Ġ= ĊĠĠĠĠĠ Ġm Database . upload Manager Queries . select ById ( id . to Long ()). execute As One OrNull () ĊĊĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠ Ġprivate Ġval ĠTAG Ġ= ĠLog Utils . make Tag < Upload JobService >() ĊĠ Ġ} Ċ } Ċ