Skip to content

Commit 9c20d45

Browse files
kherembourgclaude
andcommitted
refactor(android): use fetchPresentation + display() everywhere
Replace all presentationView usage with fetchPresentation + display() pattern on Android for proper flow support. Matches iOS approach. Co-Authored-By: Claude <noreply@anthropic.com>
1 parent 1e61b45 commit 9c20d45

3 files changed

Lines changed: 60 additions & 64 deletions

File tree

android/app/src/main/java/com/purchasely/shaker/ui/screen/detail/DetailScreen.kt

Lines changed: 32 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.purchasely.shaker.ui.screen.detail
22

3+
import android.app.Activity
34
import android.util.Log
45
import androidx.compose.foundation.background
56
import androidx.compose.foundation.layout.Arrangement
@@ -43,6 +44,7 @@ import androidx.compose.ui.platform.LocalContext
4344
import androidx.compose.ui.unit.dp
4445
import com.purchasely.shaker.ui.components.CocktailImage
4546
import io.purchasely.ext.PLYPresentationProperties
47+
import io.purchasely.ext.PLYPresentationType
4648
import io.purchasely.ext.PLYProductViewResult
4749
import io.purchasely.ext.Purchasely
4850
import org.koin.androidx.compose.koinViewModel
@@ -76,20 +78,19 @@ fun DetailScreen(
7678
viewModel.toggleFavorite()
7779
} else {
7880
// Free user: show favorites paywall
79-
Purchasely.presentationView(
80-
context = context,
81-
properties = PLYPresentationProperties(
82-
placementId = "favorites",
83-
onClose = { viewModel.onPaywallDismissed() }
84-
)
85-
) { result, plan ->
86-
when (result) {
87-
PLYProductViewResult.PURCHASED,
88-
PLYProductViewResult.RESTORED -> {
89-
Log.d("DetailScreen", "[Shaker] Purchased/Restored from favorites: ${plan?.name}")
90-
viewModel.onPaywallDismissed()
81+
val activity = context as? Activity ?: return@IconButton
82+
Purchasely.fetchPresentation("favorites") { presentation, error ->
83+
if (presentation != null && presentation.type != PLYPresentationType.DEACTIVATED) {
84+
presentation.display(activity) { result, plan ->
85+
when (result) {
86+
PLYProductViewResult.PURCHASED,
87+
PLYProductViewResult.RESTORED -> {
88+
Log.d("DetailScreen", "[Shaker] Purchased/Restored from favorites: ${plan?.name}")
89+
viewModel.onPaywallDismissed()
90+
}
91+
else -> {}
92+
}
9193
}
92-
else -> {}
9394
}
9495
}
9596
}
@@ -227,32 +228,27 @@ fun DetailScreen(
227228
) {
228229
Button(
229230
onClick = {
230-
val view = Purchasely.presentationView(
231-
context = context,
232-
properties = PLYPresentationProperties(
233-
placementId = "recipe_detail",
234-
contentId = c.id,
235-
onClose = {
236-
viewModel.onPaywallDismissed()
237-
}
238-
)
239-
) { result, plan ->
240-
when (result) {
241-
PLYProductViewResult.PURCHASED -> {
242-
Log.d("DetailScreen", "[Shaker] Purchased: ${plan?.name}")
243-
viewModel.onPaywallDismissed()
244-
}
245-
PLYProductViewResult.RESTORED -> {
246-
Log.d("DetailScreen", "[Shaker] Restored: ${plan?.name}")
247-
viewModel.onPaywallDismissed()
248-
}
249-
PLYProductViewResult.CANCELLED -> {
250-
Log.d("DetailScreen", "[Shaker] Cancelled")
231+
val activity = context as? Activity ?: return@Button
232+
Purchasely.fetchPresentation(properties = PLYPresentationProperties(placementId = "recipe_detail", contentId = c.id)) { presentation, error ->
233+
if (presentation != null && presentation.type != PLYPresentationType.DEACTIVATED) {
234+
presentation.display(activity) { result, plan ->
235+
when (result) {
236+
PLYProductViewResult.PURCHASED -> {
237+
Log.d("DetailScreen", "[Shaker] Purchased: ${plan?.name}")
238+
viewModel.onPaywallDismissed()
239+
}
240+
PLYProductViewResult.RESTORED -> {
241+
Log.d("DetailScreen", "[Shaker] Restored: ${plan?.name}")
242+
viewModel.onPaywallDismissed()
243+
}
244+
PLYProductViewResult.CANCELLED -> {
245+
Log.d("DetailScreen", "[Shaker] Cancelled")
246+
}
247+
else -> {}
248+
}
251249
}
252-
else -> {}
253250
}
254251
}
255-
// The SDK displays the paywall automatically
256252
},
257253
colors = ButtonDefaults.buttonColors(
258254
containerColor = MaterialTheme.colorScheme.primary

android/app/src/main/java/com/purchasely/shaker/ui/screen/favorites/FavoritesScreen.kt

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.purchasely.shaker.ui.screen.favorites
22

3+
import android.app.Activity
34
import android.util.Log
45
import androidx.compose.foundation.clickable
56
import androidx.compose.foundation.layout.Arrangement
@@ -36,7 +37,7 @@ import androidx.compose.ui.platform.LocalContext
3637
import androidx.compose.ui.unit.dp
3738
import com.purchasely.shaker.domain.model.Cocktail
3839
import com.purchasely.shaker.ui.components.CocktailImage
39-
import io.purchasely.ext.PLYPresentationProperties
40+
import io.purchasely.ext.PLYPresentationType
4041
import io.purchasely.ext.PLYProductViewResult
4142
import io.purchasely.ext.Purchasely
4243
import org.koin.androidx.compose.koinViewModel
@@ -81,20 +82,19 @@ fun FavoritesScreen(
8182
Spacer(modifier = Modifier.height(24.dp))
8283
Button(
8384
onClick = {
84-
Purchasely.presentationView(
85-
context = context,
86-
properties = PLYPresentationProperties(
87-
placementId = "favorites",
88-
onClose = { viewModel.onPaywallDismissed() }
89-
)
90-
) { result, plan ->
91-
when (result) {
92-
PLYProductViewResult.PURCHASED,
93-
PLYProductViewResult.RESTORED -> {
94-
Log.d("FavoritesScreen", "[Shaker] Purchased/Restored: ${plan?.name}")
95-
viewModel.onPaywallDismissed()
85+
val activity = context as? Activity ?: return@Button
86+
Purchasely.fetchPresentation("favorites") { presentation, error ->
87+
if (presentation != null && presentation.type != PLYPresentationType.DEACTIVATED) {
88+
presentation.display(activity) { result, plan ->
89+
when (result) {
90+
PLYProductViewResult.PURCHASED,
91+
PLYProductViewResult.RESTORED -> {
92+
Log.d("FavoritesScreen", "[Shaker] Purchased/Restored: ${plan?.name}")
93+
viewModel.onPaywallDismissed()
94+
}
95+
else -> {}
96+
}
9697
}
97-
else -> {}
9898
}
9999
}
100100
},

android/app/src/main/java/com/purchasely/shaker/ui/screen/home/HomeScreen.kt

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.purchasely.shaker.ui.screen.home
22

3+
import android.app.Activity
34
import android.util.Log
45
import androidx.compose.foundation.clickable
56
import androidx.compose.foundation.layout.Arrangement
@@ -44,7 +45,7 @@ import androidx.compose.ui.text.style.TextOverflow
4445
import androidx.compose.ui.unit.dp
4546
import com.purchasely.shaker.domain.model.Cocktail
4647
import com.purchasely.shaker.ui.components.CocktailImage
47-
import io.purchasely.ext.PLYPresentationProperties
48+
import io.purchasely.ext.PLYPresentationType
4849
import io.purchasely.ext.PLYProductViewResult
4950
import io.purchasely.ext.Purchasely
5051
import org.koin.androidx.compose.koinViewModel
@@ -78,20 +79,19 @@ fun HomeScreen(
7879
showFilterSheet = true
7980
} else {
8081
// Free user: show filters paywall
81-
Purchasely.presentationView(
82-
context = context,
83-
properties = PLYPresentationProperties(
84-
placementId = "filters",
85-
onClose = { viewModel.onPaywallDismissed() }
86-
)
87-
) { result, plan ->
88-
when (result) {
89-
PLYProductViewResult.PURCHASED,
90-
PLYProductViewResult.RESTORED -> {
91-
Log.d("HomeScreen", "[Shaker] Purchased/Restored from filters: ${plan?.name}")
92-
viewModel.onPaywallDismissed()
82+
val activity = context as? Activity ?: return@IconButton
83+
Purchasely.fetchPresentation("filters") { presentation, error ->
84+
if (presentation != null && presentation.type != PLYPresentationType.DEACTIVATED) {
85+
presentation.display(activity) { result, plan ->
86+
when (result) {
87+
PLYProductViewResult.PURCHASED,
88+
PLYProductViewResult.RESTORED -> {
89+
Log.d("HomeScreen", "[Shaker] Purchased/Restored from filters: ${plan?.name}")
90+
viewModel.onPaywallDismissed()
91+
}
92+
else -> {}
93+
}
9394
}
94-
else -> {}
9595
}
9696
}
9797
}

0 commit comments

Comments
 (0)