Skip to content

Commit 5af5eaf

Browse files
Optimize code
1 parent 6111438 commit 5af5eaf

File tree

3 files changed

+32
-40
lines changed

3 files changed

+32
-40
lines changed

library/src/main/java/com/dylanc/tracker/TrackNode.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ fun Activity.PageTrackNode(referrerKeyMap: Map<String, String>, vararg params: P
3535

3636
fun Activity.PageTrackNode(referrerKeyMap: Map<String, String> = emptyMap(), trackNode: TrackNode = TrackNode { }): TrackNode {
3737
val referrerParams = intent.getSerializableExtra(KEY_TRACK_PARAMS) as? Map<String, Any>
38-
threadNodeClasses = intent.getStringArrayExtra(KEY_TRACK_THREAD_NODES)?.run { MutableList(size) { Class.forName(get(it)) } }
38+
window.decorView.setTag(R.id.tag_thread_node_names, intent.getStringArrayExtra(KEY_TRACK_THREAD_NODES)?.toMutableList())
3939
return TrackNode { params ->
4040
referrerParams?.forEach {
4141
params.put(referrerKeyMap.getOrElse(it.key) { it.key }, it.value)

library/src/main/java/com/dylanc/tracker/Tracker.kt

Lines changed: 30 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -33,11 +33,11 @@ internal const val KEY_TRACK_PARAMS = "track_params"
3333
internal const val KEY_TRACK_THREAD_NODES = "track_thread_nodes"
3434
private lateinit var application: Application
3535
private 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
6464
fun Intent.putReferrerTrackNode(fragment: Fragment): Intent = putReferrerTrackNode(fragment.view)
6565

6666
fun 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

7676
fun Activity.postTrack(eventName: String, vararg clazz: Class<*>) = window.decorView.postTrack(eventName, *clazz)
7777

7878
fun 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

101101
fun 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
129127
inline fun <reified T : TrackNode> View.updateThreadTrackNode(callback: Callback<T>) = updateThreadTrackNode(T::class.java, callback)
130128

131129
fun <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

152144
fun interface Callback<T : TrackNode> {
153145
fun T.onUpdate()
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<?xml version="1.0" encoding="utf-8"?>
22
<resources>
33
<item name="tag_track_node" type="id" />
4-
<item name="tag_track_thread" type="id" />
4+
<item name="tag_thread_node_names" type="id" />
55
</resources>

0 commit comments

Comments
 (0)