[PM-29673] feat: Improved pre-polutated data on the FlightRecorder logs (#6616)

This commit is contained in:
aj-rosado
2026-03-11 14:36:43 +00:00
committed by GitHub
parent 44f5f614b6
commit 417a14fca2
6 changed files with 31 additions and 22 deletions

View File

@@ -7,8 +7,8 @@ import com.bitwarden.core.data.manager.BuildInfoManager
import com.bitwarden.data.datasource.disk.model.FlightRecorderDataSet
import com.bitwarden.data.repository.ServerConfigRepository
import com.bitwarden.data.repository.util.baseWebVaultUrlOrDefault
import com.bitwarden.core.data.manager.util.deviceData
import com.bitwarden.ui.platform.base.BaseViewModel
import com.bitwarden.ui.platform.manager.util.deviceData
import com.bitwarden.ui.util.Text
import com.bitwarden.ui.util.asText
import com.bitwarden.ui.util.concat

View File

@@ -6,9 +6,9 @@ import com.bitwarden.core.data.manager.BuildInfoManager
import com.bitwarden.data.datasource.disk.model.FlightRecorderDataSet
import com.bitwarden.data.datasource.disk.model.ServerConfig
import com.bitwarden.data.repository.ServerConfigRepository
import com.bitwarden.core.data.manager.util.deviceData
import com.bitwarden.data.repository.util.baseWebVaultUrlOrDefault
import com.bitwarden.ui.platform.base.BaseViewModelTest
import com.bitwarden.ui.platform.manager.util.deviceData
import com.bitwarden.ui.util.asText
import com.bitwarden.ui.util.concat
import com.x8bit.bitwarden.data.platform.manager.LogsManager

View File

@@ -1,6 +1,6 @@
@file:OmitFromCoverage
package com.bitwarden.ui.platform.manager.util
package com.bitwarden.core.data.manager.util
import android.os.Build
import com.bitwarden.annotation.OmitFromCoverage

View File

@@ -17,6 +17,7 @@ import com.bitwarden.data.manager.flightrecorder.FlightRecorderManager
import com.bitwarden.data.manager.flightrecorder.FlightRecorderManagerImpl
import com.bitwarden.data.manager.flightrecorder.FlightRecorderWriter
import com.bitwarden.data.manager.flightrecorder.FlightRecorderWriterImpl
import com.bitwarden.data.repository.ServerConfigRepository
import com.bitwarden.network.service.DownloadService
import dagger.Module
import dagger.Provides
@@ -80,11 +81,13 @@ object DataManagerModule {
fileManager: FileManager,
dispatcherManager: DispatcherManager,
buildInfoManager: BuildInfoManager,
serverConfigRepository: ServerConfigRepository,
): FlightRecorderWriter = FlightRecorderWriterImpl(
clock = clock,
fileManager = fileManager,
dispatcherManager = dispatcherManager,
buildInfoManager = buildInfoManager,
serverConfigRepository = serverConfigRepository,
)
@Provides

View File

@@ -5,9 +5,11 @@ import android.util.Log
import com.bitwarden.annotation.OmitFromCoverage
import com.bitwarden.core.data.manager.BuildInfoManager
import com.bitwarden.core.data.manager.dispatcher.DispatcherManager
import com.bitwarden.core.data.manager.util.deviceData
import com.bitwarden.core.data.util.toFormattedPattern
import com.bitwarden.data.datasource.disk.model.FlightRecorderDataSet
import com.bitwarden.data.manager.file.FileManager
import com.bitwarden.data.repository.ServerConfigRepository
import kotlinx.coroutines.withContext
import timber.log.Timber
import java.io.BufferedWriter
@@ -30,6 +32,7 @@ internal class FlightRecorderWriterImpl(
private val fileManager: FileManager,
private val dispatcherManager: DispatcherManager,
private val buildInfoManager: BuildInfoManager,
private val serverConfigRepository: ServerConfigRepository,
) : FlightRecorderWriter {
override suspend fun deleteLog(data: FlightRecorderDataSet.FlightRecorderData) {
fileManager.delete(File(File(fileManager.logsDirectory), data.fileName))
@@ -53,28 +56,31 @@ internal class FlightRecorderWriterImpl(
val logFile = File(logFolder, data.fileName)
if (!logFile.exists()) {
logFile.createNewFile()
val ciInfo = buildInfoManager.ciBuildInfo?.takeIf { it.isNotBlank() }
val serverData = serverConfigRepository.serverConfigStateFlow.value?.serverData
val serverInfo = StringBuilder()
.append(serverData?.server?.name ?: "Bitwarden Cloud")
.apply {
serverData?.version?.let { append(" $it") }
serverData?.environment?.cloudRegion?.let { append(" @ $it") }
}
.toString()
val startTime = Instant
.ofEpochMilli(data.startTimeMs)
.toFormattedPattern(pattern = LOG_TIME_PATTERN, clock = clock)
val operatingSystem = "${Build.VERSION.RELEASE} (${Build.VERSION.SDK_INT})"
// Upon creating the new file, we pre-populate it with basic data
BufferedWriter(FileWriter(logFile, true)).use { bw ->
bw.append("Bitwarden Android - ${buildInfoManager.applicationName}")
bw.newLine()
bw.append("Log Start Time: $startTime")
bw.newLine()
bw.append("Log Duration: ${data.durationMs.milliseconds}")
bw.newLine()
bw.append("App Version: ${buildInfoManager.versionData}")
bw.newLine()
bw.append("Build: ${buildInfoManager.buildAndFlavor}")
bw.newLine()
bw.append("Operating System: $operatingSystem")
bw.newLine()
bw.append("Device: ${Build.BRAND} ${Build.MODEL}")
bw.newLine()
bw.append("Fingerprint: ${Build.FINGERPRINT}")
bw.newLine()
bw.appendLine("Bitwarden Android - ${buildInfoManager.applicationName}")
bw.appendLine("Log Start Time: $startTime")
bw.appendLine("Log Duration: ${data.durationMs.milliseconds}")
bw.appendLine("App Version: ${buildInfoManager.versionData}")
bw.appendLine("Build: ${buildInfoManager.buildAndFlavor}")
bw.appendLine("SDK Version: \uD83E\uDD80 ${buildInfoManager.sdkData}")
ciInfo.let { bw.appendLine("CI Build Info: $it") }
bw.appendLine("Device: ${buildInfoManager.deviceData}")
bw.appendLine("\uD83C\uDF29 Server: $serverInfo")
bw.appendLine("Fingerprint: ${Build.FINGERPRINT}")
}
}
logFile

View File

@@ -26,10 +26,10 @@ import androidx.credentials.CredentialManager
import com.bitwarden.annotation.OmitFromCoverage
import com.bitwarden.core.data.manager.BuildInfoManager
import com.bitwarden.core.data.util.toFormattedPattern
import com.bitwarden.core.data.manager.util.deviceData
import com.bitwarden.core.data.manager.util.fileProviderAuthority
import com.bitwarden.core.util.isBuildVersionAtLeast
import com.bitwarden.ui.platform.manager.intent.model.AuthTabData
import com.bitwarden.ui.platform.manager.util.deviceData
import com.bitwarden.ui.platform.manager.util.fileProviderAuthority
import com.bitwarden.ui.platform.model.FileData
import com.bitwarden.ui.platform.resource.BitwardenString
import com.bitwarden.ui.platform.util.getLocalFileData