package Ġcom . are fb hr n . market pay . billing . query Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . os . Remote Exception Ċ import Ġcom . android . v ending . billing . I In App Billing Service Ċ import Ġcom . are fb hr n . market pay . billing . Billing Function Ċ import Ġcom . are fb hr n . market pay . callback . Purchase Query Callback Ċ import Ġcom . are fb hr n . market pay . config . Payment Configuration Ċ import Ġcom . are fb hr n . market pay . config . Security Check Ċ import Ġcom . are fb hr n . market pay . constant . Market Intent Ċ import Ġcom . are fb hr n . market pay . constant . Billing Ċ import Ġcom . are fb hr n . market pay . entity . Purchase Info Ċ import Ġcom . are fb hr n . market pay . exception . Result Not Ok ay Exception Ċ import Ġcom . are fb hr n . market pay . mapper . RawData To Purchase Info Ċ import Ġcom . are fb hr n . market pay . security . Purchase Verifier Ċ import Ġcom . are fb hr n . market pay . take If Ċ import Ġcom . are fb hr n . market pay . thread . Market Pay Thread Ċ Ċ internal Ġclass ĠQuery Function ( ĊĠĠĠ Ġprivate Ġval Ġraw DataTo Purchase Info : ĠRaw DataTo Purchase Info , ĊĠĠĠ Ġprivate Ġval Ġpurchase Verifier : ĠPurchase Verifier , ĊĠĠĠ Ġprivate Ġval Ġpayment Configuration : ĠPayment Configuration , ĊĠĠĠ Ġprivate Ġval Ġmain Thread : ĠMarket Pay Thread < () Ġ-> ĠUnit >, ĊĠĠĠ Ġprivate Ġval Ġcontext : ĠContext Ċ ) Ġ: ĠBilling Function < Query Function Request > Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġfunction ( ĊĠĠĠĠĠĠĠ Ġbilling Service : ĠI In App Billing Service , ĊĠĠĠĠĠĠĠ Ġrequest : ĠQuery Function Request ĊĠĠĠ Ġ): ĠUnit Ġ= Ġwith ( request ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcontinu ationToken : ĠString ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbilling Service . getP urchases ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBilling . IN _ APP _ B ILL ING _ VERSION , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . packageName , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpurchase Type . type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinu ationToken ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ?. take If ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis IsTrue Ġ= Ġ{ Ġbundle Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbundle . get ( Market Intent . RESPONSE _ CODE ) Ġ== ĠMarket Intent . RESPONSE _ RESULT _ OK ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġand IfNot Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmain Thread . execute Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPurchase Query Callback (). apply ( callback ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. query Failed ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. invoke ( Result Not Ok ay Exception ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ?. take If ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis IsTrue Ġ= Ġ{ Ġbundle Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbundle . containsKey ( Market Intent . RESPONSE _ PUR CH ASE _ ITEM _ LIST ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. and ( bundle . containsKey ( Market Intent . RESPONSE _ PUR CH ASE _ DATA _ LIST )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. and ( bundle . containsKey ( Market Intent . RESPONSE _ DATA _ SIGNATURE _ LIST )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. and ( bundle . getString ArrayList ( Market Intent . RESPONSE _ PUR CH ASE _ DATA _ LIST ) Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġand IfNot Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmain Thread . execute Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPurchase Query Callback (). apply ( callback ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. query Failed ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. invoke ( IllegalStateException (" Missing Ġdata Ġfrom Ġthe Ġreceived Ġresult ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ?. also Ġ{ Ġbundle Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinu ationToken Ġ= Ġbundle . getString ( Market Intent . RESPONSE _ CONT IN UATION _ TOKEN ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ?. let (:: extract Purchase d Data From Bundle )?. also Ġ{ Ġpurch ased Items Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmain Thread . execute Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPurchase Query Callback (). apply ( callback ). query Suc ceed . invoke ( purchase d Items ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġwhile Ġ(! continu ationToken . isNull Or Blank ()) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠRemoteException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmain Thread . execute Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPurchase Query Callback (). apply ( callback ). query Failed . invoke ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġextract Purchase d Data From Bundle ( bundle : ĠBundle ): ĠList < Purchase Info > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpurchase DataList : ĠList < String > Ġ= Ġbundle . getString ArrayList ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMarket Intent . RESPONSE _ PUR CH ASE _ DATA _ LIST ĊĠĠĠĠĠĠĠ Ġ) Ġ?: Ġempty List () ĊĠĠĠĠĠĠĠ Ġval Ġsignature DataList : ĠList < String > Ġ= Ġbundle . getString ArrayList ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMarket Intent . RESPONSE _ DATA _ SIGNATURE _ LIST ĊĠĠĠĠĠĠĠ Ġ) Ġ?: Ġempty List () ĊĠĠĠĠĠĠĠ Ġval Ġvalid P urchases Ġ= ĠArrayList < Purchase Info >( purchase DataList . size ) ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġpurchase DataList . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( payment Configuration . local Security Check Ġis ĠSecurity Check . Enable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Purchase Valid Ġ= Ġpurchase Verifier . verify Purchase ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpayment Configuration . local Security Check . rsa PublicKey , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpurchase DataList [ i ], ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsignature DataList [ i ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! is Purchase Valid ) Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalid P urchases Ġ+= Ġraw DataTo Purchase Info . map To Purchase Info ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpurchase DataList [ i ], ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsignature DataList [ i ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġvalid P urchases ĊĠĠĠ Ġ} Ċ Ċ }