Saturday, February 4, 2017

Implement "Rate Us" feature in Android App

I implemented this a while back, to some extent. It is impossible to know whether or not a user has rated an app, to prevent ratings from becoming a currency (some developers might add an option like “Rate this app and get so and so in the app for free”).

The class I wrote provides three buttons, and configures the dialog so that it is only shown after the app has been launched n times (users have a higher chance of rating the app if they’ve used it a bit before. Most of them are unlikely to even know what it does on the first run):




 public class AppRater {  
   private final static String APP_TITLE = "App Name";// App Name  
   private final static String APP_PNAME = "com.example.name";// Package Name  
   private final static int DAYS_UNTIL_PROMPT = 3;//Min number of days  
   private final static int LAUNCHES_UNTIL_PROMPT = 3;//Min number of launches  
   public static void app_launched(Context mContext) {  
     SharedPreferences prefs = mContext.getSharedPreferences("apprater", 0);  
     if (prefs.getBoolean("dontshowagain", false)) { return ; }  
     SharedPreferences.Editor editor = prefs.edit();  
     // Increment launch counter  
     long launch_count = prefs.getLong("launch_count", 0) + 1;  
     editor.putLong("launch_count", launch_count);  
     // Get date of first launch  
     Long date_firstLaunch = prefs.getLong("date_firstlaunch", 0);  
     if (date_firstLaunch == 0) {  
       date_firstLaunch = System.currentTimeMillis();  
       editor.putLong("date_firstlaunch", date_firstLaunch);  
     }  
     // Wait at least n days before opening  
     if (launch_count >= LAUNCHES_UNTIL_PROMPT) {  
       if (System.currentTimeMillis() >= date_firstLaunch +   
           (DAYS_UNTIL_PROMPT * 24 * 60 * 60 * 1000)) {  
         showRateDialog(mContext, editor);  
       }  
     }  
     editor.commit();  
   }    
   public static void showRateDialog(final Context mContext, final SharedPreferences.Editor editor) {  
     final Dialog dialog = new Dialog(mContext);  
     dialog.setTitle("Rate " + APP_TITLE);  
     LinearLayout ll = new LinearLayout(mContext);  
     ll.setOrientation(LinearLayout.VERTICAL);  
     TextView tv = new TextView(mContext);  
     tv.setText("If you enjoy using " + APP_TITLE + ", please take a moment to rate it. Thanks for your support!");  
     tv.setWidth(240);  
     tv.setPadding(4, 0, 4, 10);  
     ll.addView(tv);  
     Button b1 = new Button(mContext);  
     b1.setText("Rate " + APP_TITLE);  
     b1.setOnClickListener(new OnClickListener() {  
       public void onClick(View v) {  
         mContext.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + APP_PNAME)));  
         dialog.dismiss();  
       }  
     });      
     ll.addView(b1);  
     Button b2 = new Button(mContext);  
     b2.setText("Remind me later");  
     b2.setOnClickListener(new OnClickListener() {  
       public void onClick(View v) {  
         dialog.dismiss();  
       }  
     });  
     ll.addView(b2);  
     Button b3 = new Button(mContext);  
     b3.setText("No, thanks");  
     b3.setOnClickListener(new OnClickListener() {  
       public void onClick(View v) {  
         if (editor != null) {  
           editor.putBoolean("dontshowagain", true);  
           editor.commit();  
         }  
         dialog.dismiss();  
       }  
     });  
     ll.addView(b3);  
     dialog.setContentView(ll);      
     dialog.show();      
   }  
 }  
Integrating the class is as simple as adding:
 AppRater.app_launched(this);  
To your Activity. It only needs to be added to one Activity in the entire app.

No comments :

Post a Comment