package de.onyxbits.sensorreadout;
import android.app.AlertDialog;
import android.content.ActivityNotFoundException;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.util.Log;
/**
* Ask the user about reviewing the app on Google Play after a reasonable
* amount of time and launches.
*/
class AppRater implements DialogInterface.OnClickListener {
private static final int DAYS_UNTIL_PROMPT = 7;
private static final int LAUNCHES_UNTIL_PROMPT = 14;
private static final String PREFSFILE = "apprater";
private Context context;
private AppRater(Context context) {
this.context = context;
}
/**
* Should be called on every <code>Activity.onCreate()</code>. Checks if the
* trial period is over and if so brings up a notification dialog.
*
* @param ctx
* The application context.
*/
public static void appLaunched(Context ctx) {
try {
// Don't even bother if not installed from Google Play
PackageManager pm = ctx.getPackageManager();
String pn = ctx.getPackageName();
String inst = pm.getInstallerPackageName(pn);
if (inst == null || !(inst.startsWith("com.google")
|| inst.startsWith("com.android"))) {
return;
}
}
catch (Exception exp) {
Log.w("AppRater",exp);
// Just bailout. Don't even try recovery.
return;
}
SharedPreferences prefs = ctx.getSharedPreferences(PREFSFILE, 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);
}
editor.commit();
// 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(ctx);
}
}
}
/**
* Just bring up the rating dialog without checking whether or not the trial
* period has ended
*
* @param ctx
* application context
*/
public static void showRateDialog(Context ctx) {
AppRater rater = new AppRater(ctx);
AlertDialog.Builder builder = new AlertDialog.Builder(ctx);
builder.setTitle(R.string.apprater_title);
builder.setMessage(R.string.apprater_message);
builder.setIcon(R.drawable.ic_rate);
builder.setPositiveButton(R.string.apprater_positive, rater);
builder.setNegativeButton(R.string.apprater_negative, rater);
builder.setNeutralButton(R.string.apprater_neutral, rater);
builder.create().show();
}
@Override
public void onClick(DialogInterface di, int id) {
SharedPreferences.Editor editor = context
.getSharedPreferences(PREFSFILE, 0).edit();
switch (id) {
case DialogInterface.BUTTON_POSITIVE: {
try {
context.startActivity(new Intent(Intent.ACTION_VIEW, Uri
.parse("market://details?id=" + context.getPackageName())));
}
catch (ActivityNotFoundException exp) {
}
// Fall through intended!
}
case DialogInterface.BUTTON_NEGATIVE: {
editor.putBoolean("dontshowagain", true);
break;
}
case DialogInterface.BUTTON_NEUTRAL:
default: {
// Did the user select "Later" because s/he does not have network access
// right now or because s/he wants to extend the trial period? Let's
// assume the later and reset the launch counter, as it is the less
// pesky option.
editor.putLong("launch_count", 0);
}
}
editor.commit();
di.dismiss();
}
}