/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 1 5 ĠO leg ĠK an Ċ Ġ* Ċ Ġ* Ġ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 Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttp :// 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 . simp la ap lik o . app r ater Ċ Ċ import Ġandroid . app . Activity Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . DialogInterface Ċ import Ġandroid . content . Intent Ċ import Ġandroid . content . pm . PackageManager Ċ import Ġandroid . net . Uri Ċ import Ġandroid . os . Build Ċ import Ġandroid . widget . Toast Ċ import Ġandroidx . annotation . Requires Api Ċ import Ġandroidx . appcompat . app . AlertDialog Ċ import Ġcom . google . android . play . core . review . Review ManagerFactory Ċ import Ġcom . google . android . play . core . review . testing . Fake Review Manager Ċ import Ġjava . util . Date Ċ Ċ @ Suppress (" Member Visibility Can Be Private ") Ċ object ĠApp R ater Ġ{ ĊĠĠĠ Ġprivate Ġconst Ġval ĠDAY Ġ= Ġ 2 4 Ġ* Ġ 6 0 Ġ* Ġ 6 0 Ġ* Ġ 1 0 0 0 ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCheck Ġif Ġ' Google ĠPlay ĠIn - App ĠReview ' Ġdialog Ġneeds Ġto Ġbe Ġdisplayed , ĊĠĠĠĠ Ġ* Ġbased Ġon Ġthe Ġfirst Ġlaunch Ġdate , Ġlaunch Ġcount Ġand Ġdo Ġnot Ġshow Ġagain ĊĠĠĠĠ Ġ* Ġshared Ġpreferences . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġactivity ĠActivity ĊĠĠĠĠ Ġ* Ġ@ param ĠonComplete Listener ĠOn Ġreview Ġcomplete Ġlistener ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Requires Api ( Build . VERSION _ CODES . LO L LI POP ) ĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġfun Ġapp La unched ( activity : ĠActivity , ĠonComplete Listener : Ġ() Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpreferences Ġ= ĠPreferences Helper ( activity ) ĊĠĠĠĠĠĠĠ Ġif Ġ( preferences . is Do No Show Again ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġincrement ( activity ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( is TimeTo Rate ( activity )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshow Review Dialog ( activity , ĠonComplete Listener , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Requires Api ( Build . VERSION _ CODES . LO L LI POP ) ĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġfun Ġshow Review Dialog ( activity : ĠActivity , ĠonComplete Listener : Ġ() Ġ-> ĠUnit , Ġdebug : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmanager Ġ= Ġif Ġ( debug ) ĠReview ManagerFactory . create ( activity ) Ġelse ĠFake Review Manager ( activity ) ĊĊĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= Ġmanager . request Review Flow () ĊĠĠĠĠĠĠĠ Ġrequest . add On Complete Listener Ġ{ Ġtask Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( task . is Successful ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreview Info Ġ= Ġtask . result ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġflow Ġ= Ġmanager . launch Review Flow ( activity , Ġreview Info ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġflow . add On Complete Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcancel Rem inders ( activity ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonComplete Listener () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrem ind Later ( activity ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCheck Ġif Ġ' rate Ġapp ' Ġdialog Ġneeds Ġto Ġbe Ġdisplayed , ĊĠĠĠĠ Ġ* Ġbased Ġon Ġthe Ġfirst Ġlaunch Ġdate , Ġlaunch Ġcount Ġand Ġdo Ġnot Ġshow Ġagain ĊĠĠĠĠ Ġ* Ġshared Ġpreferences . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġactivity ĠActivity ĊĠĠĠĠ Ġ* Ġ@ param Ġon Positive Button Listener ĠPositive Ġbutton Ġclick Ġlistener ĊĠĠĠĠ Ġ* Ġ@ param Ġon Negative Button Listener ĠNegative Ġbutton Ġclick Ġlistener ĊĠĠĠĠ Ġ* Ġ@ param Ġon Neutral Button Listener ĠNe utral Ġbutton Ġclick Ġlistener ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġ@ Jvm Over loads ĊĠĠĠ Ġfun Ġapp La unched ( ĊĠĠĠĠĠĠĠ Ġactivity : ĠActivity , ĊĠĠĠĠĠĠĠ Ġon Positive Button Listener : ĠDialog Interface . OnClickListener ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġon Negative Button Listener : ĠDialog Interface . OnClickListener ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġon Neutral Button Listener : ĠDialog Interface . OnClickListener ? Ġ= Ġnull ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpreferences Ġ= ĠPreferences Helper ( activity ) ĊĠĠĠĠĠĠĠ Ġif Ġ( preferences . is Do No Show Again ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġincrement ( activity ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( is TimeTo Rate ( activity )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshow Dialog ( activity , Ġon Positive Button Listener , Ġon Negative Button Listener , Ġon Neutral Button Listener ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġ@ Jvm Over loads ĊĠĠĠ Ġfun Ġshow Dialog ( ĊĠĠĠĠĠĠĠ Ġactivity : ĠActivity , ĊĠĠĠĠĠĠĠ Ġon Positive Button Listener : ĠDialog Interface . OnClickListener ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġon Negative Button Listener : ĠDialog Interface . OnClickListener ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġon Neutral Button Listener : ĠDialog Interface . OnClickListener ? Ġ= Ġnull ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= ĠAlertDialog . Builder ( activity ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Cancel able ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. setTitle ( R . string . ar _ dialog _ rate _ title ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. setMessage ( R . string . ar _ dialog _ rate _ message ) ĊĊĠĠĠĠĠĠĠ Ġon Positive Button Listener ?. let Ġ{ Ġlistener Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . set Positive Button ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . string . ar _ dialog _ rate _ positive _ button _ rate ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ Ġdialog : ĠDialog Interface ?, Ġwhich : ĠInt Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrate App ( activity ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlistener . onClick ( dialog , Ġwhich ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġon Negative Button Listener ?. let Ġ{ Ġlistener Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . set Negative Button ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . string . ar _ dialog _ rate _ negative _ button ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ Ġdialog : ĠDialog Interface ?, Ġwhich : ĠInt Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrem ind Later ( activity ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlistener . onClick ( dialog , Ġwhich ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġon Neutral Button Listener ?. let Ġ{ Ġlistener Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . set Neutral Button ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . string . ar _ dialog _ rate _ neutral _ button ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ Ġdialog : ĠDialog Interface ?, Ġwhich : ĠInt Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcancel Rem inders ( activity ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlistener . onClick ( dialog , Ġwhich ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġbuilder . create () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. show () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠIncrement Ġlaunch Ġcount Ġand Ġset Ġfirst Ġlaunch Ġdate ĊĠĠĠĠ Ġ* Ġ@ param Ġcontext ĠContext ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġincrement ( context : ĠContext ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpreferences Ġ= ĠPreferences Helper ( context ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠIncrement Ġthe Ġlaunch Ġcounter ĊĠĠĠĠĠĠĠ Ġval Ġlaunch Count Ġ= Ġpreferences . launch Count Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠ Ġpreferences . set Launch Count ( launch Count ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠGet Ġdate Ġof Ġthe Ġfirst Ġlaunch ĊĠĠĠĠĠĠĠ Ġval Ġfirst Launch Date Ġ= Ġpreferences . first Launch Date ĊĠĠĠĠĠĠĠ Ġif Ġ( first Launch Date Ġ== Ġ 0 L ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpreferences . set First Launch Date ( System . currentTimeMillis ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġfun Ġget First Launch Date ( context : ĠContext ): ĠDate Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpreferences Ġ= ĠPreferences Helper ( context ) ĊĠĠĠĠĠĠĠ Ġval Ġfirst Launch Date Ġ= Ġpreferences . first Launch Date ĊĠĠĠĠĠĠĠ Ġreturn ĠDate ( first Launch Date ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġfun Ġget Launch Count ( context : ĠContext ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpreferences Ġ= ĠPreferences Helper ( context ) ĊĠĠĠĠĠĠĠ Ġreturn Ġpreferences . launch Count ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġfun Ġis DoNot Show Again ( context : ĠContext ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpreferences Ġ= ĠPreferences Helper ( context ) ĊĠĠĠĠĠĠĠ Ġreturn Ġpreferences . is Do No Show Again ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġfun Ġis TimeTo Rate ( context : ĠContext ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresources Ġ= Ġcontext . resources ĊĠĠĠĠĠĠĠ Ġval Ġday Until Prompt Ġ= Ġresources . getInteger ( R . integer . ar _ app _ r ater _ days _ until _ prompt ) ĊĠĠĠĠĠĠĠ Ġval Ġla unches Until Prompt Ġ= Ġresources . getInteger ( R . integer . ar _ app _ r ater _ la unches _ until _ prompt ) ĊĊĠĠĠĠĠĠĠ Ġval Ġpreferences Ġ= ĠPreferences Helper ( context ) ĊĠĠĠĠĠĠĠ Ġval Ġlaunch Count Ġ= Ġpreferences . launch Count ĊĠĠĠĠĠĠĠ Ġval Ġfirst Launch Date Ġ= Ġpreferences . first Launch Date ĊĊĠĠĠĠĠĠĠ Ġreturn Ġ! preferences . is Do No Show Again Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlaunch Count Ġ>= Ġla unches Until Prompt Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . currentTimeMillis () Ġ>= Ġfirst Launch Date Ġ+ Ġday Until Prompt Ġ* ĠDAY ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠOpen ĠPlay ĠStore Ġfor Ġthe Ġrelated Ġapplication . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġrate App ( context : ĠContext ) Ġ{ ĊĠĠĠĠĠĠĠ ĠPreferences Helper ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Do No Show Again ( true ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġcreate ĠPlay ĠStore Ġintent ĊĠĠĠĠĠĠĠ Ġvar Ġrate Ġ= ĠIntent ( Intent . ACTION _ VIEW , ĠUri . parse (" market :// details ? id =" Ġ+ Ġcontext . packageName )) ĊĠĠĠĠĠĠĠ Ġif Ġ(! is Intent Callable ( context , Ġrate )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġif ĠPlay ĠStore Ġdoesn 't Ġexist Ġshow Ġin Ġbrowser ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrate Ġ= ĠIntent ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIntent . ACTION _ VIEW , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUri . parse (" http :// play . google . com / store / apps / details ? id =" Ġ+ Ġcontext . packageName ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! is Intent Callable ( context , Ġrate )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġif Ġbrowser Ġapp Ġdoesn 't Ġexist , Ġshow Ġtoast Ġand Ġquit ĊĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( context , Ġcontext . getString ( R . string . ar _ unable _ to _ find _ google _ play ), ĠToast . LENGTH _ LONG ). show () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( context Ġis ĠActivity ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . startActivity ( rate ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent . create Chooser ( rate , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġintent . flags Ġ= ĠIntent . FLAG _ ACTIVITY _ NEW _ TASK ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . startActivity ( intent ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReset Ġlaunch Ġcounter . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġrem ind Later ( context : ĠContext ) Ġ{ ĊĠĠĠĠĠĠĠ ĠPreferences Helper ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Launch Count ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set First Launch Date ( System . currentTimeMillis ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCancel Ġrem inders . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġcancel Rem inders ( context : ĠContext ) Ġ{ ĊĠĠĠĠĠĠĠ ĠPreferences Helper ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Do No Show Again ( true ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCheck Ġif Ġthis Ġis Ġa Ġfirst Ġlaunch ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġis First Launch ( context : ĠContext ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠPreferences Helper ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. first Launch Date Ġ== Ġ 0 L ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġis Intent Callable ( context : ĠContext , Ġintent : ĠIntent ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlist Ġ= Ġcontext . package Manager ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. query Intent Activities ( intent , ĠPackage Manager . MATCH _ DEFAULT _ ONLY ) ĊĠĠĠĠĠĠĠ Ġreturn Ġlist . size Ġ> Ġ 0 ĊĠĠĠ Ġ} Ċ } Ċ