@@ -5,6 +5,7 @@ import android.content.Context
55import io.constructor.BuildConfig
66import io.constructor.data.DataManager
77import io.constructor.data.local.PreferencesHelper
8+ import io.constructor.data.memory.TestCellMemoryHolder
89import io.constructor.data.model.SuggestionViewModel
910import io.constructor.injection.component.AppComponent
1011import io.constructor.injection.component.DaggerAppComponent
@@ -14,15 +15,20 @@ import io.constructor.util.broadcastIntent
1415import io.constructor.util.d
1516import io.constructor.util.e
1617import io.constructor.util.urlEncode
18+ import io.reactivex.disposables.CompositeDisposable
1719import io.reactivex.schedulers.Schedulers
1820import java.util.*
1921
22+ typealias ConstructorError = ((Throwable ) -> Unit )?
23+
2024@SuppressLint(" StaticFieldLeak" )
2125object ConstructorIo {
2226
2327 private lateinit var dataManager: DataManager
2428 private lateinit var preferenceHelper: PreferencesHelper
29+ private lateinit var testCellMemoryHolder: TestCellMemoryHolder
2530 private lateinit var context: Context
31+ private var disposable = CompositeDisposable ()
2632
2733 internal val component: AppComponent by lazy {
2834 DaggerAppComponent .builder()
@@ -31,11 +37,16 @@ object ConstructorIo {
3137 .build()
3238 }
3339
34- var sessionIncrementEventHandler: (String ) -> Unit = {
35- dataManager.trackSessionStart(arrayOf(Constants .QueryConstants .SESSION to it,
40+ private var sessionIncrementEventHandler: (String ) -> Unit = {
41+ trackSessionStartInternal(it)
42+ }
43+
44+ private fun trackSessionStartInternal (sessionId : String , errorCallback : ConstructorError = null) {
45+ disposable.add(dataManager.trackSessionStart(arrayOf(Constants .QueryConstants .SESSION to sessionId,
3646 Constants .QueryConstants .ACTION to Constants .QueryValues .EVENT_SESSION_START )).subscribeOn(Schedulers .io()).subscribe({}, {
47+ errorCallback?.invoke(it)
3748 d(" Error triggering Session Change event" )
38- })
49+ }))
3950 }
4051
4152 fun init (context : Context ? , apiKey : String , defaultItemSection : String = BuildConfig .AUTOCOMPLETE_SECTION ) {
@@ -45,128 +56,126 @@ object ConstructorIo {
4556 this .context = context.applicationContext
4657 dataManager = component.dataManager()
4758 preferenceHelper = component.preferenceHelper()
59+ testCellMemoryHolder = component.testCellMemoryHolder()
4860 preferenceHelper.token = apiKey
4961 preferenceHelper.defaultItemSection = defaultItemSection
5062 if (preferenceHelper.id.isBlank()) {
5163 preferenceHelper.id = UUID .randomUUID().toString()
5264 }
5365 }
5466
55- internal fun testInit (context : Context ? , apiKey : String , dataManager : DataManager , preferenceHelper : PreferencesHelper ) {
67+ fun getSessionId () = preferenceHelper.getSessionId()
68+
69+ fun getClientId () = preferenceHelper.id
70+
71+ fun setTestCellValues (pair1 : Pair <String , String >, pair2 : Pair <String , String >? = null, pair3 : Pair <String , String >? = null) {
72+ testCellMemoryHolder.testCellParams = listOf (pair1, pair2, pair3)
73+ }
74+
75+ fun clearTestCellValues () {
76+ testCellMemoryHolder.testCellParams = emptyList()
77+ }
78+
79+ internal fun testInit (context : Context ? , apiKey : String , dataManager : DataManager , preferenceHelper : PreferencesHelper , testCellMemoryHolder : TestCellMemoryHolder ) {
5680 if (context == null ) {
5781 throw IllegalStateException (" Context is null, please init library using ConstructorIo.with(context)" )
5882 }
5983 this .context = context.applicationContext
6084 this .dataManager = dataManager
6185 this .preferenceHelper = preferenceHelper
86+ this .testCellMemoryHolder = testCellMemoryHolder
6287 preferenceHelper.token = apiKey
6388 if (preferenceHelper.id.isBlank()) {
6489 preferenceHelper.id = UUID .randomUUID().toString()
6590 }
6691 }
6792
68- internal fun getAutocompleteResults (query : String ) = dataManager.getAutocompleteResults(query)
93+ fun getAutocompleteResults (query : String ) = dataManager.getAutocompleteResults(query)
6994
70- internal fun trackSelect (query : String , suggestion : SuggestionViewModel ) {
95+ fun trackSelect (query : String , suggestion : SuggestionViewModel , errorCallback : ConstructorError = null ) {
7196 val sessionId = preferenceHelper.getSessionId(sessionIncrementEventHandler)
7297 val encodedParams: ArrayList <Pair <String , String >> = arrayListOf ()
7398 suggestion.group?.groupId?.let { encodedParams.add(Constants .QueryConstants .GROUP_ID .urlEncode() to it) }
7499 suggestion.group?.displayName?.let { encodedParams.add(Constants .QueryConstants .GROUP_DISPLAY_NAME .urlEncode() to it.urlEncode()) }
75- dataManager.trackSelect(suggestion.term,
100+ disposable.add( dataManager.trackSelect(suggestion.term,
76101 arrayOf(Constants .QueryConstants .SESSION to sessionId.toString(),
77102 Constants .QueryConstants .AUTOCOMPLETE_SECTION to suggestion.section!! ,
78103 Constants .QueryConstants .ORIGINAL_QUERY to query,
79104 Constants .QueryConstants .EVENT to Constants .QueryValues .EVENT_CLICK ),
80105 encodedParams.toTypedArray())
81- .subscribe({ response ->
82- if (response.isSuccessful) {
83- d(" trigger select success" ) // To change body of created functions use File | Settings | File Templates.
84- context.broadcastIntent(Constants .EVENT_QUERY_SENT , Constants .EXTRA_TERM to query)
85- }
106+ .subscribe({
107+ context.broadcastIntent(Constants .EVENT_QUERY_SENT , Constants .EXTRA_TERM to query)
86108 }, { t ->
87109 t.printStackTrace()
110+ errorCallback?.invoke(t)
88111 e(" trigger select error: ${t.message} " ) // To change body of created functions use File | Settings | File Templates.
89- })
112+ }))
90113 }
91114
92- internal fun trackSearch (query : String , suggestion : SuggestionViewModel ) {
115+ fun trackSearch (query : String , suggestion : SuggestionViewModel , errorCallback : ConstructorError = null ) {
93116 val sessionId = preferenceHelper.getSessionId(sessionIncrementEventHandler)
94117 val encodedParams: ArrayList <Pair <String , String >> = arrayListOf ()
95118 suggestion.group?.groupId?.let { encodedParams.add(Constants .QueryConstants .GROUP_ID .urlEncode() to it) }
96119 suggestion.group?.displayName?.let { encodedParams.add(Constants .QueryConstants .GROUP_DISPLAY_NAME .urlEncode() to it.urlEncode()) }
97- dataManager.trackSearch(suggestion.term,
120+ disposable.add( dataManager.trackSearch(suggestion.term,
98121 arrayOf(Constants .QueryConstants .SESSION to sessionId.toString(),
99122 Constants .QueryConstants .ORIGINAL_QUERY to query,
100123 Constants .QueryConstants .EVENT to Constants .QueryValues .EVENT_SEARCH ), encodedParams.toTypedArray())
101124 .subscribe({
102- if (it.isSuccessful) {
103- d(" trigger search success" )
104- context.broadcastIntent(Constants .EVENT_QUERY_SENT , Constants .EXTRA_TERM to query)
105- }
125+ context.broadcastIntent(Constants .EVENT_QUERY_SENT , Constants .EXTRA_TERM to query)
106126 }, {
107127 it.printStackTrace()
128+ errorCallback?.invoke(it)
108129 e(" trigger search error: ${it.message} " )
109- })
130+ }))
110131 }
111132
112- fun trackConversion (itemId : String , term : String = "TERM_UNKNOWN ", revenue : String? = null) {
133+ fun trackConversion (itemId : String , term : String = "TERM_UNKNOWN ", revenue : String? = null, errorCallback : ConstructorError = null ) {
113134 val sessionId = preferenceHelper.getSessionId(sessionIncrementEventHandler)
114- dataManager.trackConversion(term, itemId, revenue,
135+ disposable.add( dataManager.trackConversion(term, itemId, revenue,
115136 arrayOf(Constants .QueryConstants .SESSION to sessionId.toString(),
116137 Constants .QueryConstants .AUTOCOMPLETE_SECTION to preferenceHelper.defaultItemSection)).subscribeOn(Schedulers .io())
117- .subscribe({ response ->
118- if (response.isSuccessful) {
119- d(" Conversion event success" )
120- }
121- }, { t ->
138+ .subscribe({}, { t ->
122139 t.printStackTrace()
140+ errorCallback?.invoke(t)
123141 e(" Conversion event error: ${t.message} " )
124- })
142+ }))
125143 }
126144
127- fun trackSearchResultClickThrough (term : String , itemId : String , position : String? = null) {
145+ fun trackSearchResultClickThrough (term : String , itemId : String , position : String? = null, errorCallback : ConstructorError = null ) {
128146 val sessionId = preferenceHelper.getSessionId(sessionIncrementEventHandler)
129- dataManager.trackSearchResultClickThrough(term, itemId, position,
147+ disposable.add( dataManager.trackSearchResultClickThrough(term, itemId, position,
130148 arrayOf(Constants .QueryConstants .SESSION to sessionId.toString(),
131149 Constants .QueryConstants .AUTOCOMPLETE_SECTION to preferenceHelper.defaultItemSection)).subscribeOn(Schedulers .io())
132- .subscribe({ response ->
133- if (response.isSuccessful) {
134- d(" Conversion click through event success" )
135- }
136- }, { t ->
150+ .subscribe({}, { t ->
137151 t.printStackTrace()
152+ errorCallback?.invoke(t)
138153 e(" Conversion click through event error: ${t.message} " )
139- })
154+ }))
140155 }
141156
142- fun trackSearchResultLoaded (term : String , resultCount : Int ) {
157+ fun trackSearchResultLoaded (term : String , resultCount : Int , errorCallback : ConstructorError = null ) {
143158 val sessionId = preferenceHelper.getSessionId(sessionIncrementEventHandler)
144- dataManager.trackSearchResultLoaded(term, resultCount,
159+ disposable.add( dataManager.trackSearchResultLoaded(term, resultCount,
145160 arrayOf(Constants .QueryConstants .SESSION to sessionId.toString(),
146161 Constants .QueryConstants .ACTION to Constants .QueryValues .EVENT_SEARCH_RESULTS )).subscribeOn(Schedulers .io())
147- .subscribe({ response ->
148- if (response.isSuccessful) {
149- d(" Conversion event success" )
150- }
151- }, { t ->
162+ .subscribe({}, { t ->
152163 t.printStackTrace()
164+ errorCallback?.invoke(t)
153165 e(" Conversion event error: ${t.message} " )
154- })
166+ }))
155167 }
156168
157- internal fun trackInputFocus (term : String? ) {
169+ fun trackInputFocus (term : String? , errorCallback : ConstructorError = null ) {
158170 val sessionId = preferenceHelper.getSessionId(sessionIncrementEventHandler)
159- dataManager.trackInputFocus(term,
171+ disposable.add( dataManager.trackInputFocus(term,
160172 arrayOf(Constants .QueryConstants .SESSION to sessionId.toString(),
161173 Constants .QueryConstants .ACTION to Constants .QueryValues .EVENT_INPUT_FOCUS )).subscribeOn(Schedulers .io())
162- .subscribe({ response ->
163- if (response.isSuccessful) {
164- d(" Input focus event success" )
165- }
166- }, { t ->
174+ .subscribe({}, { t ->
167175 t.printStackTrace()
176+ errorCallback?.invoke(t)
168177 e(" Input focus event error: ${t.message} " )
169- })
178+ }))
170179 }
171180
172181}
0 commit comments