Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
4e28e38
feat(odin): Allow collecting FCM device token in SDK & demonstrate it…
odin-posthog Jan 20, 2026
20f5e50
Update changelogs
odin-posthog Jan 20, 2026
51dcb52
feat: allow collecting FCM tokens for push notifications in core
odin-posthog Jan 26, 2026
ddb4a2e
Update PR in changelog
odin-posthog Jan 26, 2026
ae8a3df
chore: remove non-core changes, keep only posthog/ module changes
odin-posthog Jan 26, 2026
7405f85
Fix up minor issues
odin-posthog Jan 26, 2026
9c5fb6b
Fix CI issues (formatting, code cleanliness)
odin-posthog Jan 26, 2026
c59ba16
Update API file
odin-posthog Jan 26, 2026
4c7bcea
Add registerPushToken to PostHogFake.kt
odin-posthog Jan 26, 2026
4e9a08b
Fix tests
odin-posthog Jan 26, 2026
286a45f
Update changelogs
odin-posthog Jan 20, 2026
e81be16
Address PR comments
odin-posthog Jan 26, 2026
ff00334
Apply spotless formatting
odin-posthog Jan 26, 2026
7fb293f
Update api file
odin-posthog Jan 26, 2026
4ef12d3
Add firebaseAppId to request
odin-posthog Jan 27, 2026
d2027af
Clear token from preferences after failed API calls to enable swift r…
odin-posthog Jan 27, 2026
b2398b4
Use SerializedName to snake-case PostHogPushSubscriptionRequest
odin-posthog Jan 27, 2026
3c67b45
Include firebase app id, refactor to keep PostHog.kt clean
odin-posthog Jan 30, 2026
da3b7f2
Rename "firebase app id" to "firebase project id", since that's what …
odin-posthog Jan 30, 2026
95cc19f
Reupload token every 24h instead of 1h
odin-posthog Jan 30, 2026
65d8ff7
Remove strict mode tagging (only needed locally)
odin-posthog Jan 30, 2026
8069e27
Apply spotless formatting
odin-posthog Jan 30, 2026
9ed0b2d
Rename firebaseProjectId to fcmProjectId (as in backend), fix flaky t…
odin-posthog Feb 2, 2026
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
1 change: 1 addition & 0 deletions posthog-android/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
## Next
Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

Is it correct to have the changelog in this PR already or should it be in the version bump PR? (or does it not matter?)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

under next is correct, just do not add a version yet

