Skip to content

Commit

Permalink
Introduce a Tracker interface
Browse files Browse the repository at this point in the history
  • Loading branch information
oguzkocer committed Jan 11, 2024
1 parent a8bf91d commit 69f4571
Showing 1 changed file with 59 additions and 27 deletions.
86 changes: 59 additions & 27 deletions parsely/src/main/java/com/parsely/parselyandroid/ParselyTracker.kt
Original file line number Diff line number Diff line change
Expand Up @@ -22,19 +22,54 @@ import androidx.lifecycle.ProcessLifecycleOwner
import com.parsely.parselyandroid.Logging.log
import java.util.UUID

public interface Tracker {
public val engagementInterval: Double?
public val videoEngagementInterval: Double?
public val flushInterval: Long

public fun engagementIsActive(): Boolean
public fun videoIsActive(): Boolean

public fun trackPageview(
url: String,
urlRef: String = "",
urlMetadata: ParselyMetadata? = null,
extraData: Map<String, Any>? = null,
)

public fun startEngagement(
url: String,
urlRef: String? = null,
extraData: Map<String, Any>? = null
)

public fun stopEngagement()

public fun trackPlay(
url: String,
urlRef: String = "",
videoMetadata: ParselyVideoMetadata,
extraData: Map<String, Any>? = null,
)
public fun trackPause()
public fun resetVideo()
public fun flushEventQueue()
public fun flushTimerIsActive(): Boolean
}

/**
* Tracks Parse.ly app views in Android apps
*
*
* Accessed as a singleton. Maintains a queue of pageview events in memory and periodically
* flushes the queue to the Parse.ly pixel proxy server.
*/
public open class ParselyTracker protected constructor(
public class ParselyTracker protected constructor(
siteId: String,
flushInterval: Int,
c: Context,
private val dryRun: Boolean
) {
): Tracker {
private val flushManager: FlushManager
private var engagementManager: EngagementManager? = null
private var videoEngagementManager: EngagementManager? = null
Expand Down Expand Up @@ -94,18 +129,18 @@ public open class ParselyTracker protected constructor(
*
* @return The base engagement tracking interval.
*/
public val engagementInterval: Double?
override val engagementInterval: Double?
get() = engagementManager?.intervalMillis

public val videoEngagementInterval: Double?
override val videoEngagementInterval: Double?
get() = videoEngagementManager?.intervalMillis

/**
* Returns whether the engagement tracker is running.
*
* @return Whether the engagement tracker is running.
*/
public fun engagementIsActive(): Boolean {
override fun engagementIsActive(): Boolean {
return engagementManager?.isRunning ?: false
}

Expand All @@ -114,7 +149,7 @@ public open class ParselyTracker protected constructor(
*
* @return Whether video tracking is active.
*/
public fun videoIsActive(): Boolean {
override fun videoIsActive(): Boolean {
return videoEngagementManager?.isRunning ?: false
}

Expand All @@ -123,7 +158,7 @@ public open class ParselyTracker protected constructor(
*
* @return The interval at which the event queue is flushed to Parse.ly.
*/
public val flushInterval: Long
override val flushInterval: Long
get() = flushManager.intervalMillis / 1000

/**
Expand All @@ -138,12 +173,11 @@ public open class ParselyTracker protected constructor(
* would normally crawl.
* @param extraData A Map of additional information to send with the event.
*/
@JvmOverloads
public fun trackPageview(
override fun trackPageview(
url: String,
urlRef: String = "",
urlMetadata: ParselyMetadata? = null,
extraData: Map<String, Any>? = null,
urlRef: String,
urlMetadata: ParselyMetadata?,
extraData: Map<String, Any>?,
) {
if (url.isBlank()) {
log("url cannot be empty")
Expand Down Expand Up @@ -176,11 +210,10 @@ public open class ParselyTracker protected constructor(
* @param url The URL to track engaged time for.
* @param urlRef Referrer URL associated with this video view.
*/
@JvmOverloads
public fun startEngagement(
override fun startEngagement(
url: String,
urlRef: String? = null,
extraData: Map<String, Any>? = null
urlRef: String?,
extraData: Map<String, Any>?
) {
if (url.isBlank()) {
log("url cannot be empty")
Expand Down Expand Up @@ -217,7 +250,7 @@ public open class ParselyTracker protected constructor(
* like `onPause` or `onStop`. Otherwise, engaged time tracking may keep running in the background
* and Parse.ly values may be inaccurate.
*/
public fun stopEngagement() {
override fun stopEngagement() {
engagementManager?.let {
it.stop()
log("Engagement session has been stopped")
Expand Down Expand Up @@ -247,12 +280,11 @@ public open class ParselyTracker protected constructor(
* @param videoMetadata Metadata about the video being tracked.
* @param extraData A Map of additional information to send with the event.
</CUSTOMERDOMAIN></CUSTOMERDOMAIN> */
@JvmOverloads
public fun trackPlay(
override fun trackPlay(
url: String,
urlRef: String = "",
urlRef: String,
videoMetadata: ParselyVideoMetadata,
extraData: Map<String, Any>? = null,
extraData: Map<String, Any>?,
) {
if (url.isBlank()) {
log("url cannot be empty")
Expand Down Expand Up @@ -305,7 +337,7 @@ public open class ParselyTracker protected constructor(
* like `onPause` or `onStop`. Otherwise, engaged time tracking may keep running in the background
* and Parse.ly values may be inaccurate.
*/
public fun trackPause() {
override fun trackPause() {
videoEngagementManager?.stop()
}

Expand All @@ -322,7 +354,7 @@ public open class ParselyTracker protected constructor(
* like `onPause` or `onStop`. Otherwise, engaged time tracking may keep running in the background
* and Parse.ly values may be inaccurate.
*/
public fun resetVideo() {
override fun resetVideo() {
videoEngagementManager?.stop()
videoEngagementManager = null
}
Expand All @@ -342,7 +374,7 @@ public open class ParselyTracker protected constructor(
* Any usage of this method is safe to remove and will have no effect. Keeping for backwards compatibility.
*/
@Deprecated("The SDK now automatically flushes the queue on app lifecycle events. Any usage of this method is safe to remove and will have no effect")
public fun flushEventQueue() {
override fun flushEventQueue() {
// no-op
}

Expand All @@ -363,7 +395,7 @@ public open class ParselyTracker protected constructor(
*
* @return Whether the event queue flush timer is running.
*/
public fun flushTimerIsActive(): Boolean {
override fun flushTimerIsActive(): Boolean {
return flushManager.isRunning
}

Expand All @@ -387,7 +419,7 @@ public open class ParselyTracker protected constructor(
* @return The singleton instance
*/
@JvmStatic
public fun sharedInstance(): ParselyTracker? {
public fun sharedInstance(): Tracker? {
return instance
}

Expand All @@ -407,7 +439,7 @@ public open class ParselyTracker protected constructor(
flushInterval: Int = DEFAULT_FLUSH_INTERVAL_SECS,
context: Context,
dryRun: Boolean = false,
): ParselyTracker {
): Tracker {
return instance ?: run {
val newInstance = ParselyTracker(siteId, flushInterval, context, dryRun)
instance = newInstance
Expand Down

0 comments on commit 69f4571

Please sign in to comment.