diff --git a/sample/build.gradle b/sample/build.gradle index 633fe755..cbe989e6 100644 --- a/sample/build.gradle +++ b/sample/build.gradle @@ -29,6 +29,8 @@ android { def API_ENDPOINT = properties.getProperty("api_endpoint") ?: System.getenv("API_ENDPOINT") buildConfigField("String", "API_KEY", "\"${API_KEY}\"") buildConfigField("String", "API_ENDPOINT", "\"${API_ENDPOINT}\"") + + setProperty("archivesBaseName", "BKT_v$versionName($versionCode)") } signingConfigs { release { @@ -72,7 +74,8 @@ dependencies { implementation libs.kotlin.coroutines.android implementation(platform(libs.firebase)) - implementation libs.firebase.messaging.ktx + //uncomment for test FCM realtime update + //implementation libs.firebase.messaging.ktx } repositories { mavenCentral() diff --git a/sample/src/main/java/io/bucketeer/sample/MainActivity.kt b/sample/src/main/java/io/bucketeer/sample/MainActivity.kt index ea5e91a6..7c43e66c 100644 --- a/sample/src/main/java/io/bucketeer/sample/MainActivity.kt +++ b/sample/src/main/java/io/bucketeer/sample/MainActivity.kt @@ -1,14 +1,15 @@ package io.bucketeer.sample import android.Manifest +import android.annotation.SuppressLint import android.content.Context import android.content.pm.PackageManager import android.os.Build import android.os.Bundle -import android.util.Log import android.view.View import android.widget.ArrayAdapter import android.widget.Spinner +import android.widget.TextView import android.widget.Toast import androidx.activity.ComponentActivity import androidx.activity.result.contract.ActivityResultContracts @@ -16,8 +17,6 @@ import androidx.appcompat.app.AlertDialog import androidx.core.content.ContextCompat import androidx.lifecycle.lifecycleScope import com.google.android.material.textfield.TextInputLayout -import com.google.firebase.ktx.Firebase -import com.google.firebase.messaging.ktx.messaging import io.bucketeer.sdk.android.BKTClient import io.bucketeer.sdk.android.BKTConfig import io.bucketeer.sdk.android.BKTException @@ -27,7 +26,6 @@ import io.bucketeer.sdk.android.sample.BuildConfig import io.bucketeer.sdk.android.sample.R import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch -import kotlinx.coroutines.tasks.await import kotlinx.coroutines.withContext import org.json.JSONObject import java.util.concurrent.TimeUnit @@ -67,10 +65,15 @@ class MainActivity : ComponentActivity() { } private lateinit var variantTypeSpinner: Spinner + private lateinit var appVersionTextView: TextView + @SuppressLint("SetTextI18n") public override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) + appVersionTextView = findViewById(R.id.appVersionTv) + appVersionTextView.text = "${BuildConfig.VERSION_NAME}-b${BuildConfig.VERSION_CODE}" + variantTypeSpinner = findViewById(R.id.spinner) val adapter = ArrayAdapter( @@ -262,7 +265,7 @@ class MainActivity : ComponentActivity() { .apiKey(BuildConfig.API_KEY) .apiEndpoint(BuildConfig.API_ENDPOINT) .featureTag(getTag()) - .appVersion(BuildConfig.VERSION_NAME) + .appVersion(BuildConfig.VERSION_CODE.toString()) .eventsMaxQueueSize(10) .pollingInterval(TimeUnit.SECONDS.toMillis(20)) .backgroundPollingInterval(TimeUnit.SECONDS.toMillis(60)) @@ -273,6 +276,7 @@ class MainActivity : ComponentActivity() { BKTUser .builder() .id(getUserId()) + .customAttributes(mapOf("app_version" to BuildConfig.VERSION_CODE.toString())) .build() val future = BKTClient.initialize(this, config, user) @@ -320,28 +324,30 @@ class MainActivity : ComponentActivity() { } private suspend fun onGrantedNotificationPermission() { - val token = Firebase.messaging.token.await() - println("FCM Token $token") - - subscribeToTopic() +// uncomment for test FCM realtime update +// val token = Firebase.messaging.token.await() +// println("FCM Token $token") +// +// subscribeToTopic() } // In order to receive the update notification when the flag value changed // We need subscribe to topic, with the topic name is in this format bucketeer- // Please put your Firebase project's google-services.json under the folder `sample/src` before test this. - private fun subscribeToTopic() { - val tag = getTag() - Firebase.messaging - .subscribeToTopic("bucketeer-$tag") - .addOnCompleteListener { task -> - var msg = "Real time update enabled" - if (!task.isSuccessful) { - msg = "Subscribe to real time update failed" - } - Log.d(TAG, msg) - Toast.makeText(baseContext, msg, Toast.LENGTH_SHORT).show() - } - } + +// private fun subscribeToTopic() { +// val tag = getTag() +// Firebase.messaging +// .subscribeToTopic("bucketeer-$tag") +// .addOnCompleteListener { task -> +// var msg = "Real time update enabled" +// if (!task.isSuccessful) { +// msg = "Subscribe to real time update failed" +// } +// Log.d(TAG, msg) +// Toast.makeText(baseContext, msg, Toast.LENGTH_SHORT).show() +// } +// } companion object { const val TAG = "MainActivity" diff --git a/sample/src/main/java/io/bucketeer/sample/MyFirebaseMessagingService.kt b/sample/src/main/java/io/bucketeer/sample/MyFirebaseMessagingService.kt index ab6d9f3e..1aae58ce 100644 --- a/sample/src/main/java/io/bucketeer/sample/MyFirebaseMessagingService.kt +++ b/sample/src/main/java/io/bucketeer/sample/MyFirebaseMessagingService.kt @@ -1,47 +1,49 @@ -package io.bucketeer.sample +// uncomment for test FCM realtime update -import android.util.Log -import com.google.firebase.messaging.FirebaseMessagingService -import com.google.firebase.messaging.RemoteMessage -import io.bucketeer.sdk.android.BKTClient - -class MyFirebaseMessagingService : FirebaseMessagingService() { - // [START receive_message] - override fun onMessageReceived(remoteMessage: RemoteMessage) { - Log.d(TAG, "From: ${remoteMessage.from}") - - remoteMessage.data.also { data -> - Log.d(TAG, "Message data payload: ${remoteMessage.data}") - val isFeatureFlagUpdated = data["bucketeer_feature_flag_updated"] - if (isFeatureFlagUpdated == "true") { - // Feature flag changed - Log.d(TAG, "Bucketeer feature flag changed") - - runCatching { - // Make sure BKTClient has been initialize before access it - val client = BKTClient.getInstance() - val future = client.fetchEvaluations(3000) - val error = future.get() - if (error == null) { - val showNewFeature = client.stringVariation(Constants.FCM_FEATURE_FLAG_ID, "") - Log.d(TAG, "Bucketeer feature flag new value: $showNewFeature") - } else { - // Handle the error - } - } - } - } - - remoteMessage.notification?.let { - Log.d(TAG, "Message Notification Body: ${it.body}") - } - } - - override fun onNewToken(token: String) { - Log.d(TAG, "Refreshed token: $token") - } - - companion object { - private const val TAG = "MyFirebaseMsgService" - } -} +//package io.bucketeer.sample +// +//import android.util.Log +//import com.google.firebase.messaging.FirebaseMessagingService +//import com.google.firebase.messaging.RemoteMessage +//import io.bucketeer.sdk.android.BKTClient +// +//class MyFirebaseMessagingService : FirebaseMessagingService() { +// // [START receive_message] +// override fun onMessageReceived(remoteMessage: RemoteMessage) { +// Log.d(TAG, "From: ${remoteMessage.from}") +// +// remoteMessage.data.also { data -> +// Log.d(TAG, "Message data payload: ${remoteMessage.data}") +// val isFeatureFlagUpdated = data["bucketeer_feature_flag_updated"] +// if (isFeatureFlagUpdated == "true") { +// // Feature flag changed +// Log.d(TAG, "Bucketeer feature flag changed") +// +// runCatching { +// // Make sure BKTClient has been initialize before access it +// val client = BKTClient.getInstance() +// val future = client.fetchEvaluations(3000) +// val error = future.get() +// if (error == null) { +// val showNewFeature = client.stringVariation(Constants.FCM_FEATURE_FLAG_ID, "") +// Log.d(TAG, "Bucketeer feature flag new value: $showNewFeature") +// } else { +// // Handle the error +// } +// } +// } +// } +// +// remoteMessage.notification?.let { +// Log.d(TAG, "Message Notification Body: ${it.body}") +// } +// } +// +// override fun onNewToken(token: String) { +// Log.d(TAG, "Refreshed token: $token") +// } +// +// companion object { +// private const val TAG = "MyFirebaseMsgService" +// } +//} diff --git a/sample/src/main/res/layout/activity_main.xml b/sample/src/main/res/layout/activity_main.xml index 68e4d773..8c7aa945 100644 --- a/sample/src/main/res/layout/activity_main.xml +++ b/sample/src/main/res/layout/activity_main.xml @@ -7,6 +7,14 @@ android:orientation="vertical" android:padding="@dimen/padding_16"> + +