package Ġcom . re venue cat . p urchases . amazon . handler Ċ Ċ import Ġcom . amazon . device . i ap . model . Product Ċ import Ġcom . amazon . device . i ap . model . Product Data Response Ċ import Ġcom . amazon . device . i ap . model . RequestId Ċ import Ġcom . re venue cat . p urchases . P urchases Error Ċ import Ġcom . re venue cat . p urchases . P urchases Error Callback Ċ import Ġcom . re venue cat . p urchases . P urchases ErrorCode Ċ import Ġcom . re venue cat . p urchases . amazon . Amazon Strings Ċ import Ġcom . re venue cat . p urchases . amazon . P urch asing ServiceProvider Ċ import Ġcom . re venue cat . p urchases . amazon . listener . Product Data Response Listener Ċ import Ġcom . re venue cat . p urchases . amazon . to Product Details Ċ import Ġcom . re venue cat . p urchases . common . Log Intent Ċ import Ġcom . re venue cat . p urchases . common . Product Details List Callback Ċ import Ġcom . re venue cat . p urchases . common . log Ċ import Ġcom . re venue cat . p urchases . models . Product Details Ċ Ċ class ĠProduct Data Handler ( ĊĠĠĠ Ġprivate Ġval Ġpurch asing ServiceProvider : ĠP urch asing ServiceProvider Ċ ) Ġ: ĠProduct Data Response Listener Ġ{ ĊĊĠĠĠ Ġdata Ġclass ĠRequest ( ĊĠĠĠĠĠĠĠ Ġval Ġsku List : ĠList < String >, ĊĠĠĠĠĠĠĠ Ġval Ġmarket place : ĠString , ĊĠĠĠĠĠĠĠ Ġval Ġon Receive : ĠProduct Details List Callback , ĊĠĠĠĠĠĠĠ Ġval ĠonError : ĠP urchases Error Callback ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġ@ get : Synchron ized ĊĠĠĠ Ġprivate Ġval Ġproduct Data Requests Ġ= Ġmutable Map Of < RequestId , ĠRequest >() ĊĊĠĠĠ Ġ@ get : Synchron ized ĊĠĠĠ Ġinternal Ġval Ġproduct Data Cache Ġ= Ġmutable Map Of < String , ĠProduct >() ĊĊĠĠĠ Ġoverride Ġfun Ġget Product Data ( ĊĠĠĠĠĠĠĠ Ġsk us : ĠSet < String >, ĊĠĠĠĠĠĠĠ Ġmarket place : ĠString , ĊĠĠĠĠĠĠĠ Ġon Receive : Ġ( List < Product Details >) Ġ-> ĠUnit , ĊĠĠĠĠĠĠĠ ĠonError : Ġ( P urchases Error ) Ġ-> ĠUnit ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlog ( Log Intent . DEBUG , ĠAmazon Strings . REQUEST ING _ PRODUCT S . format ( sk us . join ToString ())) ĊĊĠĠĠĠĠĠĠ Ġsynchronized ( this ) Ġ{ Ġproduct Data Cache . toMap () Ġ}. let Ġ{ Ġproduct Data Cache Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( product Data Cache . keys . contains All ( sk us )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcached Products : ĠMap < String , ĠProduct > Ġ= Ġproduct Data Cache . filter Keys Ġ{ Ġsk us . contains ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Successful Product Data Response ( cached Products , Ġmarket place , Ġon Receive ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġproduct Data RequestId Ġ= Ġpurch asing ServiceProvider . get Product Data ( sk us ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsynchronized ( this ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproduct Data Requests [ product Data RequestId ] Ġ= ĠRequest ( sk us . toList (), Ġmarket place , Ġon Receive , ĠonError ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Product Data Response ( response : ĠProduct Data Response ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlog ( Log Intent . DEBUG , ĠAmazon Strings . PRODUCT S _ REQUEST _ FINISHED . format ( response . request Status . name )) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( response . un available Sk us . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog ( Log Intent . DEBUG , ĠAmazon Strings . PRODUCT S _ REQUEST _ UN AVAILABLE . format ( response . un available Sk us )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval ĠrequestId Ġ= Ġresponse . requestId ĊĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= Ġsynchronized ( this ) Ġ{ Ġproduct Data Requests . remove ( requestId ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( request Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse Is Successful Ġ= Ġresponse . request Status Ġ== ĠProduct Data Response . Request Status . SUCCESS FUL ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( response Is Successful ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsynchronized ( this ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproduct Data Cache . put All ( response . product Data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Successful Product Data Response ( response . product Data , Ġrequest . marketplace , Ġrequest . on Receive ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Un successful Product Data Response ( response , Ġrequest . onError ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Successful Product Data Response ( ĊĠĠĠĠĠĠĠ Ġproduct Data : ĠMap < String , ĠProduct >, ĊĠĠĠĠĠĠĠ Ġmarket place : ĠString , ĊĠĠĠĠĠĠĠ Ġon Receive : ĠProduct Details List Callback ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlog ( Log Intent . DEBUG , ĠAmazon Strings . RE TR IE VED _ PRODUCT _ DATA . format ( product Data )) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( product Data . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog ( Log Intent . DEBUG , ĠAmazon Strings . RE TR IE VED _ PRODUCT _ DATA _ EMPTY ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġproduct Details List Ġ= Ġproduct Data . values . map Ġ{ Ġit . to Product Details ( marketplace ) Ġ} ĊĠĠĠĠĠĠĠ Ġon Receive ( product Details List ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Un successful Product Data Response ( ĊĠĠĠĠĠĠĠ Ġresponse : ĠProduct Data Response , ĊĠĠĠĠĠĠĠ ĠonError : ĠP urchases Error Callback ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġunderlying ErrorMessage Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( response . request Status Ġ== ĠProduct Data Response . Request Status . NOT _ SUPPORTED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Couldn 't Ġfetch Ġproduct Ġdata , Ġsince Ġit 's Ġnot Ġsupported ." ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Error Ġwhen Ġfetching Ġproduct Ġdata ." ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġpurch ases Error Ġ= ĠP urchases Error ( P urchases ErrorCode . Store Problem Error , Ġunderlying ErrorMessage ) ĊĊĠĠĠĠĠĠĠ ĠonError ( p urchases Error ) ĊĠĠĠ Ġ} Ċ } Ċ