Skip to content

Commit 89cee59

Browse files
jiahaoliangMinTate
authored andcommitted
【TUICallKit】【Android】Add data report
1 parent 73806d9 commit 89cee59

6 files changed

Lines changed: 171 additions & 0 deletions

File tree

call/tuicallkit-kt/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/TUICallKitImpl.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import com.tencent.qcloud.tuicore.permission.PermissionCallback
1111
import com.tencent.qcloud.tuicore.permission.PermissionRequester
1212
import com.tencent.qcloud.tuikit.tuicallkit.common.data.Constants
1313
import com.tencent.qcloud.tuikit.tuicallkit.common.data.Logger
14+
import com.tencent.qcloud.tuikit.tuicallkit.common.metrics.KeyMetrics
1415
import com.tencent.qcloud.tuikit.tuicallkit.common.utils.DeviceUtils
1516
import com.tencent.qcloud.tuikit.tuicallkit.common.utils.PermissionRequest
1617
import com.tencent.qcloud.tuikit.tuicallkit.manager.CallManager
@@ -66,6 +67,10 @@ class TUICallKitImpl private constructor(context: Context) : TUICallKit() {
6667
ToastUtil.toastLongMessage(toastText)
6768
}
6869
}
70+
71+
override fun onCallReceived(callId: String, mediaType: CallMediaType, userData: String) {
72+
KeyMetrics.countUV(KeyMetrics.EventId.RECEIVED, callId)
73+
}
6974
}
7075

