package Ġbr . edu . if pb . pho eb us _ mar vel _ store Ċ Ċ import Ġandroid . content . Intent Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . util . Log Ċ import Ġandroid . view . View Ċ import Ġandroid . widget . Adapter View Ċ import Ġandroid . widget . ListView Ċ import Ġandroid . widget . TextView Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġbr . edu . if pb . pho eb us _ mar vel _ store . config . Config Ċ import Ġbr . edu . if pb . pho eb us _ mar vel _ store . model . Com ic Book Ċ import Ġbr . edu . if pb . pho eb us _ mar vel _ store . ret rofit _ model . Com ics Model Ċ import Ġbr . edu . if pb . pho eb us _ mar vel _ store . ret rofit _ model . Result Ċ import Ġbr . edu . if pb . pho eb us _ mar vel _ store . network . Api Ċ Ċ import Ġkotlinx . android . synt hetic . main . activity _ main .* Ċ import Ġretrofit 2 . Call Ċ import Ġretrofit 2 . Callback Ċ import Ġretrofit 2 . Response Ċ import Ġretrofit 2 . Ret rofit Ċ import Ġretrofit 2 . converter . gson . Gson Converter Factory Ċ import Ġjava . lang . Exception Ċ import Ġjava . math . BigInteger Ċ import Ġjava . security . Message Digest Ċ import Ġjava . security . NoSuch AlgorithmException Ċ import Ġkotlin . random . Random Ċ Ċ class ĠMainActivity Ġ: ĠAppCompatActivity () Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġlist Com ics : ĠArrayList < Result > Ġ= Ġarray ListOf () ĊĠĠĠ Ġprivate Ġvar Ġlist Selected Ġ: ĠHashMap < Int , ĠCom ic Book > Ġ= Ġhash Map Of () ĊĠĠĠ Ġprivate Ġvar Ġlist R are Com ics Ġ: ĠArrayList < Int > Ġ= Ġarray ListOf () ĊĠĠĠ Ġprivate Ġlateinit Ġvar ĠlistView : ĠListView ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġtext App bar Ġ: ĠTextView ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ ĠsetContentView ( R . layout . activity _ main ) ĊĠĠĠĠĠĠĠ Ġset Support ActionBar ( toolbar ) ĊĊĠĠĠĠĠĠĠ Ġthis . list View Ġ= ĠfindViewById ( R . id . lv Main ) ĊĠĠĠĠĠĠĠ Ġthis . text App bar Ġ= ĠfindViewById ( R . id . tv App bar ) ĊĊĠĠĠĠĠĠĠ Ġfab . setOnClickListener Ġ{ Ġview Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġit Ġ= ĠIntent ( this , ĠCheckout Activity :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . putExtra (" SELECTED ", Ġlist Selected ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . putExtra (" R ARE ", Ġlist R are Com ics ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġget Com ics () ĊĠĠĠĠĠĠĠ ĠlistView . adapter Ġ= ĠCom ics Adapter ( this , Ġlist Com ics , Ġlist Selected , Ġlist R are Com ics ) ĊĠĠĠĠĠĠĠ ĠlistView . setOn ItemClickListener ( On Item Click List ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Com ics () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval ĠBASE _ URL Ġ= Ġ" http :// gateway . mar vel . com / v 1 / public /" ĊĠĠĠĠĠĠĠ Ġval ĠPUBLIC _ KEY Ġ= ĠConfig . Keys . PUBLIC _ KEY ĊĠĠĠĠĠĠĠ Ġval ĠPRIVATE _ KEY Ġ= ĠConfig . Keys . PRIVATE _ KEY ĊĊĠĠĠĠĠĠĠ Ġval Ġts Ġ= ĠSystem . currentTimeMillis (). toString () ĊĠĠĠĠĠĠĠ Ġvar Ġhash Ġ= Ġgenerator Md 5 ( ts , ĠPUBLIC _ KEY , ĠPRIVATE _ KEY ) ĊĊĠĠĠĠĠĠĠ Ġval Ġretrofit Ġ= ĠRet rofit . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. baseUrl ( BASE _ URL ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Converter Factory ( Gson Converter Factory . create ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠ Ġval Ġservice Ġ= Ġretrofit . create ( Api :: class . java ) ĊĠĠĠĠĠĠĠ Ġval Ġcallback Ġ= Ġservice . get Com ics ( PUBLIC _ KEY , Ġts , Ġhash ) ĊĊĠĠĠĠĠĠĠ Ġcallback . enqueue ( object Ġ: ĠCallback < Com ics Model > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Response ( call : ĠCall < Com ics Model >, Ġresponse : ĠResponse < Com ics Model >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( response . is Successful ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( response . body () Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcom ic Response Ġ= Ġresponse . body () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist Com ics . addAll ( com ic Response ?. data !!. results ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist R are Com ics . addAll ( getRandom R are Com ics ( list Com ics . size )) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( this @ MainActivity . list View . adapter Ġas ĠCom ics Adapter ). update () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e (" APP _ MAR VEL ", Ġ" Response Ġerror Ġor Ġnull ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e (" APP _ MAR VEL ", Ġ" Response Ġwasn 't Ġsuccessful .\ n ${ response . raw () }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Failure ( call : ĠCall < Com ics Model >, Ġt : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e (" APP _ MAR VEL ", Ġ" On Ġfailure Ġ${ t }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠgetRandom R are Com ics ( size : ĠInt ): ĠMutable Set < Int > Ġ{ ĊĠĠĠĠĠĠĠ Ġvar ĠnumberOf R are Com ics Ġ= ĠMath . floor ( size Ġ* Ġ 0 . 1 2 ). toInt () ĊĠĠĠĠĠĠĠ Ġvar ĠlistOf R are Ġ: ĠMutable Set < Int > Ġ= Ġmutable Set Of () ĊĊĠĠĠĠĠĠĠ Ġfor ( i Ġin Ġ 1 .. numberOf R are Com ics ){ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf R are . add ( Random . nextInt ( 0 , Ġsize )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠlistOf R are ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerator Md 5 ( ts : ĠString , ĠPUBLIC _ KEY : ĠString , ĠPRIVATE _ KEY : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmd Ġ= ĠMessage Digest . getInstance (" MD 5 ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmessage Digest Ġ= Ġmd . digest ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġts . toByteArray () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ ĠPRIVATE _ KEY . toByteArray () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ ĠPUBLIC _ KEY . toByteArray () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġno Ġ= ĠBigInteger ( 1 , Ġmessage Digest ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġhas ht ext Ġ= Ġno . toString ( 1 6 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( hasht ext . length Ġ< Ġ 3 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhas ht ext Ġ= Ġ" 0 $ hasht ext " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġhas ht ext ĊĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠNoSuch AlgorithmException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException ( e ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinner Ġclass ĠOn Item Click List Ġ: ĠAdapter View . On ItemClickListener Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Item Click ( parent : ĠAdapter View < *> ?, Ġview : ĠView ?, Ġposition : ĠInt , Ġid : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcom ic Ġ= Ġlist Com ics . get ( position ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcom ic Selected Ġ: ĠCom ic Book ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcom ic Selected Ġ= ĠCom ic Book ( com ic . title , Ġcom ic . prices . get ( 0 ). price ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e Ġ: ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcom ic Selected Ġ Ġ= ĠCom ic Book ( com ic . title , Ġ" 0 . 0 0 ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i (" APP _ MAR VEL ", Ġ" Che g ou Ġno Ġcatch Ġ${ e . printStackTrace () }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( list Selected . get ( position ) Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ MainActivity . list Selected . remove ( position ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} else Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ MainActivity . list Selected . put ( position , Ġcom ic Selected ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} catch Ġ( e Ġ: ĠException ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġtotal Cost Select Ġ: ĠDouble Ġ= Ġ 0 . 0 ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor ( entries Ġin Ġlist Selected ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtotal Cost Select Ġ+= Ġentries . value . price . toDouble () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( list Selected . size Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ MainActivity . text App bar . text Ġ= Ġ" Selected Ġ${ this @ MainActivity . list Selected . size } Ġcom ic ( s ). ĠOrder Ġtotal Ġ$ ${ total Cost Select }" ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ MainActivity . text App bar . text Ġ= Ġ" Touch Ġthe Ġcom ic Ġto Ġadd Ġit Ġto Ġthe Ġcart " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( this @ MainActivity . list View . adapter Ġas ĠCom ics Adapter ). update () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }