Skip to content

Commit 5503e0d

Browse files
committed
refactor
1 parent 4e7b790 commit 5503e0d

11 files changed

Lines changed: 105 additions & 169 deletions

File tree

instrumentation/view-click/build.gradle.kts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,14 @@ plugins {
33
id("otel.publish-conventions")
44
}
55

6-
description = "OpenTelemetry Android View clcik library instrumentation for Android"
6+
description = "OpenTelemetry Android View click library instrumentation"
77

88
android {
9-
namespace = "io.opentelemetry.android.view.click.library"
9+
namespace = "io.opentelemetry.android.instrumentation.view.click"
10+
11+
defaultConfig {
12+
minSdk = 23
13+
}
1014
}
1115

1216
dependencies {

instrumentation/view-click/src/main/java/io/opentelemetry/android/instrumentation/view/click/ViewClickInstrumentation.java

Lines changed: 0 additions & 28 deletions
This file was deleted.

instrumentation/view-click/src/main/kotlin/io/opentelemetry/android/instrumentation/view/click/DefaultWindowCallback.kt

Lines changed: 0 additions & 29 deletions
This file was deleted.

instrumentation/view-click/src/main/kotlin/io/opentelemetry/android/instrumentation/view/click/EventBuilderCreator.kt

Lines changed: 0 additions & 55 deletions
This file was deleted.

instrumentation/view-click/src/main/kotlin/io/opentelemetry/android/instrumentation/view/click/Pre23WindowCallbackWrapper.kt

Lines changed: 0 additions & 12 deletions
This file was deleted.

instrumentation/view-click/src/main/kotlin/io/opentelemetry/android/instrumentation/view/click/ViewClickActivityCallback.kt

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,16 @@ package io.opentelemetry.android.instrumentation.view.click
88
import android.app.Activity
99
import io.opentelemetry.android.internal.services.visiblescreen.activities.DefaultingActivityLifecycleCallbacks
1010

11-
class ViewClickActivityCallback : DefaultingActivityLifecycleCallbacks {
11+
class ViewClickActivityCallback(
12+
private val viewClickEventGenerator: ViewClickEventGenerator,
13+
) : DefaultingActivityLifecycleCallbacks {
1214
override fun onActivityResumed(activity: Activity) {
1315
super.onActivityResumed(activity)
14-
ViewClickEventGenerator.startTracking(activity.window)
16+
viewClickEventGenerator.startTracking(activity.window)
1517
}
1618

1719
override fun onActivityPaused(activity: Activity) {
1820
super.onActivityPaused(activity)
19-
ViewClickEventGenerator.stopTracking()
21+
viewClickEventGenerator.stopTracking()
2022
}
2123
}

instrumentation/view-click/src/main/kotlin/io/opentelemetry/android/instrumentation/view/click/ViewClickEventGenerator.kt

Lines changed: 43 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -5,46 +5,46 @@
55

66
package io.opentelemetry.android.instrumentation.view.click
77

8-
import android.os.Build
9-
import android.os.Build.VERSION_CODES
108
import android.view.MotionEvent
119
import android.view.View
1210
import android.view.ViewGroup
1311
import android.view.Window
12+
import io.opentelemetry.android.instrumentation.view.click.internal.APP_SCREEN_CLICK_EVENT_NAME
13+
import io.opentelemetry.android.instrumentation.view.click.internal.VIEW_CLICK_EVENT_NAME
14+
import io.opentelemetry.android.instrumentation.view.click.internal.viewIdAttr
15+
import io.opentelemetry.android.instrumentation.view.click.internal.viewNameAttr
16+
import io.opentelemetry.android.instrumentation.view.click.internal.xCoordinateAttr
17+
import io.opentelemetry.android.instrumentation.view.click.internal.yCoordinateAttr
18+
import io.opentelemetry.api.common.Attributes
19+
import io.opentelemetry.api.incubator.logs.ExtendedLogRecordBuilder
20+
import io.opentelemetry.api.incubator.logs.ExtendedLogger
1421
import java.lang.ref.WeakReference
1522
import java.util.LinkedList
1623

17-
internal object ViewClickEventGenerator {
24+
class ViewClickEventGenerator(
25+
private val eventLogger: ExtendedLogger,
26+
) {
1827
private var windowRef: WeakReference<Window>? = null
1928

2029
private val viewCoordinates = IntArray(2)
2130

2231
fun startTracking(window: Window) {
2332
windowRef = WeakReference(window)
2433
val currentCallback = window.callback
25-
val newCallback =
26-
if (Build.VERSION.SDK_INT < VERSION_CODES.M) {
27-
Pre23WindowCallbackWrapper(currentCallback)
28-
} else {
29-
WindowCallbackWrapper(currentCallback)
30-
}
31-
32-
window.callback = newCallback
34+
window.callback = WindowCallbackWrapper(currentCallback, this)
3335
}
3436

3537
fun generateClick(motionEvent: MotionEvent?) {
3638
windowRef?.get()?.let { window ->
3739
if (motionEvent != null && motionEvent.actionMasked == MotionEvent.ACTION_UP) {
38-
EventBuilderCreator
39-
.createEvent(APP_SCREEN_CLICK_EVENT_NAME)
40+
createEvent(APP_SCREEN_CLICK_EVENT_NAME)
4041
.setAttribute(yCoordinateAttr, motionEvent.y.toDouble())
4142
.setAttribute(xCoordinateAttr, motionEvent.x.toDouble())
4243
.emit()
4344

4445
findTargetForTap(window.decorView, motionEvent.x, motionEvent.y)?.let { view ->
45-
EventBuilderCreator
46-
.createEvent(VIEW_CLICK_EVENT_NAME)
47-
.setAllAttributes(EventBuilderCreator.createViewAttributes(view))
46+
createEvent(VIEW_CLICK_EVENT_NAME)
47+
.setAllAttributes(createViewAttributes(view))
4848
.emit()
4949
}
5050
}
@@ -53,13 +53,35 @@ internal object ViewClickEventGenerator {
5353

5454
fun stopTracking() {
5555
windowRef?.get()?.run {
56-
if (callback is DefaultWindowCallback) {
57-
callback = (callback as DefaultWindowCallback).unwrap()
56+
if (callback is WindowCallbackWrapper) {
57+
callback = (callback as WindowCallbackWrapper).unwrap()
5858
}
5959
}
6060
windowRef = null
6161
}
6262

63+
private fun createEvent(name: String): ExtendedLogRecordBuilder =
64+
eventLogger
65+
.logRecordBuilder()
66+
.setEventName(name)
67+
68+
private fun createViewAttributes(view: View): Attributes {
69+
val builder = Attributes.builder()
70+
builder.put(viewNameAttr, viewToName(view))
71+
builder.put(viewIdAttr, view.id.toLong())
72+
73+
builder.put(xCoordinateAttr, view.x.toDouble())
74+
builder.put(yCoordinateAttr, view.y.toDouble())
75+
return builder.build()
76+
}
77+
78+
private fun viewToName(view: View): String =
79+
try {
80+
view.resources?.getResourceEntryName(view.id) ?: view.id.toString()
81+
} catch (throwable: Throwable) {
82+
view.id.toString()
83+
}
84+
6385
private fun findTargetForTap(
6486
decorView: View,
6587
x: Float,
@@ -119,4 +141,7 @@ internal object ViewClickEventGenerator {
119141
}
120142

121143
private fun isJetpackComposeView(view: View): Boolean = view::class.java.name.startsWith("androidx.compose.ui.platform.ComposeView")
144+
145+
private val View.isVisible: Boolean
146+
get() = visibility == View.VISIBLE
122147
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.android.instrumentation.view.click
7+
8+
import com.google.auto.service.AutoService
9+
import io.opentelemetry.android.instrumentation.AndroidInstrumentation
10+
import io.opentelemetry.android.instrumentation.InstallationContext
11+
import io.opentelemetry.api.incubator.logs.ExtendedLogger
12+
13+
@AutoService(AndroidInstrumentation::class)
14+
class ViewClickInstrumentation : AndroidInstrumentation {
15+
override val name: String = "view.click"
16+
17+
override fun install(ctx: InstallationContext) {
18+
ctx.application.registerActivityLifecycleCallbacks(
19+
ViewClickActivityCallback(
20+
ViewClickEventGenerator(
21+
ctx.openTelemetry
22+
.logsBridge
23+
.loggerBuilder("io.opentelemetry.android.view.click")
24+
.build() as ExtendedLogger,
25+
),
26+
),
27+
)
28+
}
29+
}

instrumentation/view-click/src/main/kotlin/io/opentelemetry/android/instrumentation/view/click/WindowCallbackWrapper.kt

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,20 +5,17 @@
55

66
package io.opentelemetry.android.instrumentation.view.click
77

8-
import android.os.Build.VERSION_CODES
9-
import android.view.ActionMode
10-
import android.view.SearchEvent
8+
import android.view.MotionEvent
119
import android.view.Window.Callback
12-
import androidx.annotation.RequiresApi
1310

14-
@RequiresApi(api = VERSION_CODES.M)
1511
class WindowCallbackWrapper(
1612
private val callback: Callback,
17-
) : DefaultWindowCallback(callback) {
18-
override fun onSearchRequested(searchEvent: SearchEvent?): Boolean = callback.onSearchRequested(searchEvent)
13+
private val viewClickEventGenerator: ViewClickEventGenerator,
14+
) : Callback by callback {
15+
override fun dispatchTouchEvent(event: MotionEvent?): Boolean {
16+
viewClickEventGenerator.generateClick(event)
17+
return callback.dispatchTouchEvent(event)
18+
}
1919

20-
override fun onWindowStartingActionMode(
21-
callback: ActionMode.Callback?,
22-
type: Int,
23-
): ActionMode? = this.callback.onWindowStartingActionMode(callback, type)
20+
fun unwrap(): Callback = callback
2421
}

instrumentation/view-click/src/main/kotlin/io/opentelemetry/android/instrumentation/view/click/ViewUtils.kt renamed to instrumentation/view-click/src/main/kotlin/io/opentelemetry/android/instrumentation/view/click/internal/ViewUtils.kt

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33
* SPDX-License-Identifier: Apache-2.0
44
*/
55

6-
package io.opentelemetry.android.instrumentation.view.click
7-
import android.view.View
6+
package io.opentelemetry.android.instrumentation.view.click.internal
7+
88
import io.opentelemetry.api.common.AttributeKey
99
import io.opentelemetry.api.common.AttributeKey.doubleKey
1010
import io.opentelemetry.api.common.AttributeKey.longKey
@@ -17,6 +17,3 @@ val viewNameAttr: AttributeKey<String> = stringKey("app.widget.name")
1717
val xCoordinateAttr: AttributeKey<Double> = doubleKey("app.screen.coordinate.x")
1818
val yCoordinateAttr: AttributeKey<Double> = doubleKey("app.screen.coordinate.y")
1919
val viewIdAttr: AttributeKey<Long> = longKey("app.widget.id")
20-
21-
internal val View.isVisible: Boolean
22-
get() = visibility == View.VISIBLE

0 commit comments

Comments
 (0)