diff --git a/android/app/build.gradle.kts b/android/app/build.gradle.kts index ab4c1b20..fae7ac87 100644 --- a/android/app/build.gradle.kts +++ b/android/app/build.gradle.kts @@ -18,8 +18,8 @@ android { applicationId = "com.emergetools.hackernews" minSdk = 30 targetSdk = 34 - versionCode = 10 - versionName = "1.0.1" + versionCode = 12 + versionName = "1.0.1-internal" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" vectorDrawables { @@ -136,6 +136,9 @@ dependencies { implementation(libs.kotlinx.serialization.json) implementation(libs.jsoup) + implementation(libs.play.review) + implementation(libs.play.review.ktx) + implementation(libs.androidx.room) implementation(libs.androidx.room.ktx) ksp(libs.androidx.room.compiler) diff --git a/android/app/src/main/java/com/emergetools/hackernews/features/settings/SettingsScreen.kt b/android/app/src/main/java/com/emergetools/hackernews/features/settings/SettingsScreen.kt index f88a0d45..34a72013 100644 --- a/android/app/src/main/java/com/emergetools/hackernews/features/settings/SettingsScreen.kt +++ b/android/app/src/main/java/com/emergetools/hackernews/features/settings/SettingsScreen.kt @@ -1,5 +1,6 @@ package com.emergetools.hackernews.features.settings +import android.app.Activity import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box @@ -23,7 +24,13 @@ import androidx.compose.material3.NavigationBarItemDefaults import androidx.compose.material3.Scaffold import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.painterResource import androidx.compose.ui.tooling.preview.Devices import androidx.compose.ui.tooling.preview.Preview @@ -40,6 +47,22 @@ import com.emergetools.hackernews.ui.theme.HackerNewsTheme import com.emergetools.hackernews.ui.theme.HackerOrange import com.emergetools.hackernews.ui.theme.HackerRed import com.emergetools.snapshots.annotations.EmergeAppStoreSnapshot +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 io.sentry.Sentry + +@Composable +fun rememberReviewInfo(manager: ReviewManager): ReviewInfo? { + var reviewInfo: ReviewInfo? by remember { mutableStateOf(null) } + val request = manager.requestReviewFlow() + request.addOnCompleteListener { task -> + if (task.isSuccessful) { + reviewInfo = task.result + } + } + return reviewInfo +} @Composable fun SettingsScreen( @@ -47,6 +70,19 @@ fun SettingsScreen( actions: (SettingsAction) -> Unit, navigation: (SettingsNavigation) -> Unit, ) { + val context = LocalContext.current + val activity = context as Activity + val reviewManager = remember { ReviewManagerFactory.create(context) } + val reviewInfo = rememberReviewInfo(reviewManager) + LaunchedEffect(reviewInfo) { + reviewInfo?.let { info -> + val flow = reviewManager.launchReviewFlow(activity, info) + flow.addOnCompleteListener { + Sentry.captureMessage("Showed Review Modal") + } + } + } + Column( modifier = Modifier .fillMaxSize() diff --git a/android/app/src/main/java/com/emergetools/hackernews/features/stories/StoriesScreen.kt b/android/app/src/main/java/com/emergetools/hackernews/features/stories/StoriesScreen.kt index 49e64fa0..762fed73 100644 --- a/android/app/src/main/java/com/emergetools/hackernews/features/stories/StoriesScreen.kt +++ b/android/app/src/main/java/com/emergetools/hackernews/features/stories/StoriesScreen.kt @@ -48,7 +48,6 @@ fun StoriesScreen( val listState = rememberLazyListState() val pullRefreshState = rememberPullToRefreshState() - val shouldLoadMore by remember { derivedStateOf { listState.atEndOfList() diff --git a/android/gradle/libs.versions.toml b/android/gradle/libs.versions.toml index d436ab1a..1485443a 100644 --- a/android/gradle/libs.versions.toml +++ b/android/gradle/libs.versions.toml @@ -24,6 +24,7 @@ room = "2.6.1" jsoup = "1.18.1" extendedspans = "1.4.0" composeBom = "2024.09.03" +playReview = "2.0.1" [libraries] androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" } @@ -55,6 +56,9 @@ retrofit-kotlinx-serialization = { group = "com.squareup.retrofit2", name = "con kotlinx-serialization-json = { group = "org.jetbrains.kotlinx", name = "kotlinx-serialization-json", version.ref = "kotlinx-serialization-json" } jsoup = { group = "org.jsoup", name = "jsoup", version.ref = "jsoup" } +play-review = { group = "com.google.android.play", name = "review", version.ref = "playReview" } +play-review-ktx = { group = "com.google.android.play", name = "review-ktx", version.ref = "playReview" } + emerge-snapshots = { group = "com.emergetools.snapshots", name = "snapshots", version.ref = "emergeSnapshots" } emerge-snapshots-annotations = { group = "com.emergetools.snapshots", name = "snapshots-annotations", version.ref = "emergeSnapshots" } emerge-reaper = { group = "com.emergetools.reaper", name = "reaper", version.ref = "emergeReaper" }