package Ġcom . tech flow . material color . activity Ċ Ċ import Ġandroid . content . Activity NotFoundException Ċ import Ġandroid . content . Intent Ċ import Ġandroid . net . Uri Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . util . Log Ċ import Ġandroid . view . MenuItem Ċ import Ġandroid . view . View Ċ import Ġandroid . widget . Image Button Ċ import Ġandroidx . core . app . Share Compat Ċ import Ġandroidx . databinding . Data Binding Util Ċ 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 . android . billing client . api .* Ċ import Ġcom . android . billing client . api . Billing Client . Billing Response Code Ċ import Ġcom . get keep safe . tap target view . Tap Target Ċ import Ġcom . get keep safe . tap target view . Tap Target View Ċ import Ġcom . google . android . material . app bar . Material Toolbar Ċ import Ġcom . google . android . material . button . Material Button Ċ import Ġcom . google . firebase . analytics . Firebase Analytics Ċ import Ġcom . google . firebase . analytics . k tx . analytics Ċ import Ġcom . google . firebase . k tx . Firebase Ċ import Ġcom . tech flow . material color . Material Color Ċ import Ġcom . tech flow . material color . R Ċ import Ġcom . tech flow . material color . databinding . Activity Settings Binding Ċ import Ġcom . tech flow . material color . helpers .* Ċ import Ġcom . tech flow . material color . utils .* Ċ import Ġkotlin . collections . ArrayList Ċ Ċ /** Ċ Ġ* Ġ@ author ĠD il ip ĠS uth ar Ċ Ġ*/ Ċ class ĠSettings Activity Ġ: ĠBase Activity (), ĠView . OnClickListener , ĠP urchases Updated Listener , ĊĠĠĠ ĠBilling Client State Listener Ġ{ ĊĠĠĠ Ġprivate Ġval ĠTAG Ġ= ĠSettings Activity :: class . java . simple Name ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġbind : ĠActivity Settings Binding ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġfirebase Analytics : ĠFirebase Analytics ĊĊĠĠĠ Ġ// ĠBilling ĊĠĠĠ Ġprivate Ġvar Ġsku List : ĠArrayList < String > Ġ= ĠArrayList () ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġbilling Client : ĠBilling Client ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġsku Details Param : ĠSk u Details Params ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġsku Details : ĠSk u Details ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġbilling Flow Params : ĠBilling Flow Params ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ Ġbind Ġ= ĠData Binding Util . set ContentView ( this , ĠR . layout . activity _ settings ) ĊĠĠĠĠĠĠĠ Ġfirebase Analytics Ġ= ĠFirebase . analytics ĊĊĠĠĠĠĠĠĠ Ġinit Toolbar () ĊĠĠĠĠĠĠĠ Ġshow Tutorial () ĊĊĠĠĠĠĠĠĠ Ġ// ĠSetup Ġbilling Ġclient Ġfor Ġin - app Ġpurchase ĊĠĠĠĠĠĠĠ Ġif Ġ( Tools . has Network ( this )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! this . isDebug ()) Ġsetup Billing Client () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTools . visible Views ( bind . progress Bar ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTools . in Visible Views ( bind . btn Remove Ads , Ġtype Ġ= ĠTools . In visibility Type . GONE ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ(! Shared Pref . getInstance ( this ). getBoolean ( Storage Key . SHOW _ AD , Ġtrue )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbind . btn Remove Ads . isEnabled Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġbind . btn Remove Ads . setOnClickListener ( this ) ĊĠĠĠĠĠĠĠ Ġbind . btn Rate . setOnClickListener ( this ) ĊĠĠĠĠĠĠĠ Ġbind . btn Share . setOnClickListener ( this ) ĊĠĠĠĠĠĠĠ Ġbind . fab Send . setOnClickListener ( this ) ĊĠĠĠĠĠĠĠ Ġbind . btn About . setOnClickListener ( this ) ĊĠĠĠĠĠĠĠ Ġbind . btn More Apps . setOnClickListener ( this ) ĊĠĠĠĠĠĠĠ Ġbind . btn About Material Color . setOnClickListener ( this ) ĊĠĠĠĠĠĠĠ Ġbind . btn Material Tool . setOnClickListener ( this ) ĊĠĠĠĠĠĠĠ Ġbind . btn Policy . setOnClickListener ( this ) ĊĠĠĠĠĠĠĠ Ġbind . btn Third Party License . setOnClickListener ( this ) ĊĠĠĠĠĠĠĠ Ġbind . label Reset Tutorial . setOnClickListener ( this ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠTheme Ġsetting ĊĠĠĠĠĠĠĠ Ġbind . switch Change Theme . isChecked Ġ= ĠTheme Utils . get Theme ( this ) Ġ== ĠTheme Utils . DARK ĊĊĠĠĠĠĠĠĠ Ġbind . switch Change Theme . setOn Checked ChangeListener Ġ{ Ġ_, Ġis Checked Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfirebase Analytics . log Event ( Material Color . FIRE BASE _ EVENT _ DARK _ MODE , Ġnull ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( isChecked ) ĠTheme Utils . set Theme ( this , ĠTheme Utils . DARK ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĠTheme Utils . set Theme ( this , ĠTheme Utils . LIGHT ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrecreate () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠBottom Ġsheet Ġconfig Ġsetting ĊĠĠĠĠĠĠĠ Ġbind . switch Bottom Sheet Config . isChecked Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠShared Pref . getInstance ( this ). getBoolean ( Storage Key . BOTTOM _ SHE ET _ CONFIG , Ġfalse ) ĊĊĠĠĠĠĠĠĠ Ġbind . switch Bottom Sheet Config . setOn Checked ChangeListener Ġ{ Ġ_, Ġis Checked Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( isChecked ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠShared Pref . getInstance ( this ). save Data ( Storage Key . BOTTOM _ SHE ET _ CONFIG , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠShared Pref . getInstance ( this ). save Data ( Storage Key . BOTTOM _ SHE ET _ CONFIG , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġbind . txt App version . text Ġ= Ġget App Version () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonClick ( view : ĠView ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġapp Url Ġ= Ġ" https :// play . google . com / store / apps / details ? id =${ packageName }" ĊĊĠĠĠĠĠĠĠ Ġwhen Ġ( view ?. id ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . btn _ remove _ ads Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAnim Utils . bounce Anim ( view ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfirebase Analytics . log Event ( Material Color . FIRE BASE _ EVENT _ REMOVE _ ADS , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Tools . has Network ( this )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTools . visible Views ( bind . progress Bar ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTools . in Visible Views ( bind . btn Remove Ads , Ġtype Ġ= ĠTools . In visibility Type . GONE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(:: billing Client . isInitialized ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Purchase () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdisplay Toast (" No Ġactive Ġnetwork ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . btn _ rate Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( Intent . ACTION _ VIEW , ĠUri . parse ( app Url )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity ( intent ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . btn _ share Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmsg Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Material Color Ġis Ġan Ġamazing Ġcolor Ġtool Ġapp , Ġyou Ġshould Ġtry Ġit .\ n Download Ġit Ġfrom ĠPlay ĠStore Ġusing Ġbelow Ġlink ." ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġshare Intent Ġ= ĠShare Compat . Intent Builder . from ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setText ("$ msg \ n \ n $ app Url ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setType (" text / plain ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. intent ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( share Intent . resolve Activity ( this . package Manager ) Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity ( share Intent ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . fab _ send Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtitle Ġ= Ġbind . et Feedback Title . text . toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmsg Ġ= Ġbind . et Feedback Msg . text . toString () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( title . isEmpty () Ġ&& Ġmsg . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbind . et Feedback Title . error Ġ= Ġ" Required Ġfield " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbind . et Feedback Msg . error Ġ= Ġ" Required Ġfield " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( title . isEmpty ()) Ġbind . et Feedback Title . error Ġ= Ġ" Required Ġfield " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ( msg . isEmpty ()) Ġbind . et Feedback Msg . error Ġ= Ġ" Required Ġfield " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġi Ġ= ĠIntent (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction Ġ= ĠIntent . ACTION _ SEND ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= Ġ" message / rfc 8 2 2 " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Extra ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIntent . EXTRA _ EMAIL , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠarrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRemote Config Helper . getInstance (). remote Config . getString ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRemote Config Helper . KEY _ SUPPORT _ EMAIL ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Extra ( Intent . EXTRA _ SUBJECT , Ġ" Feedback : ĠMaterial Color Ġ- Ġ$ title ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Extra ( Intent . EXTRA _ TEXT , Ġ" Title : Ġ$ title \ n Feedback : Ġ$ msg ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( i . resolve Activity ( package Manager ) Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity ( Intent . create Chooser ( i , Ġ" Send ĠFeedback ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠActivity NotFoundException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdisplay Toast (" There Ġis Ġno Ġemail Ġclient Ġinstalled .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdisplay Toast (" Submit ting ...") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . btn _ about Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow About Dialog () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . btn _ more _ apps Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġopen WebView (" https :// play . google . com / store / apps / dev ? id = 5 0 2 5 6 6 5 3 3 3 7 6 9 4 0 3 8 9 0 ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . btn _ about _ material _ color Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġopen WebView (" https :// material . io / design / color / the - color - system . html # color - theme - creation ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . btn _ material _ tool Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġopen WebView (" https :// material . io / tools / color /# !/ ? view . left = 0 & view . right = 0 ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . btn _ policy Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfirebase Analytics . log Event ( Material Color . FIRE BASE _ EVENT _ READ _ POLICY , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġopen WebView (" https :// github . com / dil ips uth ar 1 9 9 7 / Privacy Policy / blob / master / Material Color % 2 0 Privacy % 2 0 Policy . md ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . btn _ third _ party _ license Ġ-> ĠstartActivity ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIntent ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLicense s Activity :: class . java ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . label _ reset _ tutorial Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreset Tutorial ( Shared Pref . getInstance ( this )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdisplay Toast (" Tutorial Ġreset Ġsuccessful Ġ:) ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Options ItemSelected ( item : ĠMenuItem ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( item . itemId Ġ== Ġandroid . R . id . home ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Back Pressed () ĊĠĠĠĠĠĠĠ Ġreturn Ġsuper . on Options ItemSelected ( item ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ func Ġinit Ġtoolbar Ġconfig ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġinit Toolbar () Ġ{ ĊĠĠĠĠĠĠĠ Ġset Support ActionBar ( bind . toolbar Ġas ĠMaterial Toolbar ) ĊĠĠĠĠĠĠĠ Ġval Ġaction Bar Ġ= Ġsupport ActionBar !! ĊĠĠĠĠĠĠĠ Ġaction Bar . title Ġ= Ġ" Settings " ĊĠĠĠĠĠĠĠ Ġaction Bar . set Display Home As Up Enabled ( true ) ĊĠĠĠĠĠĠĠ Ġaction Bar . set Home Button Enabled ( true ) ĊĠĠĠĠĠĠĠ Ġ( bind . toolbar Ġas ĠMaterial Toolbar ). set Navigation Icon ( R . drawable . ic _ arrow _ back ) ĊĠĠĠĠĠĠĠ ĠTools . change Navigation Icon Color ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbind . toolbar Ġas ĠMaterial Toolbar , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTheme Utils . get Theme Attr Color ( this , ĠR . attr . color Text Primary ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ func Ġopen Ġabout Ġus Ġdialog ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġshow About Dialog () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġview Ġ= ĠView . inflate ( this , ĠR . layout . dialog _ about , Ġnull ) ĊĠĠĠĠĠĠĠ ĠMaterial Dialog ( this ). show Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcorner Radius ( 1 6 f ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcustom View ( view Ġ= Ġview ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġview . findViewById < Material Button >( R . id . btn _ about _ me ). setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfirebase Analytics . log Event ( Material Color . FIRE BASE _ EVENT _ AB OUT _ ME , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġopen WebView ( Remote Config Helper . getInstance (). remote Config . getString ( Remote Config Helper . KEY _ PORT FO LI O _ URL )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġview . findViewById < Image Button >( R . id . btn _ github ). setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġopen WebView (" https :// github . com / dil ips uth ar 9 7 ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġview . findViewById < Image Button >( R . id . btn _ twitter ). setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġopen WebView (" https :// twitter . com / dil ips uth ar 9 7 ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ func Ġshow Ġapp Ġintro Ġfor Ġfirst Ġuse ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġshow Tutorial () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġshared Pref Ġ= ĠShared Pref . getInstance ( this ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( shared Pref . getBoolean ( Storage Key . Setting Act FR , Ġtrue )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠT ap Target View . show For ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠT ap Target . for View ( bind . btn Rate , Ġ" Rate Ġus ", Ġ" Rate Ġus Ġon ĠGoogle ĠPlay Store .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. outer Circle Color ( R . color . color Primary ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. outer Circle Alpha ( 0 . 9 5 F ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. target Circle Color ( R . color . white ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. title Text Size ( 2 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. title TextColor ( R . color . white ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. description Text Size ( 1 8 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. description TextColor ( R . color . white ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. cancel able ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. target Radius ( 5 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġshared Pref . save Data ( Storage Key . Setting Act FR , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ func Ġreset Ġfirst Ġuse Ġtutorial Ġpreview ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġreset Tutorial ( shared Pref : ĠShared Pref ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwith ( shared Pref ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsave Data ( Storage Key . is First Run , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsave Data ( Storage Key . Home Frag FR , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsave Data ( Storage Key . Gradient Frag FR , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsave Data ( Storage Key . Color Picker Frag FR , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsave Data ( Storage Key . Setting Act FR , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsave Data ( Storage Key . Color Act FR , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsave Data ( Storage Key . Custom Color Act FR , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsave Data ( Storage Key . Custom Gradient Act FR , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsave Data ( Storage Key . Design Tool Act FR , Ġtrue ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/* ĊĠĠĠĠ Ġ* ĠBilling ĠMethods Ġ----------------------------------------------------------------------------- ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ func Ġsetup Ġin - app Ġpurchase ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġsetup Billing Client () Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" setup Billing Client : Ġcalled ") ĊĊĠĠĠĠĠĠĠ Ġsku List . clear () ĊĠĠĠĠĠĠĠ Ġ// ĠTODO : ĠAdd Ġin - app Ġpurchase Ġproduct ĠID ĊĠĠĠĠĠĠĠ Ġsku List Ġ= ĠArrayList ( listOf (* resources . getString Array ( R . array . sku _ remove _ ads ))) ĊĠĠĠĠĠĠĠ ĠLog . i ( TAG , Ġsku List . toString ()) ĊĊĠĠĠĠĠĠĠ Ġ// ĠPurchase Ġupdate Ġlistener ĊĠĠĠĠĠĠĠ Ġbilling Client Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBilling Client . newBuilder ( this ). set Listener ( this ). enable Pending P urchases (). build () ĊĊĠĠĠĠĠĠĠ Ġ// ĠBilling Ġclient Ġstate Ġlistener ĊĠĠĠĠĠĠĠ Ġbilling Client . start Connection ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ func Ġopen Ġin - app Ġpurchase Ġdialog Ġflow Ġfor Ġpurchase ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġstart Purchase () Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" start Purchase : Ġcalled ") ĊĊĠĠĠĠĠĠĠ Ġif Ġ( Tools . has Network ( this )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( billing Client . is Ready ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbilling Flow Params Ġ= ĠBilling Flow Params . newBuilder (). set Sku Details ( sku Details ). build () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbilling Client . launch Billing Flow ( this , Ġbilling Flow Params ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġdisplay Toast (" Make Ġsure Ġyou Ġhave Ġactive Ġinternet ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ inherited Ġfrom Ġ* P urchases Updated Listener Ġ-> listen Ġin - app Ġbilling Ġpurchase Ġchanges ĊĠĠĠĠ Ġ* Ġ@ param Ġbilling Result ĠBilling Result Ġobject ĊĠĠĠĠ Ġ* Ġ@ param Ġpurch ases ĠMutable Ġlist Ġof ĠPurchase Ġobject ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġon P urchases Updated ( ĊĠĠĠĠĠĠĠ Ġbilling Result : ĠBilling Result ?, ĊĠĠĠĠĠĠĠ Ġpurch ases : ĠMutable List < Purchase >? ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ ĠTools . in Visible Views ( bind . progress Bar , Ġtype Ġ= ĠTools . In visibility Type . GONE ) ĊĠĠĠĠĠĠĠ ĠTools . visible Views ( bind . btn Remove Ads ) ĊĊĠĠĠĠĠĠĠ Ġwhen Ġ( billing Result ?. response Code ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBilling Response Code . SERVICE _ TIMEOUT Ġ-> Ġthis . display Toast (" Service Ġtime Ġout Ġ: (" ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBilling Response Code . SERVICE _ DIS CONNECTED Ġ-> Ġthis . display Toast (" Billing Ġservice Ġis Ġdisconnected Ġ: (" ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBilling Response Code . OK Ġ-> Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMaterial Dialog ( this ). show Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcorner Radius ( 1 6 f ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcancel able ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtitle ( text Ġ= Ġ" Ad Ġremoved Ġsuccess ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext Ġ= Ġ" You Ġdon 't Ġsee Ġads Ġanymore . ĠAll Ġads Ġare Ġremoved Ġper manently ." Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"\ n Don 't Ġworry Ġwhen Ġyou Ġuninstall Ġthe Ġapp Ġyour Ġpurchase Ġhas Ġbeen Ġsaved " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" and Ġafter Ġre install Ġthe Ġapp Ġyou Ġhave Ġto Ġcheck Ġyour Ġpurchase Ġby Ġt apping ĠPay Ġbutton ." Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"\ n \ n Thanks Ġfor Ġpurchase Ġ: )" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpositive Button ( text Ġ= Ġ" RE START ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTools . restart App ( this @ Settings Activity ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdisplay Toast (" Re starting Ġapp ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnegative Button ( text Ġ= Ġ" OK ") Ġ{} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDisable Ġad Ġshowing ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠShared Pref . getInstance ( this ). save Data ( Storage Key . SHOW _ AD , Ġfalse ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBilling Response Code . USER _ C ANCE LED Ġ-> Ġdisplay Toast (" Transaction Ġcanceled Ġ: | ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBilling Response Code . SERVICE _ UN AVAILABLE Ġ-> Ġdisplay Toast (" Service Ġunavailable Ġ: (" ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBilling Response Code . B ILL ING _ UN AVAILABLE Ġ-> Ġdisplay Toast (" Billing Ġunavailable Ġ: (" ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBilling Response Code . ITEM _ UN AVAILABLE Ġ-> Ġdisplay Toast (" Item Ġunavailable Ġ: (" ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBilling Response Code . DE VELO PER _ ERROR Ġ-> Ġdisplay Toast (" Developer Ġerror Ġ: (" ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBilling Response Code . ERROR Ġ-> Ġdisplay Toast (" Error Ġ: (" ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBilling Response Code . ITEM _ AL READY _ OWN ED Ġ-> Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDisable Ġad Ġshowing ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠShared Pref . getInstance ( this ). save Data ( Storage Key . SHOW _ AD , Ġfalse ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbind . btn Remove Ads . isEnabled Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMaterial Dialog ( this ). show Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcorner Radius ( 1 6 f ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcancel able ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtitle ( text Ġ= Ġ" Item Ġalready Ġowned ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage ( text Ġ= Ġ" You Ġalready Ġpurch ased Ġthis .\ ny ou Ġdon 't Ġsee Ġads Ġanymore , ĠRestart Ġapp Ġnow .. ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpositive Button ( text Ġ= Ġ" RE START ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdisplay Toast (" Re starting Ġapp ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTools . restart App ( this @ Settings Activity ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnegative Button ( text Ġ= Ġ" OK ") Ġ{} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBilling Response Code . ITEM _ NOT _ OWN ED Ġ-> Ġdisplay Toast (" You Ġnot Ġowned Ġyet Ġ: (" ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ inherited Ġfrom Ġ* Billing Client State Listener Ġ-> Ġlisten ĠBilling Ġclient Ġstate ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġon Billing Service Disconnected () Ġ{ ĊĠĠĠĠĠĠĠ ĠTools . in Visible Views ( bind . btn Remove Ads , Ġtype Ġ= ĠTools . In visibility Type . GONE ) ĊĠĠĠĠĠĠĠ ĠTools . visible Views ( bind . progress Bar ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ inherited Ġfrom Ġ* Billing Client State Listener Ġ-> Ġlisten ĠBilling Ġclient Ġstate ĊĠĠĠĠ Ġ* Ġ@ param Ġbilling Result ĠBilling Result Ġobject ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġon Billing Setup Finished ( billing Result : ĠBilling Result ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( billing Result ?. response Code Ġ== ĠBilling Response Code . OK ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠTools . in Visible Views ( bind . progress Bar , Ġtype Ġ= ĠTools . In visibility Type . GONE ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTools . visible Views ( bind . btn Remove Ads ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġsku Details Param Ġ= Ġ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 ( sku Details Param ) Ġ{ Ġ_ /* billing Result */, Ġsku Details List Ġ-> ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( billing Result . response Code Ġ== ĠBilling Response Code . OK Ġ&& Ġsku Details List . isNotEmpty ()) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( sku Details Ġin Ġsku Details List ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ Settings Activity . sku Details Ġ= Ġsku Details ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsku Ġ= Ġsku Details . sku ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprice Ġ= Ġsku Details . price ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( sku List [ 0 ] Ġ== Ġsku ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbind . btn Remove Ads . text Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Check Ġ& ĠPay Ġ$ price " ĠĠ Ġ// ĠSet Ġproduct Ġprice Ġto Ġbutton Ġtext ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