/* Ċ Ġ* ĠCopyright Ġ 2 0 2 2 ĠGoogle , ĠInc . Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttps :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġcom . sample . subscriptions code lab . ui Ċ Ċ import Ġandroid . app . Activity Ċ import Ġandroid . app . Application Ċ import Ġandroid . util . Log Ċ import Ġandroidx . lifecycle . Android ViewModel Ċ import Ġandroidx . lifecycle . LiveData Ċ import Ġandroidx . lifecycle . Mutable LiveData Ċ import Ġandroidx . lifecycle . viewModel Scope Ċ import Ġcom . android . billing client . api . Billing Flow Params Ċ import Ġcom . android . billing client . api . Product Details Ċ import Ġcom . android . billing client . api . Purchase Ċ import Ġcom . sample . subscriptions code lab . billing . Billing Client Wrapper Ċ import Ġcom . sample . subscriptions code lab . repository . Subscription Data Repository Ċ import Ġkotlinx . coroutines . flow . collect Latest Ċ import Ġkotlinx . coroutines . flow . combine Ċ import Ġkotlinx . coroutines . launch Ċ Ċ /** Ċ Ġ* ĠThe Ġ[ Android ViewModel ] Ġimplementation Ġcombin es Ġall Ġflows Ġfrom Ġthe Ġrepo Ġinto Ġa Ġsingle Ġone Ċ Ġ* Ġthat Ġis Ġcollected Ġin Ġthe ĠComp osable . Ċ Ġ* Ċ Ġ* ĠIt , Ġalso , Ġhas Ġhelper Ġmethods Ġthat Ġare Ġused Ġto Ġlaunch Ġthe ĠGoogle ĠPlay ĠBilling Ġpurchase Ġflow . Ċ Ġ* Ċ Ġ*/ Ċ class ĠMain ViewModel ( application : ĠApplication ) Ġ: ĊĠĠĠ ĠAndroid ViewModel ( application ) Ġ{ ĊĠĠĠ Ġvar Ġbilling Client : ĠBilling Client Wrapper Ġ= ĠBilling Client Wrapper ( application ) ĊĠĠĠ Ġprivate Ġvar Ġrepo : ĠSubscription Data Repository Ġ= ĊĠĠĠĠĠĠĠ ĠSubscription Data Repository ( billing Client Wrapper Ġ= Ġbilling Client ) ĊĠĠĠ Ġprivate Ġval Ġ_ billing Connection State Ġ= ĠMutable LiveData ( false ) ĊĠĠĠ Ġval Ġbilling Connection State : ĠLive Data < Boolean > Ġ= Ġ_ billing Connection State ĊĊĠĠĠ Ġprivate Ġval Ġ_ destination Screen Ġ= ĠMutable LiveData < Destination Screen >() ĊĠĠĠ Ġval Ġdestination Screen : ĠLive Data < Destination Screen > Ġ= Ġ_ destination Screen ĊĊĠĠĠ Ġ// ĠStart Ġthe Ġbilling Ġconnection Ġwhen Ġthe ĠviewModel Ġis Ġinitialized . ĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġbilling Client . start Billing Connection ( billing Connection State Ġ= Ġ_ billing Connection State ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠThe Ġproducts For Sale Flows Ġobject Ġcombin es Ġall Ġthe ĠProduct Ġflows Ġinto Ġone Ġfor Ġemission . ĊĠĠĠ Ġval Ġproducts For Sale Flows Ġ= Ġcombine ( ĊĠĠĠĠĠĠĠ Ġrepo . basic Product Details , ĊĠĠĠĠĠĠĠ Ġrepo . premium Product Details ĊĠĠĠ Ġ) Ġ{ Ġbasic Product Details , ĊĠĠĠĠĠĠĠ Ġprem ium Product Details ĊĠĠĠĠĠĠĠ Ġ-> ĊĠĠĠĠĠĠĠ ĠMain State ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbasic Product Details Ġ= Ġbasic Product Details , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprem ium Product Details Ġ= Ġprem ium Product Details ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠThe Ġuser Current Subscription Flow Ġobject Ġcombin es Ġall Ġthe Ġpossible Ġsubscription Ġflows Ġinto Ġone ĊĠĠĠ Ġ// Ġfor Ġemission . ĊĠĠĠ Ġprivate Ġval Ġuser Current Subscription Flow Ġ= Ġcombine ( ĊĠĠĠĠĠĠĠ Ġrepo . has Renew able Basic , ĊĠĠĠĠĠĠĠ Ġrepo . has Pre paid Basic , ĊĠĠĠĠĠĠĠ Ġrepo . has Renew able Prem ium , ĊĠĠĠĠĠĠĠ Ġrepo . has Pre paid Prem ium ĊĠĠĠ Ġ) Ġ{ Ġhas Renew able Basic , ĊĠĠĠĠĠĠĠ Ġhas Pre paid Basic , ĊĠĠĠĠĠĠĠ Ġhas Renew able Prem ium , ĊĠĠĠĠĠĠĠ Ġhas Pre paid Prem ium ĊĠĠĠĠĠĠĠ Ġ-> ĊĠĠĠĠĠĠĠ ĠMain State ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhas Renew able Basic Ġ= Ġhas Renew able Basic , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhas Pre paid Basic Ġ= Ġhas Pre paid Basic , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhas Renew able Prem ium Ġ= Ġhas Renew able Prem ium , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhas Pre paid Prem ium Ġ= Ġhas Pre paid Prem ium ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠCurrent Ġpurch ases . ĊĠĠĠ Ġval Ġcurrent P urchases Flow Ġ= Ġrepo . p urchases ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġuser Current Subscription Flow . collect Latest Ġ{ Ġcollected Subscriptions Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcollected Subscriptions . has Renew able Basic Ġ== Ġtrue Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcollected Subscriptions . has Renew able Prem ium Ġ== Ġfalse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ destination Screen . post Value ( Destination Screen . BASIC _ RE NEW ABLE _ PROFILE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcollected Subscriptions . has Renew able Prem ium Ġ== Ġtrue Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcollected Subscriptions . has Renew able Basic Ġ== Ġfalse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ destination Screen . post Value ( Destination Screen . PRE MI UM _ RE NEW ABLE _ PROFILE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcollected Subscriptions . has Pre paid Basic Ġ== Ġtrue Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcollected Subscriptions . has Pre paid Prem ium Ġ== Ġfalse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ destination Screen . post Value ( Destination Screen . BASIC _ PRE PA ID _ PROFILE _ SCREEN ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcollected Subscriptions . has Pre paid Prem ium Ġ== Ġtrue Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcollected Subscriptions . has Pre paid Basic Ġ== Ġfalse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ destination Screen . post Value ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDestination Screen . PRE MI UM _ PRE PA ID _ PROFILE _ SCREEN ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ destination Screen . post Value ( Destination Screen . SUB SCRIPTION S _ OPTIONS _ SCREEN ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRetrieves Ġall Ġel igible Ġbase Ġplans Ġand Ġoffers Ġusing Ġtags Ġfrom ĠProduct Details . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġoffer Details Ġoffer Details Ġfrom Ġa ĠProduct Details Ġreturned Ġby Ġthe Ġlibrary . ĊĠĠĠĠ Ġ* Ġ@ param Ġtag Ġstring Ġrepresenting Ġtags Ġassociated Ġwith Ġoffers Ġand Ġbase Ġplans . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġthe Ġel igible Ġoffers Ġand Ġbase Ġplans Ġin Ġa Ġlist . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġretrieve El igible Offers ( ĊĠĠĠĠĠĠĠ Ġoffer Details : ĠMutable List < Product Details . Subscription Offer Details >, ĊĠĠĠĠĠĠĠ Ġtag : ĠString ĊĠĠĠ Ġ): ĠList < Product Details . Subscription Offer Details > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġel igible Offers Ġ= Ġempty List < Product Details . Subscription Offer Details >(). to Mutable List () ĊĠĠĠĠĠĠĠ Ġoffer Details . forEach Ġ{ Ġoffer Detail Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( offer Detail . offer Tags . contains ( tag )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġel igible Offers . add ( offer Detail ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġel igible Offers ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCalculates Ġthe Ġlowest Ġpr iced Ġoffer Ġamong st Ġall Ġel igible Ġoffers . ĊĠĠĠĠ Ġ* ĠIn Ġthis Ġimplementation Ġthe Ġlowest Ġprice Ġof Ġall Ġoffers ' Ġpr icing Ġphases Ġis Ġreturned . ĊĠĠĠĠ Ġ* ĠIt 's Ġpossible Ġthe Ġlogic Ġcan Ġbe Ġimplemented Ġdifferently . ĊĠĠĠĠ Ġ* ĠFor Ġexample , Ġthe Ġlowest Ġaverage Ġprice Ġin Ġterms Ġof Ġmonth Ġcould Ġbe Ġreturned Ġinstead . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġoffer Details ĠList Ġof Ġof Ġel igible Ġoffers Ġand Ġbase Ġplans . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġthe Ġoffer Ġid Ġtoken Ġof Ġthe Ġlowest Ġpr iced Ġoffer . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġleast Pr iced Offer Token ( ĊĠĠĠĠĠĠĠ Ġoffer Details : ĠList < Product Details . Subscription Offer Details > ĊĠĠĠ Ġ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġoffer Token Ġ= ĠString () ĊĠĠĠĠĠĠĠ Ġvar Ġleast Pr iced Offer : ĠProduct Details . Subscription Offer Details ĊĠĠĠĠĠĠĠ Ġvar Ġlowest Price Ġ= ĠInt . MAX _ VALUE ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! offer Details . isNull OrEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( offer Ġin Ġoffer Details ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( price Ġin Ġoffer . pricing Ph ases . pricing Phase List ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( price . price Amount Micro s Ġ< Ġlowest Price ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlowest Price Ġ= Ġprice . price Amount Micro s . toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġleast Pr iced Offer Ġ= Ġoffer ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoffer Token Ġ= Ġleast Pr iced Offer . offer Token ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġoffer Token ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠBilling Flow Params ĠBuilder Ġfor Ġupgrades Ġand Ġdown grade s . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġproduct Details ĠProduct Details Ġobject Ġreturned Ġby Ġthe Ġlibrary . ĊĠĠĠĠ Ġ* Ġ@ param Ġoffer Token Ġthe Ġleast Ġpr iced Ġoffer 's Ġoffer Ġid Ġtoken Ġreturned Ġby ĊĠĠĠĠ Ġ* Ġ[ least Pr iced Offer Token ]. ĊĠĠĠĠ Ġ* Ġ@ param Ġold Token Ġthe Ġpurchase Ġtoken Ġof Ġthe Ġsubscription Ġpurchase Ġbeing Ġupgraded Ġor Ġdown graded . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġ[ Billing Flow Params ] Ġbuilder . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġup Down grade Billing Flow Params Builder ( ĊĠĠĠĠĠĠĠ Ġproduct Details : ĠProduct Details , ĊĠĠĠĠĠĠĠ Ġoffer Token : ĠString , ĊĠĠĠĠĠĠĠ Ġold Token : ĠString ĊĠĠĠ Ġ): ĠBilling Flow Params Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠBilling Flow Params . newBuilder (). set Product Details Params List ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBilling Flow Params . Product Details Params . newBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Product Details ( product Details ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Offer Token ( offer Token ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ). set Subscription Update Params ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBilling Flow Params . Subscription Update Params . newBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Old Purchase Token ( old Token ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Replace Pror ation Mode ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBilling Flow Params . Pror ation Mode . IM MEDI ATE _ AND _ CHAR GE _ FULL _ PRICE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġ). build () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠBilling Flow Params ĠBuilder Ġfor Ġnormal Ġpurch ases . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġproduct Details ĠProduct Details Ġobject Ġreturned Ġby Ġthe Ġlibrary . ĊĠĠĠĠ Ġ* Ġ@ param Ġoffer Token Ġthe Ġleast Ġpr iced Ġoffer 's Ġoffer Ġid Ġtoken Ġreturned Ġby ĊĠĠĠĠ Ġ* Ġ[ least Pr iced Offer Token ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġ[ Billing Flow Params ] Ġbuilder . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġbilling Flow Params Builder ( ĊĠĠĠĠĠĠĠ Ġproduct Details : ĠProduct Details , ĊĠĠĠĠĠĠĠ Ġoffer Token : ĠString ĊĠĠĠ Ġ): ĠBilling Flow Params . Builder Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠBilling Flow Params . newBuilder (). set Product Details Params List ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBilling Flow Params . Product Details Params . newBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Product Details ( product Details ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Offer Token ( offer Token ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠUse Ġthe ĠGoogle ĠPlay ĠBilling ĠLibrary Ġto Ġmake Ġa Ġpurchase . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġproduct Details ĠProduct Details Ġobject Ġreturned Ġby Ġthe Ġlibrary . ĊĠĠĠĠ Ġ* Ġ@ param Ġcurrent P urchases ĠList Ġof Ġcurrent Ġ[ Purchase ] Ġobjects Ġneeded Ġfor Ġupgrades Ġor Ġdown grade s . ĊĠĠĠĠ Ġ* Ġ@ param Ġbilling Client ĠInstance Ġof Ġ[ Billing Client Wrapper ]. ĊĠĠĠĠ Ġ* Ġ@ param Ġactivity Ġ[ Activity ] Ġinstance . ĊĠĠĠĠ Ġ* Ġ@ param Ġtag ĠString Ġrepresenting Ġtags Ġassociated Ġwith Ġoffers Ġand Ġbase Ġplans . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġbuy ( ĊĠĠĠĠĠĠĠ Ġproduct Details : ĠProduct Details , ĊĠĠĠĠĠĠĠ Ġcurrent P urchases : ĠList < Purchase > ?, ĊĠĠĠĠĠĠĠ Ġactivity : ĠActivity , ĊĠĠĠĠĠĠĠ Ġtag : ĠString ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġoffers Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproduct Details . subscription Offer Details ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġretrieve El igible Offers ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoffer Details Ġ= Ġit , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtag Ġ= Ġtag . lowercase () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġoffer Token Ġ= Ġoffers ?. let Ġ{ Ġleast Pr iced Offer Token ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġold Purchase Token : ĠString ĊĊĠĠĠĠĠĠĠ Ġ// ĠGet Ġcurrent Ġpurchase . ĠIn Ġthis Ġapp , Ġa Ġuser Ġcan Ġonly Ġhave Ġone Ġcurrent Ġpurchase Ġat ĊĠĠĠĠĠĠĠ Ġ// Ġany Ġgiven Ġtime . ĊĠĠĠĠĠĠĠ Ġif Ġ(! current P urchases . isNull OrEmpty () Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent P urchases . size Ġ== ĠMAX _ CURRENT _ PUR CH ASE S _ ALLOWED ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThis Ġeither Ġan Ġupgrade , Ġdown grade , Ġor Ġconversion Ġpurchase . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent Purchase Ġ= Ġcurrent P urchases . first () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠGet Ġthe Ġtoken Ġfrom Ġcurrent Ġpurchase . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġold Purchase Token Ġ= Ġcurrent Purchase . purchase Token ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbilling Params Ġ= Ġoffer Token ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġup Down grade Billing Flow Params Builder ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproduct Details Ġ= Ġproduct Details , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoffer Token Ġ= Ġit , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġold Token Ġ= Ġold Purchase Token ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( billing Params Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbilling Client . launch Billing Flow ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactivity , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbilling Params ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( current P urchases Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThis Ġis Ġa Ġnormal Ġpurchase . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbilling Params Ġ= Ġoffer Token ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbilling Flow Params Builder ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproduct Details Ġ= Ġproduct Details , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoffer Token Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( billing Params Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbilling Client . launch Billing Flow ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactivity , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbilling Params . build () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ(! current P urchases . isNull OrEmpty () Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent P urchases . size Ġ> ĠMAX _ CURRENT _ PUR CH ASE S _ ALLOWED ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThe Ġdeveloper Ġhas Ġallowed Ġusers Ġ Ġto Ġhave Ġmore Ġthan Ġ 1 Ġpurchase , Ġso Ġthey Ġneed Ġto ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/// Ġimplement Ġa Ġlogic Ġto Ġfind Ġwhich Ġone Ġto Ġuse . ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" User Ġhas Ġmore Ġthan Ġ 1 Ġcurrent Ġpurchase .") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠWhen Ġan Ġactivity Ġis Ġdestroyed Ġthe ĠviewModel 's Ġon Cle ared Ġis Ġcalled , Ġso Ġwe Ġterminate Ġthe ĊĠĠĠ Ġ// Ġbilling Ġconnection . ĊĠĠĠ Ġoverride Ġfun Ġon Cle ared () Ġ{ ĊĠĠĠĠĠĠĠ Ġbilling Client . terminate Billing Connection () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠEnum Ġrepresenting Ġthe Ġvarious Ġscreens Ġa Ġuser Ġcan Ġbe Ġredirected Ġto . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġenum Ġclass ĠDestination Screen Ġ{ ĊĠĠĠĠĠĠĠ ĠSUB SCRIPTION S _ OPTIONS _ SCREEN , ĊĠĠĠĠĠĠĠ ĠBAS IC _ PRE PA ID _ PROFILE _ SCREEN , ĊĠĠĠĠĠĠĠ ĠBAS IC _ RE NEW ABLE _ PROFILE , ĊĠĠĠĠĠĠĠ ĠPRE MI UM _ PRE PA ID _ PROFILE _ SCREEN , ĊĠĠĠĠĠĠĠ ĠPRE MI UM _ RE NEW ABLE _ PROFILE ; ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠTAG : ĠString Ġ= Ġ" Main ViewModel " ĊĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠMAX _ CURRENT _ PUR CH ASE S _ ALLOWED Ġ= Ġ 1 ĊĠĠĠ Ġ} Ċ } Ċ