Skip to content

Commit 6fda524

Browse files
abdulraqeeb33AR Abdul Azeez
authored andcommitted
feat: Enable docs (#2507)
Co-authored-by: AR Abdul Azeez <[email protected]>
1 parent 4e9e4c4 commit 6fda524

File tree

12 files changed

+364
-83
lines changed

12 files changed

+364
-83
lines changed

OneSignalSDK/build.gradle

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ buildscript {
1515
huaweiHMSPushVersion = '6.3.0.304'
1616
huaweiHMSLocationVersion = '4.0.0.300'
1717
kotlinVersion = '1.9.25'
18+
dokkaVersion = '1.9.10' // Dokka version compatible with Kotlin 1.9.25
1819
coroutinesVersion = '1.7.3'
1920
kotestVersion = '5.8.0'
2021
ioMockVersion = '1.13.2'
@@ -37,6 +38,7 @@ buildscript {
3738
"com.google.gms:google-services:$googleServicesGradlePluginVersion",
3839
"com.huawei.agconnect:agcp:$huaweiAgconnectVersion",
3940
"org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion",
41+
"org.jetbrains.dokka:dokka-gradle-plugin:$dokkaVersion",
4042
"io.gitlab.arturbosch.detekt:detekt-gradle-plugin:$detektVersion",
4143
"com.diffplug.spotless:spotless-plugin-gradle:$spotlessVersion",
4244
"com.vanniktech.maven.publish:com.vanniktech.maven.publish.gradle.plugin:0.32.0"

OneSignalSDK/detekt/detekt-baseline-core.xml

Lines changed: 193 additions & 70 deletions
Large diffs are not rendered by default.

OneSignalSDK/detekt/detekt-baseline-notifications.xml

Lines changed: 36 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
<?xml version="1.0" ?>
1+
<?xml version='1.0' encoding='UTF-8'?>
22
<SmellBaseline>
3-
<ManuallySuppressedIssues></ManuallySuppressedIssues>
3+
<ManuallySuppressedIssues/>
44
<CurrentIssues>
5-
<ID>ComplexCondition:SummaryNotificationDisplayer.kt$SummaryNotificationDisplayer$updateSummary &amp;&amp; summaryList.size &gt; 1 || !updateSummary &amp;&amp; summaryList.size &gt; 0</ID>
5+
<ID>ComplexCondition:SummaryNotificationDisplayer.kt$SummaryNotificationDisplayer$updateSummary &amp;&amp; summaryList.size > 1 || !updateSummary &amp;&amp; summaryList.size > 0</ID>
66
<ID>ComplexMethod:NotificationChannelManager.kt$NotificationChannelManager$@RequiresApi(api = Build.VERSION_CODES.O) @Throws( JSONException::class, ) private fun createChannel( context: Context, notificationManager: NotificationManager, payload: JSONObject, ): String</ID>
77
<ID>ComplexMethod:NotificationGenerationProcessor.kt$NotificationGenerationProcessor$override suspend fun processNotificationData( context: Context, androidNotificationId: Int, jsonPayload: JSONObject, isRestoring: Boolean, timestamp: Long, )</ID>
88
<ID>ComplexMethod:SummaryNotificationDisplayer.kt$SummaryNotificationDisplayer$override suspend fun createSummaryNotification( notificationJob: NotificationGenerationJob, notifBuilder: NotificationDisplayBuilder.OneSignalNotificationBuilder?, groupAlertBehavior: Int, )</ID>
@@ -128,16 +128,16 @@
128128
<ID>LongMethod:NotificationGenerationProcessor.kt$NotificationGenerationProcessor$private suspend fun saveNotification( notificationJob: NotificationGenerationJob, opened: Boolean, )</ID>
129129
<ID>LongMethod:NotificationLifecycleService.kt$NotificationLifecycleService$override suspend fun notificationOpened( activity: Activity, data: JSONArray, )</ID>
130130
<ID>LongMethod:NotificationRepository.kt$NotificationRepository$override suspend fun createNotification( id: String, groupId: String?, collapseKey: String?, shouldDismissIdenticals: Boolean, isOpened: Boolean, androidId: Int, title: String?, body: String?, expireTime: Long, jsonPayload: String, )</ID>
131-
<ID>LongMethod:NotificationRepository.kt$NotificationRepository$override suspend fun listNotificationsForGroup(summaryGroup: String): List&lt;INotificationRepository.NotificationData&gt;</ID>
132-
<ID>LongMethod:NotificationRepository.kt$NotificationRepository$override suspend fun listNotificationsForOutstanding(excludeAndroidIds: List&lt;Int&gt;?): List&lt;INotificationRepository.NotificationData&gt;</ID>
131+
<ID>LongMethod:NotificationRepository.kt$NotificationRepository$override suspend fun listNotificationsForGroup(summaryGroup: String): List&lt;INotificationRepository.NotificationData></ID>
132+
<ID>LongMethod:NotificationRepository.kt$NotificationRepository$override suspend fun listNotificationsForOutstanding(excludeAndroidIds: List&lt;Int>?): List&lt;INotificationRepository.NotificationData></ID>
133133
<ID>LongMethod:NotificationRepository.kt$NotificationRepository$override suspend fun markAsConsumed( androidId: Int, dismissed: Boolean, summaryGroup: String?, clearGroupOnSummaryClick: Boolean, )</ID>
134134
<ID>LongMethod:NotificationsModule.kt$NotificationsModule$override fun register(builder: ServiceBuilder)</ID>
135135
<ID>LongMethod:SummaryNotificationDisplayer.kt$SummaryNotificationDisplayer$@RequiresApi(api = Build.VERSION_CODES.M) override suspend fun createGrouplessSummaryNotification( notificationJob: NotificationGenerationJob, intentGenerator: IntentGeneratorForAttachingToNotifications, grouplessNotifCount: Int, groupAlertBehavior: Int, )</ID>
136136
<ID>LongMethod:SummaryNotificationDisplayer.kt$SummaryNotificationDisplayer$override suspend fun createSummaryNotification( notificationJob: NotificationGenerationJob, notifBuilder: NotificationDisplayBuilder.OneSignalNotificationBuilder?, groupAlertBehavior: Int, )</ID>
137137
<ID>LongParameterList:INotificationGenerationWorkManager.kt$INotificationGenerationWorkManager$( context: Context, osNotificationId: String, androidNotificationId: Int, jsonPayload: JSONObject?, timestamp: Long, isRestoring: Boolean, isHighPriority: Boolean, )</ID>
138138
<ID>LongParameterList:INotificationRepository.kt$INotificationRepository$( id: String, groupId: String?, collapseKey: String?, shouldDismissIdenticals: Boolean, isOpened: Boolean, androidId: Int, title: String?, body: String?, expireTime: Long, jsonPayload: String, )</ID>
139139
<ID>LongParameterList:NotificationLifecycleService.kt$NotificationLifecycleService$( private val _applicationService: IApplicationService, private val _time: ITime, private val _configModelStore: ConfigModelStore, private val _influenceManager: IInfluenceManager, private val _subscriptionManager: ISubscriptionManager, private val _deviceService: IDeviceService, private val _backend: INotificationBackendService, private val _receiveReceiptWorkManager: IReceiveReceiptWorkManager, private val _analyticsTracker: IAnalyticsTracker, )</ID>
140-
<ID>LoopWithTooManyJumpStatements:NotificationLifecycleService.kt$NotificationLifecycleService$for (i in 0 until data.length()) { val notificationId = NotificationFormatHelper.getOSNotificationIdFromJson(data[i] as JSONObject?) ?: continue if (postedOpenedNotifIds.contains(notificationId)) { continue } postedOpenedNotifIds.add(notificationId) suspendifyWithErrorHandling( useIO = true, // or false for CPU operations block = { _backend.updateNotificationAsOpened( appId, notificationId, subscriptionId, deviceType, ) }, onError = { ex -&gt; if (ex is BackendException) { Logging.error("Notification opened confirmation failed with statusCode: ${ex.statusCode} response: ${ex.response}") } else { Logging.error("Unexpected error in notification opened confirmation", ex) } }, ) }</ID>
140+
<ID>LoopWithTooManyJumpStatements:NotificationLifecycleService.kt$NotificationLifecycleService$for (i in 0 until data.length()) { val notificationId = NotificationFormatHelper.getOSNotificationIdFromJson(data[i] as JSONObject?) ?: continue if (postedOpenedNotifIds.contains(notificationId)) { continue } postedOpenedNotifIds.add(notificationId) suspendifyWithErrorHandling( useIO = true, // or false for CPU operations block = { _backend.updateNotificationAsOpened( appId, notificationId, subscriptionId, deviceType, ) }, onError = { ex -> if (ex is BackendException) { Logging.error("Notification opened confirmation failed with statusCode: ${ex.statusCode} response: ${ex.response}") } else { Logging.error("Unexpected error in notification opened confirmation", ex) } }, ) }</ID>
141141
<ID>MagicNumber:FirebaseAnalyticsTracker.kt$FirebaseAnalyticsTracker$1000</ID>
142142
<ID>MagicNumber:FirebaseAnalyticsTracker.kt$FirebaseAnalyticsTracker$30</ID>
143143
<ID>MagicNumber:FirebaseAnalyticsTracker.kt$FirebaseAnalyticsTracker$60</ID>
@@ -164,7 +164,6 @@
164164
<ID>MagicNumber:NotificationDisplayer.kt$NotificationDisplayer$5000</ID>
165165
<ID>MagicNumber:NotificationGenerationProcessor.kt$NotificationGenerationProcessor$1000</ID>
166166
<ID>MagicNumber:NotificationGenerationProcessor.kt$NotificationGenerationProcessor$1000L</ID>
167-
<ID>MagicNumber:NotificationGenerationProcessor.kt$NotificationGenerationProcessor$30000L</ID>
168167
<ID>MagicNumber:NotificationGenerationWorkManager.kt$NotificationGenerationWorkManager.NotificationGenerationWorker$1000L</ID>
169168
<ID>MagicNumber:NotificationHelper.kt$NotificationHelper$10</ID>
170169
<ID>MagicNumber:NotificationQueryHelper.kt$NotificationQueryHelper$1000L</ID>
@@ -214,12 +213,12 @@
214213
<ID>ReturnCount:NotificationHelper.kt$NotificationHelper$fun getNotificationIdFromFCMJson(fcmJson: JSONObject?): String?</ID>
215214
<ID>ReturnCount:NotificationLifecycleService.kt$NotificationLifecycleService$private fun shouldInitDirectSessionFromNotificationOpen(context: Activity): Boolean</ID>
216215
<ID>ReturnCount:NotificationPermissionController.kt$NotificationPermissionController$override suspend fun prompt(fallbackToSettings: Boolean): Boolean</ID>
217-
<ID>ReturnCount:NotificationRestoreProcessor.kt$NotificationRestoreProcessor$private fun getVisibleNotifications(): List&lt;Int&gt;?</ID>
216+
<ID>ReturnCount:NotificationRestoreProcessor.kt$NotificationRestoreProcessor$private fun getVisibleNotifications(): List&lt;Int>?</ID>
218217
<ID>ReturnCount:NotificationRestoreWorkManager.kt$NotificationRestoreWorkManager.NotificationRestoreWorker$override suspend fun doWork(): Result</ID>
219218
<ID>ReturnCount:NotificationSummaryManager.kt$NotificationSummaryManager$private suspend fun internalUpdateSummaryNotificationAfterChildRemoved( group: String, dismissed: Boolean, )</ID>
220219
<ID>ReturnCount:PushRegistratorAbstractGoogle.kt$PushRegistratorAbstractGoogle$override suspend fun registerForPush(): IPushRegistrator.RegisterResult</ID>
221220
<ID>ReturnCount:PushRegistratorAbstractGoogle.kt$PushRegistratorAbstractGoogle$private suspend fun attemptRegistration( senderId: String, currentRetry: Int, ): IPushRegistrator.RegisterResult?</ID>
222-
<ID>ReturnCount:PushRegistratorHMS.kt$PushRegistratorHMS$@Synchronized @Throws(ApiException::class) private suspend fun getHMSTokenTask(context: Context): IPushRegistrator.RegisterResult</ID>
221+
<ID>ReturnCount:PushRegistratorHMS.kt$PushRegistratorHMS$@Throws(ApiException::class) private suspend fun getHMSTokenTask(context: Context): IPushRegistrator.RegisterResult</ID>
223222
<ID>ReturnCount:ReceiveReceiptWorkManager.kt$ReceiveReceiptWorkManager.ReceiveReceiptWorker$override suspend fun doWork(): Result</ID>
224223
<ID>StringLiteralDuplication:NotificationGenerationProcessor.kt$NotificationGenerationProcessor$"collapse_key"</ID>
225224
<ID>StringLiteralDuplication:NotificationRepository.kt$NotificationRepository$" = 0 AND "</ID>
@@ -280,9 +279,36 @@
280279
<ID>UndocumentedPublicClass:NotificationsManager.kt$INotificationActivityOpener</ID>
281280
<ID>UndocumentedPublicClass:OSWorkManagerHelper.kt$OSWorkManagerHelper</ID>
282281
<ID>UndocumentedPublicClass:UpgradeReceiver.kt$UpgradeReceiver : BroadcastReceiver</ID>
282+
<ID>UndocumentedPublicFunction:INotificationDisplayer.kt$INotificationDisplayer$suspend fun displayNotification(notificationJob: NotificationGenerationJob): Boolean</ID>
283+
<ID>UndocumentedPublicFunction:INotificationLifecycleCallback.kt$INotificationLifecycleCallback$suspend fun canOpenNotification( activity: Activity, jsonData: JSONObject, ): Boolean</ID>
284+
<ID>UndocumentedPublicFunction:INotificationLifecycleService.kt$INotificationLifecycleService$fun addExternalClickListener(listener: INotificationClickListener)</ID>
285+
<ID>UndocumentedPublicFunction:INotificationLifecycleService.kt$INotificationLifecycleService$fun addExternalForegroundLifecycleListener(listener: INotificationLifecycleListener)</ID>
286+
<ID>UndocumentedPublicFunction:INotificationLifecycleService.kt$INotificationLifecycleService$fun externalNotificationWillShowInForeground(willDisplayEvent: INotificationWillDisplayEvent)</ID>
287+
<ID>UndocumentedPublicFunction:INotificationLifecycleService.kt$INotificationLifecycleService$fun externalRemoteNotificationReceived(notificationReceivedEvent: INotificationReceivedEvent)</ID>
288+
<ID>UndocumentedPublicFunction:INotificationLifecycleService.kt$INotificationLifecycleService$fun removeExternalClickListener(listener: INotificationClickListener)</ID>
289+
<ID>UndocumentedPublicFunction:INotificationLifecycleService.kt$INotificationLifecycleService$fun removeExternalForegroundLifecycleListener(listener: INotificationLifecycleListener)</ID>
290+
<ID>UndocumentedPublicFunction:INotificationLifecycleService.kt$INotificationLifecycleService$fun setInternalNotificationLifecycleCallback(callback: INotificationLifecycleCallback?)</ID>
291+
<ID>UndocumentedPublicFunction:INotificationLifecycleService.kt$INotificationLifecycleService$suspend fun canOpenNotification( activity: Activity, data: JSONObject, ): Boolean</ID>
292+
<ID>UndocumentedPublicFunction:INotificationLifecycleService.kt$INotificationLifecycleService$suspend fun canReceiveNotification(jsonPayload: JSONObject): Boolean</ID>
293+
<ID>UndocumentedPublicFunction:INotificationLifecycleService.kt$INotificationLifecycleService$suspend fun notificationOpened( activity: Activity, data: JSONArray, )</ID>
294+
<ID>UndocumentedPublicFunction:INotificationLifecycleService.kt$INotificationLifecycleService$suspend fun notificationReceived(notificationJob: NotificationGenerationJob)</ID>
295+
<ID>UndocumentedPublicFunction:Notification.kt$Notification$fun hasNotificationId(): Boolean</ID>
296+
<ID>UndocumentedPublicFunction:Notification.kt$Notification$fun toJSONObject(): JSONObject</ID>
297+
<ID>UndocumentedPublicFunction:Notification.kt$Notification.ActionButton$fun toJSONObject(): JSONObject</ID>
298+
<ID>UndocumentedPublicFunction:NotificationGenerationJob.kt$NotificationGenerationJob$fun hasExtender(): Boolean</ID>
299+
<ID>UndocumentedPublicFunction:NotificationHelper.kt$NotificationHelper$@Throws(JSONException::class) fun getCustomJSONObject(jsonObject: JSONObject): JSONObject</ID>
300+
<ID>UndocumentedPublicFunction:NotificationHelper.kt$NotificationHelper$fun getCampaignNameFromNotification(notification: INotification): String</ID>
301+
<ID>UndocumentedPublicFunction:NotificationHelper.kt$NotificationHelper$fun getNotificationIdFromFCMJson(fcmJson: JSONObject?): String?</ID>
302+
<ID>UndocumentedPublicFunction:NotificationHelper.kt$NotificationHelper$fun getNotificationManager(context: Context): NotificationManager</ID>
303+
<ID>UndocumentedPublicFunction:NotificationHelper.kt$NotificationHelper$fun getSoundUri( context: Context, sound: String?, ): Uri?</ID>
304+
<ID>UndocumentedPublicFunction:NotificationHelper.kt$NotificationHelper$fun isGroupSummary(notif: StatusBarNotification): Boolean</ID>
305+
<ID>UndocumentedPublicFunction:NotificationHelper.kt$NotificationHelper$fun parseVibrationPattern(fcmBundle: JSONObject): LongArray?</ID>
306+
<ID>UndocumentedPublicFunction:NotificationsManager.kt$INotificationActivityOpener$suspend fun openDestinationActivity( activity: Activity, pushPayloads: JSONArray, )</ID>
307+
<ID>UndocumentedPublicFunction:OneSignalHmsEventBridge.kt$OneSignalHmsEventBridge$fun onMessageReceived( context: Context, message: RemoteMessage, )</ID>
283308
<ID>UnusedPrivateMember:DeviceRegistrationListener.kt$DeviceRegistrationListener$val pushSubscription = _subscriptionManager.subscriptions.push</ID>
284-
<ID>UnusedPrivateMember:NotificationDisplayBuilder.kt$NotificationDisplayBuilder$private fun addAlertButtons( context: Context, fcmJson: JSONObject, buttonsLabels: MutableList&lt;String&gt;, buttonsIds: MutableList&lt;String&gt;, )</ID>
309+
<ID>UnusedPrivateMember:NotificationDisplayBuilder.kt$NotificationDisplayBuilder$private fun addAlertButtons( context: Context, fcmJson: JSONObject, buttonsLabels: MutableList&lt;String>, buttonsIds: MutableList&lt;String>, )</ID>
285310
<ID>UnusedPrivateMember:NotificationOpenedProcessor.kt$NotificationOpenedProcessor$private fun newContentValuesWithConsumed(intent: Intent): ContentValues</ID>
286311
<ID>UnusedPrivateMember:OneSignalHmsEventBridge.kt$OneSignalHmsEventBridge$context: Context</ID>
312+
<ID>VariableNaming:NotificationGenerationProcessor.kt$NotificationGenerationProcessor$private val EXTERNAL_CALLBACKS_TIMEOUT get() = 30_000L</ID>
287313
</CurrentIssues>
288314
</SmellBaseline>
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
<?xml version='1.0' encoding='UTF-8'?>
2+
<SmellBaseline>
3+
<ManuallySuppressedIssues/>
4+
<CurrentIssues>
5+
<ID>SwallowedException:IOMockHelper.kt$IOMockHelper$e: Exception</ID>
6+
<ID>TooGenericExceptionCaught:IOMockHelper.kt$IOMockHelper$e: Exception</ID>
7+
</CurrentIssues>
8+
</SmellBaseline>

OneSignalSDK/detekt/detekt-config.yml

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -86,10 +86,12 @@ complexity:
8686
comments:
8787
UndocumentedPublicClass:
8888
active: true
89-
excludes: ['**/R.class', '**/BuildConfig.*']
89+
excludes: ['**/R.class', '**/BuildConfig.*', '**/test/**', '**/androidTest/**', '**/testhelpers/**']
9090

9191
UndocumentedPublicFunction:
92-
active: false
92+
active: true
93+
excludes: ['**/test/**', '**/androidTest/**', '**/testhelpers/**']
94+
9395
EndOfSentenceFormat:
9496
active: false
9597
endOfSentenceFormat: ([.?!][ \t\n\r\f<])|([.?!:]$)
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,17 @@
11
package com.onesignal.debug
22

3+
/**
4+
* A listener to receive all logging messages the OneSignal SDK produces.
5+
* Implement this interface and add it via [IDebugManager.addLogListener] to capture
6+
* and process SDK logs, for example to send them to your own logging service.
7+
*
8+
* Note: All log messages are always passed to this listener regardless of the [IDebugManager.logLevel] setting.
9+
*/
310
fun interface ILogListener {
11+
/**
12+
* Called when a log event occurs in the OneSignal SDK.
13+
*
14+
* @param event The [OneSignalLogEvent] containing the log level and message.
15+
*/
416
fun onLogEvent(event: OneSignalLogEvent)
517
}

OneSignalSDK/onesignal/core/src/main/java/com/onesignal/debug/LogLevel.kt

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,46 @@
11
package com.onesignal.debug
22

3+
/**
4+
* Log level enumeration for controlling the verbosity of OneSignal SDK logging.
5+
* Use [IDebugManager.logLevel] to set the desired log level for the SDK.
6+
*
7+
* Log levels are ordered from least to most verbose:
8+
* [NONE] < [FATAL] < [ERROR] < [WARN] < [INFO] < [DEBUG] < [VERBOSE]
9+
*/
310
enum class LogLevel {
11+
/**
12+
* No logging will be output.
13+
*/
414
NONE,
15+
16+
/**
17+
* Only fatal error messages will be logged.
18+
*/
519
FATAL,
20+
21+
/**
22+
* Error and fatal messages will be logged.
23+
*/
624
ERROR,
25+
26+
/**
27+
* Warning, error, and fatal messages will be logged. This is the default log level.
28+
*/
729
WARN,
30+
31+
/**
32+
* Informational, warning, error, and fatal messages will be logged.
33+
*/
834
INFO,
35+
36+
/**
37+
* Debug, informational, warning, error, and fatal messages will be logged.
38+
*/
939
DEBUG,
40+
41+
/**
42+
* All messages including verbose output will be logged.
43+
*/
1044
VERBOSE,
1145
;
1246

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,16 @@
11
package com.onesignal.debug
22

3+
/**
4+
* Represents a log event generated by the OneSignal SDK. This is provided to
5+
* [ILogListener.onLogEvent] when a log message is generated.
6+
*/
37
data class OneSignalLogEvent(
8+
/**
9+
* The severity level of this log event.
10+
*/
411
val level: LogLevel,
12+
/**
13+
* The log message content.
14+
*/
515
val entry: String,
616
)

OneSignalSDK/onesignal/core/src/main/java/com/onesignal/inAppMessages/IInAppMessageClickListener.kt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,12 @@
11
package com.onesignal.inAppMessages
22

3+
/**
4+
* An interface used to process a OneSignal In-App Message the user just clicked on.
5+
* Implement this interface and provide an instance to [IInAppMessagesManager.addClickListener]
6+
* in order to receive control when an IAM is clicked by the user.
7+
*
8+
* @see [In-App Messages | OneSignal Docs](https://documentation.onesignal.com/docs/in-app-messages)
9+
*/
310
interface IInAppMessageClickListener {
411
/**
512
* Fires when a user clicks on a clickable element in the IAM.

OneSignalSDK/onesignal/core/src/main/java/com/onesignal/user/state/UserChangedState.kt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,14 @@ package com.onesignal.user.state
22

33
import org.json.JSONObject
44

5+
/**
6+
* Represents a change in the user state. This is provided to [IUserStateObserver.onUserStateChange]
7+
* when the user state has changed, typically when a user has logged in or out.
8+
*/
59
class UserChangedState(
10+
/**
11+
* The current user state after the change.
12+
*/
613
val current: UserState,
714
) {
815
fun toJSONObject(): JSONObject {

0 commit comments

Comments
 (0)