Skip to content
Open
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 8 additions & 1 deletion example/src/main/java/io/radar/example/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,15 @@ import android.Manifest
import android.content.Context
import android.content.pm.PackageManager
import android.location.Location
import android.os.Build
import android.os.Bundle
import android.util.Log
import android.widget.Button
import android.widget.LinearLayout
import androidx.appcompat.app.AppCompatActivity
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
import androidx.core.content.edit
import io.radar.sdk.Radar
import io.radar.sdk.RadarTrackingOptions
import io.radar.sdk.RadarTripOptions
Expand All @@ -32,7 +34,12 @@ class MainActivity : AppCompatActivity() {
setContentView(R.layout.activity_main)

val receiver = MyRadarReceiver()
Radar.initialize(this, "prj_test_pk_0000000000000000000000000000000000000000", receiver, Radar.RadarLocationServicesProvider.GOOGLE, true)

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
registerActivityLifecycleCallbacks(MyActivityLifecycleCallbacks())
}

Radar.initialize(this, "prj_live_pk_bbcc3b729cf153b34d67170da37e1a3b50c7c631", receiver, Radar.RadarLocationServicesProvider.GOOGLE, true)
Radar.sdkVersion().let { Log.i("version", it) }

val verifiedReceiver = object : RadarVerifiedReceiver() {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package io.radar.example

import android.app.Activity
import android.app.Application
import android.os.Bundle
import android.util.Log
import org.json.JSONObject

class MyActivityLifecycleCallbacks : Application.ActivityLifecycleCallbacks {
override fun onActivityResumed(activity: Activity) {
// Your custom logic. E.g. tracking, analytics, session checks, etc.
Log.d("MyLifecycle", "onActivityResumed, Intent metadata: " + activity.intent.getStringExtra("radar_campaign_metadata"))

val campaignMetadata = try {
activity.intent.getStringExtra("radar_campaign_metadata")?.let { JSONObject(it) }
Copy link

Copilot AI Aug 12, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The extra key used here ("radar_campaign_metadata") doesn't match the constant defined in RadarNotificationHelper ("RADAR_CAMPAIGN_METADATA"). This inconsistency will prevent the metadata from being retrieved correctly.

Suggested change
activity.intent.getStringExtra("radar_campaign_metadata")?.let { JSONObject(it) }
import io.radar.example.RadarNotificationHelper
class MyActivityLifecycleCallbacks : Application.ActivityLifecycleCallbacks {
override fun onActivityResumed(activity: Activity) {
// Your custom logic. E.g. tracking, analytics, session checks, etc.
Log.d("MyLifecycle", "onActivityResumed, Intent metadata: " + activity.intent.getStringExtra(RadarNotificationHelper.RADAR_CAMPAIGN_METADATA))
val campaignMetadata = try {
activity.intent.getStringExtra(RadarNotificationHelper.RADAR_CAMPAIGN_METADATA)?.let { JSONObject(it) }

Copilot uses AI. Check for mistakes.
Copy link

Copilot AI Aug 12, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same issue as above - the extra key "radar_campaign_metadata" should match the constant RADAR_CAMPAIGN_METADATA from RadarNotificationHelper to ensure consistency.

Suggested change
activity.intent.getStringExtra("radar_campaign_metadata")?.let { JSONObject(it) }
import io.radar.example.RadarNotificationHelper
class MyActivityLifecycleCallbacks : Application.ActivityLifecycleCallbacks {
override fun onActivityResumed(activity: Activity) {
// Your custom logic. E.g. tracking, analytics, session checks, etc.
Log.d("MyLifecycle", "onActivityResumed, Intent metadata: " + activity.intent.getStringExtra(RadarNotificationHelper.RADAR_CAMPAIGN_METADATA))
val campaignMetadata = try {
activity.intent.getStringExtra(RadarNotificationHelper.RADAR_CAMPAIGN_METADATA)?.let { JSONObject(it) }

Copilot uses AI. Check for mistakes.
} catch (e: Exception) {
null
}
}
// Other lifecycle methods (optional)
override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) {}
override fun onActivityStarted(activity: Activity) {}
override fun onActivityPaused(activity: Activity) {}
override fun onActivityStopped(activity: Activity) {}
override fun onActivityDestroyed(activity: Activity) {}
override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle) {}
}
1 change: 1 addition & 0 deletions example/src/main/java/io/radar/example/MyRadarReceiver.kt
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ class MyRadarReceiver : RadarReceiver() {
var identifier = 0

internal fun notify(context: Context, body: String) {
return;
Copy link

Copilot AI Aug 12, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Adding an early return without explanation makes this method non-functional. This appears to be temporary debug code that should either be removed or commented with the reason for disabling notifications.

Suggested change
return;

Copilot uses AI. Check for mistakes.
identifier++

val channelId = "example"
Expand Down
21 changes: 11 additions & 10 deletions sdk/src/main/java/io/radar/sdk/RadarNotificationHelper.kt
Original file line number Diff line number Diff line change
Expand Up @@ -10,15 +10,16 @@ import android.content.Intent
import android.graphics.Color
import android.net.Uri
import android.os.Build
import android.util.Log
Copy link

Copilot AI Aug 12, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The Log import was added but doesn't appear to be used in the visible diff. Consider removing unused imports.

Suggested change
import android.util.Log

Copilot uses AI. Check for mistakes.
import androidx.core.app.NotificationCompat
import io.radar.sdk.model.RadarEvent

class RadarNotificationHelper {

internal companion object {
private const val CHANNEL_NAME = "Location"
private const val NOTIFICATION_ID = 20160525 // Radar's birthday!
const val RADAR_CAMPAIGN_ID = "radar_campaign_id"
const val RADAR_CAMPAIGN_METADATA = "radar_campaign_metadata"

@SuppressLint("DiscouragedApi", "LaunchActivityFromNotification")
internal fun showNotifications(context: Context, events: Array<RadarEvent>) {
Expand Down Expand Up @@ -46,19 +47,19 @@ class RadarNotificationHelper {
val smallIcon = context.applicationContext.resources.getIdentifier(iconString, "drawable", context.applicationContext.packageName)

if (notificationText != null && campaignType == "eventBased") {

val notificationTitle: String? = event.metadata?.optString("radar:notificationTitle")
val subTitle: String? = event.metadata?.optString("radar:notificationSubTitle")
val campaignId: String? = event.metadata?.optString("radar:campaignId")
val deeplinkURL = event.metadata?.optString("radar:notificationURL")
val notificationTitle: String? = event.metadata.optString("radar:notificationTitle")
val subTitle: String? = event.metadata.optString("radar:notificationSubTitle")
val campaignId: String? = event.metadata.optString("radar:campaignId")
val deeplinkURL = event.metadata.optString("radar:notificationURL")
val campaignMetadata: String? = event.metadata.optString("radar:campaignMetadata")

Radar.logger.d("creating campaign notification with metadata = ${event.metadata}")
val intent = context.packageManager.getLaunchIntentForPackage(context.packageName)?.apply {
flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TOP
putExtra(RADAR_CAMPAIGN_ID, campaignId)
if (deeplinkURL != null) {
data = Uri.parse(deeplinkURL)
action = Intent.ACTION_VIEW
}
putExtra(RADAR_CAMPAIGN_METADATA, campaignMetadata)
data = Uri.parse(deeplinkURL)
action = Intent.ACTION_VIEW
Copy link

Copilot AI Aug 12, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The code now unconditionally sets intent data and action even when deeplinkURL might be null or empty. This could cause issues with Uri.parse() if deeplinkURL is null. The previous null check should be retained.

Suggested change
action = Intent.ACTION_VIEW
if (!deeplinkURL.isNullOrEmpty()) {
data = Uri.parse(deeplinkURL)
action = Intent.ACTION_VIEW
}

Copilot uses AI. Check for mistakes.
}

val pendingIntentForAppOpen = PendingIntent.getActivity(
Expand Down