package Ġcom . inf usion sof gr ande ur . lo o tra ider . Managers Ċ Ċ import Ġandroid . os . Bundle Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġcom . android . billing client . api .* Ċ import Ġcom . google . firebase . analytics . Firebase Analytics Ċ import Ġcom . google . firebase . analytics . k tx . analytics Ċ import Ġcom . google . firebase . k tx . Firebase Ċ import Ġcom . inf usion sof gr ande ur . io gin f rastructure . Managers . Configuration . Io G Configuration Manager Ċ import Ġcom . inf usion sof gr ande ur . io gin f rastructure . Managers . Persistence . Io G Persistence Manager Ċ import Ġkotlinx . coroutines . launch Ċ import Ġkotlinx . coroutines . run Blocking Ċ Ċ object ĠI AP Manager : ĠP urchases Updated Listener , ĠP urchases Response Listener Ċ { ĊĊĠĠĠ Ġdata Ġclass ĠEx tras Item ( val Ġtitle : ĠString , Ġval Ġdescription : ĠString , Ġval Ġprice : ĠString , Ġval Ġsku : ĠString , Ġval Ġsku Details : ĠSk u Details ) ĊĠĠĠ Ġ{} ĊĊĠĠĠ Ġinterface ĠI AP Delegate ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġproducts Retrie ved ( products : ĠList < Extras Item >) ĊĠĠĠĠĠĠĠ Ġfun Ġpurch ases Updated ( purchase d Products : ĠList < Purchase >) ĊĠĠĠĠĠĠĠ Ġfun Ġpurchase Cancelled () ĊĠĠĠĠĠĠĠ Ġfun Ġpurchase Failed () ĊĠĠĠĠĠĠĠ Ġfun Ġpurch ases Retrie ved ( purchase d Products : ĠList < Purchase >) ĊĠĠĠĠĠĠĠ Ġfun Ġpurchase Retrie val Failed () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġbilling Client : ĠBilling Client ĊĠĠĠ Ġprivate Ġval Ġpurchase Update Listener : ĠP urchases Updated Listener ĊĠĠĠ Ġprivate Ġvar Ġready Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġwaiting For Connection Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġwaiting For P urchases Ġ= Ġfalse ĊĠĠĠ Ġvar Ġproduct List Ġ= Ġmutable ListOf < Extras Item >() ĊĠĠĠ Ġvar Ġpur ca h sed Product List Ġ= Ġmutable ListOf < Purchase >() ĊĠĠĠ Ġlateinit Ġvar Ġactivity : ĠAppCompatActivity ĊĊĠĠĠ Ġlateinit Ġvar Ġdelegate : ĠI AP Delegate ĊĊĠĠĠ Ġprivate Ġvar Ġfirebase Analytics : ĠFirebase Analytics ĊĊĠĠĠ Ġinit ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġpurchase Update Listener Ġ= Ġ ĠP urchases Updated Listener Ġ{ Ġbilling Result , Ġpurch ases Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Purchase ( billing Result , Ġpurch ases ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġbilling Client Ġ= ĠBilling Client . newBuilder ( Configuration Manager . get AppContext ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Listener ( purchase Update Listener ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. enable Pending P urchases () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠ Ġ// ĠObtain Ġthe ĠFirebase Analytics Ġinstance . ĊĠĠĠĠĠĠĠ Ġfirebase Analytics Ġ= ĠFirebase . analytics ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinitiate Connection () Ġ{ ĊĠĠĠĠĠĠĠ Ġbilling Client . start Connection ( object Ġ: ĠBilling Client State Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Billing Setup Finished ( billing Result : ĠBilling Result ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( billing Result . response Code Ġ== ĠBilling Client . Billing Response Code . OK ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġready Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( waiting For Connection ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwaiting For Connection Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġretrieve Products () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ( waiting For P urchases ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwaiting For P urchases Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġretrieve P urchases () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Billing Service Disconnected () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġready Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġretrieve Products () ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! ready ) ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwaiting For Connection Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinitiate Connection () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsku List Ġ= ĠArrayList < String >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparams Ġ= ĠSk u Details Params . newBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsku List . add ( Configuration Manager . unlock All Levels Identifier ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsku List . add ( Configuration Manager . levels 7 Through 1 2 Identifier ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsku List . add ( Configuration Manager . levels 1 3 Through 1 8 Identifier ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsku List . add ( Configuration Manager . levels 1 9 Through 2 4 Identifier ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsku List . add ( Configuration Manager . levels 2 5 Through 3 0 Identifier ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsku List . add ( Configuration Manager . levels 7 Through 3 0 Identifier ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsku List . add ( Configuration Manager . levels 7 Through 3 0 And O OP Identifier ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparams . set Sk us List ( sku List ). setType ( Billing Client . Sku Type . IN APP ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġbilling Client ?. query Sku Details Async ( params . build ()) Ġ{ Ġbilling Result , Ġsku Details List Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠProcess Ġthe Ġresult . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( billing Result . response Code Ġ== ĠBilling Client . Billing Response Code . OK Ġ&& Ġ! sku Details List . isNull OrEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproduct List . clear () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( sku Details Ġin Ġsku Details List ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproduct List . add ( Extras Item ( sku Details . title . replace ("( Lo ot ĠRa ider )", Ġ"", Ġtrue ). trim (), Ġsku Details . description , Ġsku Details . price , Ġsku Details . sku , Ġsku Details )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġretrieve P urchases () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( delegate Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelegate . products Retrie ved ( product List ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġretrieve P urchases () ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! ready ) ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwaiting For P urchases Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinitiate Connection () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbilling Client ?. query P urchases Async ( Billing Client . Sku Type . IN APP , Ġthis ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget NumberOf Available Extras (): ĠInt ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġproduct List . size ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġbuy Product ( extra : ĠEx tras Item ) ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġflow Params Ġ= ĠBilling Flow Params . newBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Sku Details ( extra . sku Details ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġfirebase Analytics . log Event (" Purchase Initi ated ", ĠBundle (). apply Ġ{ putString ( Firebase Analytics . Param . ITEM _ ID , Ġextra . sku )}) ĊĠĠĠĠĠĠĠ Ġval Ġresponse Code Ġ= Ġbilling Client . launch Billing Flow ( activity , Ġflow Params ). response Code ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġacknowledge Purchase ( purchase : ĠPurchase ) ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġacknowledge Purchase Params Ġ= ĠAck nowledge Purchase Params . newBuilder (). set Purchase Token ( purchase . purchase Token ) ĊĠĠĠĠĠĠĠ Ġbilling Client . ack nowledge Purchase ( ack nowledge Purchase Params . build ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon P urchases Updated ( billing Result : ĠBilling Result , Ġpurch ases : ĠList < Purchase > ?) ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġprocess Purchase ( billing Result , Ġpurch ases ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Query P urchases Response ( billing Result : ĠBilling Result , Ġpurch ases : ĠMutable List < Purchase >) ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( billing Result . response Code Ġ== ĠBilling Client . Billing Response Code . OK Ġ&& Ġpurch ases Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpur ca h sed Product List . addAll ( p urchases . toList ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( purchase Ġin Ġpurch ases ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! purchase . is Ack nowled ged ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ launch Ġ{ ack nowledge Purchase ( purchase )}} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( delegate Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelegate . p urchases Retrie ved ( pur ca h sed Product List ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( purchase Ġin Ġpurch ases ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( sku Ġin Ġpurchase . sk us ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFirst Ġsee Ġif Ġwe Ġneed Ġto Ġenable Ġunlock Ġof Ġall Ġlevels ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( sku Ġ== ĠConfiguration Manager . unlock All Levels Identifier ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠConfiguration Manager . unlock All Levels Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ( sku Ġ== ĠConfiguration Manager . levels 7 Through 3 0 And O OP Identifier ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠConfiguration Manager . unlock All Levels Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThen Ġadd Ġwhatever Ġextra Ġwas Ġpurch ased Ġto Ġstorage ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Io G Persistence Manager . get Shared Manager (). check ForValue ( Configuration Manager . persistence Item Purchase d Items , ĠIo G Persistence Manager . Persistence Source . SharedPreferences )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpurch ased Items Response Ġ= ĠIo G Persistence Manager . get Shared Manager (). readValue ( Configuration Manager . persistence Item Purchase d Items , ĠIo G Persistence Manager . Persistence Source . SharedPreferences ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpurch ased Item Entries Ġ= Ġpurch ased Items Response . get ( Io G Configuration Manager . persistence Read Result Value ) Ġas ĠList < String > ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġadd Item Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( next Item Ġin Ġpurch ased Item Entries ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( next Item Ġ== Ġsku ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Item Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( addItem ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġnew Entries Ġ= Ġpurch ased Item Entries . to Mutable List () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Entries . add ( sku ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIo G Persistence Manager . get Shared Manager (). save Value ( Configuration Manager . persistence Item Purchase d Items , Ġnew Entries , ĠIo G Persistence Manager . Persistence DataType . Array , ĠIo G Persistence Manager . Persistence Source . SharedPreferences , ĠIo G Persistence Manager . Persistence Protection Level . Un sec ured , ĠIo G Persistence Manager . Persistence L if es pan . Imm ort al , Ġnull , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġnew Entries Ġ= Ġmutable ListOf < String >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Entries . add ( sku ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIo G Persistence Manager . get Shared Manager (). save Value ( Configuration Manager . persistence Item Purchase d Items , Ġnew Entries , ĠIo G Persistence Manager . Persistence DataType . Array , ĠIo G Persistence Manager . Persistence Source . SharedPreferences , ĠIo G Persistence Manager . Persistence Protection Level . Un sec ured , ĠIo G Persistence Manager . Persistence L if es pan . Imm ort al , Ġnull , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( delegate Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelegate . purchase Retrie val Failed () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġprocess Purchase ( billing Result : ĠBilling Result , Ġpurch ases : ĠList < Purchase > ?) ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( billing Result . response Code Ġ== ĠBilling Client . Billing Response Code . OK Ġ&& Ġpurch ases Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpur ca h sed Product List . addAll ( p urchases . toList ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( purchase Ġin Ġpurch ases ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! purchase . is Ack nowled ged ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ launch Ġ{ ack nowledge Purchase ( purchase )}} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfirebase Analytics . log Event (" Completed Purchase ", ĠBundle (). apply Ġ{ putString ( Firebase Analytics . Param . ITEM _ ID , Ġpurchase . sk us . toString ()) }) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelegate ?. p urchases Updated ( pur ca h sed Product List ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġif Ġ( billing Result . response Code Ġ== ĠBilling Client . Billing Response Code . USER _ C ANCE LED ) ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠHandle Ġan Ġerror Ġcaused Ġby Ġa Ġuser Ġcancell ing Ġthe Ġpurchase Ġflow . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfirebase Analytics . log Event (" Purchase Cancelled ", Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelegate ?. purchase Cancelled () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠHandle Ġany Ġother Ġerror Ġcodes . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( p urchases Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( purchase Ġin Ġpurch ases ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfirebase Analytics . log Event (" Purchase Failed ", ĠBundle (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput String ( Firebase Analytics . Param . ITEM _ ID , Ġpurchase . sk us . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Int (" Error ", Ġbilling Result . response Code )}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelegate ?. purchase Failed () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }