package Ġorg . edx . mobile . in ap pp urchases Ċ Ċ import Ġandroid . app . Activity Ċ import Ġandroid . content . Context Ċ import Ġandroid . os . Handler Ċ import Ġandroid . os . Looper Ċ import Ġcom . android . billing client . api .* Ċ import Ġorg . edx . mobile . logger . Logger Ċ Ċ /** Ċ Ġ* ĠThe ĠBilling Processor Ġimplements Ġall Ġbilling Ġfunctionality Ġfor Ġapplication . Ċ Ġ* ĠP urchases Ġcan Ġhappen Ġwhile Ġin Ġthe Ġapp . Ċ Ġ* Ċ Ġ* ĠThis ĠBilling Processor Ġknows Ġnothing Ġabout Ġthe Ġapplication , Ġall Ġnecessary Ġinformation Ġis Ġeither Ċ Ġ* Ġpassed Ġinto Ġthe Ġconstructor , Ġexported Ġas Ġobservable ĠFlow s , Ġor Ġexported Ġthrough Ġcallbacks . Ċ Ġ* Ċ Ġ* ĠIn sp iration : Ġ[ https :// github . com / android / play - billing - samples / blob / master / T rivial Drive Kotlin / app / src / main / java / com / sample / android / trivial d rives ample / billing / Billing DataSource . kt ] Ċ Ġ* Ġ*/ Ċ class ĠBilling Processor ( val Ġcontext : ĠContext , Ġval Ġlistener : ĠBilling Flow Listeners ?) Ġ: ĊĠĠĠ ĠP urchases Updated Listener , ĊĠĠĠ ĠBilling Client State Listener Ġ{ ĊĊĠĠĠ Ġprivate Ġval ĠTAG Ġ= ĠBilling Processor :: class . java . simple Name ĊĠĠĠ Ġprivate Ġval Ġlogger Ġ= ĠLogger ( TAG ) ĊĊĠĠĠ Ġprivate Ġvar ĠRE CONNECT _ TIMER _ START _ MILLISECONDS Ġ= Ġ 1 L Ġ* Ġ 1 0 0 0 L ĊĠĠĠ Ġprivate Ġval ĠRE CONNECT _ MAX _ COUNT Ġ= Ġ 3 Ġ// Ġretry Ġconnection Ġmax Ġcount ĊĊĠĠĠ Ġprivate Ġval Ġhandler Ġ= ĠHandler ( Looper . get Main Looper ()) ĊĠĠĠ Ġprivate Ġvar Ġconnection Try Count Ġ= Ġ 0 ĊĊĠĠĠ Ġ// ĠBilling Ġclient , Ġconnection , Ġcached Ġdata ĊĠĠĠ Ġprivate Ġval Ġbilling Client : ĠBilling Client Ġ= ĠBilling Client . newBuilder ( context ) ĊĠĠĠĠĠĠĠ Ġ. set Listener ( this ) ĊĠĠĠĠĠĠĠ Ġ. enable Pending P urchases () ĊĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġbilling Client . start Connection ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Billing Setup Finished ( billing Result : ĠBilling Result ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlogger . debug ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Billing Setup Finished Ġ-> ĠResponse Ġcode : Ġ" Ġ+ Ġbilling Result . response Code . toString () Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ĠDebug Ġmessage : Ġ" Ġ+ Ġbilling Result . debug Message ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġlistener ?. on Billing Setup Finished ( billing Result ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThis Ġis Ġa Ġpretty Ġun usual Ġoccurrence . ĠIt Ġhappens Ġprimarily Ġif Ġthe ĠGoogle ĠPlay ĠStore ĊĠĠĠĠ Ġ* Ġself - upgrade s Ġor Ġis Ġforce Ġclosed . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġon Billing Service Disconnected () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( connection Try Count Ġ> ĠRE CONNECT _ MAX _ COUNT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconnection Try Count ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġretry Billing Service Connection With Exponent ial Backoff () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlistener ?. on Billing Service Disconnected () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCalled Ġby Ġthe ĠBilling Library Ġwhen Ġnew Ġpurch ases Ġare Ġdetected ; Ġtypically Ġin Ġresponse Ġto Ġa ĊĠĠĠĠ Ġ* Ġlaunch Billing Flow . ĊĠĠĠĠ Ġ* Ġ@ param Ġbilling Result Ġresult Ġof Ġthe Ġpurchase Ġflow . ĊĠĠĠĠ Ġ* Ġ@ param Ġlist Ġof Ġnew Ġpurch ases . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġon P urchases Updated ( ĊĠĠĠĠĠĠĠ Ġbilling Result : ĠBilling Result , ĊĠĠĠĠĠĠĠ Ġpurch ases : ĠMutable List < Purchase >? ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( p urchases Ġ!= Ġnull Ġ&& Ġ! p urchases [ 0 ]. is Ack nowled ged ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġacknowledge Purchase ( p urchases [ 0 ]) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( p urchases Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlistener ?. on Purchase Cancel () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCalled Ġto Ġpurchase Ġthe Ġnew Ġproduct . ĠQuery Ġthe Ġproduct Ġdetails Ġand Ġlaunch Ġthe Ġpurchase Ġflow . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġactivity Ġactive Ġactivity Ġto Ġlaunch Ġour Ġbilling Ġflow Ġfrom ĊĠĠĠĠ Ġ* Ġ@ param ĠproductId ĠSK U Ġ( Product ĠID ) Ġto Ġbe Ġpurch ased ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġpurchase Item ( activity : ĠActivity , ĠproductId : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( billing Client . is Ready ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthis Ġblock Ġof Ġcode Ġis Ġonly Ġfor Ġtest Ġpurpose Ġonly Ġhave Ġto Ġremove Ġbefore Ġmerging Ġit . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbilling Client . query P urchases Async ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBilling Client . Sku Type . IN APP ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ Ġ_, Ġpurch ases Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( p urchases . size Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconsume Purchase ( p urchases [ 0 ]. purchase Token ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġquery Sync Details ( productId , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSk u Details Response Listener Ġ{ Ġbilling Result , Ġsku Details List Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . debug ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Getting ĠP urchases Ġ-> ĠResponse Ġcode : Ġ" Ġ+ Ġbilling Result . response Code . toString () Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ĠDebug Ġmessage : Ġ" Ġ+ Ġbilling Result . debug Message ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( sku Details List Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlaunch Billing Flow ( activity , Ġsku Details List [ 0 ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠLaunch Ġthe Ġbilling Ġflow . ĠThis Ġwill Ġlaunch Ġan Ġexternal ĠActivity Ġfor Ġa Ġresult , Ġso Ġit Ġrequires ĊĠĠĠĠ Ġ* Ġan ĠActivity Ġreference . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġactivity Ġactive Ġactivity Ġto Ġlaunch Ġour Ġbilling Ġflow Ġfrom ĊĠĠĠĠ Ġ* Ġ@ param Ġsku Detail ĠSK U Ġ( Product ) Ġto Ġbe Ġpurch ased ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġlaunch Billing Flow ( activity : ĠActivity , Ġsku Detail : ĠSk u Details ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbilling Flow Params Builder Ġ= ĠBilling Flow Params . newBuilder () ĊĠĠĠĠĠĠĠ Ġbilling Flow Params Builder . set Sku Details ( sku Detail ) ĊĠĠĠĠĠĠĠ Ġbilling Client . launch Billing Flow ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġactivity , Ġbilling Flow Params Builder . build () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAck nowledge Ġnew Ġpurch ases Ġare Ġones Ġnot Ġyet Ġacknowled ged . ĊĠĠĠĠ Ġ* Ġ@ param Ġpurchase Ġnew Ġpurchase ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġacknowledge Purchase ( purchase : ĠPurchase ) Ġ{ ĊĠĠĠĠĠĠĠ Ġbilling Client . ack nowledge Purchase ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAck nowledge Purchase Params . newBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Purchase Token ( purchase . purchase Token ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġ) Ġ{ Ġbilling Result : ĠBilling Result Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( billing Result . response Code Ġ== ĠBilling Client . Billing Response Code . OK ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . debug ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ack nowledge Purchase Ġ-> Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Response Ġcode : Ġ" Ġ+ Ġbilling Result . response Code . toString () Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ĠDebug Ġmessage : Ġ" Ġ+ Ġbilling Result . debug Message ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlistener ?. on Purchase Complete ( purchase ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRet ries Ġthe Ġbilling Ġservice Ġconnection Ġwith Ġexponential Ġbackoff . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġretry Billing Service Connection With Exponent ial Backoff () Ġ{ ĊĠĠĠĠĠĠĠ Ġhandler . post Delayed ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġbilling Client . start Connection ( this @ Billing Processor ) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRE CONNECT _ TIMER _ START _ MILLISECONDS ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġconsume Purchase ( purchase Token : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġbilling Client . consume Async ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCons ume Params . newBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Purchase Token ( purchase Token ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġ) Ġ{ Ġbilling Result , Ġ_ Ġ-> Ġlogger . debug ( billing Result . response Code . toString () Ġ+ Ġbilling Result . debug Message ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCalls Ġthe Ġbilling Ġclient Ġfunctions Ġto Ġquery Ġsku Ġdetails Ġfor Ġin app ĠSK Us . ĠSK U Ġdetails Ġare ĊĠĠĠĠ Ġ* Ġuseful Ġfor Ġdisplaying Ġitem Ġnames Ġand Ġprice Ġlists Ġto Ġthe Ġuser , Ġand Ġare Ġrequired Ġto Ġmake Ġa ĊĠĠĠĠ Ġ* Ġpurchase . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param ĠproductId ĠSK U Ġof Ġthe Ġproduct ĊĠĠĠĠ Ġ* Ġ@ param Ġlistener Ġ[ Sku Details Response Listener ] ĊĠĠĠĠ Ġ* Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġquery Sync Details ( productId : ĠString , Ġlistener : ĠSk u Details Response Listener ) Ġ{ ĊĠĠĠĠĠĠĠ Ġbilling Client . query Sku Details Async ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSk u Details Params . newBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setType ( Billing Client . Sku Type . IN APP ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Sk us List ( listOf ( productId )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build (), Ġlistener ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCloses Ġthe Ġconnection Ġand Ġreleases Ġall Ġheld Ġresources Ġsuch Ġas Ġservice Ġconnections . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġdisconnect () Ġ{ ĊĠĠĠĠĠĠĠ Ġbilling Client . end Connection () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinterface ĠBilling Flow Listeners Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġon Billing Service Disconnected () Ġ{} ĊĊĠĠĠĠĠĠĠ Ġfun Ġon Billing Setup Finished ( billing Result : ĠBilling Result ) Ġ{} ĊĊĠĠĠĠĠĠĠ Ġfun Ġon Purchase Cancel () ĊĊĠĠĠĠĠĠĠ Ġfun Ġon Purchase Complete ( purchase : ĠPurchase ) ĊĠĠĠ Ġ} Ċ } Ċ