package Ġcom . example . doub an movie . data . api Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . util . Log Ċ import Ġcom . example . doub an movie . data . model . Episode Ċ import Ġcom . example . doub an movie . data . model . Subject Box Ċ import Ġcom . google . gson . Gson Builder Ċ import Ġcom . google . gson . reflect . Type Token Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . with Context Ċ import Ġokhttp 3 . Call Ċ import Ġokhttp 3 . Callback Ċ import Ġokhttp 3 . Ok HttpClient Ċ import Ġokhttp 3 . Request Ċ import Ġokhttp 3 . Response Ċ import Ġjava . io . File Ċ import Ġjava . io . FileInputStream Ċ import Ġjava . io . File OutputStream Ċ import Ġjava . io . IOException Ċ import Ġjava . io . Object InputStream Ċ import Ġjava . io . Object OutputStream Ċ Ċ class ĠApi ServiceImpl Ġ: ĠApi Service Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġclient : ĠOk HttpClient ĊĠĠĠ Ġprivate Ġvar Ġbuilder : ĠOk HttpClient . Builder Ġ= ĠOk HttpClient . Builder () ĊĠĠĠ Ġprivate Ġval Ġget Movie Type Address Ġ= ĊĠĠĠĠĠĠĠ Ġ" https :// movie . doub an . com / j / search _ tags ? type = movie & tag =% E 7 % 8 3 % AD % E 9 % 9 7 % A 8 & source =" ĊĠĠĠ Ġprivate Ġval Ġtag Ġ= Ġ" MainActivity " ĊĠĠĠ Ġprivate Ġval Ġget Movie Address 1 Ġ= Ġ" https :// movie . doub an . com / j / search _ subjects ? type = movie & tag =" ĊĠĠĠ Ġprivate Ġval Ġget Movie Address 2 Ġ= Ġ"& sort = recommend & page _ limit = 2 0 & page _ start =" ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġclient Ġ= Ġbuilder . build () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġget Episode s (): Ġretrofit 2 . Call < List < Episode >> Ġ{ ĊĠĠĠĠĠĠĠ ĠTODO (" Not Ġyet Ġimplemented ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġget Movie Types From Internet (): ĠList < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwith Context ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= ĠRequest . Builder (). url ( get Movie Type Address ). build () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= Ġclient . new Call ( request ). execute () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! response . is Successful ) Ġthrow ĠIOException (" Unexpected ĠCode Ġ$ response ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ(( name , Ġvalue ) Ġin Ġresponse . headers ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( tag , Ġ" Movie Type Ġ$ name : Ġ$ value ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( tag , Ġresponse . toString ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġjson Data Ġ= Ġresponse . body ?. string () Ġ?: Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( tag , Ġjson Data ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjson Data Ġ= Ġjson Data . substring After (': ') ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjson Data Ġ= Ġjson Data . substring Before Last (' }') ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( tag , Ġjson Data ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgson Ġ= ĠGson Builder (). create () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Ġ= Ġobject Ġ: ĠType Token < List < String >>() Ġ{} . type ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmovie TypeList Ġ= Ġmutable ListOf < String >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmovie TypeList . addAll ( gson . fromJson ( json Data , Ġtype )) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( tag , Ġ" è½¬æį¢ åĩºçļĦ movie Types æľī Ġ${ movie TypeList . size } Ġä¸ª ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmovie TypeList ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġget Movie Items From Internet ( ĊĠĠĠĠĠĠĠ Ġmovie Tag : ĠString ?, Ġpage Start : ĠInt ? ĊĠĠĠ Ġ): ĠList < Episode > Ġ{ ĊĊĠĠĠĠĠĠĠ Ġreturn Ġwith Context ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( tag , Ġ" ######## ###### Ġget Movie Items Ġ######## ### ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( tag , Ġ" movie Tag : Ġ$ movie Tag Ġ--- Ġpage Start : Ġ$ page Start ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmovie Tag 2 Ġ= Ġmovie Tag Ġ?: Ġ" çĥŃ éĹ¨ " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġpage Start String Ġ= Ġpage Start Ġ?: Ġ" 0 " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRequest . Builder (). url ( get Movie Address 1 Ġ+ Ġmovie Tag 2 Ġ+ Ġget Movie Address 2 Ġ+ Ġpage Start String ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build (). also Ġ{ ĠLog . d ( tag , Ġit . url . toString ()) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= Ġclient . new Call ( request ). execute () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! response . is Successful ) Ġthrow ĠIOException (" Unexpected ĠCode Ġ$ response ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġjson Data Ġ= Ġ( response . body ?. string () Ġ?: Ġ""). also Ġ{ ĠLog . d ( tag , Ġ" json Data Ġ= Ġ$ it ") Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgson Ġ= ĠGson Builder (). create () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsubject Box Ġ= Ġgson . fromJson ( json Data , ĠSubject Box :: class . java ). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( tag , Ġ" subjects : Ġ${ it . subjects }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġsubject Box . subjects ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġ æľ¬åľ° ï¼ļ ä¿ĿåŃĺ çĶµ å½± åĪĹè¡¨ ĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġset Movie Item ToFile ( context : ĠContext , Ġmovie Tag : ĠString , Ġepisode List : ĠMutable List < Episode >) Ġ{ ĊĠĠĠĠĠĠĠ Ġwith Context ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( tag , Ġ" ä¿ĿåŃĺ åĪ° æľ¬åľ° Ġ-- Ġ$ movie Tag Ġ-- Ġ${ episode List . size } æĿ¡ Ġ 2 ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtemp Episode List : ĠMutable List < Episode > Ġ= Ġmutable ListOf () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtemp Episode List . addAll ( episode List ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcache Parent Ġ= ĠFile ( context . cacheDir . path Ġ+ Ġ"/ movie Item "). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! it . exists ()) Ġit . mkdir () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcache Ġ= ĠFile ( cache Parent , Ġmovie Tag ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile OutputStream Ġ= ĠFileOutputStream ( cache ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġobject OutputStream Ġ= ĠObject OutputStream ( file OutputStream ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobject OutputStream . write Object ( temp Episode List ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġepisode List . addAll ( temp Episode List ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile OutputStream . close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobject OutputStream . close () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġ æľ¬åľ° ï¼ļ èİ·åıĸ çĶµ å½± åĪĹè¡¨ ĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġget Movie Item FromFile ( context : ĠContext , Ġmovie Tag : ĠString ): ĠMutable List < Episode > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwith Context ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( tag , Ġ" æľ¬åľ° èİ·åıĸ æķ°æį® Ġ-- Ġmovie _$ movie Tag ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFile ("${ context . cacheDir . path }/ movie Item /$ movie Tag "). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile InputStream Ġ= ĠFileInputStream ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġobject InputStream Ġ= ĠObject InputStream ( file InputStream ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( object InputStream . read Object () Ġas ĠList < Episode >). also Ġ{ Ġepisode Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile InputStream . close () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobject InputStream . close () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( tag , Ġ" æľ¬åľ° èİ·åıĸ æķ°æį® Ġ-- Ġmovie _$ movie Tag Ġ-- Ġ${ episode . size } ä¸ª ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġas ĠMutable List < Episode > ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmutable ListOf < Episode >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile InputStream . close () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobject InputStream . close () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmutable ListOf () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