/* Ċ Ġ* ĠCopyright Ġ 2 0 1 1 ĠDaniel ĠE rat Ġ< dan @ er at . org > Ċ Ġ* ĠAll Ġrights Ġreserved . Ċ Ġ*/ Ċ Ċ package Ġorg . er at . n up Ċ Ċ import Ġandroid . util . Log Ċ import Ġjava . io . IOException Ċ import Ġjava . net . Http URLConnection Ċ import Ġjava . util . Date Ċ import Ġjava . util . concurrent . locks . Re entrant Lock Ċ import Ġkotlin . concurrent . with Lock Ċ import Ġorg . er at . n up . Downloader . Pref Exception Ċ Ċ class ĠPlay back Reporter ( ĊĠĠĠ Ġprivate Ġval Ġsong Db : ĠSong Database , ĊĠĠĠ Ġprivate Ġval Ġdown loader : ĠDown loader , ĊĠĠĠ Ġprivate Ġval Ġnetwork Helper : ĠNetwork Helper , Ċ ) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġlock Ġ= ĠRe entrant Lock () ĊĠĠĠ Ġprivate Ġvar Ġreporting Ġ= Ġfalse ĊĊĠĠĠ Ġ/** ĠReport Ġthe Ġplayback Ġof Ġ[ song Id ] Ġstarting Ġat Ġ[ startDate ]. Ġ*/ ĊĠĠĠ Ġsuspend Ġfun Ġreport ( song Id : ĠLong , ĠstartDate : ĠDate ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsong Db . add Pending Playback Report ( song Id , ĠstartDate ) ĊĠĠĠĠĠĠĠ Ġif Ġ( network Helper . is Network Available ) Ġreport Pending () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠS ynchronously Ġreport Ġall Ġun reported Ġsongs . Ġ*/ ĊĠĠĠ Ġsuspend Ġfun Ġreport Pending () Ġ{ ĊĠĠĠĠĠĠĠ Ġlock . with Lock () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( reporting ) Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreporting Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( report Ġin Ġsong Db . all Pending Playback Reports ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( send ( report . song Id , Ġreport . startDate )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsong Db . remove Pending Playback Report ( report . song Id , Ġreport . startDate ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġreport () Ġcould 've Ġadded Ġmore Ġsongs Ġwhile Ġwe Ġwere Ġsending Ġthe Ġpending Ġreports Ġto Ġthe ĊĠĠĠĠĠĠĠ Ġ// Ġserver . ĠThis Ġprobably Ġisn 't Ġa Ġbig Ġdeal , Ġsince Ġwe 'll Ġsend Ġthose Ġsongs Ġnext Ġtime . ĠKotlin ĊĠĠĠĠĠĠĠ Ġ// Ġwon 't Ġlet Ġus Ġcall Ġsuspend Ġfunctions Ġin Ġcritical Ġsections . ĊĠĠĠĠĠĠĠ Ġlock . with Lock () Ġ{ Ġreporting Ġ= Ġfalse Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠSends Ġa Ġreport Ġof Ġ[ song Id ] Ġstarting Ġat Ġ[ startDate ]. Ġ*/ ĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġsend ( song Id : ĠLong , ĠstartDate : ĠDate ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! network Helper . is Network Available ) Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Reporting Ġsong Ġ$ song Id Ġstarted Ġat Ġ$ startDate ") ĊĠĠĠĠĠĠĠ Ġvar Ġconn : ĠHttp URLConnection ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstart Ġ= ĠString . format ("% . 3 f ", ĠstartDate . time Ġ/ Ġ 1 0 0 0 . 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpath Ġ= Ġ"/ play ed ? song Id =$ song Id & startTime =$ start " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconn Ġ= Ġdown loader . download ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdown loader . getServer Url ( path ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" POST ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDown loader . Auth Type . SERVER , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( conn . response Code Ġ== Ġ 2 0 0 ) Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" Got Ġ${ conn . response Code } Ġfrom Ġserver : Ġ${ conn . response Message }") ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠPref Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" Preferences Ġerror : Ġ$ e ") ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" IO Ġerror : Ġ$ e ") ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconn ?. disconnect () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠTAG Ġ= Ġ" Playback Reporter " ĊĠĠĠ Ġ} Ċ } Ċ