1+ package com.qonversion.flutter.sdk.qonversion_flutter_sdk
2+
3+ import android.content.Context
4+ import io.flutter.plugin.common.BinaryMessenger
5+ import io.flutter.plugin.common.MethodChannel.Result
6+ import io.qonversion.sandwich.BridgeData
7+ import io.qonversion.sandwich.NoCodesEventListener
8+ import io.qonversion.sandwich.NoCodesSandwich
9+ import com.google.gson.Gson
10+
11+ class NoCodesPlugin (private val messenger : BinaryMessenger , private val context : Context ) : NoCodesEventListener {
12+ private var noCodesSandwich: NoCodesSandwich ? = null
13+ private val gson = Gson ()
14+
15+ // Separate event stream handlers for each event type
16+ private var screenShownEventStreamHandler: BaseEventStreamHandler ? = null
17+ private var finishedEventStreamHandler: BaseEventStreamHandler ? = null
18+ private var actionStartedEventStreamHandler: BaseEventStreamHandler ? = null
19+ private var actionFailedEventStreamHandler: BaseEventStreamHandler ? = null
20+ private var actionFinishedEventStreamHandler: BaseEventStreamHandler ? = null
21+ private var screenFailedToLoadEventStreamHandler: BaseEventStreamHandler ? = null
22+
23+ companion object {
24+ private const val SCREEN_SHOWN_EVENT_CHANNEL = " nocodes_screen_shown"
25+ private const val FINISHED_EVENT_CHANNEL = " nocodes_finished"
26+ private const val ACTION_STARTED_EVENT_CHANNEL = " nocodes_action_started"
27+ private const val ACTION_FAILED_EVENT_CHANNEL = " nocodes_action_failed"
28+ private const val ACTION_FINISHED_EVENT_CHANNEL = " nocodes_action_finished"
29+ private const val SCREEN_FAILED_TO_LOAD_EVENT_CHANNEL = " nocodes_screen_failed_to_load"
30+ }
31+
32+ init {
33+ setup()
34+ }
35+
36+ private fun setup () {
37+ // Register separate event channels for each event type
38+ val screenShownListener = BaseListenerWrapper (messenger, SCREEN_SHOWN_EVENT_CHANNEL )
39+ screenShownListener.register()
40+ this .screenShownEventStreamHandler = screenShownListener.eventStreamHandler
41+
42+ val finishedListener = BaseListenerWrapper (messenger, FINISHED_EVENT_CHANNEL )
43+ finishedListener.register()
44+ this .finishedEventStreamHandler = finishedListener.eventStreamHandler
45+
46+ val actionStartedListener = BaseListenerWrapper (messenger, ACTION_STARTED_EVENT_CHANNEL )
47+ actionStartedListener.register()
48+ this .actionStartedEventStreamHandler = actionStartedListener.eventStreamHandler
49+
50+ val actionFailedListener = BaseListenerWrapper (messenger, ACTION_FAILED_EVENT_CHANNEL )
51+ actionFailedListener.register()
52+ this .actionFailedEventStreamHandler = actionFailedListener.eventStreamHandler
53+
54+ val actionFinishedListener = BaseListenerWrapper (messenger, ACTION_FINISHED_EVENT_CHANNEL )
55+ actionFinishedListener.register()
56+ this .actionFinishedEventStreamHandler = actionFinishedListener.eventStreamHandler
57+
58+ val screenFailedToLoadListener = BaseListenerWrapper (messenger, SCREEN_FAILED_TO_LOAD_EVENT_CHANNEL )
59+ screenFailedToLoadListener.register()
60+ this .screenFailedToLoadEventStreamHandler = screenFailedToLoadListener.eventStreamHandler
61+ }
62+
63+ fun initializeNoCodes (projectKey : String , result : Result ) {
64+ if (projectKey.isNotEmpty()) {
65+ // Initialize NoCodes Sandwich
66+ noCodesSandwich = NoCodesSandwich ()
67+ noCodesSandwich?.initialize(context, projectKey)
68+ noCodesSandwich?.setDelegate(this )
69+ result.success(null )
70+ } else {
71+ result.noNecessaryDataError()
72+ }
73+ }
74+
75+ fun setScreenPresentationConfig (config : Map <String , Any >? , contextKey : String? , result : Result ) {
76+ if (config != null ) {
77+ noCodesSandwich?.setScreenPresentationConfig(config, contextKey)
78+ result.success(null )
79+ } else {
80+ result.noNecessaryDataError()
81+ }
82+ }
83+
84+ fun showNoCodesScreen (contextKey : String? , result : Result ) {
85+ if (contextKey != null ) {
86+ noCodesSandwich?.showScreen(contextKey)
87+ result.success(null )
88+ } else {
89+ result.noNecessaryDataError()
90+ }
91+ }
92+
93+ fun closeNoCodes (result : Result ) {
94+ noCodesSandwich?.close()
95+ result.success(null )
96+ }
97+
98+ // NoCodesEventListener implementation
99+ override fun onNoCodesEvent (event : NoCodesEventListener .Event , payload : BridgeData ? ) {
100+ val eventData = mapOf (" payload" to (payload ? : emptyMap<String , Any >()))
101+
102+ // Convert to JSON string
103+ val jsonString = gson.toJson(eventData)
104+
105+ when (event) {
106+ NoCodesEventListener .Event .ScreenShown -> {
107+ screenShownEventStreamHandler?.eventSink?.success(jsonString)
108+ }
109+ NoCodesEventListener .Event .Finished -> {
110+ finishedEventStreamHandler?.eventSink?.success(jsonString)
111+ }
112+ NoCodesEventListener .Event .ActionStarted -> {
113+ actionStartedEventStreamHandler?.eventSink?.success(jsonString)
114+ }
115+ NoCodesEventListener .Event .ActionFailed -> {
116+ actionFailedEventStreamHandler?.eventSink?.success(jsonString)
117+ }
118+ NoCodesEventListener .Event .ActionFinished -> {
119+ actionFinishedEventStreamHandler?.eventSink?.success(jsonString)
120+ }
121+ NoCodesEventListener .Event .ScreenFailedToLoad -> {
122+ screenFailedToLoadEventStreamHandler?.eventSink?.success(jsonString)
123+ }
124+ }
125+ }
126+ }
0 commit comments