From 1ee6b2d142a5f02a0f8ce7895fc35271f1ec3a7d Mon Sep 17 00:00:00 2001 From: Laurent Date: Wed, 9 Feb 2022 14:39:42 +0100 Subject: [PATCH] First draft for review requests --- .../ui/activity/components/BaseActivity.kt | 10 ++-- .../ui/fragment/components/BaseFragment.kt | 1 + .../report/ComparisonReportFragment.kt | 4 +- .../fragment/report/ProgressReportFragment.kt | 3 + .../android/ui/helpers/AppReviewManager.kt | 58 +++++++++++++++++++ .../calendar/CalendarDetailsFragment.kt | 2 + .../android/util/Preferences.kt | 18 +++++- 7 files changed, 90 insertions(+), 6 deletions(-) create mode 100644 app/src/main/java/net/pokeranalytics/android/ui/helpers/AppReviewManager.kt diff --git a/app/src/main/java/net/pokeranalytics/android/ui/activity/components/BaseActivity.kt b/app/src/main/java/net/pokeranalytics/android/ui/activity/components/BaseActivity.kt index e9771f00..9d05ae22 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/activity/components/BaseActivity.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/activity/components/BaseActivity.kt @@ -16,6 +16,7 @@ import io.realm.Realm import net.pokeranalytics.android.model.realm.Location import net.pokeranalytics.android.util.CrashLogging import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate +import net.pokeranalytics.android.ui.helpers.AppReviewManager import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.util.LocationManager import net.pokeranalytics.android.util.PermissionRequest @@ -40,10 +41,6 @@ abstract class BaseActivity : AppCompatActivity() { ViewModelProvider(this).get(RootBottomSheetViewModel::class.java) } -// var bottomSheetRow: RowRepresentable? -// get() { return this.bottomSheetViewModel.rowRepresentable } -// set(value) { this.bottomSheetViewModel.rowRepresentable = value } - fun setBottomSheetParameters(rowRepresentable: RowRepresentable, delegate: RowRepresentableDelegate) { this.bottomSheetViewModel.rowRepresentable = rowRepresentable this.bottomSheetViewModel.delegate = delegate @@ -83,6 +80,11 @@ abstract class BaseActivity : AppCompatActivity() { this.realm?.close() } + override fun onBackPressed() { + super.onBackPressed() + AppReviewManager.showReviewManager(this) + } + override fun onRequestPermissionsResult(requestCode: Int, permissions: Array, grantResults: IntArray) { super.onRequestPermissionsResult(requestCode, permissions, grantResults) diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/BaseFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/BaseFragment.kt index 30699224..fcf15f08 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/BaseFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/BaseFragment.kt @@ -7,6 +7,7 @@ import android.os.Bundle import android.view.View import androidx.appcompat.widget.Toolbar import androidx.fragment.app.Fragment +import com.google.android.play.core.review.ReviewManagerFactory import net.pokeranalytics.android.R import net.pokeranalytics.android.util.CrashLogging import net.pokeranalytics.android.ui.activity.components.BaseActivity diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/report/ComparisonReportFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/report/ComparisonReportFragment.kt index 8d107560..9c781dfa 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/report/ComparisonReportFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/report/ComparisonReportFragment.kt @@ -7,6 +7,7 @@ import android.view.ViewGroup import com.google.android.material.tabs.TabLayout import net.pokeranalytics.android.databinding.FragmentReportDetailsBinding import net.pokeranalytics.android.ui.adapter.ReportPagerAdapter +import net.pokeranalytics.android.ui.helpers.AppReviewManager class ComparisonReportFragment : AbstractReportFragment() { @@ -27,7 +28,8 @@ class ComparisonReportFragment : AbstractReportFragment() { override fun onDestroyView() { super.onDestroyView() - _binding = null + AppReviewManager.requestReview() + _binding = null } override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View { diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/report/ProgressReportFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/report/ProgressReportFragment.kt index 3af8dba3..03845dd8 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/report/ProgressReportFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/report/ProgressReportFragment.kt @@ -29,6 +29,7 @@ import net.pokeranalytics.android.ui.extensions.px import net.pokeranalytics.android.ui.extensions.showWithAnimation import net.pokeranalytics.android.ui.fragment.GraphFragment import net.pokeranalytics.android.ui.graph.Graph +import net.pokeranalytics.android.ui.helpers.AppReviewManager import timber.log.Timber import java.util.* @@ -87,6 +88,8 @@ class ProgressReportFragment : AbstractReportFragment() { // fragmentTransaction.commit() // } + AppReviewManager.requestReview() + super.onDestroyView() _binding = null } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/helpers/AppReviewManager.kt b/app/src/main/java/net/pokeranalytics/android/ui/helpers/AppReviewManager.kt new file mode 100644 index 00000000..285d3d14 --- /dev/null +++ b/app/src/main/java/net/pokeranalytics/android/ui/helpers/AppReviewManager.kt @@ -0,0 +1,58 @@ +package net.pokeranalytics.android.ui.helpers + +import android.app.Activity +import android.content.Context +import com.google.android.play.core.review.ReviewManagerFactory +import net.pokeranalytics.android.util.Preferences +import java.util.* + +object AppReviewManager { + + private var reviewRequested: Boolean = false + + fun requestReview() { + this.reviewRequested = true + } + + fun showReviewManager(activity: Activity) { + + if (this.reviewRequested && this.shouldAskForReview(activity.baseContext)) { + this.reviewRequested = false + + val manager = ReviewManagerFactory.create(activity.applicationContext) + val task = manager.requestReviewFlow() + task.addOnCompleteListener { request -> + if (request.isSuccessful) { + + Preferences.setLastReviewRequestDate(Date().time, activity.applicationContext) + + // We got the ReviewInfo object + val reviewInfo = request.result + val flow = manager.launchReviewFlow(activity, reviewInfo) + flow.addOnCompleteListener { + // completed + } + } else { + // There was some problem, continue regardless of the result. + } + } + } + + } + + private fun shouldAskForReview(context: Context): Boolean { + + val now = Date().time + val firstLaunch = Preferences.getFirstLaunchDate(context) + if (now - firstLaunch < 20 * 24 * 3600 * 1000L) { + return false + } + + val lastReviewRequest = Preferences.getLastReviewRequestDate(context) + if (now - lastReviewRequest < 90 * 24 * 3600 * 1000L) { + return false + } + return true + } + +} \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/ui/modules/calendar/CalendarDetailsFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/modules/calendar/CalendarDetailsFragment.kt index 0206b538..d80d71e0 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/modules/calendar/CalendarDetailsFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/modules/calendar/CalendarDetailsFragment.kt @@ -28,6 +28,7 @@ import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource import net.pokeranalytics.android.ui.fragment.components.BaseFragment +import net.pokeranalytics.android.ui.helpers.AppReviewManager import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowViewType import net.pokeranalytics.android.ui.view.rows.CustomizableRowRepresentable @@ -70,6 +71,7 @@ class CalendarDetailsFragment : BaseFragment(), StaticRowRepresentableDataSource override fun onDestroyView() { super.onDestroyView() + AppReviewManager.requestReview() _binding = null } diff --git a/app/src/main/java/net/pokeranalytics/android/util/Preferences.kt b/app/src/main/java/net/pokeranalytics/android/util/Preferences.kt index eb870e80..54a4bac4 100644 --- a/app/src/main/java/net/pokeranalytics/android/util/Preferences.kt +++ b/app/src/main/java/net/pokeranalytics/android/util/Preferences.kt @@ -23,7 +23,7 @@ class Preferences { enum class Keys(override var identifier: String) : PreferenceKey { CURRENCY_CODE("CurrencyCode"), LOCALE_CODE("LocaleCode"), -// FIRST_LAUNCH("firstLaunch"), + FIRST_LAUNCH("firstLaunch"), STOP_SHOWING_DISCLAIMER("stopShowingDisclaimer"), STOP_SHOWING_DUPLICATE("stopShowingDuplicate"), STOP_SHOWING_DISCORD("stopShowingDiscord"), @@ -42,6 +42,7 @@ class Preferences { LATEST_BLOG_POST_ID_DISPLAYED("latestBlogPostIdDisplayed"), LAST_BLOG_TIPS_RETRIEVAL("lastBlogTipsRetrieval"), SHOW_BLOG_TIPS("showBlogTips"), + LAST_REVIEW_REQUEST_DATE("lastReviewRequestDate") } enum class FeedMessage { @@ -283,6 +284,21 @@ class Preferences { return getLong(Keys.LAST_BLOG_TIPS_RETRIEVAL, context) } + fun setLastReviewRequestDate(date: Long, context: Context) { + setLong(Keys.LAST_REVIEW_REQUEST_DATE, date, context) + } + + fun getLastReviewRequestDate(context: Context): Long { + return getLong(Keys.LAST_REVIEW_REQUEST_DATE, context) + } + + fun setFirstLaunchDate(date: Long, context: Context) { + setLong(Keys.FIRST_LAUNCH, date, context) + } + + fun getFirstLaunchDate(context: Context): Long { + return getLong(Keys.FIRST_LAUNCH, context) + } } }