summaryrefslogtreecommitdiff
path: root/app/src/play/java/de/danoeh/antennapod/dialog/RatingDialog.java
blob: 66072e2fa3cfbae13f53eed5dde250ada34ac18a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
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 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;
    }
}