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+ }
0 commit comments