package Ġorg . ny pl . simpl ified . books . audio Ċ Ċ import Ġcom . io 7 m . jun reachable . Unimplemented Code Exception Ċ import Ġio . reactivex . Observable Ċ import Ġio . reactivex . subjects . Publish Subject Ċ import Ġone . ir rad ia . mime . api . MIME Type Ċ import Ġorg . library simpl ified . audio book . api . Player Result Ċ import Ġorg . library simpl ified . audio book . license _ check . api . License Check Parameters Ċ import Ġorg . library simpl ified . audio book . license _ check . api . License Check Result Ċ import Ġorg . library simpl ified . audio book . license _ check . api . License Checks Ċ import Ġorg . library simpl ified . audio book . license _ check . spi . Single License Check Result Ċ import Ġorg . library simpl ified . audio book . license _ check . spi . Single License Check Status Ċ import Ġorg . library simpl ified . audio book . manifest . api . Player Manifest Ċ import Ġorg . library simpl ified . audio book . manifest _ ful fill . basic . Manifest Ful fillment Basic Credentials Ċ import Ġorg . library simpl ified . audio book . manifest _ ful fill . basic . Manifest Ful fillment Basic Parameters Ċ import Ġorg . library simpl ified . audio book . manifest _ ful fill . basic . Manifest Ful fillment Basic Type Ċ import Ġorg . library simpl ified . audio book . manifest _ ful fill . op a . OP A Manifest Ful fillment Strategy Provider Type Ċ import Ġorg . library simpl ified . audio book . manifest _ ful fill . op a . OP A Manifest URI Ċ import Ġorg . library simpl ified . audio book . manifest _ ful fill . op a . OP A Parameters Ċ import Ġorg . library simpl ified . audio book . manifest _ ful fill . op a . OP AP assword Ċ import Ġorg . library simpl ified . audio book . manifest _ ful fill . spi . Manifest Ful filled Ċ import Ġorg . library simpl ified . audio book . manifest _ ful fill . spi . Manifest Ful fillment ErrorType Ċ import Ġorg . library simpl ified . audio book . manifest _ ful fill . spi . Manifest Ful fillment Event Ċ import Ġorg . library simpl ified . audio book . manifest _ ful fill . spi . Manifest Ful fillment Strategy Type Ċ import Ġorg . library simpl ified . audio book . parser . api . ParseError Ċ import Ġorg . library simpl ified . audio book . parser . api . Parse Result Ċ import Ġorg . library simpl ified . audio book . parser . api . Parse Warning Ċ import Ġorg . ny pl . simpl ified . books . book _ database . api . Book Formats Ċ import Ġorg . ny pl . simpl ified . task recorder . api . Task Recorder Ċ import Ġorg . ny pl . simpl ified . task recorder . api . Task Recorder Type Ċ import Ġorg . ny pl . simpl ified . task recorder . api . Task Result Ċ import Ġorg . slf 4 j . LoggerFactory Ċ import Ġjava . net . URI Ċ Ċ /** Ċ Ġ* ĠThe Ġdefault Ġaudio Ġbook Ġmanifest Ġstrategy . Ċ Ġ*/ Ċ Ċ class ĠAudio Book Manifest Strategy ( ĊĠ Ġprivate Ġval Ġrequest : ĠAudio Book Manifest Request Ċ ) Ġ: ĠAudio Book Manifest Strategy Type Ġ{ ĊĊĠ Ġprivate Ġval Ġlogger Ġ= ĊĠĠĠ ĠLoggerFactory . getLogger ( Audio Book Manifest Strategy :: class . java ) ĊĊĠ Ġprivate Ġval Ġevent Subject Ġ= ĊĠĠĠ ĠPublish Subject . create < String >() ĊĊĠ Ġoverride Ġval Ġevents : ĠObservable < String > Ġ= ĊĠĠĠ Ġthis . event Subject ĊĊĠ Ġoverride Ġfun Ġexecute (): ĠTask Result < Audio Book Manifest Data > Ġ{ ĊĠĠĠ Ġval Ġtask Recorder Ġ= ĠTask Recorder . create () ĊĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠ Ġval Ġdownload Result Ġ= ĊĠĠĠĠĠĠĠ Ġif Ġ( this . request . is Network Available ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġtask Recorder . begin New Step (" Downloading Ġmanifest âĢ¦ ") ĊĠĠĠĠĠĠĠĠĠ Ġthis . download Manifest () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġtask Recorder . begin New Step (" Loading Ġmanifest âĢ¦ ") ĊĠĠĠĠĠĠĠĠĠ Ġthis . load Fallback Manifest () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġif Ġ( download Result Ġis ĠPlayer Result . Failure ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtask Recorder . current Step Failed ( ĊĠĠĠĠĠĠĠĠĠ Ġmessage Ġ= Ġdownload Result . failure . message , ĊĠĠĠĠĠĠĠĠĠ ĠerrorCode Ġ= Ġformat Server Data ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Ġ= Ġdownload Result . failure . message , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġserver Data Ġ= Ġdownload Result . failure . server Data ĊĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġreturn Ġtask Recorder . finish Failure () ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġtask Recorder . begin New Step (" Parsing Ġmanifest âĢ¦ ") ĊĠĠĠĠĠ Ġval Ġ( contentType , Ġdownload Bytes ) Ġ= Ġ( download Result Ġas ĠPlayer Result . Success ). result ĊĠĠĠĠĠ Ġval Ġparse Result Ġ= Ġthis . parse Manifest ( this . request . target URI , Ġdownload Bytes ) ĊĠĠĠĠĠ Ġif Ġ( parse Result Ġis ĠParse Result . Failure ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtask Recorder . current Step Failed ( ĊĠĠĠĠĠĠĠĠĠ Ġformat Parse Errors And Warnings ( parse Result . warnings , Ġparse Result . errors ), ĊĠĠĠĠĠĠĠĠĠ Ġ"" ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġreturn Ġtask Recorder . finish Failure () ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġtask Recorder . begin New Step (" Checking Ġlicense âĢ¦ ") ĊĠĠĠĠĠ Ġval Ġ(_, Ġparsed Manifest ) Ġ= Ġparse Result Ġas ĠParse Result . Success ĊĠĠĠĠĠ Ġval Ġcheck Result Ġ= Ġthis . check Manifest ( parsed Manifest ) ĊĠĠĠĠĠ Ġif Ġ(! check Result . check Succeeded ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġtask Recorder . current Step Failed ( ĊĠĠĠĠĠĠĠĠĠ Ġformat License Check Statuses ( check Result . check Statuses ), ĊĠĠĠĠĠĠĠĠĠ Ġ"" ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġreturn Ġtask Recorder . finish Failure () ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġreturn Ġthis . finish ( ĊĠĠĠĠĠĠĠ Ġparsed Manifest Ġ= Ġparsed Manifest , ĊĠĠĠĠĠĠĠ Ġdownload Bytes Ġ= Ġdownload Bytes , ĊĠĠĠĠĠĠĠ ĠcontentType Ġ= ĠcontentType , ĊĠĠĠĠĠĠĠ Ġtask Recorder Ġ= Ġtask Recorder ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠ Ġthis . logger . error (" error Ġduring Ġfulfill ment : Ġ", Ġe ) ĊĠĠĠĠĠ Ġval Ġmessage Ġ= Ġe . message Ġ?: Ġe . java Class . name ĊĠĠĠĠĠ Ġtask Recorder . current Step Failed App ending ( message , Ġmessage , Ġe ) ĊĠĠĠĠĠ Ġreturn Ġtask Recorder . finish Failure () ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġformat License Check Statuses ( statuses : ĠList < Single License Check Result >): ĠString Ġ{ ĊĠĠĠ Ġreturn Ġbuild String Ġ{ ĊĠĠĠĠĠ Ġthis . append (" One Ġor Ġmore Ġlicense Ġchecks Ġfailed .") ĊĠĠĠĠĠ Ġthis . append ('\ n ') ĊĊĠĠĠĠĠ Ġfor Ġ( status Ġin Ġstatuses ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . append ( status . short Name ) ĊĠĠĠĠĠĠĠ Ġthis . append (": Ġ") ĊĠĠĠĠĠĠĠ Ġthis . append ( status . message ) ĊĠĠĠĠĠĠĠ Ġthis . append ('\ n ') ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġformat Parse Errors And Warnings ( ĊĠĠĠ Ġwarnings : ĠList < Parse Warning >, ĊĠĠĠ Ġerrors : ĠList < ParseError > ĊĠ Ġ): ĠString Ġ{ ĊĠĠĠ Ġreturn Ġbuild String Ġ{ ĊĠĠĠĠĠ Ġthis . append (" Manifest Ġparsing Ġfailed .") ĊĠĠĠĠĠ Ġthis . append ('\ n ') ĊĊĠĠĠĠĠ Ġfor Ġ( warning Ġin Ġwarnings ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . append (" Warning : Ġ") ĊĠĠĠĠĠĠĠ Ġthis . append ( warning . source ) ĊĠĠĠĠĠĠĠ Ġthis . append (": Ġ") ĊĠĠĠĠĠĠĠ Ġthis . append ( warning . line ) ĊĠĠĠĠĠĠĠ Ġthis . append (': ') ĊĠĠĠĠĠĠĠ Ġthis . append ( warning . column ) ĊĠĠĠĠĠĠĠ Ġthis . append (": Ġ") ĊĠĠĠĠĠĠĠ Ġthis . append ( warning . message ) ĊĠĠĠĠĠĠĠ Ġthis . append ('\ n ') ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġfor Ġ( error Ġin Ġerrors ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . append (" Error : Ġ") ĊĠĠĠĠĠĠĠ Ġthis . append ( error . source ) ĊĠĠĠĠĠĠĠ Ġthis . append (": Ġ") ĊĠĠĠĠĠĠĠ Ġthis . append ( error . line ) ĊĠĠĠĠĠĠĠ Ġthis . append (': ') ĊĠĠĠĠĠĠĠ Ġthis . append ( error . column ) ĊĠĠĠĠĠĠĠ Ġthis . append (": Ġ") ĊĠĠĠĠĠĠĠ Ġthis . append ( error . message ) ĊĠĠĠĠĠĠĠ Ġthis . append ('\ n ') ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġformat Server Data ( ĊĠĠĠ Ġmessage : ĠString , ĊĠĠĠ Ġserver Data : ĠManifest Ful fillment ErrorType . Server Data ? ĊĠ Ġ): ĠString Ġ{ ĊĠĠĠ Ġreturn Ġbuild String Ġ{ ĊĠĠĠĠĠ Ġthis . append ( message ) ĊĠĠĠĠĠ Ġthis . append ('\ n ') ĊĊĠĠĠĠĠ Ġif Ġ( server Data Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . append (" Server ĠURI : Ġ") ĊĠĠĠĠĠĠĠ Ġthis . append ( server Data . uri ) ĊĠĠĠĠĠĠĠ Ġthis . append ('\ n ') ĊĊĠĠĠĠĠĠĠ Ġthis . append (" Server Ġstatus : Ġ") ĊĠĠĠĠĠĠĠ Ġthis . append ( server Data . code ) ĊĠĠĠĠĠĠĠ Ġthis . append ('\ n ') ĊĊĠĠĠĠĠĠĠ Ġif Ġ( server Data . received ContentType Ġ== Ġ" application / api - problem + json ") Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġval Ġparser Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequest . problem Report Parsers . create Parser ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuri Ġ= Ġserver Data . uri . toString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstream Ġ= Ġserver Data . received Body . inputStream () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreport Ġ= Ġparser . execute () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . append (" Status : Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . append ( report . status ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . append ('\ n ') ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . append (" Type : Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . append ( report . type ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . append ('\ n ') ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . append (" Title : Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . append ( report . title ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . append ('\ n ') ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . append (" Detail : Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . append ( report . detail ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . append ('\ n ') ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error (" status : Ġ{}", Ġreport . status ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error (" type : ĠĠ Ġ{}", Ġreport . type ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error (" title : Ġ Ġ{}", Ġreport . title ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error (" detail : Ġ{}", Ġreport . detail ) ĊĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error (" un parse able Ġproblem Ġreport : Ġ", Ġe ) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġdata Ġclass ĠData Load Failed ( ĊĠĠĠ Ġoverride Ġval Ġmessage : ĠString , ĊĠĠĠ Ġval Ġexception : Ġjava . lang . Exception ? Ġ= Ġnull , ĊĠĠĠ Ġoverride Ġval Ġserver Data : ĠManifest Ful fillment ErrorType . Server Data ? Ġ= Ġnull ĊĠ Ġ) Ġ: ĠManifest Ful fillment ErrorType ĊĊĠ Ġprivate Ġfun Ġload Fallback Manifest (): ĠPlayer Result < Manifest Ful filled , ĠManifest Ful fillment ErrorType > Ġ{ ĊĠĠĠ Ġthis . logger . debug (" load Fallback Manifest ") ĊĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠ Ġval Ġdata Ġ= Ġthis . request . load Fallback Data () ĊĠĠĠĠĠ Ġif Ġ( data Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ ĠPlayer Result . Failure ( Data Load Failed (" No Ġfallback Ġmanifest Ġdata Ġis Ġprovided ")) ĊĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ ĠPlayer Result . unit ( data ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠ Ġthis . logger . error (" load Fallback Manifest : Ġ", Ġe ) ĊĠĠĠĠĠ ĠPlayer Result . Failure ( Data Load Failed ( e . message Ġ?: Ġe . java Class . name , Ġe )) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġfinish ( ĊĠĠĠ Ġparsed Manifest : ĠPlayer Manifest , ĊĠĠĠ Ġdownload Bytes : ĠByteArray , ĊĠĠĠ ĠcontentType : ĠMIME Type , ĊĠĠĠ Ġtask Recorder : ĠTask Recorder Type ĊĠ Ġ): ĠTask Result < Audio Book Manifest Data > Ġ{ ĊĠĠĠ Ġreturn Ġtask Recorder . finish Success ( ĊĠĠĠĠĠ ĠAudio Book Manifest Data ( ĊĠĠĠĠĠĠĠ Ġmanifest Ġ= Ġparsed Manifest , ĊĠĠĠĠĠĠĠ Ġful filled Ġ= ĠManifest Ful filled ( ĊĠĠĠĠĠĠĠĠĠ ĠcontentType Ġ= ĠcontentType , ĊĠĠĠĠĠĠĠĠĠ Ġdata Ġ= Ġdownload Bytes ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ) ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* Ġ@ return Ġ` true ` Ġif Ġthe Ġrequest Ġcontent Ġtype Ġimplies Ġan ĠOver drive Ġaudio Ġbook ĊĠĠ Ġ*/ ĊĊĠ Ġprivate Ġfun Ġis Over drive (): ĠBoolean Ġ{ ĊĠĠĠ Ġreturn ĠBook Formats . audio Book Over drive Mime Types () ĊĠĠĠĠĠ Ġ. map Ġ{ Ġit . full Type Ġ} ĊĠĠĠĠĠ Ġ. contains ( this . request . contentType . full Type ) ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠAttempt Ġto Ġsynchronous ly Ġdownload Ġa Ġmanifest Ġfile . ĠIf Ġthe Ġdownload Ġfails , Ġreturn Ġthe ĊĠĠ Ġ* Ġerror Ġdetails . ĊĠĠ Ġ*/ ĊĊĠ Ġprivate Ġfun Ġdownload Manifest (): ĠPlayer Result < Manifest Ful filled , ĠManifest Ful fillment ErrorType > Ġ{ ĊĠĠĠ Ġthis . logger . debug (" download Manifest ") ĊĊĠĠĠ Ġval Ġstrategy : ĠManifest Ful fillment Strategy Type Ġ= ĊĠĠĠĠĠ Ġthis . download Strategy For Credentials () ĊĠĠĠ Ġval Ġfulfill Subscription Ġ= ĊĠĠĠĠĠ Ġstrategy . events . subscribe ( this :: on Manifest Ful fillment Event ) ĊĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠ Ġreturn Ġstrategy . execute () ĊĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠ Ġfulfill Subscription . dispose () ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠTry Ġto Ġfind Ġan Ġappropriate Ġfulfill ment Ġstrategy Ġbased Ġon Ġthe Ġaudio Ġbook Ġrequest . ĊĠĠ Ġ*/ ĊĊĠ Ġprivate Ġfun Ġdownload Strategy For Credentials (): ĠManifest Ful fillment Strategy Type Ġ{ ĊĠĠĠ Ġreturn Ġif Ġ( this . is Over drive ()) Ġ{ ĊĠĠĠĠĠ Ġthis . logger . debug (" download Strategy For Credentials : Ġtrying Ġan ĠOver drive Ġstrategy ") ĊĊĠĠĠĠĠ Ġval Ġsecret Service Ġ= ĊĠĠĠĠĠĠĠ Ġthis . request . services . optional Service ( ĊĠĠĠĠĠĠĠĠĠ ĠAudio Book Over drive Secret ServiceType :: class . java ĊĠĠĠĠĠĠĠ Ġ) Ġ?: Ġthrow ĠUnsupportedOperationException (" No ĠOver drive Ġsecret Ġservice Ġis Ġavailable ") ĊĊĠĠĠĠĠ Ġval Ġstrategies Ġ= ĊĠĠĠĠĠĠĠ Ġthis . request . strategy Registry . find Strategy ( ĊĠĠĠĠĠĠĠĠĠ ĠOP A Manifest Ful fillment Strategy Provider Type :: class . java ĊĠĠĠĠĠĠĠ Ġ) Ġ?: Ġthrow ĠUnsupportedOperationException (" No ĠOver drive Ġfulfill ment Ġstrategy Ġis Ġavailable ") ĊĊĠĠĠĠĠ Ġval Ġparameters Ġ= ĊĠĠĠĠĠĠĠ Ġwhen Ġ( val Ġcredentials Ġ= Ġthis . request . credentials ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġis ĠAudio Book Credentials . Username Password Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOP A Parameters ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠuserName Ġ= Ġcredentials . userName , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpassword Ġ= ĠOP AP assword . Password ( credentials . password ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclient Key Ġ= Ġsecret Service . client Key , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclient Pass Ġ= Ġsecret Service . client Pass , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtarget URI Ġ= ĠOP A Manifest URI . Indirect ( this . request . target URI ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuser Agent Ġ= Ġthis . request . userAgent ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠ Ġis ĠAudio Book Credentials . Username Only Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOP A Parameters ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠuserName Ġ= Ġcredentials . userName , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpassword Ġ= ĠOP AP assword . Not Required , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclient Key Ġ= Ġsecret Service . client Key , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclient Pass Ġ= Ġsecret Service . client Pass , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtarget URI Ġ= ĠOP A Manifest URI . Indirect ( this . request . target URI ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuser Agent Ġ= Ġthis . request . userAgent ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠ Ġis ĠAudio Book Credentials . Bearer Token Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠUnsupportedOperationException (" Can 't Ġuse Ġbe arer Ġtokens Ġfor ĠOver drive Ġfulfill ment ") ĊĠĠĠĠĠĠĠĠĠ Ġnull Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠUn implemented Code Exception () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġstrategies . create ( parameters ) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠ Ġthis . logger . debug (" download Strategy For Credentials : Ġtrying Ġa ĠBasic Ġstrategy ") ĊĊĠĠĠĠĠ Ġval Ġstrategies Ġ= ĊĠĠĠĠĠĠĠ Ġthis . request . strategy Registry . find Strategy ( ĊĠĠĠĠĠĠĠĠĠ ĠManifest Ful fillment Basic Type :: class . java ĊĠĠĠĠĠĠĠ Ġ) Ġ?: Ġthrow ĠUnsupportedOperationException (" No ĠBasic Ġfulfill ment Ġstrategy Ġis Ġavailable ") ĊĊĠĠĠĠĠ Ġval Ġparameters Ġ= ĊĠĠĠĠĠĠĠ ĠManifest Ful fillment Basic Parameters ( ĊĠĠĠĠĠĠĠĠĠ Ġuri Ġ= Ġthis . request . target URI , ĊĠĠĠĠĠĠĠĠĠ Ġcredentials Ġ= Ġthis . request . credentials ?. let Ġ{ Ġcredentials Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( credentials ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠAudio Book Credentials . Username Password Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠManifest Ful fillment Basic Credentials ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠuserName Ġ= Ġcredentials . userName , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpassword Ġ= Ġcredentials . password ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠAudio Book Credentials . Username Only Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠManifest Ful fillment Basic Credentials ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠuserName Ġ= Ġcredentials . userName , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpassword Ġ= Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠAudio Book Credentials . Bearer Token Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠUnsupportedOperationException ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Can 't Ġuse Ġbe arer Ġtokens Ġfor Ġaudio Ġbook Ġfulfill ment " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠ Ġuser Agent Ġ= Ġthis . request . userAgent ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠ Ġstrategies . create ( parameters ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠAttempt Ġto Ġparse Ġa Ġmanifest Ġfile . ĊĠĠ Ġ*/ ĊĊĠ Ġprivate Ġfun Ġparse Manifest ( ĊĠĠĠ Ġsource : ĠURI , ĊĠĠĠ Ġdata : ĠByteArray ĊĠ Ġ): ĠParse Result < Player Manifest > Ġ{ ĊĠĠĠ Ġthis . logger . debug (" parse Manifest ") ĊĠĠĠ Ġreturn Ġthis . request . manifest Parsers . parse ( ĊĠĠĠĠĠ Ġuri Ġ= Ġsource , ĊĠĠĠĠĠ Ġstreams Ġ= Ġdata , ĊĠĠĠĠĠ Ġextensions Ġ= Ġthis . request . extensions ĊĠĠĠ Ġ) ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠAttempt Ġto Ġperform Ġany Ġrequired Ġlicense Ġchecks Ġon Ġthe Ġmanifest . ĊĠĠ Ġ*/ ĊĊĠ Ġprivate Ġfun Ġcheck Manifest ( ĊĠĠĠ Ġmanifest : ĠPlayer Manifest ĊĠ Ġ): ĠLicense Check Result Ġ{ ĊĠĠĠ Ġthis . logger . debug (" check Manifest ") ĊĊĠĠĠ Ġval Ġcheck Ġ= ĊĠĠĠĠĠ ĠLicense Checks . create License Check ( ĊĠĠĠĠĠĠĠ ĠLicense Check Parameters ( ĊĠĠĠĠĠĠĠĠĠ Ġmanifest Ġ= Ġmanifest , ĊĠĠĠĠĠĠĠĠĠ Ġuser Agent Ġ= Ġthis . request . userAgent , ĊĠĠĠĠĠĠĠĠĠ Ġchecks Ġ= Ġthis . request . license Checks , ĊĠĠĠĠĠĠĠĠĠ Ġcache Directory Ġ= Ġthis . request . cache Directory ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġ) ĊĊĠĠĠ Ġval Ġcheck Subscription Ġ= ĊĠĠĠĠĠ Ġcheck . events . subscribe Ġ{ Ġevent Ġ-> ĊĠĠĠĠĠĠĠ Ġthis . on License Check Event ( event ) ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠ Ġreturn Ġcheck . execute () ĊĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠ Ġcheck Subscription . dispose () ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġon License Check Event ( event : ĠSingle License Check Status ) Ġ{ ĊĠĠĠ Ġthis . logger . debug (" on License Check Event : Ġ{} : Ġ{}", Ġevent . source , Ġevent . message ) ĊĠĠĠ Ġthis . event Subject . onNext ( event . message ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġon Manifest Ful fillment Event ( event : ĠManifest Ful fillment Event ) Ġ{ ĊĠĠĠ Ġthis . logger . debug (" on Manifest Ful fillment Event : Ġ{}", Ġevent . message ) ĊĠĠĠ Ġthis . event Subject . onNext ( event . message ) ĊĠ Ġ} Ċ } Ċ