package Ġcom . vin ar nt . j ikan 4 j . service Ċ Ċ import Ġcom . squareup . mos hi . Kotlin Json Adapter Factory Ċ import Ġcom . squareup . mos hi . M oshi Ċ import Ġcom . vin ar nt . j ikan 4 j . Constants Ċ import Ġcom . vin ar nt . j ikan 4 j . model . search . Search Type Ċ import Ġcom . vin ar nt . j ikan 4 j . model . search . entry .* Ċ import Ġcom . vin ar nt . j ikan 4 j . model . search . result .* Ċ import Ġokhttp 3 . Call Ċ import Ġokhttp 3 . Callback Ċ import Ġokhttp 3 . Request Ċ import Ġokhttp 3 . Response Ċ import Ġjava . io . IOException Ċ import Ġkotlin . reflect . K Class ĊĊ Ċ class ĠSearch Service Ġ: ĠBase Service ( Constants . API _ SEARCH _ PATH ) Ġ{ ĊĊĠĠĠ Ġinterface ĠSearch Callback < T Ġ: ĠSearch Entry > Ġ{ ĊĊĠĠĠĠĠĠĠ Ġfun Ġon Failure ( call : ĠCall ?, Ġe : ĠException ?) ĊĊĠĠĠĠĠĠĠ Ġfun Ġon Response ( call : ĠCall ?, Ġresponse : ĠResponse ?, Ġresult : ĠSearch Result < out ĠSearch Entry > ?) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinterface ĠAn ime Search Callback Ġ: ĠSearch Callback < An ime Search Entry > ĊĠĠĠ Ġinterface ĠM anga Search Callback Ġ: ĠSearch Callback < M anga Search Entry > ĊĠĠĠ Ġinterface ĠPerson Search Callback Ġ: ĠSearch Callback < Person Search Entry > ĊĠĠĠ Ġinterface ĠCharacter Search Callback Ġ: ĠSearch Callback < Character Search Entry > ĊĊĠĠĠ Ġprivate Ġval Ġm oshi Ġ= ĠM oshi . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( Kotlin Json Adapter Factory ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSearch Ġfor Ġan imes Ġfrom Ġa Ġkeywords ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġquery Ġkeywords Ġto Ġsearch Ġ( Must Ġbe Ġat Ġleast Ġ 3 Ġcharacters Ġlong ) ĊĠĠĠĠ Ġ* Ġ@ param Ġpage Ġresult Ġpage Ġto Ġget Ġ( Default Ġto Ġ 1 ) ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġsearch An imes ( query : ĠString , Ġpage : ĠInt Ġ= Ġ 1 ): ĠAn ime SearchResult ? Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsearch ( query , Ġpage , ĠSearch Type . AN IME , ĠAn ime SearchResult :: class ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSearch Ġfor Ġm ang as Ġfrom Ġa Ġkeywords ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġquery Ġkeywords Ġto Ġsearch Ġ( Must Ġbe Ġat Ġleast Ġ 3 Ġcharacters Ġlong ) ĊĠĠĠĠ Ġ* Ġ@ param Ġpage Ġresult Ġpage Ġto Ġget Ġ( Default Ġto Ġ 1 ) ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġsearch M ang as ( query : ĠString , Ġpage : ĠInt Ġ= Ġ 1 ): ĠM anga SearchResult ? Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsearch ( query , Ġpage , ĠSearch Type . M ANG A , ĠM anga SearchResult :: class ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSearch Ġfor Ġpersons Ġfrom Ġa Ġkeywords ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġquery Ġkeywords Ġto Ġsearch Ġ( Must Ġbe Ġat Ġleast Ġ 3 Ġcharacters Ġlong ) ĊĠĠĠĠ Ġ* Ġ@ param Ġpage Ġresult Ġpage Ġto Ġget Ġ( Default Ġto Ġ 1 ) ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġsearch Pers ons ( query : ĠString , Ġpage : ĠInt Ġ= Ġ 1 ): ĠPerson SearchResult ? Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsearch ( query , Ġpage , ĠSearch Type . PERSON , ĠPerson SearchResult :: class ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSearch Ġfor Ġcharacters Ġfrom Ġa Ġkeywords ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġquery Ġkeywords Ġto Ġsearch Ġ( Must Ġbe Ġat Ġleast Ġ 3 Ġcharacters Ġlong ) ĊĠĠĠĠ Ġ* Ġ@ param Ġpage Ġresult Ġpage Ġto Ġget Ġ( Default Ġto Ġ 1 ) ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġsearch Characters ( query : ĠString , Ġpage : ĠInt Ġ= Ġ 1 ): ĠCharacter SearchResult ? Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsearch ( query , Ġpage , ĠSearch Type . CHARACTER , ĠCharacter SearchResult :: class ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSearch Ġfor Ġan imes Ġfrom Ġa Ġkeywords Ġasynchronously ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġquery Ġkeywords Ġto Ġsearch Ġ( Must Ġbe Ġat Ġleast Ġ 3 Ġcharacters Ġlong ) ĊĠĠĠĠ Ġ* Ġ@ param Ġpage Ġresult Ġpage Ġto Ġget Ġ( Default Ġto Ġ 1 ) ĊĠĠĠĠ Ġ* Ġ@ param Ġcallback Ġresult Ġcallback ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġasync Search An imes ( query : ĠString , Ġpage : ĠInt Ġ= Ġ 1 , Ġcallback : ĠAn ime Search Callback ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġasync Search ( query , Ġpage , ĠSearch Type . AN IME , ĠAn ime SearchResult :: class , Ġcallback ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSearch Ġfor Ġm ang as Ġfrom Ġa Ġkeywords Ġasynchronously ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġquery Ġkeywords Ġto Ġsearch Ġ( Must Ġbe Ġat Ġleast Ġ 3 Ġcharacters Ġlong ) ĊĠĠĠĠ Ġ* Ġ@ param Ġpage Ġresult Ġpage Ġto Ġget Ġ( Default Ġto Ġ 1 ) ĊĠĠĠĠ Ġ* Ġ@ param Ġcallback Ġresult Ġcallback ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġasync Search M ang as ( query : ĠString , Ġpage : ĠInt Ġ= Ġ 1 , Ġcallback : ĠM anga Search Callback ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġasync Search ( query , Ġpage , ĠSearch Type . M ANG A , ĠM anga SearchResult :: class , Ġcallback ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSearch Ġfor Ġpersons Ġfrom Ġa Ġkeywords Ġasynchronously ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġquery Ġkeywords Ġto Ġsearch Ġ( Must Ġbe Ġat Ġleast Ġ 3 Ġcharacters Ġlong ) ĊĠĠĠĠ Ġ* Ġ@ param Ġpage Ġresult Ġpage Ġto Ġget Ġ( Default Ġto Ġ 1 ) ĊĠĠĠĠ Ġ* Ġ@ param Ġcallback Ġresult Ġcallback ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġasync Search Pers ons ( query : ĠString , Ġpage : ĠInt Ġ= Ġ 1 , Ġcallback : ĠPerson Search Callback ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġasync Search ( query , Ġpage , ĠSearch Type . PERSON , ĠPerson SearchResult :: class , Ġcallback ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSearch Ġfor Ġcharacters Ġfrom Ġa Ġkeywords Ġasynchronously ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġquery Ġkeywords Ġto Ġsearch Ġ( Must Ġbe Ġat Ġleast Ġ 3 Ġcharacters Ġlong ) ĊĠĠĠĠ Ġ* Ġ@ param Ġpage Ġresult Ġpage Ġto Ġget Ġ( Default Ġto Ġ 1 ) ĊĠĠĠĠ Ġ* Ġ@ param Ġcallback Ġresult Ġcallback ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġasync Search Characters ( query : ĠString , Ġpage : ĠInt Ġ= Ġ 1 , Ġcallback : ĠCharacter Search Callback ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġasync Search ( query , Ġpage , ĠSearch Type . CHARACTER , ĠCharacter SearchResult :: class , Ġcallback ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGeneric Ġsynchronous Ġsearch ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġ< T Ġ: ĠSearch Result <* >> Ġsearch ( query : ĠString , Ġpage : ĠInt , Ġsearch Type : ĠSearch Type , Ġresult Type : ĠK Class < out ĠT >): ĠT ? Ġ{ ĊĊĠĠĠĠĠĠĠ Ġif Ġ( query . length Ġ< Ġ 3 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" query Ġparameter Ġlength Ġmust Ġbe Ġhigher Ġthan Ġ 3 Ġcharacters ") ĊĊĠĠĠĠĠĠĠ Ġval Ġurl Ġ= ĠgetUrl ( search Type . canonical Name , Ġquery , Ġpage ) ĊĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= Ġclient . new Call ( Request . Builder (). url ( url ). build ()). execute () ĊĊĠĠĠĠĠĠĠ Ġreturn Ġnormalize Response ( response , Ġresult Type ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGeneric Ġasynchronous Ġsearch ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġasync Search ( query : ĠString , Ġpage : ĠInt , Ġsearch Type : ĠSearch Type , Ġresult Type : ĠK Class < out ĠSearch Result <* >>, Ġcallback : ĠSearch Callback < out ĠSearch Entry >) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġif Ġ( query . length Ġ< Ġ 3 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" query Ġparameter Ġlength Ġmust Ġbe Ġhigher Ġthan Ġ 3 Ġcharacters ") ĊĊĠĠĠĠĠĠĠ Ġval Ġurl Ġ= ĠgetUrl ( search Type . canonical Name , Ġquery , Ġpage ) ĊĊĠĠĠĠĠĠĠ Ġclient . new Call ( Request . Builder (). url ( url ). build ()). enqueue ( object Ġ: ĠCallback Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Failure ( call : ĠCall ?, Ġe : ĠIOException ?) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . on Failure ( call , Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Response ( call : ĠCall ?, Ġresponse : ĠResponse ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġnormalize Response ( response , Ġresult Type ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . on Response ( call , Ġresponse , Ġresult ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . on Failure ( call , Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġ< T Ġ: ĠSearch Result <* >> Ġnormalize Response ( response : ĠResponse , Ġresult Type : ĠK Class < out ĠT >): ĠT ? Ġ{ ĊĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( response . is Successful ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( response . body () Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm oshi . adapter ( result Type . java ). fromJson ( response . body () !!. string ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġnull ĊĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġnull ĊĠĠĠ Ġ} Ċ } Ċ