- Allow collecting FCM device token in SDK ([#376](https://github.com/PostHog/posthog-android/pull/376))

- fix: Session Replay masks only the text area for EditText, Button, and CompoundButton (CheckBox, RadioButton, Switch) instead of the entire component bounds ([#400](https://github.com/PostHog/posthog-android/pull/400))

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package com.posthog.android
import com.posthog.PostHogConfig
import com.posthog.PostHogInterface
import com.posthog.PostHogOnFeatureFlags
import com.posthog.PostHogPushTokenCallback
import java.util.Date
import java.util.UUID

Expand Down Expand Up @@ -89,6 +90,14 @@ public class PostHogFake : PostHogInterface {
override fun resetPersonPropertiesForFlags(reloadFeatureFlags: Boolean) {
}

override fun registerPushToken(
token: String,
fcmProjectId: String,
callback: PostHogPushTokenCallback?,
) {
callback?.onComplete(null, null)
}

override fun setGroupPropertiesForFlags(
type: String,
groupProperties: Map<String, Any>,
Expand Down
3 changes: 2 additions & 1 deletion posthog-samples/posthog-android-sample/.gitignore
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
/build
/build
google-services.json
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ class MyApp : Application() {
// Demo:
// val apiKey = "_6SG-F7I1vCuZ-HdJL3VZQqjBlaSb1_20hDPwqMNnGI"
// ManoelTesting:
val apiKey = "phc_6lqCaCDCBEWdIGieihq5R2dZpPVbAUFISA75vFZow06"
val apiKey = "phc_QFbR1y41s5sxnNTZoyKG2NJo2RlsCIWkUfdpawgb40D"
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

This is the rotated key, rollback

// PaulKey
// val apiKey = "phc_GavhjwMwc75N4HsaLjMTEvH8Kpsz70rZ3N0E9ho89YJ"
// val config = PostHogAndroidConfig(apiKey, host = "https://3727-86-27-112-156.ngrok-free.app").apply {
Expand Down
3 changes: 3 additions & 0 deletions posthog/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
## Next

### Added
- Allow collecting FCM device token in SDK ([#376](https://github.com/PostHog/posthog-android/pull/376))

- feat: Add `getFeatureFlagResult` to `PostHogFeatureFlagsInterface`, drop `getFeatureFlag`, `getFeatureFlagPayload`. ([#398](https://github.com/PostHog/posthog-android/pull/398))

## 6.3.1 - 2026-01-29
Expand Down
52 changes: 51 additions & 1 deletion posthog/api/posthog.api
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ public final class com/posthog/PersonProfiles : java/lang/Enum {

public final class com/posthog/PostHog : com/posthog/PostHogStateless, com/posthog/PostHogInterface {
public static final field Companion Lcom/posthog/PostHog$Companion;
public synthetic fun <init> (Ljava/util/concurrent/ExecutorService;Ljava/util/concurrent/ExecutorService;Ljava/util/concurrent/ExecutorService;Ljava/util/concurrent/ExecutorService;ZLkotlin/jvm/internal/DefaultConstructorMarker;)V
public synthetic fun <init> (Ljava/util/concurrent/ExecutorService;Ljava/util/concurrent/ExecutorService;Ljava/util/concurrent/ExecutorService;Ljava/util/concurrent/ExecutorService;Ljava/util/concurrent/ExecutorService;ZLkotlin/jvm/internal/DefaultConstructorMarker;)V
public fun alias (Ljava/lang/String;)V
public fun capture (Ljava/lang/String;Ljava/lang/String;Ljava/util/Map;Ljava/util/Map;Ljava/util/Map;Ljava/util/Map;Ljava/util/Date;)V
public fun captureException (Ljava/lang/Throwable;Ljava/util/Map;)V
Expand All @@ -42,6 +42,7 @@ public final class com/posthog/PostHog : com/posthog/PostHogStateless, com/posth
public fun optIn ()V
public fun optOut ()V
public fun register (Ljava/lang/String;Ljava/lang/Object;)V
public fun registerPushToken (Ljava/lang/String;Ljava/lang/String;Lcom/posthog/PostHogPushTokenCallback;)V
public fun reloadFeatureFlags (Lcom/posthog/PostHogOnFeatureFlags;)V
public fun reset ()V
public fun resetGroupPropertiesForFlags (Ljava/lang/String;Z)V
Expand Down Expand Up @@ -80,6 +81,7 @@ public final class com/posthog/PostHog$Companion : com/posthog/PostHogInterface
public fun optOut ()V
public final fun overrideSharedInstance (Lcom/posthog/PostHogInterface;)V
public fun register (Ljava/lang/String;Ljava/lang/Object;)V
public fun registerPushToken (Ljava/lang/String;Ljava/lang/String;Lcom/posthog/PostHogPushTokenCallback;)V
public fun reloadFeatureFlags (Lcom/posthog/PostHogOnFeatureFlags;)V
public fun reset ()V
public fun resetGroupPropertiesForFlags (Ljava/lang/String;Z)V
Expand Down Expand Up @@ -297,6 +299,7 @@ public abstract interface class com/posthog/PostHogInterface : com/posthog/PostH
public abstract fun isSessionActive ()Z
public abstract fun isSessionReplayActive ()Z
public abstract fun register (Ljava/lang/String;Ljava/lang/Object;)V
public abstract fun registerPushToken (Ljava/lang/String;Ljava/lang/String;Lcom/posthog/PostHogPushTokenCallback;)V
public abstract fun reloadFeatureFlags (Lcom/posthog/PostHogOnFeatureFlags;)V
public abstract fun reset ()V
public abstract fun resetGroupPropertiesForFlags (Ljava/lang/String;Z)V
Expand All @@ -318,6 +321,7 @@ public final class com/posthog/PostHogInterface$DefaultImpls {
public static synthetic fun getFeatureFlagPayload$default (Lcom/posthog/PostHogInterface;Ljava/lang/String;Ljava/lang/Object;ILjava/lang/Object;)Ljava/lang/Object;
public static synthetic fun group$default (Lcom/posthog/PostHogInterface;Ljava/lang/String;Ljava/lang/String;Ljava/util/Map;ILjava/lang/Object;)V
public static synthetic fun isFeatureEnabled$default (Lcom/posthog/PostHogInterface;Ljava/lang/String;ZLjava/lang/Boolean;ILjava/lang/Object;)Z
public static synthetic fun registerPushToken$default (Lcom/posthog/PostHogInterface;Ljava/lang/String;Ljava/lang/String;Lcom/posthog/PostHogPushTokenCallback;ILjava/lang/Object;)V
public static synthetic fun reloadFeatureFlags$default (Lcom/posthog/PostHogInterface;Lcom/posthog/PostHogOnFeatureFlags;ILjava/lang/Object;)V
public static synthetic fun resetGroupPropertiesForFlags$default (Lcom/posthog/PostHogInterface;Ljava/lang/String;ZILjava/lang/Object;)V
public static synthetic fun resetPersonPropertiesForFlags$default (Lcom/posthog/PostHogInterface;ZILjava/lang/Object;)V
Expand Down Expand Up @@ -348,6 +352,24 @@ public abstract interface class com/posthog/PostHogPropertiesSanitizer {
public abstract fun sanitize (Ljava/util/Map;)Ljava/util/Map;
}

public abstract interface class com/posthog/PostHogPushTokenCallback {
public abstract fun onComplete (Lcom/posthog/PostHogPushTokenError;Ljava/lang/Throwable;)V
}

public final class com/posthog/PostHogPushTokenError : java/lang/Enum {
public static final field BLANK_FIREBASE_PROJECT_ID Lcom/posthog/PostHogPushTokenError;
public static final field BLANK_TOKEN Lcom/posthog/PostHogPushTokenError;
public static final field CONFIG_NULL Lcom/posthog/PostHogPushTokenError;
public static final field INVALID_INPUT Lcom/posthog/PostHogPushTokenError;
public static final field NETWORK_ERROR Lcom/posthog/PostHogPushTokenError;
public static final field OTHER Lcom/posthog/PostHogPushTokenError;
public static final field SDK_DISABLED Lcom/posthog/PostHogPushTokenError;
public static final field SERVER_ERROR Lcom/posthog/PostHogPushTokenError;
public static final field UNAUTHORIZED Lcom/posthog/PostHogPushTokenError;
public static fun valueOf (Ljava/lang/String;)Lcom/posthog/PostHogPushTokenError;
public static fun values ()[Lcom/posthog/PostHogPushTokenError;
}

public class com/posthog/PostHogStateless : com/posthog/PostHogStatelessInterface {
public static final field Companion Lcom/posthog/PostHogStateless$Companion;
protected field config Lcom/posthog/PostHogConfig;
Expand Down Expand Up @@ -598,6 +620,7 @@ public final class com/posthog/internal/PostHogApi {
public static synthetic fun flags$default (Lcom/posthog/internal/PostHogApi;Ljava/lang/String;Ljava/lang/String;Ljava/util/Map;Ljava/util/Map;Ljava/util/Map;ILjava/lang/Object;)Lcom/posthog/internal/PostHogFlagsResponse;
public final fun localEvaluation (Ljava/lang/String;Ljava/lang/String;)Lcom/posthog/internal/LocalEvaluationApiResponse;
public static synthetic fun localEvaluation$default (Lcom/posthog/internal/PostHogApi;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lcom/posthog/internal/LocalEvaluationApiResponse;
public final fun registerPushSubscription (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
public final fun remoteConfig ()Lcom/posthog/internal/PostHogRemoteConfigResponse;
public final fun snapshot (Ljava/util/List;)V
}
Expand Down Expand Up @@ -748,6 +771,33 @@ public final class com/posthog/internal/PostHogPrintLogger : com/posthog/interna
public fun log (Ljava/lang/String;)V
}

public final class com/posthog/internal/PostHogPushSubscriptionRequest {
public fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
public final fun component1 ()Ljava/lang/String;
public final fun component2 ()Ljava/lang/String;
public final fun component3 ()Ljava/lang/String;
public final fun component4 ()Ljava/lang/String;
public final fun component5 ()Ljava/lang/String;
public final fun component6 ()Ljava/lang/String;
public final fun copy (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Lcom/posthog/internal/PostHogPushSubscriptionRequest;
public static synthetic fun copy$default (Lcom/posthog/internal/PostHogPushSubscriptionRequest;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lcom/posthog/internal/PostHogPushSubscriptionRequest;
public fun equals (Ljava/lang/Object;)Z
public final fun getApiKey ()Ljava/lang/String;
public final fun getDistinctId ()Ljava/lang/String;
public final fun getFcmProjectId ()Ljava/lang/String;
public final fun getPlatform ()Ljava/lang/String;
public final fun getProvider ()Ljava/lang/String;
public final fun getToken ()Ljava/lang/String;
public fun hashCode ()I
public fun toString ()Ljava/lang/String;
}

public final class com/posthog/internal/PostHogPushTokenRegistration {
public fun <init> (Lcom/posthog/PostHogConfig;Lcom/posthog/internal/PostHogApi;Ljava/util/concurrent/ExecutorService;)V
public final fun register (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/posthog/internal/PostHogPreferences;Lcom/posthog/PostHogPushTokenCallback;)V
public final fun registerStoredTokenIfExists (Lcom/posthog/internal/PostHogPreferences;Ljava/lang/String;)V
}

public abstract interface class com/posthog/internal/PostHogQueueInterface {
public abstract fun add (Lcom/posthog/PostHogEvent;)V
public abstract fun clear ()V
Expand Down
88 changes: 83 additions & 5 deletions posthog/src/main/java/com/posthog/PostHog.kt
Original file line number Diff line number Diff line change
Expand Up @@ -8,18 +8,23 @@ import com.posthog.internal.PostHogPreferences.Companion.ALL_INTERNAL_KEYS
import com.posthog.internal.PostHogPreferences.Companion.ANONYMOUS_ID
import com.posthog.internal.PostHogPreferences.Companion.BUILD
import com.posthog.internal.PostHogPreferences.Companion.DISTINCT_ID
import com.posthog.internal.PostHogPreferences.Companion.FCM_PROJECT_ID
import com.posthog.internal.PostHogPreferences.Companion.FCM_TOKEN
import com.posthog.internal.PostHogPreferences.Companion.FCM_TOKEN_LAST_UPDATED
import com.posthog.internal.PostHogPreferences.Companion.GROUPS
import com.posthog.internal.PostHogPreferences.Companion.IS_IDENTIFIED
import com.posthog.internal.PostHogPreferences.Companion.OPT_OUT
import com.posthog.internal.PostHogPreferences.Companion.PERSON_PROCESSING
import com.posthog.internal.PostHogPreferences.Companion.VERSION
import com.posthog.internal.PostHogPrintLogger
import com.posthog.internal.PostHogPushTokenRegistration
import com.posthog.internal.PostHogQueueInterface
import com.posthog.internal.PostHogRemoteConfig
import com.posthog.internal.PostHogSendCachedEventsIntegration
import com.posthog.internal.PostHogSerializer
import com.posthog.internal.PostHogSessionManager
import com.posthog.internal.PostHogThreadFactory
import com.posthog.internal.executeSafely
import com.posthog.internal.personPropertiesContext
import com.posthog.internal.replay.PostHogSessionReplayHandler
import com.posthog.internal.sortMapRecursively
Expand Down Expand Up @@ -47,6 +52,10 @@ public class PostHog private constructor(
Executors.newSingleThreadScheduledExecutor(
PostHogThreadFactory("PostHogSendCachedEventsThread"),
),
private val pushTokenExecutor: ExecutorService =
Executors.newSingleThreadExecutor(
PostHogThreadFactory("PostHogFCMTokenRegistration"),
),
private val reloadFeatureFlags: Boolean = true,
) : PostHogInterface, PostHogStateless() {
private val anonymousLock = Any()
Expand All @@ -56,9 +65,11 @@ public class PostHog private constructor(

private val featureFlagsCalledLock = Any()
private val cachedPersonPropertiesLock = Any()
private var pushTokenRegistration: PostHogPushTokenRegistration? = null

private var remoteConfig: PostHogRemoteConfig? = null
private var replayQueue: PostHogQueueInterface? = null
private lateinit var api: PostHogApi
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

I'd avoid lateinit otherwise you crash if you use it and its not init yet, nullable var is fine

private val featureFlagsCalled = mutableMapOf<String, MutableList<Any?>>()

// Used to deduplicate setPersonProperties calls
Expand Down Expand Up @@ -97,25 +108,25 @@ public class PostHog private constructor(

val cachePreferences = config.cachePreferences ?: memoryPreferences
config.cachePreferences = cachePreferences
val api = PostHogApi(config)
this.api = PostHogApi(config)
val queue =
config.queueProvider(
config,
api,
this.api,
PostHogApiEndpoint.BATCH,
config.storagePrefix,
queueExecutor,
)
val replayQueue =
config.queueProvider(
config,
api,
this.api,
PostHogApiEndpoint.SNAPSHOT,
config.replayStoragePrefix,
replayExecutor,
)
val featureFlags =
config.remoteConfigProvider(config, api, remoteConfigExecutor) {
config.remoteConfigProvider(config, this.api, remoteConfigExecutor) {
getDefaultPersonProperties()
}

Expand All @@ -133,14 +144,20 @@ public class PostHog private constructor(
val sendCachedEventsIntegration =
PostHogSendCachedEventsIntegration(
config,
api,
this.api,
startDate,
cachedEventsExecutor,
)

this.config = config
this.queue = queue
this.replayQueue = replayQueue
this.pushTokenRegistration =
PostHogPushTokenRegistration(
config = config,
api = this.api,
pushTokenExecutor = pushTokenExecutor,
)

if (featureFlags is PostHogRemoteConfig) {
this.remoteConfig = featureFlags
Expand Down Expand Up @@ -703,6 +720,9 @@ public class PostHog private constructor(
}
this.distinctId = distinctId

// Automatically register stored push token with new distinctId
registerStoredTokenIfExists()

// Automatically set person properties for feature flags during identify() call
setPersonPropertiesForFlagsIfNeeded(userProperties, userPropertiesSetOnce)

Expand Down Expand Up @@ -1148,6 +1168,10 @@ public class PostHog private constructor(
if (config?.reuseAnonymousId == true) {
except.add(ANONYMOUS_ID)
}
// preserve FCM token data so we can re-register it with the new anonymous distinctId
except.add(FCM_TOKEN)
except.add(FCM_TOKEN_LAST_UPDATED)
except.add(FCM_PROJECT_ID)
getPreferences().clear(except = except.toList())
remoteConfig?.clear()
featureFlagsCalled.clear()
Expand All @@ -1169,6 +1193,9 @@ public class PostHog private constructor(
if (reloadFeatureFlags) {
reloadFeatureFlags(config?.onFeatureFlags)
}

// Automatically register stored push token with new anonymous distinctId after reset
registerStoredTokenIfExists()
}

public override fun register(
Expand Down Expand Up @@ -1223,6 +1250,42 @@ public class PostHog private constructor(
return PostHogSessionManager.isSessionActive()
}

override fun registerPushToken(
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

i still think that this method code impl should live within another class, and this method just forwards to that class eg remoteConfig/replayQueue etc
this class is huge already and it should be a clean interface where users just call something and dont get distracted by its implementation

token: String,
fcmProjectId: String,
callback: PostHogPushTokenCallback?,
Copy link
Copy Markdown
Contributor

@ioannisj ioannisj Jan 27, 2026

Choose a reason for hiding this comment

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

Will BE allow integrating only with a single Firebase project? If we support multiple firebase projects, I would expect to register a firebase config identifier along with this token (So that BE would know which Firebase project to use)? Correct me if my rationale is wrong here, but for people using multiple apps within a specific PostHog project, this could be problematic?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

That's a good point! Until now I had assumed that users would have one firebase project per posthog project, and that's probably true for most users, but it would be much better to support multiple. I added the firebase app id

) {
if (!isEnabled()) {
pushTokenExecutor.executeSafely { callback?.onComplete(PostHogPushTokenError.SDK_DISABLED, null) }
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

You dont need to execute the callback always within the executor, i'd just run the callback on whatever thread it is

return
}

val registration = pushTokenRegistration
if (registration == null) {
config?.logger?.log("FCM: registerPushToken failed - config is null")
pushTokenExecutor.executeSafely { callback?.onComplete(PostHogPushTokenError.CONFIG_NULL, null) }
return
}
val currentDistinctId = distinctId()
val preferences = getPreferences()
registration.register(token, fcmProjectId, currentDistinctId, preferences, callback)
}

/**
* Automatically registers stored push token when distinctId changes.
* This is called internally after identify() and reset() to ensure
* the push token is associated with the current distinctId.
*/
private fun registerStoredTokenIfExists() {
if (!isEnabled()) {
return
}
pushTokenRegistration?.registerStoredTokenIfExists(
preferences = getPreferences(),
distinctId = distinctId(),
)
}

override fun <T : PostHogConfig> getConfig(): T? {
@Suppress("UNCHECKED_CAST")
return super<PostHogStateless>.config as? T
Expand Down Expand Up @@ -1307,6 +1370,8 @@ public class PostHog private constructor(

private val apiKeys = mutableSetOf<String>()

private const val ONE_HOUR_IN_MILLIS = 60 * 60 * 1000L
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Const usually goes within the companion object in kotlin


@PostHogVisibleForTesting
public fun overrideSharedInstance(postHog: PostHogInterface) {
shared = postHog
Expand Down Expand Up @@ -1336,13 +1401,18 @@ public class PostHog private constructor(
featureFlagsExecutor: ExecutorService,
cachedEventsExecutor: ExecutorService,
reloadFeatureFlags: Boolean,
pushTokenExecutor: ExecutorService =
Executors.newSingleThreadExecutor(
PostHogThreadFactory("PostHogFCMTokenRegistration"),
),
): PostHogInterface {
val instance =
PostHog(
queueExecutor,
replayExecutor,
featureFlagsExecutor,
cachedEventsExecutor,
pushTokenExecutor,
reloadFeatureFlags = reloadFeatureFlags,
)
instance.setup(config)
Expand Down Expand Up @@ -1540,5 +1610,13 @@ public class PostHog private constructor(
override fun getSessionId(): UUID? {
return shared.getSessionId()
}

override fun registerPushToken(
token: String,
fcmProjectId: String,
callback: PostHogPushTokenCallback?,
) {
shared.registerPushToken(token, fcmProjectId, callback)
}
}
}
Loading
Loading