Added in-app review (#4489)

This commit is contained in:
DAMLA YILDIZ 2020-10-10 23:07:26 +03:00 committed by GitHub
parent 36e5d7066b
commit e5e149a9df
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 124 additions and 1 deletions

View File

@ -152,6 +152,7 @@ dependencies {
// free build hack: skip some dependencies
if (!doFreeBuild()) {
playImplementation project(":core")
implementation 'com.google.android.play:core:1.8.0'
} else {
System.out.println("app: free build hack, skipping some dependencies")
}

View File

@ -110,4 +110,4 @@ public class RatingDialog {
.setOnCancelListener(dialog1 -> resetStartDate())
.create();
}
}
}

View File

@ -0,0 +1,122 @@
package de.danoeh.antennapod.dialog;
import android.app.Activity;
import android.content.Context;
import android.content.SharedPreferences;
import androidx.annotation.VisibleForTesting;
import android.util.Log;
import android.widget.Toast;
import java.lang.ref.WeakReference;
import java.util.concurrent.TimeUnit;
import com.google.android.play.core.review.ReviewInfo;
import com.google.android.play.core.review.ReviewManager;
import com.google.android.play.core.review.ReviewManagerFactory;
import com.google.android.play.core.tasks.Task;
public class RatingDialog {
private RatingDialog() {
}
private static final String TAG = RatingDialog.class.getSimpleName();
private static final int AFTER_DAYS = 14;
private static WeakReference<Context> mContext;
private static SharedPreferences mPreferences;
private static final String PREFS_NAME = "RatingPrefs";
private static final String KEY_RATED = "KEY_WAS_RATED";
private static final String KEY_FIRST_START_DATE = "KEY_FIRST_HIT_DATE";
private static final String KEY_NUMBER_OF_REVIEWS = "NUMBER_OF_REVIEW_ATTEMPTS";
public static void init(Context context) {
mContext = new WeakReference<>(context);
mPreferences = context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE);
long firstDate = mPreferences.getLong(KEY_FIRST_START_DATE, 0);
if (firstDate == 0) {
resetStartDate();
}
}
public static void check() {
if (shouldShow()) {
try {
showInAppReview();
} catch (Exception e) {
Log.e(TAG, Log.getStackTraceString(e));
}
}
}
private static void showInAppReview() {
Context context = mContext.get();
if (context == null) {
return;
}
ReviewManager manager = ReviewManagerFactory.create(context);
Task<ReviewInfo> request = manager.requestReviewFlow();
request.addOnCompleteListener(task -> {
if (task.isSuccessful()) {
ReviewInfo reviewInfo = task.getResult();
Task<Void> flow = manager.launchReviewFlow((Activity) context, reviewInfo);
flow.addOnCompleteListener(task1 -> {
int previousAttempts = mPreferences.getInt(KEY_NUMBER_OF_REVIEWS, 0);
if (previousAttempts >= 3) {
saveRated();
} else {
resetStartDate();
mPreferences
.edit()
.putInt(KEY_NUMBER_OF_REVIEWS, previousAttempts + 1)
.apply();
}
Log.i("ReviewDialog", "Successfully finished in-app review");
})
.addOnFailureListener(error -> {
Log.i("ReviewDialog", "failed in reviewing process");
});
}
})
.addOnFailureListener(error -> {
Log.i("ReviewDialog", "failed to get in-app review request");
});
}
private static boolean rated() {
return mPreferences.getBoolean(KEY_RATED, false);
}
@VisibleForTesting
public static void saveRated() {
mPreferences
.edit()
.putBoolean(KEY_RATED, true)
.apply();
}
private static void resetStartDate() {
mPreferences
.edit()
.putLong(KEY_FIRST_START_DATE, System.currentTimeMillis())
.apply();
}
private static boolean shouldShow() {
if (rated()) {
return false;
}
long now = System.currentTimeMillis();
long firstDate = mPreferences.getLong(KEY_FIRST_START_DATE, now);
long diff = now - firstDate;
long diffDays = TimeUnit.DAYS.convert(diff, TimeUnit.MILLISECONDS);
return diffDays >= AFTER_DAYS;
}
}