From b64d7a267ec3544acdf98bb70e77fdbbf356170c Mon Sep 17 00:00:00 2001 From: Jorge Martin Espinosa Date: Tue, 5 Mar 2024 17:21:47 +0100 Subject: [PATCH] Add extra params to bug reports (#2490) * Add extra params to bug reports - `local_time`: the time in the device's timezone. - `utc_time`: the time in UTC. - `sdk_sha`: the commit SHA that was used to build the Rust SDK --- ...time-and-sdk-sha-params-to-bugreports.misc | 1 + features/rageshake/impl/build.gradle.kts | 1 + .../impl/reporter/DefaultBugReporter.kt | 9 ++++++ .../impl/reporter/DefaultBugReporterTest.kt | 6 ++-- .../libraries/matrix/api/SdkMetadata.kt | 21 ++++++++++++++ .../libraries/matrix/impl/RustSdkMetadata.kt | 29 +++++++++++++++++++ .../libraries/matrix/test/FakeSdkMetadata.kt | 21 ++++++++++++++ 7 files changed, 86 insertions(+), 2 deletions(-) create mode 100644 changelog.d/+add-time-and-sdk-sha-params-to-bugreports.misc create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/SdkMetadata.kt create mode 100644 libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustSdkMetadata.kt create mode 100644 libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/FakeSdkMetadata.kt diff --git a/changelog.d/+add-time-and-sdk-sha-params-to-bugreports.misc b/changelog.d/+add-time-and-sdk-sha-params-to-bugreports.misc new file mode 100644 index 0000000000..034dc54a05 --- /dev/null +++ b/changelog.d/+add-time-and-sdk-sha-params-to-bugreports.misc @@ -0,0 +1 @@ +Add `local_time`, `utc_time` and `sdk_sha` params to bug reports so they're easier to investigate. diff --git a/features/rageshake/impl/build.gradle.kts b/features/rageshake/impl/build.gradle.kts index f87858ddc2..fdc8e803f7 100644 --- a/features/rageshake/impl/build.gradle.kts +++ b/features/rageshake/impl/build.gradle.kts @@ -46,6 +46,7 @@ dependencies { implementation(projects.libraries.designsystem) implementation(projects.libraries.uiStrings) implementation(projects.libraries.sessionStorage.api) + implementation(projects.libraries.matrix.api) api(libs.squareup.seismic) api(projects.features.rageshake.api) implementation(libs.androidx.datastore.preferences) diff --git a/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/reporter/DefaultBugReporter.kt b/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/reporter/DefaultBugReporter.kt index bd76aa9650..aa0633c273 100755 --- a/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/reporter/DefaultBugReporter.kt +++ b/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/reporter/DefaultBugReporter.kt @@ -36,6 +36,7 @@ import io.element.android.libraries.core.mimetype.MimeTypes import io.element.android.libraries.di.AppScope import io.element.android.libraries.di.ApplicationContext import io.element.android.libraries.di.SingleIn +import io.element.android.libraries.matrix.api.SdkMetadata import io.element.android.libraries.network.useragent.UserAgentProvider import io.element.android.libraries.sessionstorage.api.SessionStore import io.element.android.services.toolbox.api.systemclock.SystemClock @@ -57,6 +58,10 @@ import java.io.File import java.io.IOException import java.io.OutputStreamWriter import java.net.HttpURLConnection +import java.time.Instant +import java.time.LocalDateTime +import java.time.ZoneOffset +import java.time.format.DateTimeFormatter import java.util.Locale import javax.inject.Inject import javax.inject.Provider @@ -78,6 +83,7 @@ class DefaultBugReporter @Inject constructor( private val sessionStore: SessionStore, private val buildMeta: BuildMeta, private val bugReporterUrlProvider: BugReporterUrlProvider, + private val sdkMetadata: SdkMetadata, ) : BugReporter { companion object { // filenames @@ -158,6 +164,9 @@ class DefaultBugReporter @Inject constructor( .addFormDataPart("device_id", deviceId) .addFormDataPart("device", Build.MODEL.trim()) .addFormDataPart("locale", Locale.getDefault().toString()) + .addFormDataPart("sdk_sha", sdkMetadata.sdkGitSha) + .addFormDataPart("local_time", LocalDateTime.now().format(DateTimeFormatter.ISO_DATE_TIME)) + .addFormDataPart("utc_time", LocalDateTime.ofInstant(Instant.now(), ZoneOffset.UTC).format(DateTimeFormatter.ISO_DATE_TIME)) currentTracingFilter?.let { builder.addFormDataPart("tracing_filter", it) } diff --git a/features/rageshake/impl/src/test/kotlin/io/element/android/features/rageshake/impl/reporter/DefaultBugReporterTest.kt b/features/rageshake/impl/src/test/kotlin/io/element/android/features/rageshake/impl/reporter/DefaultBugReporterTest.kt index 91b5c016da..14c01c5dc8 100755 --- a/features/rageshake/impl/src/test/kotlin/io/element/android/features/rageshake/impl/reporter/DefaultBugReporterTest.kt +++ b/features/rageshake/impl/src/test/kotlin/io/element/android/features/rageshake/impl/reporter/DefaultBugReporterTest.kt @@ -20,6 +20,7 @@ import com.google.common.truth.Truth.assertThat import io.element.android.features.rageshake.api.reporter.BugReporterListener import io.element.android.features.rageshake.test.crash.FakeCrashDataStore import io.element.android.features.rageshake.test.screenshot.FakeScreenshotHolder +import io.element.android.libraries.matrix.test.FakeSdkMetadata import io.element.android.libraries.matrix.test.core.aBuildMeta import io.element.android.libraries.network.useragent.DefaultUserAgentProvider import io.element.android.libraries.sessionstorage.impl.memory.InMemorySessionStore @@ -150,11 +151,12 @@ class DefaultBugReporterTest { userAgentProvider = DefaultUserAgentProvider(buildMeta), sessionStore = InMemorySessionStore(), buildMeta = buildMeta, - bugReporterUrlProvider = { server.url("/") } + bugReporterUrlProvider = { server.url("/") }, + sdkMetadata = FakeSdkMetadata("123456789"), ) } companion object { - private const val EXPECTED_NUMBER_OF_PROGRESS_VALUE = 12 + private const val EXPECTED_NUMBER_OF_PROGRESS_VALUE = 15 } } diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/SdkMetadata.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/SdkMetadata.kt new file mode 100644 index 0000000000..ef193ff9c5 --- /dev/null +++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/SdkMetadata.kt @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2024 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.element.android.libraries.matrix.api + +interface SdkMetadata { + val sdkGitSha: String +} diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustSdkMetadata.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustSdkMetadata.kt new file mode 100644 index 0000000000..6e5c1150c9 --- /dev/null +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustSdkMetadata.kt @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2024 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.element.android.libraries.matrix.impl + +import com.squareup.anvil.annotations.ContributesBinding +import io.element.android.libraries.di.AppScope +import io.element.android.libraries.matrix.api.SdkMetadata +import org.matrix.rustcomponents.sdk.sdkGitSha +import javax.inject.Inject + +@ContributesBinding(AppScope::class) +class RustSdkMetadata @Inject constructor() : SdkMetadata { + override val sdkGitSha: String + get() = sdkGitSha() +} diff --git a/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/FakeSdkMetadata.kt b/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/FakeSdkMetadata.kt new file mode 100644 index 0000000000..90f855de81 --- /dev/null +++ b/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/FakeSdkMetadata.kt @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2024 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.element.android.libraries.matrix.test + +import io.element.android.libraries.matrix.api.SdkMetadata + +class FakeSdkMetadata(override val sdkGitSha: String) : SdkMetadata