package Ġcom . red bean lat te 1 1 . fact checker . util Ċ Ċ import Ġandroid . app . Activity Ċ import Ġcom . android . billing client . api .* Ċ import Ġtim ber . log . Tim ber Ċ import Ġjava . util . concurrent . Concurrent HashMap Ċ import Ġjava . util . concurrent . Concurrent Map Ċ Ċ class ĠBilling Manager ( ĊĠĠĠ Ġprivate Ġval Ġactivity : ĠActivity Ċ ) Ġ: ĠP urchases Updated Listener Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġsku Details Map : ĠConcurrent Map < String , ĠSk u Details > Ġ= ĠConcurrent HashMap () ĊĊĠĠĠ Ġprivate Ġvar Ġbilling Client : ĠBilling Client Ġ= ĠBilling Client . newBuilder ( activity ) ĊĠĠĠĠĠĠĠ Ġ. enable Pending P urchases () ĊĠĠĠĠĠĠĠ Ġ. set Listener ( this ) ĊĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠ Ġprivate Ġvar Ġon Purchase Finished : Ġ(() Ġ-> ĠUnit )? Ġ= Ġnull ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġbilling Client . start Connection ( object Ġ: ĠBilling Client State Listener Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Billing Setup Finished ( billing Result : ĠBilling Result ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" on Billing Setup Finished , Ġresponse Code : Ġ${ billing Result . response Code }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( billing Result . response Code Ġ== ĠBilling Client . Billing Response Code . OK ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Sku Details List () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Billing Service Disconnected () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" on Billing Service Disconnected ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Sku Details List () Ġ{ ĊĠĠĠĠĠĠĠ ĠTim ber . d (" get Sku Details List ") ĊĠĠĠĠĠĠĠ Ġif Ġ( billing Client . is Ready ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsku List Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSK U _ ID _ CO FF EE _ 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSK U _ ID _ CO FF EE _ 2 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSK U _ ID _ CO FF EE _ 3 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSK U _ ID _ CO FF EE _ 4 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSK U _ ID _ CO FF EE _ 5 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparams Ġ= ĠSk u Details Params . newBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Sk us List ( sku List ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setType ( Billing Client . Sku Type . IN APP ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġbilling Client . query Sku Details Async ( params ) Ġ{ Ġbilling Result , Ġsku Details List Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( billing Result . response Code Ġ== ĠBilling Client . Billing Response Code . OK ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" query Sku Details Async , Ġresponse Code : Ġ${ billing Result . response Code }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( sku Details List . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . w (" sku Details List Ġis Ġempty ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ query Sku Details Async ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsku Details List . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsku Details Map [ it . sku ] Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . w (" Billing Client Ġnot Ġready ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġpurchase ( sku Id : ĠString , Ġon Purchase Finished : Ġ() Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ ĠTim ber . d (" purchase : Ġ$ sku Id ") ĊĠĠĠĠĠĠĠ Ġthis . on Purchase Finished Ġ= Ġon Purchase Finished ĊĠĠĠĠĠĠĠ Ġval Ġsku Details Ġ= Ġsku Details Map [ sku Id ] ĊĊĠĠĠĠĠĠĠ Ġsku Details ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbilling Flow Params Ġ= ĠBilling Flow Params ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. newBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Sku Details ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbilling Client . launch Billing Flow ( activity , Ġbilling Flow Params ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon P urchases Updated ( billing Result : ĠBilling Result , Ġpurch ases : ĠList < Purchase > ?) Ġ{ ĊĠĠĠĠĠĠĠ ĠTim ber . d (" on P urchases Updated : Ġ${ billing Result . response Code }") ĊĠĠĠĠĠĠĠ Ġif Ġ( billing Result . response Code Ġ== ĠBilling Client . Billing Response Code . OK ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Purchase Finished ?. invoke () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġallow Multiple P urchases ( p urchases ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġallow Multiple P urchases ( p urchases : ĠList < Purchase > ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpurchase Ġ= Ġpurch ases ?. first () ĊĠĠĠĠĠĠĠ Ġif Ġ( purchase Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconsume Params Ġ= ĠCons ume Params . newBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Purchase Token ( purchase . purchase Token ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Developer Payload ( purchase . developer Payload ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġbilling Client . consume Async ( consume Params ) Ġ{ Ġbilling Result , Ġpurchase Token Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( billing Result . response Code Ġ== ĠBilling Client . Billing Response Code . OK Ġ&& Ġpurchase Token Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" allow Multiple P urchases Ġsuccess , Ġresponse Code : Ġ${ billing Result . response Code }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" Can 't Ġallow Multiple P urchases , Ġresponse Code : Ġ${ billing Result . response Code }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠSK U _ ID _ CO FF EE _ 1 Ġ= Ġ" coffee _ 1 " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠSK U _ ID _ CO FF EE _ 2 Ġ= Ġ" coffee _ 2 " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠSK U _ ID _ CO FF EE _ 3 Ġ= Ġ" coffee _ 3 " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠSK U _ ID _ CO FF EE _ 4 Ġ= Ġ" coffee _ 4 " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠSK U _ ID _ CO FF EE _ 5 Ġ= Ġ" coffee _ 5 " ĊĠĠĠ Ġ} Ċ }