Skip to content
Merged
Show file tree
Hide file tree
Changes from all 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
98 changes: 67 additions & 31 deletions library/src/main/java/io/constructor/core/ConstructorIo.kt
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,11 @@ import io.constructor.injection.component.DaggerAppComponent
import io.constructor.injection.module.AppModule
import io.constructor.injection.module.NetworkModule
import io.constructor.util.broadcastIntent
import io.constructor.util.e
import io.constructor.util.urlEncode
import io.reactivex.Completable
import io.reactivex.Observable
import io.reactivex.disposables.CompositeDisposable
import io.reactivex.schedulers.Schedulers
import java.util.*

Expand All @@ -29,7 +31,7 @@ object ConstructorIo {
private lateinit var preferenceHelper: PreferencesHelper
private lateinit var configMemoryHolder: ConfigMemoryHolder
private lateinit var context: Context
private var broadcast = true
private var disposable = CompositeDisposable()

var userId: String?
get() = configMemoryHolder.userId
Expand All @@ -45,7 +47,7 @@ object ConstructorIo {
}

private var sessionIncrementHandler: (String) -> Unit = {
trackSessionStartInternal()
trackSessionStart()
}

fun init(context: Context?, constructorIoConfig: ConstructorIoConfig) {
Expand Down Expand Up @@ -84,7 +86,6 @@ object ConstructorIo {
this.dataManager = dataManager
this.preferenceHelper = preferenceHelper
this.configMemoryHolder = configMemoryHolder
this.broadcast = false
}

fun appMovedToForeground() {
Expand Down Expand Up @@ -121,8 +122,14 @@ object ConstructorIo {
}

/**
* Tracks Session Start Events
* Tracks session start events
*/
private fun trackSessionStart() {
var completable = trackSessionStartInternal()
disposable.add(completable.subscribeOn(Schedulers.io()).subscribe({}, {
t -> e("Session Start event error: ${t.message}")
}))
}
internal fun trackSessionStartInternal (): Completable {
return dataManager.trackSessionStart(
arrayOf(Constants.QueryConstants.ACTION to Constants.QueryValues.EVENT_SESSION_START)
Expand All @@ -132,7 +139,13 @@ object ConstructorIo {
/**
* Tracks input focus events
*/
fun trackInputFocus(term: String?): Completable {
fun trackInputFocus(term: String?) {
var completable = trackInputFocusInternal(term)
disposable.add(completable.subscribeOn(Schedulers.io()).subscribe({}, {
t -> e("Input Focus event error: ${t.message}")
}))
}
internal fun trackInputFocusInternal(term: String?): Completable {
preferenceHelper.getSessionId(sessionIncrementHandler)
return dataManager.trackInputFocus(term, arrayOf(
Constants.QueryConstants.ACTION to Constants.QueryValues.EVENT_INPUT_FOCUS
Expand All @@ -142,53 +155,59 @@ object ConstructorIo {
/**
* Tracks autocomplete select events
*/
fun trackAutocompleteSelect(searchTerm: String, originalQuery: String, sectionName: String, group: Group? = null, resultID: String? = null): Completable {
fun trackAutocompleteSelect(searchTerm: String, originalQuery: String, sectionName: String, group: Group? = null, resultID: String? = null) {
var completable = trackAutocompleteSelectInternal(searchTerm, originalQuery, sectionName, group, resultID);
disposable.add(completable.subscribeOn(Schedulers.io()).subscribe({
context.broadcastIntent(Constants.EVENT_QUERY_SENT, Constants.EXTRA_TERM to searchTerm)
}, {
t -> e("Autocomplete Select error: ${t.message}")
}))
}
internal fun trackAutocompleteSelectInternal(searchTerm: String, originalQuery: String, sectionName: String, group: Group? = null, resultID: String? = null): Completable {
preferenceHelper.getSessionId(sessionIncrementHandler)
val encodedParams: ArrayList<Pair<String, String>> = arrayListOf()
group?.groupId?.let { encodedParams.add(Constants.QueryConstants.GROUP_ID.urlEncode() to it) }
group?.displayName?.let { encodedParams.add(Constants.QueryConstants.GROUP_DISPLAY_NAME.urlEncode() to it.urlEncode()) }
resultID?.let { encodedParams.add(Constants.QueryConstants.RESULT_ID.urlEncode() to it.urlEncode()) }
val completable = dataManager.trackAutocompleteSelect(searchTerm, arrayOf(
return dataManager.trackAutocompleteSelect(searchTerm, arrayOf(
Constants.QueryConstants.AUTOCOMPLETE_SECTION to sectionName,
Constants.QueryConstants.ORIGINAL_QUERY to originalQuery,
Constants.QueryConstants.EVENT to Constants.QueryValues.EVENT_CLICK
), encodedParams.toTypedArray()).subscribeOn(Schedulers.io())

if (this.broadcast) {
completable.subscribeOn(Schedulers.io()).subscribe {
context.broadcastIntent(Constants.EVENT_QUERY_SENT, Constants.EXTRA_TERM to searchTerm)
}
}

return completable
), encodedParams.toTypedArray())
}

/**
* Tracks search submit events
*/
fun trackSearchSubmit(searchTerm: String, originalQuery: String, group: Group?): Completable {
fun trackSearchSubmit(searchTerm: String, originalQuery: String, group: Group?) {
var completable = trackSearchSubmitInternal(searchTerm, originalQuery, group)
disposable.add(completable.subscribeOn(Schedulers.io()).subscribe({
context.broadcastIntent(Constants.EVENT_QUERY_SENT, Constants.EXTRA_TERM to searchTerm)
}, {
t -> e("Search Submit error: ${t.message}")
}))
}
internal fun trackSearchSubmitInternal(searchTerm: String, originalQuery: String, group: Group?): Completable {
preferenceHelper.getSessionId(sessionIncrementHandler)
val encodedParams: ArrayList<Pair<String, String>> = arrayListOf()
group?.groupId?.let { encodedParams.add(Constants.QueryConstants.GROUP_ID.urlEncode() to it) }
group?.displayName?.let { encodedParams.add(Constants.QueryConstants.GROUP_DISPLAY_NAME.urlEncode() to it.urlEncode()) }
val completable = dataManager.trackSearchSubmit(searchTerm, arrayOf(
return dataManager.trackSearchSubmit(searchTerm, arrayOf(
Constants.QueryConstants.ORIGINAL_QUERY to originalQuery,
Constants.QueryConstants.EVENT to Constants.QueryValues.EVENT_SEARCH
), encodedParams.toTypedArray())

if (this.broadcast) {
completable.subscribeOn(Schedulers.io()).subscribe {
context.broadcastIntent(Constants.EVENT_QUERY_SENT, Constants.EXTRA_TERM to searchTerm)
}
}

return completable
}

/**
* Tracks search results loaded (a.k.a. search results viewed) events
*/
fun trackSearchResultsLoaded(term: String, resultCount: Int): Completable {
fun trackSearchResultsLoaded(term: String, resultCount: Int) {
var completable = trackSearchResultsLoadedInternal(term, resultCount)
disposable.add(completable.subscribeOn(Schedulers.io()).subscribe({}, {
t -> e("Search Results Loaded error: ${t.message}")
}))
}
internal fun trackSearchResultsLoadedInternal(term: String, resultCount: Int): Completable {
preferenceHelper.getSessionId(sessionIncrementHandler)
return dataManager.trackSearchResultsLoaded(term, resultCount, arrayOf(
Constants.QueryConstants.ACTION to Constants.QueryValues.EVENT_SEARCH_RESULTS
Expand All @@ -198,7 +217,13 @@ object ConstructorIo {
/**
* Tracks search result click events
*/
fun trackSearchResultClick(itemName: String, customerId: String, searchTerm: String = Constants.QueryConstants.TERM_UNKNOWN, sectionName: String? = null, resultID: String? = null): Completable {
fun trackSearchResultClick(itemName: String, customerId: String, searchTerm: String = Constants.QueryConstants.TERM_UNKNOWN, sectionName: String? = null, resultID: String? = null) {
var completable = trackSearchResultClickInternal(itemName, customerId, searchTerm, sectionName, resultID)
disposable.add(completable.subscribeOn(Schedulers.io()).subscribe({}, {
t -> e("Search Result Click error: ${t.message}")
}))
}
internal fun trackSearchResultClickInternal(itemName: String, customerId: String, searchTerm: String = Constants.QueryConstants.TERM_UNKNOWN, sectionName: String? = null, resultID: String? = null): Completable {
preferenceHelper.getSessionId(sessionIncrementHandler)
val encodedParams: ArrayList<Pair<String, String>> = arrayListOf()
resultID?.let { encodedParams.add(Constants.QueryConstants.RESULT_ID.urlEncode() to it.urlEncode()) }
Expand All @@ -212,7 +237,13 @@ object ConstructorIo {
/**
* Tracks conversion (a.k.a add to cart) events
*/
fun trackConversion(itemName: String, customerId: String, revenue: Double?, searchTerm: String = Constants.QueryConstants.TERM_UNKNOWN, sectionName: String? = null): Completable {
fun trackConversion(itemName: String, customerId: String, revenue: Double?, searchTerm: String = Constants.QueryConstants.TERM_UNKNOWN, sectionName: String? = null) {
var completable = trackConversionInternal(itemName, customerId, revenue, searchTerm, sectionName)
disposable.add(completable.subscribeOn(Schedulers.io()).subscribe({}, {
t -> e("Conversion error: ${t.message}")
}))
}
internal fun trackConversionInternal(itemName: String, customerId: String, revenue: Double?, searchTerm: String = Constants.QueryConstants.TERM_UNKNOWN, sectionName: String? = null): Completable {
preferenceHelper.getSessionId(sessionIncrementHandler)
val revenueString = revenue?.let { "%.2f".format(revenue) }
return dataManager.trackConversion(searchTerm, itemName, customerId, revenueString, arrayOf(
Expand All @@ -223,12 +254,17 @@ object ConstructorIo {
/**
* Tracks purchase events
*/
fun trackPurchase(clientIds: Array<String>, revenue: Double?, orderID: String, sectionName: String? = null): Completable {
fun trackPurchase(clientIds: Array<String>, revenue: Double?, orderID: String, sectionName: String? = null) {
var completable = trackPurchaseInternal(clientIds, revenue, orderID, sectionName)
disposable.add(completable.subscribeOn(Schedulers.io()).subscribe({}, {
t -> e("Purchase error: ${t.message}")
}))
}
internal fun trackPurchaseInternal(clientIds: Array<String>, revenue: Double?, orderID: String, sectionName: String? = null): Completable {
preferenceHelper.getSessionId(sessionIncrementHandler)
val sectionNameParam = sectionName ?: preferenceHelper.defaultItemSection
val revenueString = revenue?.let { "%.2f".format(revenue) }
val params = mutableListOf(Constants.QueryConstants.AUTOCOMPLETE_SECTION to sectionNameParam)
return dataManager.trackPurchase(clientIds.toList(), revenueString, orderID, params.toTypedArray())
}

}
2 changes: 2 additions & 0 deletions library/src/main/java/io/constructor/util/Extensions.kt
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,8 @@ fun String.urlEncode() = URLEncoder.encode(this, "UTF-8").replace("+", "%20")

fun Any.d(msg: String) = Log.d(this::class.qualifiedName, msg)

fun Any.e(msg: String) = Log.e(this::class.qualifiedName, msg)

fun String.base64Encode(): String? {
return String(Base64.encode(toByteArray(), Base64.NO_WRAP or Base64.NO_PADDING))
}
Expand Down
Loading