From 0ada07a2c4a8a31839a40422e4b9d94519092097 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=B8=D1=85=D0=B0=D0=B9=D0=BB=D0=BE?= <5080736+yzheka@users.noreply.github.com> Date: Tue, 10 Feb 2026 15:18:45 +0200 Subject: [PATCH] Refactor getUserAgent method and improve logging On some devices WebView(context).settings.userAgentString can throw NullPointerException, preventing for fallback to System.getProperty("http.agent"). With this, if webview fails, system property will be fetched. If system property fetch fails too then no user-agent header will be added, letting system to decide --- .../java/com/dev/openpanelsdk/OpenPanel.kt | 32 +++++++++---------- 1 file changed, 15 insertions(+), 17 deletions(-) diff --git a/OpenPanelSDK/src/main/java/com/dev/openpanelsdk/OpenPanel.kt b/OpenPanelSDK/src/main/java/com/dev/openpanelsdk/OpenPanel.kt index de0d8ad..8daa784 100644 --- a/OpenPanelSDK/src/main/java/com/dev/openpanelsdk/OpenPanel.kt +++ b/OpenPanelSDK/src/main/java/com/dev/openpanelsdk/OpenPanel.kt @@ -53,23 +53,20 @@ class OpenPanel(private val context: Context, private val options: Options) { } } - private fun getUserAgent(): String { - return try { - WebView(context).settings.userAgentString - ?: (System.getProperty("http.agent")?.toString() ?: "") - }catch (_:Exception){ - "" - } - } + private fun getUserAgent(): String? = runCatching { + WebView(context).settings.userAgentString + }.getOrNull() ?: runCatching { + System.getProperty("http.agent") + }.getOrNull() init { val defaultHeaders = mutableMapOf( "openpanel-client-id" to options.clientId, "openpanel-sdk-name" to "kotlin", - "openpanel-sdk-version" to sdkVersion, - "user-agent" to getUserAgent() + "openpanel-sdk-version" to sdkVersion ) + getUserAgent()?.let { defaultHeaders["user-agent"] = it } // Fetch system information mSystemInformation = SystemInformation.getInstance(context) @@ -157,7 +154,8 @@ class OpenPanel(private val context: Context, private val options: Options) { flush() val mergedTraits = (globalProperties.toMap() + (traits ?: emptyMap())).toMutableMap() - send(IdentifyPayload( + send( + IdentifyPayload( profileId = profileId, firstName = mergedTraits["firstName"] as? String, lastName = mergedTraits["lastName"] as? String, @@ -199,15 +197,15 @@ class OpenPanel(private val context: Context, private val options: Options) { private fun getDefaultEventProperties(): Map { val ret = mutableMapOf() - + ret["__osVersion"] = Build.VERSION.RELEASE ret["__brand"] = Build.BRAND ret["__model"] = Build.MODEL val displayMetrics = mSystemInformation?.displayMetrics - ret["__screenDpi"] = displayMetrics?.densityDpi ?: null - ret["__screenHeight"] = displayMetrics?.heightPixels ?: null - ret["__screenWidth"] = displayMetrics?.widthPixels ?: null + displayMetrics?.densityDpi?.let { ret["__screenDpi"] = it } + displayMetrics?.heightPixels?.let { ret["__screenHeight"] = it } + displayMetrics?.widthPixels?.let { ret["__screenWidth"] = it } val applicationVersionName = mSystemInformation?.appVersionName if (applicationVersionName != null) { @@ -383,7 +381,7 @@ class Api(private val config: Config) { private fun logVerbose(message: String) { if (config.verbose) { - Log.d("OpenPanel","OpenPanel: $message") + Log.d("OpenPanel", "OpenPanel: $message") } } @@ -418,7 +416,7 @@ class Api(private val config: Config) { connection.doOutput = true connection.outputStream.use { it.write(data.toString().toByteArray()) } - logVerbose("Sending data: ${data.toString()}") + logVerbose("Sending data: $data") val responseCode = connection.responseCode logVerbose("Response code: $responseCode")