package Ġfr . tw ent yn ine . keep on . utils Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Intent Ċ import Ġandroid . graphics . Color Ċ import Ġandroid . net . Uri Ċ import Ġandroid . util . Display Metrics Ċ import Ġandroid . view . Gravity Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroid . widget . Button Ċ import Ġandroid . widget . TextView Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġandroidx . coordinator layout . widget . Coordinator Layout Ċ import Ġcom . google . android . material . sn ackbar . Snackbar Ċ import Ġcom . google . android . material . sn ackbar . Snackbar . Snackbar Layout Ċ import Ġfr . tw ent yn ine . keep on . R Ċ import Ġfr . tw ent yn ine . keep on . di . T ooth pick Helper Ċ import Ġfr . tw ent yn ine . keep on . di . annotation . Activity Scope Ċ import Ġfr . tw ent yn ine . keep on . utils . preferences . Preferences Ċ import Ġtoo th pick . Inject Constructor Ċ import Ġtoo th pick . k tp . delegate . lazy Ċ import Ġjava . util . Calendar Ċ import Ġjava . util . TimeZone Ċ Ċ /** Ċ Ġ* ĠCopyright Ġ( c ) ĠP ix p licity , ĠGene - rate Ċ Ġ* Ġhttps :// github . com / Pix p licity / gene - rate Ċ Ġ* Ċ Ġ* ĠWhen Ġyour Ġapp Ġhas Ġlaunched Ġa Ġcouple Ġof Ġtimes , Ġthis Ġclass Ġwill Ġask Ġto Ġgive Ġyour Ġapp Ġa Ġrating Ġon Ċ Ġ* Ġthe ĠPlay ĠStore . ĠIf Ġthe Ġuser Ġdoes Ġnot Ġwant Ġto Ġrate Ġyour Ġapp Ġand Ġindicates Ġa Ġcompl aint , Ġyou Ġhave Ċ Ġ* Ġthe Ġoption Ġto Ġredirect Ġthem Ġto Ġa Ġfeedback Ġlink . Ċ Ġ* Ċ Ġ* Ċ Ġ* ĠTo Ġuse , Ġcall Ġthe Ġfollowing Ġon Ġevery Ġapp Ġstart Ġ( or Ġwhen Ġappropriate ): < br ></ br > Ċ Ġ* Ġ` Ċ Ġ* ĠRate Ġm Rate Ġ= Ġnew ĠRate . Builder ( context ) Ċ Ġ* Ġ. set Trigger Count ( 1 0 ) Ċ Ġ* Ġ. setMinimum Install Time ( TimeUnit . DAYS . to Millis ( 7 )) Ċ Ġ* Ġ. setMessage ( R . string . my _ message _ text ) Ċ Ġ* Ġ. set Sn ackBar Parent ( view ) Ċ Ġ* Ġ. build (); Ċ Ġ* Ġm Rate . count (); Ċ ` Ġ* Ċ Ġ* ĠWhen Ġit Ġis Ġa Ġgood Ġtime Ġto Ġshow Ġa Ġrating Ġrequest , Ġcall : Ċ Ġ* Ġ` Ċ Ġ* Ġm Rate . show Request (); Ċ ` Ġ* Ċ Ġ* Ċ Ġ*/ Ċ @ Activity Scope Ċ @ Inject Constructor Ċ class ĠRate ( private Ġval Ġm Activity : ĠAppCompatActivity ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġpreferences : ĠPreferences Ġby Ġlazy () ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠInject Ġdependencies Ġwith ĠT ooth pick ĊĠĠĠĠĠĠĠ ĠT ooth pick Helper . scoped Injection ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġm Store Link : ĠString ? Ġ= Ġnull ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCall Ġthis Ġmethod Ġwhenever Ġyour Ġapp Ġis Ġlaunched Ġto Ġincrease Ġthe Ġlaunch Ġcounter . ĠOr Ġwhenever ĊĠĠĠĠ Ġ* Ġthe Ġuser Ġperforms Ġan Ġaction Ġthat Ġindicates Ġimm ersion . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġthe Ġ[ Rate ] Ġinstance ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġcount (): ĠRate Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġincrement ( false ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġincrement ( force : ĠBoolean ): ĠRate Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠGet Ġcurrent Ġlaunch Ġcount ĊĠĠĠĠĠĠĠ Ġvar Ġcount Ġ= Ġcount ĊĠĠĠĠĠĠĠ Ġ// ĠIncrement , Ġbut Ġonly Ġwhen Ġwe 're Ġnot Ġon Ġa Ġlaunch Ġpoint . ĠOtherwise Ġwe Ġcould Ġmiss ĊĠĠĠĠĠĠĠ Ġ// Ġit Ġwhen Ġ. count Ġand Ġ. show Request Ġcalls Ġare Ġnot Ġcalled Ġexactly Ġaltern ated ĊĠĠĠĠĠĠĠ Ġval Ġis At Launch Point Ġ= Ġremaining Count Ġ== Ġ 0 L ĊĠĠĠĠĠĠĠ Ġif Ġ( force Ġ|| Ġ! is At Launch Point ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcount ++ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġpreferences . set App Launch Count ( count ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġhow Ġoften ĠThe ĠAction Ġhas Ġbeen Ġperformed , Ġever . ĠThis Ġis Ġusually Ġthe Ġapp Ġlaunch Ġevent . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return ĠNumber Ġof Ġtimes Ġthe Ġapp Ġwas Ġlaunched . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġcount : ĠLong ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġpreferences . getApp Launch Count () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġhow Ġmany Ġmore Ġtimes Ġthe Ġtrigger Ġaction Ġshould Ġbe Ġperformed Ġbefore Ġit Ġtriggers Ġthe ĊĠĠĠĠ Ġ* Ġrating Ġrequest . ĠThis Ġcan Ġbe Ġeither Ġthe Ġfirst Ġrequest Ġor Ġcon sequent Ġrequests Ġafter Ġdis missing ĊĠĠĠĠ Ġ* Ġprevious Ġones . ĠThis Ġmethod Ġdoes ĠNOT Ġconsider Ġif Ġthe Ġrequest Ġwill Ġbe Ġshown Ġat Ġall , Ġe . g . Ġwhen ĊĠĠĠĠ Ġ* Ġ" don 't Ġask Ġagain " Ġwas Ġchecked . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠIf Ġthis Ġmethod Ġreturns Ġ` 0 ` Ġ( zero ), Ġthe Ġnext Ġcall Ġto Ġ[. show Request ] Ġwill Ġshow Ġthe ĊĠĠĠĠ Ġ* Ġdialog . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return ĠRem aining Ġcount Ġbefore Ġthe Ġnext Ġrequest Ġis Ġtriggered . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġremaining Count : ĠLong ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( count Ġ< ĠDEFAULT _ COUNT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDEFAULT _ COUNT Ġ- Ġcount ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( DEFAULT _ REPEAT _ COUNT Ġ- Ġ( count Ġ- ĠDEFAULT _ COUNT ) Ġ% ĠDEFAULT _ REPEAT _ COUNT ) Ġ% ĠDEFAULT _ REPEAT _ COUNT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠChecks Ġif Ġthe Ġapp Ġhas Ġbeen Ġlaunched Ġoften Ġenough Ġto Ġask Ġfor Ġa Ġrating , Ġand Ġshows Ġthe Ġrating ĊĠĠĠĠ Ġ* Ġrequest Ġif Ġso . ĠThe Ġrating Ġrequest Ġcan Ġbe Ġa ĠSn ackBar Ġ( preferred ) Ġor Ġa Ġdialog . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return ĠIf Ġthe Ġrequest Ġis Ġshown Ġor Ġnot ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġshow Request (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġasked Ġ= Ġpreferences . getApp Review Ask ed () ĊĠĠĠĠĠĠĠ Ġval Ġfirst Launch Ġ= Ġm Activity . package Manager . get Package Info ( m Activity . packageName , Ġ 0 ). first Install Time ĊĊĠĠĠĠĠĠĠ Ġval Ġshould Show Request Ġ= Ġ( remaining Count Ġ== Ġ 0 L Ġ&& Ġ! ask ed Ġ&& ĠCalendar . getInstance ( TimeZone . getTime Zone (" utc ")). time In Millis Ġ> Ġ( first Launch Ġ+ ĠDEFAULT _ INSTALL _ TIME )) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( should Show Request Ġ&& Ġcan Rate App ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshow Rating Request () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġshould Show Request ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCreates Ġan ĠIntent Ġto Ġlaunch Ġthe Ġproper Ġstore Ġpage . ĠThis Ġdoes Ġnot Ġguarantee Ġthe ĠIntent Ġcan Ġbe ĊĠĠĠĠ Ġ* Ġlaunched Ġ( i . e . Ġthat Ġthe ĠPlay ĠStore Ġis Ġinstalled ). ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return ĠThe ĠIntent Ġto Ġlaunch Ġthe Ġstore . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġstore Intent : ĠIntent ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuri Ġ= ĠUri . parse ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Store Link Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Store Link ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠpackageName Ġ= Ġm Activity . packageName ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" market :// details ? id =$ packageName " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠIntent ( Intent . ACTION _ VIEW , Ġuri ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshow Rating Request () Ġ{ ĊĠĠĠĠĠĠĠ Ġincrement ( true ) ĊĠĠĠĠĠĠĠ Ġshow Rating Snackbar () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshow Rating Snackbar () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠW ie Ġis Ġhier Ġnou Ġde Ġsn ackbar ? ĊĠĠĠĠĠĠĠ Ġval Ġsn ackbar Ġ= ĠSn ackbar . make ( m Activity . findViewById ( R . id . card View Container ), Ġ"", ĠSn ackbar . LENGTH _ IN DEFIN ITE ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠSet Ġbackground Ġtransparent Ġand Ġremove Ġpadding ĊĠĠĠĠĠĠĠ Ġsn ackbar . view . set BackgroundColor ( Color . TRANSP ARENT ) ĊĠĠĠĠĠĠĠ Ġsn ackbar . view . set Padding ( 0 , Ġ 0 , Ġ 0 , Ġ 0 ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠGet Ġsn ackbar Ġlayout ĊĠĠĠĠĠĠĠ Ġval Ġlayout Ġ= Ġsn ackbar . view Ġas ĠSn ackbar Layout ĊĊĠĠĠĠĠĠĠ Ġ// ĠHide Ġdefault Ġtext ĊĠĠĠĠĠĠĠ Ġval ĠtextView Ġ= Ġlayout . findViewById < TextView >( R . id . sn ackbar _ text ) ĊĠĠĠĠĠĠĠ ĠtextView . visibility Ġ= ĠView . IN VISIBLE ĊĊĠĠĠĠĠĠĠ Ġ// ĠInf late Ġour Ġcustom Ġview ĊĠĠĠĠĠĠĠ Ġval Ġinflater Ġ= Ġ( m Activity . getSystem Service ( Context . LAYOUT _ IN FL ATER _ SERVICE ) Ġas ĠLayoutInflater ) ĊĠĠĠĠĠĠĠ Ġ@ Suppress (" Inf late Params ") ĊĠĠĠĠĠĠĠ Ġval Ġsn ack View Ġ= Ġinflater . inflate ( R . layout . generate _ sn ackbar , Ġnull ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠSet ĠOn ClickListener Ġfor Ġbuttons ĊĠĠĠĠĠĠĠ Ġval Ġbt Rate Ġ= Ġsn ack View . findViewById < Button >( R . id . bt _ positive ) ĊĠĠĠĠĠĠĠ Ġbt Rate . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsn ackbar . dismiss () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġopen Play Store () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsave Ask ed () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġbt No Ġ= Ġsn ack View . findViewById < Button >( R . id . bt _ negative ) ĊĠĠĠĠĠĠĠ Ġbt No . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsn ackbar . dismiss () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsave Ask ed () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġlayout Params Ġ= Ġlayout . layout Params Ġas ĠCoord inator Layout . LayoutParams ĊĠĠĠĠĠĠĠ Ġval Ġdisplay Metrics : ĠDisplay Metrics Ġ= Ġm Activity . resources . display Metrics ĊĠĠĠĠĠĠĠ Ġval Ġdp Width Ġ= Ġdisplay Metrics . width Pixels Ġ/ Ġdisplay Metrics . density ĊĠĠĠĠĠĠĠ Ġif Ġ( dp Width Ġ>= Ġ 6 2 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlayout Params . width Ġ= Ġ 5 8 0 . px ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlayout Params . anchor Gravity Ġ= ĠGr avity . CENTER _ HORIZONTAL Ġor ĠGr avity . BOTTOM ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlayout Params . gravity Ġ= ĠGr avity . CENTER _ HORIZONTAL Ġor ĠGr avity . BOTTOM ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlayout Params . width Ġ= ĠViewGroup . LayoutParams . MATCH _ PARENT ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsn ackbar . view . layout Params Ġ= Ġlayout Params ĊĊĠĠĠĠĠĠĠ Ġ// ĠAdd Ġthe Ġview Ġto Ġthe ĠSn ackbar 's Ġlayout ĊĠĠĠĠĠĠĠ Ġlayout . addView ( sn ack View , Ġ 0 ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠShow Ġthe ĠSn ackbar ĊĠĠĠĠĠĠĠ Ġsn ackbar . show () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġopen Play Store () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġintent Ġ= Ġstore Intent ĊĠĠĠĠĠĠĠ Ġintent . flags Ġ= ĠIntent . FLAG _ ACTIVITY _ NEW _ TASK ĊĠĠĠĠĠĠĠ Ġm Activity . startActivity ( intent ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠChecks Ġif Ġthe Ġapp Ġcan Ġbe Ġr ated , Ġi . e . Ġif Ġthe Ġstore ĠIntent Ġcan Ġbe Ġlaunched , Ġi . e . Ġif Ġthe ĠPlay ĊĠĠĠĠ Ġ* ĠStore Ġis Ġinstalled . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġif Ġthe Ġapp Ġcan Ġbe Ġr ated ĊĠĠĠĠ Ġ* Ġ@ see Ġ. get Store Intent ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġcan Rate App (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġcan Open Intent ( store Intent ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠChecks Ġif Ġthe Ġsystem Ġor Ġany Ġ 3 rd Ġparty Ġapp Ġcan Ġhandle Ġthe ĠIntent ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġintent Ġthe ĠIntent ĊĠĠĠĠ Ġ* Ġ@ return Ġif Ġthe ĠIntent Ġcan Ġbe Ġhandled Ġby Ġthe Ġsystem ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġcan Open Intent ( intent : ĠIntent ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġm Activity ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. package Manager ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. query Intent Activities ( intent , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. size Ġ> Ġ 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsave Ask ed () Ġ{ ĊĠĠĠĠĠĠĠ Ġpreferences . set App Review Ask ed ( true ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠDEFAULT _ COUNT Ġ= Ġ 5 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠDEFAULT _ REPEAT _ COUNT Ġ= Ġ 2 0 ĊĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠDEFAULT _ INSTALL _ TIME Ġ= Ġ( 5 Ġ* Ġ( 1 0 0 0 Ġ* Ġ 6 0 Ġ* Ġ 6 0 Ġ* Ġ 2 4 )). to Long () Ġ// Ġ 5 Ġdays Ġ( 1 0 0 0 Ġ-> Ġto Ġseconds Ġ* Ġ 6 0 Ġ-> Ġto Ġminutes Ġ* Ġ 6 0 Ġ-> Ġto Ġhours Ġ* Ġ 2 4 Ġ-> Ġto Ġdays ) ĊĠĠĠ Ġ} Ċ } Ċ