package Ġhi bernate . v 2 . test your android . ui . main Ċ Ċ import Ġandroid . content . Activity NotFoundException Ċ import Ġandroid . content . Intent Ċ import Ġandroid . content . res . Configuration Ċ import Ġandroid . net . Uri Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . view . Menu Ċ import Ġandroid . view . MenuItem Ċ import Ġandroid . widget . Toast Ċ import Ġandroidx . lifecycle . lifecycle Scope Ċ import Ġcom . af ol le st ad . material dialogs . Material Dialog Ċ import Ġcom . af ol le st ad . material dialogs . custom view . custom View Ċ import Ġcom . af ol le st ad . material dialogs . list . list Items Single Choice Ċ import Ġcom . android . billing client . api . Ack nowledge Purchase Params Ċ import Ġcom . android . billing client . api . Billing Client Ċ import Ġcom . android . billing client . api . Billing Client State Listener Ċ import Ġcom . android . billing client . api . Billing Flow Params Ċ import Ġcom . android . billing client . api . Billing Result Ċ import Ġcom . android . billing client . api . Purchase Ċ import Ġcom . android . billing client . api . Sku Details Ċ import Ġcom . android . billing client . api . Sku Details Params Ċ import Ġcom . google . android . gms . ads . Ad Error Ċ import Ġcom . google . android . gms . ads . Ad Request Ċ import Ġcom . google . android . gms . ads . FullScreen Content Callback Ċ import Ġcom . google . android . gms . ads . Load Ad Error Ċ import Ġcom . google . android . gms . ads . inter stitial . Inter stitial Ad Ċ import Ġcom . google . android . gms . ads . inter stitial . Inter stitial Ad Load Callback Ċ import Ġcom . or h ano but . logger . Logger Ċ import Ġcom . step stone . app rating . App Rating Dialog Ċ import Ġcom . step stone . app rating . listener . Rating Dialog Listener Ċ import Ġhi bernate . v 2 . test your android . Build Config Ċ import Ġhi bernate . v 2 . test your android . R Ċ import Ġhi bernate . v 2 . test your android . core . SharedPreferences Manager Ċ import Ġhi bernate . v 2 . test your android . databinding . Activity Container Binding Ċ import Ġhi bernate . v 2 . test your android . ui . base . Base Activity Ċ import Ġhi bernate . v 2 . test your android . util . Utils Ċ import Ġhi bernate . v 2 . test your android . util . Utils . i ap Product IdList Ċ import Ġhi bernate . v 2 . test your android . util . Utils . i ap Product IdList All Ċ import Ġorg . k oin . android . ext . android . inject Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . launch Ċ import Ġkotlinx . coroutines . with Context Ċ import Ġjava . util . regex . Matcher Ċ import Ġjava . util . regex . Pattern Ċ import Ġkotlin . coroutines . resume Ċ import Ġkotlin . coroutines . suspend Coroutine Ċ Ċ class ĠMainActivity Ġ: ĠBase Activity < Activity Container Binding >(), ĠRating Dialog Listener Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġshared Preferences Manager : ĠSharedPreferences Manager Ġby Ġinject () ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġbilling Client : ĠBilling Client ĊĊĠĠĠ Ġprivate Ġvar Ġsku Details List : ĠList < Sku Details >? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġm Inter stitial Ad : ĠInter stitial Ad ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġvar Ġcount Inter stitial Ad Ġ= Ġ 0 ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġset Theme ( R . style . App Theme ) ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĊĠĠĠĠĠĠĠ Ġinit ActionBar ( view Binding . toolbar . root , Ġtitle Id Ġ= ĠR . string . app _ name ) ĊĠĠĠĠĠĠĠ Ġsupport ActionBar ?. set Display Home As Up Enabled ( false ) ĊĠĠĠĠĠĠĠ Ġsupport ActionBar ?. set Home Button Enabled ( false ) ĊĊĠĠĠĠĠĠĠ Ġsetup Billing Client () ĊĊĠĠĠĠĠĠĠ Ġsupport FragmentManager ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. beginTransaction () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. replace ( R . id . container , ĠMain Fragment ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. commit () ĊĊĠĠĠĠĠĠĠ Ġinit Inter stitial Ad () ĊĊĠĠĠĠĠĠĠ Ġcount Rate () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Configuration Changed ( new Config : ĠConfiguration ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Configuration Changed ( new Config ) ĊĊĠĠĠĠĠĠĠ Ġwhen Ġ( new Config . ui Mode Ġand ĠConfiguration . UI _ MODE _ N IGHT _ MASK ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠConfiguration . UI _ MODE _ N IGHT _ NO Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . d ("// ĠNight Ġmode Ġis Ġnot Ġactive , Ġwe 're Ġusing Ġthe Ġlight Ġtheme ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠConfiguration . UI _ MODE _ N IGHT _ YES Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . d ("// ĠNight Ġmode Ġis Ġactive , Ġwe 're Ġusing Ġdark Ġtheme ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate Options Menu ( menu : ĠMenu ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġmenu Inflater . inflate ( R . menu . main , Ġmenu ) ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Options ItemSelected ( item : ĠMenuItem ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( item . itemId ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . action _ language Ġ-> Ġopen Dialog Language () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . action _ i ap Ġ-> Ġopen Dialog I AP () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġsuper . on Options ItemSelected ( item ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Resume () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Resume () ĊĊĠĠĠĠĠĠĠ Ġcount Inter stitial Ad () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġopen Dialog Rate () Ġ{ ĊĠĠĠĠĠĠĠ ĠApp Rating Dialog . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Positive ButtonText ( R . string . rate _ pos btn ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Negative ButtonText ( R . string . rate _ nav btn ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Neutral ButtonText ( R . string . rate _ net btn ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set NumberOf St ars ( 5 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. setDefault Rating ( 5 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. setTitle ( R . string . rate _ title ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. setDescription ( R . string . rate _ message ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Comment Input Enabled ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Star Color ( R . color . line Color 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. setTitle TextColor ( R . color . white ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. setDescription TextColor ( R . color . rating Text ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. setWindow Animation ( R . style . Rating Dialog Fade Animation ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Cancel able ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Canceled On Touch Outside ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. create ( this @ MainActivity ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. show () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcount Rate () Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġcount Rate Ġ= Ġshared Preferences Manager . count Rate ĊĠĠĠĠĠĠĠ Ġif Ġ( count Rate Ġ== Ġ 5 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġopen Dialog Rate () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcount Rate ++ ĊĠĠĠĠĠĠĠ Ġshared Preferences Manager . count Rate Ġ= Ġcount Rate ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit Inter stitial Ad () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( Utils . is Ad Hidden ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠInter stitial Ad . load ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBuild Config . AD MOB _ FULL _ SCREEN _ ID , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAd Request . Builder (). build (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ: ĠInter stitial Ad Load Callback () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Ad Failed To Load ( ad Error : ĠLoad Ad Error ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Inter stitial Ad Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Ad Loaded ( inter stitial Ad : ĠInter stitial Ad ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Inter stitial Ad Ġ= Ġinter stitial Ad ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Inter stitial Ad ?. full Screen Content Callback Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ: ĠFull Screen Content Callback () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Ad Failed To Show FullScreen Content ( ad Error : ĠAd Error ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . d (" Ad Ġfailed Ġto Ġshow ." Ġ+ Ġad Error ?. message ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Ad Show ed FullScreen Content () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinit Inter stitial Ad () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcount Inter stitial Ad () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( Utils . is Ad Hidden ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ(++ count Inter stitial Ad Ġ== Ġ 3 Ġ|| Ġcount Inter stitial Ad Ġ== Ġ 7 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Inter stitial Ad ?. show ( this ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġopen Dialog Language () Ġ{ ĊĠĠĠĠĠĠĠ ĠMaterial Dialog ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. title ( R . string . title _ activity _ language ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. list Items Single Choice ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . array . language _ choose , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠwaitFor Positive Button Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ Ġdialog , Ġindex , Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdialog . dismiss () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlanguage Locale Code Array Ġ= Ġresources . getString Array ( R . array . language _ locale _ code ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlanguage Locale CountryCode Array Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresources . getString Array ( R . array . language _ locale _ country _ code ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshared Preferences Manager . language Ġ= Ġlanguage Locale Code Array [ index ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshared Preferences Manager . language Country Ġ= Ġlanguage Locale CountryCode Array [ index ] ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintent Ġ= Ġpackage Manager . get Launch Intent For Package ( packageName ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġintent ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġintent . add Flags ( Intent . FLAG _ ACTIVITY _ CLEAR _ TOP ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġintent . add Category ( Intent . CATEGORY _ HOME ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġintent . add Flags ( Intent . FLAG _ ACTIVITY _ CLEAR _ TASK ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġintent . add Flags ( Intent . FLAG _ ACTIVITY _ NEW _ TASK ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity ( intent ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. negative Button ( R . string . ui _ cancel ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. show () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġopen Dialog I AP () Ġ{ ĊĠĠĠĠĠĠĠ Ġsku Details List ?. let Ġ{ Ġsku Details List Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( sku Details List . isNull OrEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( this , ĠR . string . ui _ error , ĠToast . LENGTH _ LONG ). show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsku Title List Ġ= Ġsku Details List . map Ġ{ Ġsku Details Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġp : ĠPattern Ġ= ĠPattern . compile ("( ?> Ġ\\ (. + ? \\ )) $", ĠPattern . CASE _ INS ENS ITIVE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġm : ĠMatcher Ġ= Ġp . matcher ( sku Details . title ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtitle Without AppName : ĠString Ġ= Ġm . replaceAll ("") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ sku Details . price } Ġ- Ġ$ title Without AppName " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠMaterial Dialog ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. title ( R . string . title _ activity _ test _ ad _ remo ver ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. list Items Single Choice ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitems Ġ= Ġsku Title List , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠwaitFor Positive Button Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ Ġdialog , Ġindex , Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbilling Flow Params Ġ= ĠBilling Flow Params ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. newBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Sku Details ( sku Details List [ index ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbilling Client . launch Billing Flow ( this , Ġbilling Flow Params ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdialog . dismiss () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. negative Button ( R . string . ui _ cancel ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. show () ĊĠĠĠĠĠĠĠ Ġ} Ġ?: Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( this @ MainActivity , ĠR . string . ui _ error , ĠToast . LENGTH _ LONG ). show () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsetup Billing Client () Ġ{ ĊĠĠĠĠĠĠĠ Ġbilling Client Ġ= ĠBilling Client . newBuilder ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Listener Ġ{ Ġbilling Result , Ġpurch ases Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlifecycle Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . d ( billing Result . response Code ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( billing Result . response Code Ġ== ĠBilling Client . Billing Response Code . OK Ġ&& Ġpurch ases Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( purchase Ġin Ġpurch ases ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Handle Purchase ( purchase ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( billing Result . response Code Ġ== ĠBilling Client . Billing Response Code . ITEM _ AL READY _ OWN ED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Purchase d () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith Context ( Dispatch ers . Main ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( this @ MainActivity , ĠR . string . ui _ error , ĠToast . LENGTH _ LONG ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. enable Pending P urchases () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġ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 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThe ĠBilling Client Ġis Ġready . ĠYou Ġcan Ġquery Ġpurch ases Ġhere . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparams Ġ= ĠSk u Details Params ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. newBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Sk us List ( i ap Product IdList ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setType ( Billing Client . Sku Type . IN APP ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlifecycle Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsku Details List Ġ= Ġquery Sku Details ( params ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Billing Service Disconnected () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTry Ġto Ġrestart Ġthe Ġconnection Ġon Ġthe Ġnext Ġrequest Ġto ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠGoogle ĠPlay Ġby Ġcalling Ġthe Ġstart Connection () Ġmethod . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġon Handle Purchase ( purchase : ĠPurchase ) Ġ{ ĊĠĠĠĠĠĠĠ ĠLogger . d ( purchase . purchase State ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( purchase . purchase State Ġ== ĠPurchase . Purchase State . PUR CH ASE D ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( purchase . is Ack nowled ged ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Purchase d () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġacknowledge Purchase Params Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAck nowledge Purchase Params ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. newBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Purchase Token ( purchase . purchase Token ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ack nowledge Purchase ( ack nowledge Purchase Params )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Purchase d () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġon Purchase d () Ġ{ ĊĠĠĠĠĠĠĠ Ġshared Preferences Manager . i ap Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġif Ġ( is Finish ing ) Ġreturn ĊĊĠĠĠĠĠĠĠ Ġwith Context ( Dispatch ers . Main ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMaterial Dialog ( this @ MainActivity ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. custom View ( R . layout . dialog _ don ate ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. positive Button ( R . string . ui _ ok ay ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. show () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcheck Purchase History () Ġ{ ĊĠĠĠĠĠĠĠ Ġlifecycle Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġi ap Product IdList All (). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( query Purchase History ( it )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Purchase d () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ forEach ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠRating Dialog Listener ĊĠĠĠ Ġoverride Ġfun Ġon Negative Button Clicked () Ġ{ ĊĠĠĠĠĠĠĠ Ġshared Preferences Manager . count Rate Ġ= Ġ 1 0 0 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Neutral Button Clicked () Ġ{ ĊĠĠĠĠĠĠĠ Ġshared Preferences Manager . count Rate Ġ= Ġ 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Positive Button Clicked ( rate : ĠInt , Ġcomment : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġshared Preferences Manager . count Rate Ġ= Ġ 1 0 0 0 ĊĠĠĠĠĠĠĠ Ġif Ġ( rate Ġ>= Ġ 4 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIntent . ACTION _ VIEW , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUri . parse (" https :// play . google . com / store / apps / details ? id = hibernate . v 2 . test your android ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity ( intent ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠActivity NotFoundException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠgetActivity View Binding (): ĠActivity Container Binding Ġ= ĊĠĠĠĠĠĠĠ ĠActivity Container Binding . inflate ( layout Inflater ) ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġquery Sku Details ( params : ĠSk u Details Params ): ĠList < Sku Details >? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġsuspend Coroutine Ġ{ Ġcontinuation Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbilling Client . query Sku Details Async ( params ) Ġ{ Ġbilling Result , Ġsku Details List Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( billing Result . response Code Ġ== ĠBilling Client . Billing Response Code . OK ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinuation . resume ( sku Details List ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinuation . resume ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġquery Purchase History ( i ap Id : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġsuspend Coroutine Ġ{ Ġcontinuation Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbilling Client . query Purchase History Async ( i ap Id ) Ġ{ Ġbilling Result , Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( billing Result . response Code Ġ== ĠBilling Client . Billing Response Code . OK ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinuation . resume ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinuation . resume ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġacknowledge Purchase ( params : ĠAck nowledge Purchase Params ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġsuspend Coroutine Ġ{ Ġcontinuation Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbilling Client . ack nowledge Purchase ( params ) Ġ{ Ġbilling Result Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( billing Result . response Code Ġ== ĠBilling Client . Billing Response Code . OK ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinuation . resume ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinuation . resume ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }