diff --git a/misc/src/main/java/com/example/snippets/engage/ClusterRequestFactory.kt b/misc/src/main/java/com/example/snippets/engage/ClusterRequestFactory.kt index 00dfe3cb2..a6a8ffe60 100644 --- a/misc/src/main/java/com/example/snippets/engage/ClusterRequestFactory.kt +++ b/misc/src/main/java/com/example/snippets/engage/ClusterRequestFactory.kt @@ -33,6 +33,10 @@ class AppDataRepository { fun getRecommendations(): List { return emptyList() } + + fun getContinuationData(): List { + return emptyList() + } } @SuppressLint("UseKtx") @@ -62,11 +66,28 @@ class ClusterRequestFactory(context: Context) { val items = appDataRepository.getRecommendations() val recommendationCluster = com.google.android.engage.common.datamodel.RecommendationCluster.Builder() + .setTitle("Recommended Content") // Required field + .setRecommendationClusterType(com.google.android.engage.common.datamodel.RecommendationClusterType.TYPE_TOP_PICKS_FOR_YOU) // Required field for (item in items) { recommendationCluster.addEntity(ItemToEntityConverter.convert(item)) } return com.google.android.engage.service.PublishRecommendationClustersRequest.Builder() .addRecommendationCluster(recommendationCluster.build()) + .setAccountProfile(accountProfile) // Set the account profile on the request for personalization/sync + .build() + } + + fun constructContinuationClusterRequest(): com.google.android.engage.service.PublishContinuationClusterRequest { + val items = appDataRepository.getContinuationData() + + val continuationCluster = com.google.android.engage.common.datamodel.ContinuationCluster.Builder() + .setAccountProfile(accountProfile) // Set the account profile on the request for personalization/sync + + for (item in items) { + continuationCluster.addEntity(ItemToEntityConverter.convert(item)) + } + return com.google.android.engage.service.PublishContinuationClusterRequest.Builder() + .setContinuationCluster(continuationCluster.build()) .build() } diff --git a/misc/src/main/java/com/example/snippets/engage/Constants.kt b/misc/src/main/java/com/example/snippets/engage/Constants.kt index 63175d237..453ac8aa5 100644 --- a/misc/src/main/java/com/example/snippets/engage/Constants.kt +++ b/misc/src/main/java/com/example/snippets/engage/Constants.kt @@ -25,7 +25,7 @@ object Constants { const val PUBLISH_TYPE_KEY = "PUBLISH_TYPE" const val PUBLISH_TYPE_RECOMMENDATIONS = "RECOMMENDATIONS" const val PUBLISH_TYPE_FEATURED = "FEATURED" - // const val PUBLISH_TYPE_CONTINUATION = "CONTINUATION" + const val PUBLISH_TYPE_CONTINUATION = "CONTINUATION" // ... const val PUBLISH_TYPE_USER_ACCOUNT_MANAGEMENT = "USER_ACCOUNT_MANAGEMENT" // const val PUBLISH_TYPE_FOOD_SHOPPING_CARD = "FOOD_SHOPPING_CARD" diff --git a/misc/src/main/java/com/example/snippets/engage/EngageWorker.kt b/misc/src/main/java/com/example/snippets/engage/EngageWorker.kt index a1f8cfaeb..9d753663e 100644 --- a/misc/src/main/java/com/example/snippets/engage/EngageWorker.kt +++ b/misc/src/main/java/com/example/snippets/engage/EngageWorker.kt @@ -59,7 +59,7 @@ class EngageWorker(context: Context, workerParams: WorkerParameters) : Coroutine return when (publishType) { Constants.PUBLISH_TYPE_RECOMMENDATIONS -> publishRecommendations() // Constants.PUBLISH_TYPE_FEATURED -> publishFeatured() - // Constants.PUBLISH_TYPE_CONTINUATION-> publishContinuation() + Constants.PUBLISH_TYPE_CONTINUATION -> publishContinuation() Constants.PUBLISH_TYPE_USER_ACCOUNT_MANAGEMENT -> publishUserAccountManagement() else -> Result.failure() } @@ -74,6 +74,21 @@ class EngageWorker(context: Context, workerParams: WorkerParameters) : Coroutine return publishAndProvideResult(publishTask) } + private suspend fun publishContinuation(): Result { + // Empty Continuation Guard: If there is no continuation content, + // we must delete the cluster instead of publishing an empty one on the UI. + if (getContinuationData().isEmpty()) { + val deleteTask = client.deleteContinuationCluster() + return publishAndProvideResult(deleteTask) + } + + val publishTask: Task = + client.publishContinuationCluster( + clusterRequestFactory.constructContinuationClusterRequest() + ) + return publishAndProvideResult(publishTask) + } + private suspend fun publishUserAccountManagement(): Result { val publishTask: Task if (isAccountSignedIn()) { @@ -105,6 +120,13 @@ class EngageWorker(context: Context, workerParams: WorkerParameters) : Coroutine // [END_EXCLUDE] } + private fun getContinuationData(): List { + // Implement your app's data loading logic here. + // [START_EXCLUDE] + return emptyList() + // [END_EXCLUDE] + } + private suspend fun publishAndProvideResult( publishTask: Task ): Result { diff --git a/misc/src/main/java/com/example/snippets/engage/ItemToEntityConverter.kt b/misc/src/main/java/com/example/snippets/engage/ItemToEntityConverter.kt index d486d5736..24c4b1496 100644 --- a/misc/src/main/java/com/example/snippets/engage/ItemToEntityConverter.kt +++ b/misc/src/main/java/com/example/snippets/engage/ItemToEntityConverter.kt @@ -32,3 +32,19 @@ object ItemToEntityConverter { } } // [END android_engage_item_to_entity_converter_implementation] + +// [START android_engage_dual_content_rating_example] +fun convertMovie(movie: MovieData): MovieEntity { + val ratingSystem = RatingSystem.Builder() + .setAgencyName("MPAA") + .setRating("PG-13") + .build() + return MovieEntity.Builder() + .setEntityId(movie.id) + .setName(movie.title) + // ... other fields + .addContentRating(ratingSystem) // Recommended API + .addContentRatingsLegacy(listOf("MPAA:PG-13")) // Legacy API for backward compatibility + .build() +} +// [END android_engage_dual_content_rating_example]