7176
init {

call/tuicallkit-kt/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/common/data/Constants.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.tencent.qcloud.tuikit.tuicallkit.common.data
22

33
object Constants {
4+
const val VERSION = "4.0.0.0"
45
const val CALL_WAITING_MAX_TIME = 30 //unit:s
56
const val MAX_USER = 9
67

Lines changed: 156 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,156 @@
1+
package com.tencent.qcloud.tuikit.tuicallkit.common.metrics
2+
3+
import com.tencent.cloud.tuikit.engine.common.ContextProvider
4+
import com.tencent.imsdk.v2.V2TIMManager
5+
import com.tencent.imsdk.v2.V2TIMValueCallback
6+
import com.tencent.liteav.base.Log
7+
import com.tencent.qcloud.tuicore.TUIConfig
8+
import com.tencent.qcloud.tuicore.permission.PermissionRequester
9+
import com.tencent.qcloud.tuikit.tuicallkit.common.data.Constants
10+
import com.tencent.qcloud.tuikit.tuicallkit.common.utils.DeviceUtils
11+
import com.tencent.qcloud.tuikit.tuicallkit.common.utils.PermissionRequest
12+
import com.tencent.trtc.TRTCCloud
13+
import com.trtc.tuikit.common.util.TUIBuild
14+
import io.trtc.tuikit.atomicxcore.api.call.CallStore
15+
import org.json.JSONException
16+
import org.json.JSONObject
17+
import java.util.concurrent.atomic.AtomicReference
18+
19+
object KeyMetrics {
20+
private const val TAG = "KeyMetrics"
21+
private const val API_REPORT_ROOM_ENGINE_EVENT = "reportRoomEngineEvent"
22+
private val lastWakeupCallId = AtomicReference<String?>(null)
23+
24+
enum class EventId(val value: Int) {
25+
RECEIVED(171010),
26+
WAKEUP(171011),
27+
}
28+
29+
fun countUV(eventId: EventId, callId: String) {
30+
when (eventId) {
31+
EventId.RECEIVED -> {
32+
countEvent(eventId, callId)
33+
}
34+
35+
EventId.WAKEUP -> {
36+
val lastCallId = lastWakeupCallId.get()
37+
if (lastCallId != callId) {
38+
lastWakeupCallId.set(callId)
39+
countEvent(eventId, callId)
40+
}
41+
}
42+
}
43+
}
44+
45+
private fun countEvent(eventId: EventId, callId: String) {
46+
trackForKibana(eventId, callId)
47+
trackForTRTC(eventId)
48+
}
49+
50+
private fun trackForKibana(eventId: EventId, callId: String) {
51+
try {
52+
val extensionJson = buildExtensionJson(callId)
53+
val payload = buildEventPayload(eventId, extensionJson.toString())
54+
55+
V2TIMManager.getInstance().callExperimentalAPI(API_REPORT_ROOM_ENGINE_EVENT, payload.toString(),
56+
object : V2TIMValueCallback<Any?> {
57+
override fun onSuccess(data: Any?) {
58+
Log.i(TAG, "trackForKibana success: eventId=$eventId")
59+
}
60+
61+
override fun onError(code: Int, desc: String) {
62+
Log.e(TAG, "trackForKibana failed: code=$code, desc=$desc")
63+
}
64+
}
65+
)
66+
} catch (e: Exception) {
67+
Log.e(TAG, "trackForKibana exception: eventId=$eventId", e)
68+
}
69+
}
70+
71+
private fun trackForTRTC(eventId: EventId) {
72+
try {
73+
val paramsJson = JSONObject().apply {
74+
put("opt", "CountPV")
75+
put("key", eventId.value)
76+
put("withInstanceTrace", false)
77+
put("version", Constants.VERSION)
78+
}
79+
val jsonParams = JSONObject().apply {
80+
put("api", "KeyMetricsStats")
81+
put("params", paramsJson)
82+
}
83+
84+
TRTCCloud.sharedInstance(ContextProvider.getApplicationContext()).callExperimentalAPI(jsonParams.toString())
85+
} catch (e: JSONException) {
86+
Log.e(TAG, "trackForTRTC call exception: eventId=$eventId", e)
87+
e.printStackTrace()
88+
}
89+
}
90+
91+
private fun buildExtensionJson(callId: String): JSONObject {
92+
val roomId = CallStore.shared.observerState.activeCall.value.roomId
93+
return JSONObject().apply {
94+
// Basic Info
95+
put(JsonKeys.CALL_ID, callId)
96+
put(JsonKeys.STR_ROOM_ID, roomId)
97+
put(JsonKeys.UI_KIT_VERSION, Constants.VERSION)
98+
99+
// Platform Info
100+
put(JsonKeys.PLATFORM, "android")
101+
put(JsonKeys.FRAMEWORK, Constants.framework)
102+
put(JsonKeys.DEVICE_BRAND, TUIBuild.getBrand())
103+
put(JsonKeys.DEVICE_MODEL, TUIBuild.getModel())
104+
put(JsonKeys.ANDROID_VERSION, TUIBuild.getVersion())
105+
put(JsonKeys.IS_FOREGROUND, DeviceUtils.isAppRunningForeground(TUIConfig.getAppContext()))
106+
put(JsonKeys.IS_SCREEN_LOCKED, DeviceUtils.isScreenLocked(TUIConfig.getAppContext()))
107+
put(
108+
JsonKeys.HAS_FLOATING_WINDOW_PERMISSION,
109+
PermissionRequester.newInstance(PermissionRequester.FLOAT_PERMISSION).has()
110+
)
111+
put(
112+
JsonKeys.HAS_BACKGROUND_LAUNCH_PERMISSION,
113+
PermissionRequester.newInstance(PermissionRequester.BG_START_PERMISSION).has()
114+
)
115+
put(JsonKeys.HAS_NOTIFICATION_PERMISSION, PermissionRequest.isNotificationEnabled())
116+
}
117+
}
118+
119+
private fun buildEventPayload(eventId: EventId, extensionMessage: String): JSONObject {
120+
return JSONObject().apply {
121+
put(JsonKeys.EVENT_ID, eventId.value)
122+
put(JsonKeys.EVENT_CODE, 0)
123+
put(JsonKeys.EVENT_RESULT, 0)
124+
put(JsonKeys.EVENT_MESSAGE, Constants.VERSION)
125+
put(JsonKeys.MORE_MESSAGE, "")
126+
put(JsonKeys.EXTENSION_MESSAGE, extensionMessage)
127+
}
128+
}
129+
130+
private object JsonKeys {
131+
// Event Payload Keys
132+
const val EVENT_ID = "event_id"
133+
const val EVENT_CODE = "event_code"
134+
const val EVENT_RESULT = "event_result"
135+
const val EVENT_MESSAGE = "event_message"
136+
const val MORE_MESSAGE = "more_message"
137+
const val EXTENSION_MESSAGE = "extension_message"
138+
139+
// Basic Info Keys
140+
const val CALL_ID = "call_id"
141+
const val STR_ROOM_ID = "str_room_id"
142+
const val UI_KIT_VERSION = "ui_kit_version"
143+
144+
// Platform Info Keys
145+
const val PLATFORM = "platform"
146+
const val FRAMEWORK = "framework"
147+
const val DEVICE_BRAND = "device_brand"
148+
const val DEVICE_MODEL = "device_model"
149+
const val ANDROID_VERSION = "android_version"
150+
const val IS_FOREGROUND = "is_foreground"
151+
const val IS_SCREEN_LOCKED = "is_screen_locked"
152+
const val HAS_FLOATING_WINDOW_PERMISSION = "has_floating_window_permission"
153+
const val HAS_BACKGROUND_LAUNCH_PERMISSION = "has_background_launch_permission"
154+
const val HAS_NOTIFICATION_PERMISSION = "has_notification_permission"
155+
}
156+
}

call/tuicallkit-kt/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/view/CallMainActivity.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import com.tencent.qcloud.tuicore.util.TUIBuild
1919
import com.tencent.qcloud.tuikit.tuicallkit.R
2020
import com.tencent.qcloud.tuikit.tuicallkit.common.data.Constants
2121
import com.tencent.qcloud.tuikit.tuicallkit.common.data.Logger
22+
import com.tencent.qcloud.tuikit.tuicallkit.common.metrics.KeyMetrics
2223
import com.tencent.qcloud.tuikit.tuicallkit.common.utils.DeviceUtils
2324
import com.tencent.qcloud.tuikit.tuicallkit.common.utils.PermissionRequest
2425
import com.tencent.qcloud.tuikit.tuicallkit.manager.CallManager
@@ -76,6 +77,8 @@ class CallMainActivity : FullScreenActivity() {
7677
finishCallMainActivity()
7778
return
7879
}
80+
val callId = CallStore.shared.observerState.activeCall.value.callId
81+
KeyMetrics.countUV(KeyMetrics.EventId.WAKEUP, callId)
7982
setBackground()
8083
addCallView()
8184
addFloatButton()

call/tuicallkit-kt/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/view/component/incomingbanner/IncomingFloatBanner.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import com.tencent.qcloud.tuicore.util.TUIBuild
1818
import com.tencent.qcloud.tuikit.tuicallkit.R
1919
import com.tencent.qcloud.tuikit.tuicallkit.common.data.Constants
2020
import com.tencent.qcloud.tuikit.tuicallkit.common.data.Logger
21+
import com.tencent.qcloud.tuikit.tuicallkit.common.metrics.KeyMetrics
2122
import com.tencent.qcloud.tuikit.tuicallkit.manager.CallManager
2223
import com.tencent.qcloud.tuikit.tuicallkit.state.ViewState
2324
import com.tencent.qcloud.tuikit.tuicallkit.view.CallMainActivity
@@ -143,6 +144,8 @@ class IncomingFloatBanner(context: Context) : RelativeLayout(context) {
143144

144145
CallManager.instance.viewState.router.set(ViewState.ViewRouter.Banner)
145146
windowManager.addView(layoutView, viewParams)
147+
val callId = CallStore.shared.observerState.activeCall.value.callId
148+
KeyMetrics.countUV(KeyMetrics.EventId.WAKEUP, callId)
146149
}
147150

148151
private val viewParams: WindowManager.LayoutParams

call/tuicallkit-kt/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/view/component/incomingbanner/IncomingNotificationBanner.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import com.tencent.qcloud.tuicore.util.TUIBuild
2121
import com.tencent.qcloud.tuikit.tuicallkit.R
2222
import com.tencent.qcloud.tuikit.tuicallkit.common.data.Constants
2323
import com.tencent.qcloud.tuikit.tuicallkit.common.data.Logger
24+
import com.tencent.qcloud.tuikit.tuicallkit.common.metrics.KeyMetrics
2425
import com.tencent.qcloud.tuikit.tuicallkit.manager.feature.NotificationFeature
2526
import com.tencent.qcloud.tuikit.tuicallkit.view.CallMainActivity
2627
import io.trtc.tuikit.atomicxcore.api.call.CallMediaType
@@ -58,6 +59,8 @@ class IncomingNotificationBanner(context: Context) {
5859

5960
fun showNotification(participant: CallParticipantInfo) {
6061
Logger.i(TAG, "showNotification, user: $participant")
62+
val callId = CallStore.shared.observerState.activeCall.value.callId
63+
KeyMetrics.countUV(KeyMetrics.EventId.WAKEUP, callId)
6164
registerObserver()
6265
notification = createNotification()
6366

0 commit comments

Comments
 (0)