@@ -33,11 +33,11 @@ internal const val KEY_TRACK_PARAMS = "track_params"
3333internal const val KEY_TRACK_THREAD_NODES = " track_thread_nodes"
3434private lateinit var application: Application
3535private var trackHandler: TrackHandler ? = null
36- private val threadNodeCache by lazy { mutableMapOf<Class < * > , TrackNode > () }
36+ private val threadNodes by lazy { mutableMapOf<String , TrackNode >() }
3737
3838@JvmName(" init" )
39- fun initTracker (application : Application , handler : TrackHandler ) {
40- com.dylanc.tracker. application = application
39+ fun initTracker (app : Application , handler : TrackHandler ) {
40+ application = app
4141 trackHandler = handler
4242}
4343
@@ -64,24 +64,24 @@ fun Intent.putReferrerTrackNode(activity: Activity): Intent = putReferrerTrackNo
6464fun Intent.putReferrerTrackNode (fragment : Fragment ): Intent = putReferrerTrackNode(fragment.view)
6565
6666fun Intent.putReferrerTrackNode (view : View ? ): Intent = putExtra(KEY_TRACK_PARAMS , view?.collectTrack() as ? Serializable )
67- .putExtra(KEY_TRACK_THREAD_NODES , view?.threadNodeClasses?. let { list -> Array (list.size) { list[it].name } } )
67+ .putExtra(KEY_TRACK_THREAD_NODES , view?.findThreadNodeNames()?.toTypedArray() )
6868
69- fun ComponentActivity .setPageTrackNode (trackNode : TrackNode ) = setPageTrackNode(emptyMap(), trackNode)
69+ fun Activity .setPageTrackNode (trackNode : TrackNode ) = setPageTrackNode(emptyMap(), trackNode)
7070
7171@JvmOverloads
72- fun ComponentActivity .setPageTrackNode (referrerKeyMap : Map <String , String > = emptyMap(), trackNode : TrackNode = TrackNode { }) {
72+ fun Activity .setPageTrackNode (referrerKeyMap : Map <String , String > = emptyMap(), trackNode : TrackNode = TrackNode { }) {
7373 this .trackNode = PageTrackNode (referrerKeyMap, trackNode)
7474}
7575
7676fun Activity.postTrack (eventName : String , vararg clazz : Class <* >) = window.decorView.postTrack(eventName, * clazz)
7777
7878fun Fragment.postTrack (eventName : String , vararg clazz : Class <* >) = view?.postTrack(eventName, * clazz)
7979
80- fun View.postTrack (eventId : String , vararg clazz : Class <* >) {
81- trackHandler?.onEvent(application, eventId, collectTrack(* clazz ))
80+ fun View.postTrack (eventId : String , vararg threadNodeClasses : Class <* >) {
81+ trackHandler?.onEvent(application, eventId, collectTrack(* threadNodeClasses ))
8282}
8383
84- fun View.collectTrack (vararg classes : Class <* >): Map <String , String > {
84+ fun View.collectTrack (vararg threadNodeClasses : Class <* >): Map <String , String > {
8585 var view: View ? = this
8686 val params = TrackParams ()
8787 val nodeList = mutableListOf<TrackNode >()
@@ -90,30 +90,28 @@ fun View.collectTrack(vararg classes: Class<*>): Map<String, String> {
9090 view = view.parent as ? View
9191 }
9292 nodeList.reversed().forEach { node -> node.fillTackParams(params) }
93- classes .forEach { clazz ->
94- if (threadNodeClasses ?.any { it == clazz } == true ) {
95- threadNodeCache [clazz]?.fillTackParams(params)
93+ threadNodeClasses .forEach { clazz ->
94+ if (findThreadNodeNames() ?.any { it == clazz.name } == true ) {
95+ threadNodes [clazz.name ]?.fillTackParams(params)
9696 }
9797 }
9898 return params.toMap()
9999}
100100
101101fun ComponentActivity.putThreadTrackNode (trackNode : TrackNode ) {
102- if (threadNodeClasses == null ) {
103- threadNodeClasses = mutableListOf (trackNode.javaClass)
104- } else {
105- threadNodeClasses!! .add(trackNode.javaClass)
106- }
107- threadNodeCache[trackNode.javaClass] = trackNode
102+ val clazzName = trackNode.javaClass.name
103+ threadNodes[clazzName] = trackNode
104+ val list = window.decorView.getTag(R .id.tag_thread_node_names) as ? MutableList <String > ? : mutableListOf ()
105+ list.add(clazzName)
106+ window.decorView.setTag(R .id.tag_thread_node_names, list)
108107 lifecycle.addObserver(object : DefaultLifecycleObserver {
109108 override fun onResume (owner : LifecycleOwner ) {
110- if (threadNodeCache[trackNode.javaClass] == null ) {
111- threadNodeCache[trackNode.javaClass] = trackNode
112- }
109+ if (threadNodes[clazzName] == null )
110+ threadNodes[clazzName] = trackNode
113111 }
114112
115113 override fun onDestroy (owner : LifecycleOwner ) {
116- threadNodeCache .remove(trackNode.javaClass )
114+ threadNodes .remove(clazzName )
117115 }
118116 })
119117}
@@ -129,25 +127,19 @@ fun <T : TrackNode> Fragment.updateThreadTrackNode(clazz: Class<T>, callback: Ca
129127inline fun <reified T : TrackNode > View.updateThreadTrackNode (callback : Callback <T >) = updateThreadTrackNode(T ::class .java, callback)
130128
131129fun <T : TrackNode > View.updateThreadTrackNode (clazz : Class <T >, callback : Callback <T >) =
132- (if (threadNodeClasses?.contains(clazz) == true ) threadNodeCache[clazz] as ? T else null )?.let { callback.apply { it.onUpdate() } }
133-
134- internal var Activity .threadNodeClasses: MutableList <Class <* >>?
135- get() = window.decorView.getTag(R .id.tag_track_thread) as ? MutableList <Class <* >>
136- set(value) {
137- window.decorView.setTag(R .id.tag_track_thread, value)
130+ findThreadNodeNames()?.any { it == clazz.name }?.takeIf { it }?.let {
131+ callback.apply { (threadNodes[clazz.name] as ? T )?.onUpdate() }
138132 }
139133
140- private val View .threadNodeClasses: List <Class <* >>?
141- get() {
142- var view: View ? = this
143- while (view != null ) {
144- if (view.getTag(R .id.tag_track_thread) != null ) {
145- return view.getTag(R .id.tag_track_thread) as List <Class <* >>
146- }
147- view = view.parent as ? View
148- }
149- return null
134+ private fun View.findThreadNodeNames (): List <String >? {
135+ var view: View ? = this
136+ while (view != null ) {
137+ if (view.getTag(R .id.tag_thread_node_names) != null )
138+ return view.getTag(R .id.tag_thread_node_names) as List <String >
139+ view = view.parent as ? View
150140 }
141+ return null
142+ }
151143
152144fun interface Callback <T : TrackNode > {
153145 fun T.onUpdate ()
0 commit comments