package Ġcom . applic aster . i ap Ċ Ċ import Ġandroid . app . Activity Ċ import Ġandroid . content . Context Ċ import Ġandroid . util . Log Ċ import Ġcom . android . billing client . api .* Ċ import Ġcom . applic aster . i ap . security . Security Ċ Ċ /** Ċ Ġ* ĠMain Ġclass Ġfor Ġcommunication Ġbetween Ġbilling Ġlibrary Ġand Ġapp Ġcode Ċ Ġ*/ Ċ object ĠGoogle Billing Helper Ġ: ĠBilling Helper Ġ{ ĊĊĠĠĠ Ġprivate Ġval ĠTAG Ġ= ĠGoogle Billing Helper :: class . java . simple Name ĊĊĠĠĠ Ġ// ĠError Ġdescription Ġfields ĊĠĠĠ Ġprivate Ġconst Ġval ĠUSER _ C ANCE LED _ DESC Ġ= Ġ" User Ġcanceled Ġthe Ġrequest Ġthat Ġis Ġcurrently Ġtaking Ġplace " ĊĠĠĠ Ġprivate Ġconst Ġval ĠB ILL ING _ UN AVAILABLE _ DESC Ġ= Ġ" Version Ġfor Ġthe ĠBilling ĠAPI Ġis Ġnot Ġsupported Ġfor Ġthe Ġrequested Ġtype " ĊĠĠĠ Ġprivate Ġconst Ġval ĠDE VELO PER _ ERROR _ DESC Ġ= Ġ" Incorrect Ġarguments Ġhave Ġbeen Ġsent Ġto Ġthe ĠBilling ĠAPI " ĊĠĠĠ Ġprivate Ġconst Ġval ĠERROR _ DESC Ġ= Ġ" Error Ġoccurs Ġduring Ġthe ĠAPI Ġaction Ġbeing Ġexecuted " ĊĠĠĠ Ġprivate Ġconst Ġval ĠFEATURE _ NOT _ SUPPORTED _ DESC Ġ= Ġ" Requested Ġaction Ġis Ġnot Ġsupported Ġby Ġplay Ġservices Ġon Ġthe Ġcurrent Ġdevice " ĊĠĠĠ Ġprivate Ġconst Ġval ĠITEM _ AL READY _ OWN ED _ DESC Ġ= Ġ" Attempt Ġto Ġpurch ases Ġan Ġitem Ġthat Ġuser Ġalready Ġowns " ĊĠĠĠ Ġprivate Ġconst Ġval ĠITEM _ NOT _ OWN ED _ DESC Ġ= Ġ" Attempt Ġto Ġconsume Ġan Ġitem Ġthat Ġuser Ġdoes Ġnot Ġcurrently Ġown " ĊĠĠĠ Ġprivate Ġconst Ġval ĠITEM _ UN AVAILABLE _ DESC Ġ= Ġ" Attempt Ġto Ġpurchase Ġa Ġproduct Ġthat Ġis Ġnot Ġavailable Ġfor Ġpurchase " ĊĠĠĠ Ġprivate Ġconst Ġval ĠSERVICE _ DIS CONNECTED _ DESC Ġ= Ġ" Play Ġservice Ġis Ġnot Ġconnected Ġat Ġthe Ġpoint Ġof Ġthe Ġrequest " ĊĠĠĠ Ġprivate Ġconst Ġval ĠSERVICE _ TIMEOUT _ DESC Ġ= Ġ" The Ġrequest Ġhas Ġreached Ġthe Ġmaximum Ġtimeout Ġbefore ĠGoogle ĠPlay Ġrespon ds " ĊĠĠĠ Ġprivate Ġconst Ġval ĠSERVICE _ UN AVAILABLE _ DESC Ġ= Ġ" Error Ġoccurs Ġin Ġrelation Ġto Ġthe Ġdevices Ġnetwork Ġconnectivity " ĊĠĠĠ Ġprivate Ġconst Ġval ĠUN DEFINED _ ERROR _ DESC Ġ= Ġ" Undefined Ġerror " ĊĠĠĠ Ġprivate Ġconst Ġval ĠB LL ING _ SERVICE _ CONNECTION _ W AS _ LO ST Ġ= Ġ" Billing Ġservice Ġconnection Ġwas Ġlost " ĊĊĠĠĠ Ġprivate Ġvar Ġconnection Status : ĠConnection Status Ġ= ĠConnection Status . DIS CONNECTED ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġbilling Listener : ĠBilling Listener ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġbilling Client : ĠBilling Client ĊĊĠĠĠ Ġprivate Ġvar Ġis Mult it ype Query InProgress : ĠBoolean Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġval Ġcached Sku Details Ġ= Ġarray ListOf < Sku Details >() ĊĊĠĠĠ Ġoverride Ġfun Ġinit ( application Context : ĠContext , Ġcallback : ĠBilling Listener ) Ġ{ ĊĠĠĠĠĠĠĠ Ġbilling Listener Ġ= Ġcallback ĊĊĠĠĠĠĠĠĠ Ġval Ġbilling Client Builder Ġ= Ġwith ( Billing Client . newBuilder ( application Context )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġset ĠPurchase Updated Listener Ġto ĠBilling Client . Builder ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Listener Ġ{ Ġresponse Code , Ġpurch ases Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate P urchases ( response Code , Ġpurch ases ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// build Ġconfigured Ġbuilder Ġand Ġset Ġresult Ġto ĠBilling Ġclient Ġinstance ĊĠĠĠĠĠĠĠ Ġbilling Client Ġ= Ġbilling Client Builder . build () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġpurchase ( activity : ĠActivity , Ġsku Details : ĠSk u Details ) Ġ{ ĊĠĠĠĠĠĠĠ Ġexecute Flow Ġ{ Ġstart Purchase Flow ( activity , Ġsku Details ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġload Sku Details (@ Billing Client . Sku Type Ġsku Type : ĠString , Ġsk us List : ĠList < String >) Ġ{ ĊĠĠĠĠĠĠĠ Ġexecute Flow Ġ{ Ġquery Sku Details ( sku Type , Ġsk us List ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġload Sku Details ForAll Types ( sk us : ĠMap < String , ĠString >) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġfilter Ġitems Ġby ĠSk u Type ĊĠĠĠĠĠĠĠ Ġval Ġin apps Ġ= Ġsk us . filter Values Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsku Type Ġ-> Ġsku Type Ġ== ĠBilling Client . Sku Type . IN APP ĊĠĠĠĠĠĠĠ Ġ}. map Ġ{ Ġit . key Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġsubs Ġ= Ġsk us . filter Values Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsku Type Ġ-> Ġsku Type Ġ== ĠBilling Client . Sku Type . SUB S ĊĠĠĠĠĠĠĠ Ġ}. map Ġ{ Ġit . key Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// clear Ġcached Ġsku Ġdetails Ġbefore Ġquery Sku Details Ġcall ĊĠĠĠĠĠĠĠ Ġcached Sku Details . clear () ĊĊĠĠĠĠĠĠĠ Ġ// Ġexecute Ġflow Ġdepends Ġon Ġfiltered Ġitems Ġby ĠSk u Type ĊĠĠĠĠĠĠĠ Ġexecute Flow Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubs . isNotEmpty () Ġ&& Ġin apps . isEmpty () Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġquery Sku Details ( Billing Client . Sku Type . SUB S , Ġsubs ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubs . isEmpty () Ġ&& Ġin apps . isNotEmpty () Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġquery Sku Details ( Billing Client . Sku Type . IN APP , Ġin apps ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubs . isNotEmpty () Ġ&& Ġin apps . isNotEmpty () Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Mult it ype Query InProgress Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġquery Sku Details ( Billing Client . Sku Type . SUB S , Ġsubs ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġquery Sku Details ( Billing Client . Sku Type . IN APP , Ġin apps ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġrestore P urchases (@ Billing Client . Sku Type Ġsku Type : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġexecute Flow Ġ{ Ġbilling Listener . on P urchases Restore d ( query P urchases ( sku Type )) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġrestore P urchases ForAll Types () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrestored Subscriptions : ĠList < Purchase > Ġ= Ġquery P urchases ( Billing Client . Sku Type . SUB S ) ĊĠĠĠĠĠĠĠ Ġval Ġrestored In apps : ĠList < Purchase > Ġ= Ġquery P urchases ( Billing Client . Sku Type . IN APP ) ĊĠĠĠĠĠĠĠ Ġbilling Listener . on P urchases Restore d ( Ġrestored Subscriptions Ġ+ Ġrestored In apps ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġconsume ( purchase Item : ĠPurchase ) Ġ{ ĊĠĠĠĠĠĠĠ Ġexecute Flow Ġ{ Ġconsume Async ( purchase Item . purchase Token ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvalidate P urchases ( app PublicKey : ĠString , Ġpurch ases : ĠList < Purchase >) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġwe Ġshould Ġcheck Ġapp Ġpublic Ġkey Ġif Ġit 's Ġnot Ġempty Ġand Ġreturn Ġempty Ġlist Ġif Ġit Ġdoes ĊĠĠĠĠĠĠĠ Ġif Ġ( app PublicKey . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . w ( TAG , Ġ" App Ġpublic Ġkey Ġshould Ġbe Ġnot Ġempty !") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbilling Listener . on Purchase Loaded ( emptyList ()) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalid P urchases : ĠList < Purchase > Ġ= Ġpurch ases . filter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSecurity . verify Purchase ( app PublicKey , Ġit . original Json , Ġit . purchase Token ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbilling Listener . on Purchase Loaded ( valid P urchases ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠCheck Ġconnection Ġstatus Ġand Ġrun Ġblock Ġpassed Ġto Ġthis Ġfunction ĊĠĠĠ Ġ// ĠIf Ġthe Ġconnection Ġwasn 't Ġestablished Ġtry Ġto Ġestablish Ġconnection Ġand ĊĠĠĠ Ġ// Ġexecute Ġpassed Ġblock Ġafter Ġestablish ing Ġthe Ġconnection ĊĠĠĠ Ġprivate Ġfun Ġexecute Flow ( function : Ġ() Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( connection Status Ġ== ĠConnection Status . CONNECTED Ġ&& Ġbilling Client . is Ready ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġexecute Ġgiven Ġfunction Ġimmediately ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfunction () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġstart Ġthe Ġconnection Ġif Ġnot Ġconnected Ġalready Ġand Ġif Ġsuccess Ġcall Ġfunction ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Connection ( function ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// update Ġhandle Ġresponse Ġcode Ġand Ġupdate Ġpurch ases Ġif ĠResponse Code . OK ĊĠĠĠ Ġprivate Ġfun Ġupdate P urchases (@ Billing Client . Billing Response Ġresponse Code : ĠInt , Ġpurch ases : ĠList < Purchase > ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( response Code ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBilling Client . Billing Response . OK Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbilling Listener . on Purchase Loaded ( p urchases Ġ?: Ġarray ListOf ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbilling Listener . on Purchase Loading Failed ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse Code , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Error Result ( response Code ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ// Ġstart ĠGoogle Ġbilling Ġservice Ġconnection ĊĠĠĠ Ġprivate Ġfun Ġstart Connection ( function : Ġ() Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġbilling Client . start Connection ( object Ġ: ĠBilling Client State Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Billing Service Disconnected () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . w ( TAG , Ġ" Billing Ġservice Ġdisconnected ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconnection Status Ġ= ĠConnection Status . DIS CONNECTED ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbilling Listener . on Billing Client Error ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBilling Client . Billing Response . SERVICE _ DIS CONNECTED , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠB LL ING _ SERVICE _ CONNECTION _ W AS _ LO ST ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Billing Setup Finished (@ Billing Client . Billing Response Ġresponse Code : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i ( TAG , Ġ" Billing Ġsetup Ġfinished ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( response Code ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBilling Client . Billing Response . OK Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconnection Status Ġ= ĠConnection Status . CONNECTED ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfunction () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconnection Status Ġ= ĠConnection Status . DIS CONNECTED ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbilling Listener . on Billing Client Error ( response Code , Ġhandle Error Result ( response Code )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġquery P urchases (@ Billing Client . Sku Type Ġsku Type : ĠString ): ĠList < Purchase > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġbilling Client . query P urchases ( sku Type ) ĊĠĠĠĠĠĠĠ Ġ// if Ġresult Ġisn 't Ġnull Ġset Ġto Ġcallback Ġpurch ases Ġlist Ġelse Ġset Ġempty Ġlist ĊĠĠĠĠĠĠĠ Ġreturn Ġresult ?. p urchases List Ġ?: ĠlistOf () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġquery Sku Details ( sku Type : ĠString , Ġsk us List : ĠList < String >) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġsku Details Params : ĠSk u Details Params Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSk u Details Params . newBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setType ( sku Type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Sk us List ( sk us List ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠ Ġbilling Client . query Sku Details Async ( sku Details Params ) Ġ{ Ġresponse Code , Ġsku Details List Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( response Code ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBilling Client . Billing Response . OK Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// call Ġcallback Ġfunction Ġwith Ġresult Ġdepends Ġon Ġbilling Ġflow Ġstate ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Mult it ype Query InProgress ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġsave Ġobtained Ġitems Ġto Ġthe Ġcache Ġand Ġset Ġbilling Ġflow Ġto Ġfinished ( is Mult it ype Query InProgress Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcached Sku Details . addAll ( sku Details List ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Mult it ype Query InProgress Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbilling Listener . on Sku Details Loaded ( cached Sku Details Ġ+ Ġsku Details List ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcached Sku Details . clear () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Mult it ype Query InProgress Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcached Sku Details . clear () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbilling Listener . on Sku Details Loading Failed ( response Code , Ġhandle Error Result ( response Code )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstart Purchase Flow ( activity : ĠActivity , Ġsku Details : ĠSk u Details ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġflow Params Ġ= ĠBilling Flow Params ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. newBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Sku Details ( sku Details ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġbilling Client . launch Billing Flow ( activity , Ġflow Params ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġconsume Async ( purchase Token : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġbilling Client . consume Async ( purchase Token ) Ġ{ Ġresponse Code , Ġout Token Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( response Code ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBilling Client . Billing Response . OK Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbilling Listener . on Purchase Cons umed ( out Token ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbilling Listener . on Purchase Consumption Failed ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse Code , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Error Result ( response Code ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Error Result (@ Billing Client . Billing Response Ġresponse Code : ĠInt ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( response Code ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBilling Client . Billing Response . USER _ C ANCE LED Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . w ( TAG , ĠUSER _ C ANCE LED _ DESC ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUSER _ C ANCE LED _ DESC ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBilling Client . Billing Response . B ILL ING _ UN AVAILABLE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , ĠB ILL ING _ UN AVAILABLE _ DESC ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠB ILL ING _ UN AVAILABLE _ DESC ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBilling Client . Billing Response . DE VELO PER _ ERROR Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , ĠDE VELO PER _ ERROR _ DESC ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDE VELO PER _ ERROR _ DESC ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBilling Client . Billing Response . ERROR Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , ĠERROR _ DESC ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠERROR _ DESC ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBilling Client . Billing Response . FEATURE _ NOT _ SUPPORTED Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , ĠFEATURE _ NOT _ SUPPORTED _ DESC ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFEATURE _ NOT _ SUPPORTED _ DESC ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBilling Client . Billing Response . ITEM _ AL READY _ OWN ED Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . w ( TAG , ĠITEM _ AL READY _ OWN ED _ DESC ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠITEM _ AL READY _ OWN ED _ DESC ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBilling Client . Billing Response . ITEM _ NOT _ OWN ED Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . w ( TAG , ĠITEM _ NOT _ OWN ED _ DESC ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠITEM _ NOT _ OWN ED _ DESC ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBilling Client . Billing Response . ITEM _ UN AVAILABLE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . w ( TAG , ĠITEM _ UN AVAILABLE _ DESC ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠITEM _ UN AVAILABLE _ DESC ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBilling Client . Billing Response . SERVICE _ DIS CONNECTED Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , ĠSERVICE _ DIS CONNECTED _ DESC ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSERVICE _ DIS CONNECTED _ DESC ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBilling Client . Billing Response . SERVICE _ TIMEOUT Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , ĠSERVICE _ TIMEOUT _ DESC ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSERVICE _ TIMEOUT _ DESC ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBilling Client . Billing Response . SERVICE _ UN AVAILABLE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , ĠSERVICE _ UN AVAILABLE _ DESC ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSERVICE _ UN AVAILABLE _ DESC ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , ĠUN DEFINED _ ERROR _ DESC ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUN DEFINED _ ERROR _ DESC ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġenum Ġclass ĠConnection Status Ġ{ ĊĠĠĠĠĠĠĠ ĠCONNECT ED , ĠDIS CONNECTED ĊĠĠĠ Ġ} Ċ }