11package net.opendasharchive.openarchive.features.main
22
3+ import android.app.Activity
34import android.content.Context
45import android.content.Intent
56import android.graphics.Point
@@ -16,6 +17,7 @@ import android.view.inputmethod.EditorInfo
1617import android.view.inputmethod.InputMethodManager
1718import android.widget.LinearLayout
1819import android.widget.PopupWindow
20+ import android.widget.Toast
1921import androidx.activity.result.contract.ActivityResultContracts
2022import androidx.annotation.RequiresApi
2123import androidx.core.content.ContextCompat
@@ -27,6 +29,12 @@ import androidx.lifecycle.lifecycleScope
2729import androidx.recyclerview.widget.LinearLayoutManager
2830import androidx.viewpager2.widget.ViewPager2
2931import com.google.android.material.snackbar.Snackbar
32+ import com.google.android.play.core.review.ReviewException
33+ import com.google.android.play.core.review.ReviewInfo
34+ import com.google.android.play.core.review.ReviewManager
35+ import com.google.android.play.core.review.ReviewManagerFactory
36+ import com.google.android.play.core.review.model.ReviewErrorCode
37+ import com.google.android.play.core.review.testing.FakeReviewManager
3038import kotlinx.coroutines.Dispatchers
3139import kotlinx.coroutines.launch
3240import net.opendasharchive.openarchive.BuildConfig
@@ -78,6 +86,9 @@ import net.opendasharchive.openarchive.util.extensions.show
7886import org.koin.android.ext.android.inject
7987import org.koin.androidx.viewmodel.ext.android.viewModel
8088import java.text.NumberFormat
89+ import androidx.core.content.edit
90+ import kotlinx.coroutines.delay
91+ import net.opendasharchive.openarchive.util.InAppReviewHelper
8192
8293
8394class MainActivity : BaseActivity (), SpaceDrawerAdapterListener, FolderDrawerAdapterListener {
@@ -129,6 +140,8 @@ class MainActivity : BaseActivity(), SpaceDrawerAdapterListener, FolderDrawerAda
129140
130141 private lateinit var permissionManager: PermissionManager
131142
143+ private lateinit var reviewManager: ReviewManager
144+ private var shouldPromptReview = false
132145
133146 override fun onCreate (savedInstanceState : Bundle ? ) {
134147 // /enableEdgeToEdge()
@@ -165,6 +178,9 @@ class MainActivity : BaseActivity(), SpaceDrawerAdapterListener, FolderDrawerAda
165178 // Initialize the permission manager with this activity and its dialogManager.
166179 permissionManager = PermissionManager (this , dialogManager)
167180
181+ // Initialize In App Ratings Helper
182+ InAppReviewHelper .init (this )
183+
168184 initMediaLaunchers()
169185 setupToolbarAndPager()
170186 setupNavigationDrawer()
@@ -196,6 +212,10 @@ class MainActivity : BaseActivity(), SpaceDrawerAdapterListener, FolderDrawerAda
196212 // You can start the upload service or update the UI accordingly.
197213 UploadService .startUploadService(this )
198214 }
215+
216+ reviewManager = ReviewManagerFactory .create(this )
217+ InAppReviewHelper .requestReviewInfo(this )
218+ shouldPromptReview = InAppReviewHelper .onAppLaunched()
199219 }
200220
201221 override fun onResume () {
@@ -212,6 +232,19 @@ class MainActivity : BaseActivity(), SpaceDrawerAdapterListener, FolderDrawerAda
212232 serverListOffset = - dims.second.toFloat()
213233 serverListCurOffset = serverListOffset
214234 }
235+
236+ // ─────────────────────────────────────────────────────────────────────────
237+ // Only now, after UI is ready, do we fire the in‐app review if needed.
238+ if (shouldPromptReview) {
239+ lifecycleScope.launch(Dispatchers .Main ) {
240+ // Wait a small delay so we don’t interrupt initial load (e.g. 2 seconds).
241+ delay(2_000 )
242+ InAppReviewHelper .showReviewIfPossible(this @MainActivity, reviewManager)
243+ InAppReviewHelper .markReviewDone()
244+ shouldPromptReview = false
245+ }
246+ }
247+ // ─────────────────────────────────────────────────────────────────────────
215248 }
216249
217250 @RequiresApi(Build .VERSION_CODES .UPSIDE_DOWN_CAKE )
@@ -719,6 +752,8 @@ class MainActivity : BaseActivity(), SpaceDrawerAdapterListener, FolderDrawerAda
719752 mFolderAdapter.update(projects)
720753 }
721754
755+
756+
722757 private fun refreshCurrentProject () {
723758 val project = getSelectedProject()
724759
0 commit comments