package Ġcom . lis b . android . medi ash rink Ċ Ċ import Ġandroid . app . Service Ċ import Ġandroid . content . Intent Ċ import Ġandroid . net . Uri Ċ import Ġandroid . os .* Ċ import Ġtim ber . log . Tim ber Ċ import Ġjava . io . IOException Ċ import Ġjava . util . concurrent . ExecutorService Ċ import Ġjava . util . concurrent . Executors Ċ Ċ class ĠMedia Shrink Service Ġ: ĠService () Ġ{ ĊĠĠĠ Ġprivate Ġval Ġlock Ġ= ĠObject () ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġmedia Shrink : ĠMedia Shrink ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġmess enger : ĠMess enger ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġbg Thread : ĠHandler Thread ĊĠĠĠ Ġprivate Ġlateinit Ġvar ĠexecutorService : ĠExecutor Service ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate () Ġ{ ĊĠĠĠĠĠĠĠ ĠTim ber . tag ( TAG ). v (" onCreate ") ĊĠĠĠĠĠĠĠ Ġsuper . onCreate () ĊĠĠĠĠĠĠĠ ĠexecutorService Ġ= ĠExec utors . new Single Thread Executor () ĊĠĠĠĠĠĠĠ Ġbg Thread Ġ= ĠHandler Thread (" request - queue - thread ") ĊĠĠĠĠĠĠĠ Ġbg Thread . start () ĊĠĠĠĠĠĠĠ Ġval Ġhandler Ġ= ĠReceive RequestHandler ( bg Thread . lo oper ) ĊĠĠĠĠĠĠĠ Ġmess enger Ġ= ĠMess enger ( handler ) ĊĠĠĠĠĠĠĠ Ġmedia Shrink Ġ= ĠMedia Shrink ( this ) ĊĠĠĠĠĠĠĠ Ġmedia Shrink . on Progress Listener Ġ= Ġhandler ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Bind ( intent : ĠIntent ): ĠI Binder ? Ġ{ ĊĠĠĠĠĠĠĠ ĠTim ber . tag ( TAG ). v (" on Bind ") ĊĠĠĠĠĠĠĠ Ġmedia Shrink . width Ġ= Ġintent . getInt Extra ( EXTRA _ WIDTH , Ġ- 1 ) ĊĠĠĠĠĠĠĠ Ġmedia Shrink . video Bit Rate Ġ= Ġintent . getInt Extra ( EXTRA _ VIDEO _ BIT RATE , Ġ- 1 ) ĊĠĠĠĠĠĠĠ Ġmedia Shrink . audio Bit Rate Ġ= Ġintent . getInt Extra ( EXTRA _ AUDIO _ BIT RATE , Ġ- 1 ) ĊĠĠĠĠĠĠĠ Ġmedia Shrink . duration Limit Ġ= Ġintent . getLong Extra ( EXTRA _ DURATION _ LIMIT , Ġ- 1 ) ĊĠĠĠĠĠĠĠ Ġreturn Ġmess enger . binder ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Un bind ( intent : ĠIntent ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ ĠTim ber . tag ( TAG ). v (" on Un bind ") ĊĠĠĠĠĠĠĠ Ġreturn Ġsuper . on Un bind ( intent ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy () Ġ{ ĊĠĠĠĠĠĠĠ ĠTim ber . tag ( TAG ). v (" on Destroy ") ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy () ĊĠĠĠĠĠĠĠ Ġbg Thread . quit () ĊĠĠĠĠĠĠĠ ĠexecutorService . shutdown () ĊĠĠĠĠĠĠĠ ĠProcess . kill Process ( Process . my Pid ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinner Ġclass ĠReceive RequestHandler ( lo oper : ĠL ooper ) Ġ: ĠHandler ( lo oper ), ĠOn Progress Listener , ĠUn recover able Error Callback Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġcurrent Message : ĠMessage ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġhandle Message ( msg : ĠMessage ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . tag ( TAG ). d (" Receive RequestHandler # handle Message . Ġwhat :% d ", Ġmsg . what ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( msg . what ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠREQUEST _ SH R INK _ MSG ID Ġ-> Ġhandle Request Shrink ( msg ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġhandle Request Shrink ( msg : ĠMessage ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Message Ġ= Ġmsg ĊĠĠĠĠĠĠĠĠĠĠĠ ĠexecutorService . execute Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinput Uri Ġ= Ġmsg . data . get Parcelable < Uri >( REQUEST _ SH R INK _ INPUT _ URI ) !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoutput Path Ġ= Ġmsg . data . getString ( REQUEST _ SH R INK _ OUTPUT _ PATH ) !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Shrink . shrink ( input Uri , Ġoutput Path , Ġthis @ Receive RequestHandler ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrespond S af ely ( Message . obtain ( null , ĠRESULT _ COMPLETE _ MSG ID )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . tag ( TAG ). e ( e , Ġ" Failed Ġto Ġmedia Ġshrink ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= ĠMessage . obtain () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . what Ġ= ĠRESULT _ RE COVER ABLE _ ERROR _ MSG ID ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata Ġ= ĠBundle () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata . put Serializable ( RESULT _ RE COVER ABLE _ ERROR _ EXCEPTION , Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . data Ġ= Ġdata ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrespond S af ely ( response ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠToo Movie Long Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . tag ( TAG ). e ( e , Ġ" Failed Ġto Ġmedia Ġshrink ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= ĠMessage . obtain () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . what Ġ= ĠRESULT _ RE COVER ABLE _ ERROR _ MSG ID ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata Ġ= ĠBundle () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata . put Serializable ( RESULT _ RE COVER ABLE _ ERROR _ EXCEPTION , Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . data Ġ= Ġdata ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrespond S af ely ( response ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Message Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsynchronized ( lock ) Ġ{ Ġlock . notify All () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( current Message Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsynchronized ( lock ) Ġ{ Ġlock . wait () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠInterruptedException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . tag ( TAG ). e ( e , Ġ" inter rupted ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġrespond S af ely ( message : ĠMessage ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . tag ( TAG ). d (" respond S af ely . Ġtype :% d ", Ġmessage . what ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Message !!. reply To . send ( message ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠRemoteException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . tag ( TAG ). e ( e , Ġ" Failed Ġto Ġrespond ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Progress ( progress : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrespond S af ely ( Message . obtain ( null , ĠRESULT _ PROGRESS _ MSG ID , Ġprogress , Ġ 0 )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Un recover able Error ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . tag ( TAG ). e ( e , Ġ" Un recover able Ġerror Ġoccurred .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= ĠMessage . obtain () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . what Ġ= ĠRESULT _ UN RE COVER ABLE _ ERROR _ MSG ID ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata Ġ= ĠBundle () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata . put Serializable ( RESULT _ UN RE COVER ABLE _ ERROR _ EXCEPTION , Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . data Ġ= Ġdata ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrespond S af ely ( response ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠProcess . kill Process ( Process . my Pid ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠEX TRA _ WIDTH Ġ= Ġ" width " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠEX TRA _ VIDEO _ BIT RATE Ġ= Ġ" video - bit rate " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠEX TRA _ AUDIO _ BIT RATE Ġ= Ġ" audio - bit rate " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠEX TRA _ DURATION _ LIMIT Ġ= Ġ" duration - limit " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠREQUEST _ SH R INK _ MSG ID Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠREQUEST _ SH R INK _ INPUT _ URI Ġ= Ġ" input " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠREQUEST _ SH R INK _ OUTPUT _ PATH Ġ= Ġ" output " ĊĠĠĠĠĠĠĠ Ġ/** Ġarg 1 Ġãģ¯ éĢ² æį Ĺ çİĩ Ġ Ġ*/ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠRESULT _ PROGRESS _ MSG ID Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠRESULT _ COMPLETE _ MSG ID Ġ= Ġ 2 ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠRESULT _ RE COVER ABLE _ ERROR _ MSG ID Ġ= Ġ 3 ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠRESULT _ RE COVER ABLE _ ERROR _ EXCEPTION Ġ= Ġ" exception " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠRESULT _ UN RE COVER ABLE _ ERROR _ MSG ID Ġ= Ġ 4 ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠRESULT _ UN RE COVER ABLE _ ERROR _ EXCEPTION Ġ= Ġ" exception " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠTAG Ġ= Ġ" Media Shrink Service " ĊĠĠĠ Ġ} Ċ }