fix(app): standardize branding and disable telemetry

This commit is contained in:
2026-07-15 23:30:13 +02:00
parent d2d3c45180
commit e40a4bfee2
12 changed files with 92 additions and 30 deletions

View File

@@ -18,13 +18,14 @@ class DiagnosticsCoordinator(
val crashReporter: CrashReporter,
val bugReports: BugReportService,
private val scope: CoroutineScope,
private val included: Boolean = DiagnosticsBuildConfig.INCLUDED,
) {
fun start() {
// Install id is useful for bug-report correlation even without telemetry.
scope.launch {
preferencesRepository.ensureDiagnosticsInstallId()
}
if (!DiagnosticsBuildConfig.INCLUDED) return
if (!included) return
crashReporter.startObservingPreferences()
crashReporter.installUnhandledExceptionHandler()
scope.launch {
@@ -33,7 +34,7 @@ class DiagnosticsCoordinator(
}
fun record(name: String, properties: Map<String, String> = emptyMap()) {
if (!DiagnosticsBuildConfig.INCLUDED) return
if (!included) return
telemetry.record(name, properties)
}
@@ -45,6 +46,7 @@ class DiagnosticsCoordinator(
preferencesRepository: PreferencesRepository,
scope: CoroutineScope,
transport: DiagnosticsTransport = NoOpDiagnosticsTransport(),
included: Boolean = DiagnosticsBuildConfig.INCLUDED,
): DiagnosticsCoordinator {
val breadcrumbs = BreadcrumbBuffer()
val crashStore = createPendingCrashStore(appDataDir)
@@ -53,6 +55,7 @@ class DiagnosticsCoordinator(
transport = transport,
breadcrumbs = breadcrumbs,
scope = scope,
included = included,
)
val crashReporter = CrashReporter(
store = crashStore,
@@ -78,6 +81,7 @@ class DiagnosticsCoordinator(
crashReporter = crashReporter,
bugReports = bugReports,
scope = scope,
included = included,
)
}
}

View File

@@ -119,6 +119,7 @@ fun createDiagnosticsTransport(
platform: String,
installIdProvider: suspend () -> String,
): DiagnosticsTransport = buildDiagnosticsTransport(
included = DiagnosticsBuildConfig.INCLUDED,
endpoint = DiagnosticsBuildConfig.ENDPOINT,
ingestKey = DiagnosticsBuildConfig.INGEST_KEY,
appVersion = appVersion,
@@ -127,12 +128,14 @@ fun createDiagnosticsTransport(
)
internal fun buildDiagnosticsTransport(
included: Boolean = true,
endpoint: String,
ingestKey: String,
appVersion: String,
platform: String,
installIdProvider: suspend () -> String,
): DiagnosticsTransport {
if (!included) return NoOpDiagnosticsTransport()
val normalizedEndpoint = endpoint.trim()
val normalizedIngestKey = ingestKey.trim()
if (normalizedEndpoint.isEmpty() && normalizedIngestKey.isEmpty()) return NoOpDiagnosticsTransport()

View File

@@ -31,6 +31,7 @@ class TelemetryRecorder(
private val flushIntervalMillis: Long = DefaultFlushIntervalMillis,
private val retryBackoffMillis: Long = DefaultRetryBackoffMillis,
private val automaticRetryCount: Int = DefaultAutomaticRetryCount,
private val included: Boolean = true,
) {
private val bufferMutex = Mutex()
private val state = AtomicReference(TelemetryState())
@@ -42,22 +43,24 @@ class TelemetryRecorder(
require(flushIntervalMillis > 0) { "flushIntervalMillis must be positive" }
require(retryBackoffMillis > 0) { "retryBackoffMillis must be positive" }
require(automaticRetryCount >= 0) { "automaticRetryCount must not be negative" }
scope.launch {
preferencesRepository.preferences
.map { it.diagnosticsEnabled }
.distinctUntilChanged()
.collect { isEnabled ->
updateState { current ->
if (isEnabled) current.copy(enabled = true) else TelemetryState(enabled = false)
if (included) {
scope.launch {
preferencesRepository.preferences
.map { it.diagnosticsEnabled }
.distinctUntilChanged()
.collect { isEnabled ->
updateState { current ->
if (isEnabled) current.copy(enabled = true) else TelemetryState(enabled = false)
}
flushSignals.trySend(Unit)
}
flushSignals.trySend(Unit)
}
}
scope.launch { runAutomaticFlushes() }
}
scope.launch { runAutomaticFlushes() }
}
fun record(name: String, properties: Map<String, String> = emptyMap()) {
if (!DiagnosticsBuildConfig.INCLUDED) return
if (!included) return
val sanitizedName = sanitizeDiagnosticName(name)
if (sanitizedName.isBlank()) return
val sanitizedProperties = sanitizeDiagnosticProperties(properties)

View File

@@ -88,6 +88,7 @@ class SettingsViewModel(
private val messages: UiMessageController,
private val bugReports: BugReportService,
private val diagnostics: DiagnosticsCoordinator? = null,
private val diagnosticsIncluded: Boolean = DiagnosticsBuildConfig.INCLUDED,
) : ViewModel() {
private val _state = MutableStateFlow(
SettingsState(
@@ -200,7 +201,7 @@ class SettingsViewModel(
}
fun setDiagnosticsEnabled(enabled: Boolean) {
if (!DiagnosticsBuildConfig.INCLUDED) return
if (!diagnosticsIncluded) return
viewModelScope.launch {
preferencesRepository.setDiagnosticsEnabled(enabled)
diagnostics?.record(