package Ġcom . example . om db . present ers Ċ Ċ import Ġcom . example . om db . models . Movie Model Ċ import Ġcom . example . om db . views . MainActivity Ċ import Ġkotlinx . coroutines . launch Ċ import Ġkotlinx . coroutines . run Blocking Ċ import Ġokhttp 3 .* Ċ import Ġorg . json . JSONArray Ċ import Ġorg . json . JSONObject Ċ import Ġjava . io . IOException ĊĊ Ċ /** Ċ Ġ* ĠMovie Ġpresenter Ċ Ġ*/ Ċ class ĠMovie Presenter ( list ening Activity : ĠMainActivity ) Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠBase ĠO MD b ĠURL ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval ĠURL : ĠString Ġ= Ġ" http :// www . om db api . com /? apikey = 6 7 5 e 6 6 8 a & " ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠIdentity Ġparameter ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval ĠIDENTITY PARAMETER : ĠString Ġ= Ġ" t =" ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSearch Ġparameter ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval ĠSEARCH _ PARAMETER : ĠString Ġ= Ġ" s =" ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠPage Ġparameter ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval ĠPAGE _ PARAMETER : ĠString Ġ= Ġ"& page =" ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠFirst ĠPage ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval ĠFIRST _ PAGE Ġ= Ġ 1 ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠPage Ġnumber ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġpage Ġ= ĠFIRST _ PAGE ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠActivity ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġactivity : ĠMainActivity Ġ= Ġlistening Activity ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠList Ġof ĠMov ies ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġmovie Model List : ĠArrayList < Movie Model > Ġ= ĠArrayList () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠList Ġto Ġcheck Ġwhether Ġmovie Ġhas Ġar rived ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġar rived Movies : ĠArrayList < String > Ġ= ĠArrayList () ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠList Ġof ĠMov ies ĠIDs ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġmove ID list : ĠArrayList < String > Ġ= ĠArrayList () ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCurrent ĠQuery ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġcurrent Query : ĠString Ġ= Ġ"" ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠHttp ĠClient ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġclient Ġ= ĠOk HttpClient () ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSearch Ġmovies ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġsearch Movies ( query : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġsearch Query Ġ= Ġquery ĊĊĠĠĠĠĠĠĠ Ġ// ĠGo Ġto Ġnext Ġpage Ġin Ġsearch Ġor Ġstart Ġnew Ġsearch ĊĠĠĠĠĠĠĠ Ġif Ġ( query . equals ("") Ġ|| Ġquery . equals ( current Query )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsearch Query Ġ= Ġcurrent Query ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart New Search ( search Query ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġ// ĠCreate Ġrequest ĊĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= ĠRequest . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. url ( URL Ġ+ ĠSEARCH _ PARAMETER Ġ+ Ġsearch Query Ġ+ ĠPAGE _ PARAMETER Ġ+ Ġpage ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠ Ġ// ĠSet Ġto Ġnext Ġpage ĊĠĠĠĠĠĠĠ Ġpage Ġ+= Ġ 1 ĊĊĠĠĠĠĠĠĠ Ġclient . new Call ( request ). enqueue ( object Ġ: ĠCallback Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Failure ( call : ĠCall , Ġe : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactivity . show Movie NotFound () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Response ( call : ĠCall , Ġresponse : ĠResponse ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġstring Response Ġ= Ġresponse . body () !!. string () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCreate Ġjson Ġobject ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġjson Movie Object Ġ= ĠJSONObject ( string Response ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCreate Ġjson Ġarray ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġsearch Tag Ġ= Ġ" Search " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġtitle Tag Ġ= Ġ" Title " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġjson Movie Array : ĠJSONArray Ġ= Ġjson Movie Object . get JSONArray ( search Tag ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġsize : ĠInt Ġ= Ġjson Movie Array . length () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNew Ġlist Ġof Ġmovie Ġtitles ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġnew Movies Titles : ĠArrayList < String > Ġ= ĠArrayList () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠGet ĠMovie ĠIDs Ġfrom Ġthe ĠSearch Ġfunction ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġsize ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġjson Movie : ĠJSONObject Ġ= Ġjson Movie Array . getJSONObject ( i ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġmovie ID Ġ= Ġjson Movie . getString ( title Tag ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsearch Single Movie ( movie ID ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( movie ID Ġ! in Ġmove ID list ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmove ID list . add ( movie ID ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Movies Titles . add ( movie ID ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠGet Ġmovies Ġbased Ġon ĠID 's Ġbecause Ġusing Ġthe Ġsearch Ġfunction Ġy ielded Ġmovies Ġwith Ġnot Ġa Ġlot Ġof Ġextra Ġinfo Ġ( no Ġdirector Ġand Ġsummary Ġetc ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar ĠID size : ĠInt Ġ= Ġnew Movies Titles . size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil ĠID size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlaunch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsearch Single Movie ( new Movies Titles . get ( i )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactivity . refresh Screen ( movie Model List ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactivity . show Movie NotFound () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠStart Ġnew ĠSearch ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġstart New Search ( search Query : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcurrent Query Ġ= Ġsearch Query ĊĠĠĠĠĠĠĠ Ġmovie Model List Ġ= ĠArrayList () ĊĠĠĠĠĠĠĠ Ġmove ID list Ġ= ĠArrayList () ĊĠĠĠĠĠĠĠ Ġar rived Movies Ġ= ĠArrayList () ĊĠĠĠĠĠĠĠ Ġpage Ġ= Ġ 1 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSearch Ġsingle Ġmovie ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġsearch Single Movie ( movie Title : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= ĠRequest . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. url ( URL Ġ+ ĠIDENTITY PARAMETER Ġ+ Ġmovie Title ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġclient . new Call ( request ). enqueue ( object Ġ: ĠCallback Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Failure ( call : ĠCall , Ġe : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactivity . show Movie NotFound () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Response ( call : ĠCall , Ġresponse : ĠResponse ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġstring Response Ġ= Ġresponse . body () !!. string () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġjson Movie Ġ= ĠJSONObject ( string Response ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġmovie Ġ= ĠMovie Model ( json Movie ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠI Ġran Ġinto Ġan Ġissue Ġwhere ĠI Ġdid Ġa Ġrequest Ġonce Ġand ĠI Ġgot Ġthe Ġsame Ġresponse Ġtwice Ġwhich Ġresulted Ġin Ġdouble Ġentries . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠI Ġcouldn 't Ġfind Ġa Ġmore Ġeleg ant Ġway Ġto Ġsolve Ġthis Ġ( as Ġall Ġthose Ġsolutions Ġgave Ġa Ġconcurrent Ġmodification Ġexception ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSo ĠI Ġsolved Ġit Ġby Ġadding Ġanother Ġlist Ġwhich Ġholds Ġthe Ġmoves Ġthat Ġhave Ġalready Ġar rived , Ġwhich Ġseems Ġto Ġhave Ġsolved Ġthe Ġproblem ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( movie . is Title Initialized () Ġ&& Ġmovie . title Ġ! in Ġar rived Movies ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmovie Model List . add ( movie ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġar rived Movies . add ( movie . title ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġactivity . show Movie NotFound () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }