From 82924099dbc92655fd38b55ae1708fa352cac83e Mon Sep 17 00:00:00 2001 From: Shannon Rodricks Date: Sun, 24 Sep 2023 13:49:15 +0530 Subject: [PATCH 1/2] Added support for logging ExceptionModel. Updated version code to 30 --- build.gradle | 2 +- .../clientlib/permission/PermissionManager.kt | 8 +- .../permission/PermissionManagerImpl.kt | 16 +++- .../clientlib/transmission/Transmitter.kt | 14 ++- .../clientlib/transmission/TransmitterImpl.kt | 88 +++++++++++++++---- 5 files changed, 108 insertions(+), 20 deletions(-) diff --git a/build.gradle b/build.gradle index cee0925..22fc0ed 100644 --- a/build.gradle +++ b/build.gradle @@ -2,7 +2,7 @@ buildscript { ext { kotlin_version = '1.8.22' - versionName = '0.0.29' + versionName = '0.0.30' } repositories { diff --git a/lib/src/main/java/com/evdayapps/madassistant/clientlib/permission/PermissionManager.kt b/lib/src/main/java/com/evdayapps/madassistant/clientlib/permission/PermissionManager.kt index acfcc3a..143ffd2 100644 --- a/lib/src/main/java/com/evdayapps/madassistant/clientlib/permission/PermissionManager.kt +++ b/lib/src/main/java/com/evdayapps/madassistant/clientlib/permission/PermissionManager.kt @@ -1,5 +1,6 @@ package com.evdayapps.madassistant.clientlib.permission +import com.evdayapps.madassistant.common.models.exceptions.ExceptionModel import com.evdayapps.madassistant.common.models.networkcalls.NetworkCallLogModel /** @@ -60,7 +61,12 @@ interface PermissionManager { /** * Test if [throwable] should be logged to the repository */ - fun shouldLogExceptions(throwable: Throwable): Boolean + fun shouldLogException(throwable: Throwable): Boolean + + /** + * Test if [exception] should be logged to the repository + */ + fun shouldLogException(exception: ExceptionModel): Boolean // endregion Crash Logs // region Analytics diff --git a/lib/src/main/java/com/evdayapps/madassistant/clientlib/permission/PermissionManagerImpl.kt b/lib/src/main/java/com/evdayapps/madassistant/clientlib/permission/PermissionManagerImpl.kt index 34b4d2e..9895600 100644 --- a/lib/src/main/java/com/evdayapps/madassistant/clientlib/permission/PermissionManagerImpl.kt +++ b/lib/src/main/java/com/evdayapps/madassistant/clientlib/permission/PermissionManagerImpl.kt @@ -4,6 +4,7 @@ import android.util.Log import com.evdayapps.madassistant.clientlib.utils.Logger import com.evdayapps.madassistant.clientlib.utils.matches import com.evdayapps.madassistant.common.cipher.MADAssistantCipher +import com.evdayapps.madassistant.common.models.exceptions.ExceptionModel import com.evdayapps.madassistant.common.models.networkcalls.NetworkCallLogModel import com.evdayapps.madassistant.common.models.permissions.MADAssistantPermissions import org.json.JSONException @@ -154,7 +155,7 @@ class PermissionManagerImpl( /** * Test if [throwable] should be logged to the repository */ - override fun shouldLogExceptions(throwable: Throwable): Boolean { + override fun shouldLogException(throwable: Throwable): Boolean { if (!isLoggingEnabled() || (permissions?.exceptions?.enabled != true)) { return false } @@ -165,6 +166,19 @@ class PermissionManagerImpl( return chkType && chkMessage } + override fun shouldLogException(exception: ExceptionModel): Boolean { + if (!isLoggingEnabled() || (permissions?.exceptions?.enabled != true)) { + return false + } + + val chkType = + patternExceptionsType?.matches(exception.stackTrace.firstOrNull()?.className) ?: true + val chkMessage = patternExceptionsMessage?.matches(exception.message) ?: true + + return chkType && chkMessage + } + + // region Analytics override fun shouldLogAnalytics( destination: String, diff --git a/lib/src/main/java/com/evdayapps/madassistant/clientlib/transmission/Transmitter.kt b/lib/src/main/java/com/evdayapps/madassistant/clientlib/transmission/Transmitter.kt index 5df21ba..9b25ce3 100644 --- a/lib/src/main/java/com/evdayapps/madassistant/clientlib/transmission/Transmitter.kt +++ b/lib/src/main/java/com/evdayapps/madassistant/clientlib/transmission/Transmitter.kt @@ -1,5 +1,6 @@ package com.evdayapps.madassistant.clientlib.transmission +import com.evdayapps.madassistant.common.models.exceptions.ExceptionModel import com.evdayapps.madassistant.common.models.networkcalls.NetworkCallLogModel /** @@ -45,7 +46,9 @@ interface Transmitter { fun hasActiveSession(): Boolean /** - * Disconnect from the repository. This method should be called instead of [ConnectionManager.disconnect] because it ensures processing of the log queue + * Disconnect from the repository. + * + * This method should be called instead of [ConnectionManager.disconnect] because it ensures processing of the log queue */ fun disconnect(code: Int, message: String) @@ -72,6 +75,15 @@ interface Transmitter { data: Map? = null ) + /** + * Log an exception model (non-fatal) in the repository + * + * Required when dealing with exceptions that come from incompatible sources, like Flutter + */ + fun logException( + exception: ExceptionModel + ) + /** * Log a generic log in the repository */ diff --git a/lib/src/main/java/com/evdayapps/madassistant/clientlib/transmission/TransmitterImpl.kt b/lib/src/main/java/com/evdayapps/madassistant/clientlib/transmission/TransmitterImpl.kt index a414c27..e1817c3 100644 --- a/lib/src/main/java/com/evdayapps/madassistant/clientlib/transmission/TransmitterImpl.kt +++ b/lib/src/main/java/com/evdayapps/madassistant/clientlib/transmission/TransmitterImpl.kt @@ -247,6 +247,12 @@ class TransmitterImpl( sessionId = sessionId, first = data ) + } else { + logger?.w( + tag = TAG, + message = "No session initiated, unable to log network call.\n" + + "Please initiate a session first using startSession()", + ) } } @@ -315,6 +321,12 @@ class TransmitterImpl( fourth = data ) ) + } else { + logger?.w( + tag = TAG, + message = "No session initiated, unable to log crash.\n" + + "Please initiate a session first using startSession()", + ) } } @@ -335,6 +347,32 @@ class TransmitterImpl( third = message, fourth = data ) + } else { + logger?.w( + tag = TAG, + message = "No session initiated, unable to log exception.\n" + + "Please initiate a session first using startSession()", + ) + } + } + + /** + * Log an exception model (non-fatal) in the repository + * Required when dealing with exceptions that come from incompatible sources, like Flutter + */ + override fun logException(exception: ExceptionModel) { + if (sessionId != -1L) { + queueManager.addMessageToQueue( + type = MADAssistantTransmissionType.Exception, + sessionId = sessionId, + first = exception, + ) + } else { + logger?.w( + tag = TAG, + message = "No session initiated, unable to log exception.\n" + + "Please initiate a session first using startSession()", + ) } } @@ -343,23 +381,41 @@ class TransmitterImpl( */ private fun _processException(messageData: MessageData) { try { - val throwable: Throwable = messageData.first as Throwable - if (permissionManager.shouldLogExceptions(throwable)) { - val json = ExceptionModel( - threadName = messageData.threadName, - throwable = throwable, - isCrash = messageData.second as Boolean, - message = messageData.third?.run { this as String }, - data = messageData.fourth?.run { JSONObject(this as Map) } - ).toJsonObject().toString(0) + val value = messageData.first + when (val input = messageData.first) { + is ExceptionModel -> { + if (permissionManager.shouldLogException(input)) { + val json = input.toJsonObject().toString(0) + + transmit( + json = json, + type = MADAssistantTransmissionType.Exception, + sessionId = messageData.sessionId, + timestamp = messageData.timestamp, + encrypt = permissionManager.shouldEncryptLogs() + ) + } + } - transmit( - json = json, - type = MADAssistantTransmissionType.Exception, - sessionId = messageData.sessionId, - timestamp = messageData.timestamp, - encrypt = permissionManager.shouldEncryptLogs() - ) + is Throwable -> { + if (permissionManager.shouldLogException(input)) { + val json = ExceptionModel( + threadName = messageData.threadName, + throwable = input, + isCrash = messageData.second as Boolean, + message = messageData.third?.run { this as String }, + data = messageData.fourth?.run { JSONObject(this as Map) } + ).toJsonObject().toString(0) + + transmit( + json = json, + type = MADAssistantTransmissionType.Exception, + sessionId = messageData.sessionId, + timestamp = messageData.timestamp, + encrypt = permissionManager.shouldEncryptLogs() + ) + } + } } } catch (ex: Exception) { logger?.e(ex) From bcb71cf90f8f923009a5ababf09671db23b6eda0 Mon Sep 17 00:00:00 2001 From: Shannon Rodricks Date: Mon, 25 Sep 2023 01:24:05 +0530 Subject: [PATCH 2/2] Added new exception logging method in client. Updated version code to 31 --- build.gradle | 2 +- .../madassistant/clientlib/MADAssistantClient.kt | 8 ++++++++ .../madassistant/clientlib/MADAssistantClientImpl.kt | 8 ++++++++ 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 22fc0ed..26ca0bc 100644 --- a/build.gradle +++ b/build.gradle @@ -2,7 +2,7 @@ buildscript { ext { kotlin_version = '1.8.22' - versionName = '0.0.30' + versionName = '0.0.31' } repositories { diff --git a/lib/src/main/java/com/evdayapps/madassistant/clientlib/MADAssistantClient.kt b/lib/src/main/java/com/evdayapps/madassistant/clientlib/MADAssistantClient.kt index d8ff6f7..74fd859 100644 --- a/lib/src/main/java/com/evdayapps/madassistant/clientlib/MADAssistantClient.kt +++ b/lib/src/main/java/com/evdayapps/madassistant/clientlib/MADAssistantClient.kt @@ -3,6 +3,7 @@ package com.evdayapps.madassistant.clientlib import com.evdayapps.madassistant.clientlib.connection.ConnectionManager import com.evdayapps.madassistant.clientlib.transmission.Transmitter import com.evdayapps.madassistant.clientlib.utils.Logger +import com.evdayapps.madassistant.common.models.exceptions.ExceptionModel import com.evdayapps.madassistant.common.models.networkcalls.NetworkCallLogModel /** @@ -126,4 +127,11 @@ interface MADAssistantClient { message: String? = null, data: Map? = null ) + + /** + * Log an exception in the system + */ + fun logException( + exception: ExceptionModel + ) } \ No newline at end of file diff --git a/lib/src/main/java/com/evdayapps/madassistant/clientlib/MADAssistantClientImpl.kt b/lib/src/main/java/com/evdayapps/madassistant/clientlib/MADAssistantClientImpl.kt index 5eafb9e..d6b84ae 100644 --- a/lib/src/main/java/com/evdayapps/madassistant/clientlib/MADAssistantClientImpl.kt +++ b/lib/src/main/java/com/evdayapps/madassistant/clientlib/MADAssistantClientImpl.kt @@ -9,6 +9,7 @@ import com.evdayapps.madassistant.clientlib.transmission.Transmitter import com.evdayapps.madassistant.clientlib.transmission.TransmitterImpl import com.evdayapps.madassistant.common.cipher.MADAssistantCipher import com.evdayapps.madassistant.common.cipher.MADAssistantCipherImpl +import com.evdayapps.madassistant.common.models.exceptions.ExceptionModel import com.evdayapps.madassistant.common.models.networkcalls.NetworkCallLogModel /** @@ -173,6 +174,13 @@ class MADAssistantClientImpl( message = message, data = data ) + + /** + * Log an exception in the system + */ + override fun logException(exception: ExceptionModel) = + transmitter.logException(exception = exception) + // endregion Logging } \ No newline at end of file