Skip to content

Commit 2ab6abe

Browse files
committed
This commit introduces a mandatory disclaimer dialog that appears when a user saves a new Bluetooth scale. The dialog informs the user that openScale is an open-source project and that compatibility with all scales cannot be guaranteed.
1 parent 82b49ee commit 2ab6abe

3 files changed

Lines changed: 92 additions & 11 deletions

File tree

android_app/app/src/main/java/com/health/openscale/ui/screen/settings/BluetoothScreen.kt

Lines changed: 84 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import android.app.Activity
2222
import android.bluetooth.BluetoothAdapter
2323
import android.content.Intent
2424
import android.content.pm.PackageManager
25+
import android.net.Uri
2526
import androidx.activity.compose.rememberLauncherForActivityResult
2627
import androidx.activity.result.contract.ActivityResultContracts
2728
import androidx.compose.foundation.layout.Arrangement
@@ -31,6 +32,7 @@ import androidx.compose.foundation.layout.Row
3132
import androidx.compose.foundation.layout.Spacer
3233
import androidx.compose.foundation.layout.fillMaxSize
3334
import androidx.compose.foundation.layout.fillMaxWidth
35+
import androidx.compose.foundation.layout.height
3436
import androidx.compose.foundation.layout.padding
3537
import androidx.compose.foundation.layout.size
3638
import androidx.compose.foundation.layout.width
@@ -41,10 +43,12 @@ import androidx.compose.material.icons.automirrored.filled.BluetoothSearching
4143
import androidx.compose.material.icons.filled.BluetoothDisabled
4244
import androidx.compose.material.icons.filled.CheckCircle
4345
import androidx.compose.material.icons.filled.ErrorOutline
46+
import androidx.compose.material.icons.filled.Info
4447
import androidx.compose.material.icons.filled.MoreVert
4548
import androidx.compose.material.icons.filled.Search
4649
import androidx.compose.material.icons.filled.Star
4750
import androidx.compose.material.icons.filled.Warning
51+
import androidx.compose.material3.AlertDialog
4852
import androidx.compose.material3.Button
4953
import androidx.compose.material3.ButtonDefaults
5054
import androidx.compose.material3.Card
@@ -62,6 +66,7 @@ import androidx.compose.material3.MaterialTheme
6266
import androidx.compose.material3.OutlinedCard
6367
import androidx.compose.material3.SnackbarDuration
6468
import androidx.compose.material3.Text
69+
import androidx.compose.material3.TextButton
6570
import androidx.compose.runtime.Composable
6671
import androidx.compose.runtime.DisposableEffect
6772
import androidx.compose.runtime.LaunchedEffect
@@ -79,6 +84,7 @@ import androidx.compose.ui.res.stringResource
7984
import androidx.compose.ui.text.font.FontWeight
8085
import androidx.compose.ui.unit.dp
8186
import androidx.core.content.ContextCompat
87+
import androidx.glance.layout.height
8288
import com.health.openscale.R
8389
import com.health.openscale.core.bluetooth.modern.DeviceCapability
8490
import com.health.openscale.core.bluetooth.modern.DeviceSupport
@@ -87,6 +93,7 @@ import com.health.openscale.core.service.ScannedDeviceInfo
8793
import com.health.openscale.core.utils.LogManager
8894
import com.health.openscale.ui.shared.SharedViewModel
8995
import kotlinx.coroutines.launch
96+
import androidx.core.net.toUri
9097

9198
/**
9299
* Main Bluetooth settings screen.
@@ -123,6 +130,8 @@ fun BluetoothScreen(
123130
var pendingScan by remember { mutableStateOf(false) }
124131
var showSavedMenu by remember { mutableStateOf(false) }
125132
var showTuningMenu by remember { mutableStateOf(false) }
133+
var showCompatibilityDialog by remember { mutableStateOf(false) }
134+
var deviceToSave by remember { mutableStateOf<ScannedDeviceInfo?>(null) }
126135

127136
// Simple flag: a saved name of "Debug" indicates debug mode is active.
128137
val isDebugActive = (savedDevice?.name.orEmpty() == "Debug")
@@ -451,6 +460,30 @@ fun BluetoothScreen(
451460
}
452461
}
453462

463+
464+
if (showCompatibilityDialog) {
465+
CompatibilityAlertDialog(
466+
onConfirm = {
467+
deviceToSave?.let {
468+
bluetoothViewModel.saveDeviceAsPreferred(it)
469+
scope.launch {
470+
sharedViewModel.showSnackbar(
471+
context.getString(
472+
R.string.device_saved_as_preferred,
473+
it.name
474+
),
475+
duration = SnackbarDuration.Short
476+
)
477+
}
478+
}
479+
},
480+
onDismiss = {
481+
showCompatibilityDialog = false
482+
deviceToSave = null
483+
}
484+
)
485+
}
486+
454487
// Combined scan/connection error presentation
455488
if (hasPermissions && btEnabled) {
456489
val errorToShow = connectionError ?: scanError
@@ -476,18 +509,9 @@ fun BluetoothScreen(
476509
deviceInfo = device,
477510
savedAddress = savedDevice?.address,
478511
onSavePreferred = {
479-
bluetoothViewModel.requestStopDeviceScan()
480512
if (device.isSupported) {
481-
bluetoothViewModel.saveDeviceAsPreferred(device)
482-
scope.launch {
483-
sharedViewModel.showSnackbar(
484-
context.getString(
485-
R.string.device_saved_as_preferred,
486-
device.name ?: context.getString(R.string.unknown_device)
487-
),
488-
duration = SnackbarDuration.Short
489-
)
490-
}
513+
deviceToSave = device
514+
showCompatibilityDialog = true
491515
} else {
492516
scope.launch {
493517
sharedViewModel.showSnackbar(
@@ -598,6 +622,55 @@ private fun DebugBanner() {
598622
}
599623
}
600624

625+
/**
626+
* Shows a disclaimer dialog before saving a device.
627+
* The user must acknowledge the disclaimer to proceed with saving.
628+
*/
629+
@Composable
630+
private fun CompatibilityAlertDialog(
631+
onConfirm: () -> Unit,
632+
onDismiss: () -> Unit
633+
) {
634+
val context = LocalContext.current
635+
val projectUrl = "https://github.com/oliexdev/openScale/"
636+
637+
AlertDialog(
638+
onDismissRequest = onDismiss,
639+
icon = { Icon(Icons.Default.Info, contentDescription = null) },
640+
title = { Text(stringResource(R.string.compatibility_dialog_title)) },
641+
text = {
642+
Column {
643+
Text(stringResource(R.string.bluetooth_compatibility_disclaimer))
644+
Spacer(Modifier.height(16.dp))
645+
TextButton(
646+
onClick = {
647+
val intent = Intent(Intent.ACTION_VIEW, projectUrl.toUri())
648+
context.startActivity(intent)
649+
},
650+
modifier = Modifier.align(Alignment.End)
651+
) {
652+
Text(stringResource(id = R.string.go_to_project_website_button))
653+
}
654+
}
655+
},
656+
confirmButton = {
657+
TextButton(
658+
onClick = {
659+
onConfirm()
660+
onDismiss()
661+
}
662+
) {
663+
Text(stringResource(R.string.compatibility_dialog_confirm_button))
664+
}
665+
},
666+
dismissButton = {
667+
TextButton(onClick = onDismiss) {
668+
Text(stringResource(R.string.cancel_button))
669+
}
670+
}
671+
)
672+
}
673+
601674
/**
602675
* Compact, icon-only capability row:
603676
* - Implemented features: normal tint (onSurface)

android_app/app/src/main/res/values-de/strings.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -346,6 +346,10 @@
346346
<string name="bluetooth_disabled_message_enable_for_scan">Bitte aktivieren Sie Bluetooth, um nach Waagen zu suchen.</string>
347347
<string name="enable_bluetooth_button">Bluetooth aktivieren</string>
348348
<string name="error_icon_desc">Fehlersymbol</string>
349+
<string name="compatibility_dialog_title">Wichtiger Hinweis</string>
350+
<string name="bluetooth_compatibility_disclaimer">openScale ist ein Open-Source-Projekt und ich besitze nicht jede Waage selbst. Bitte beachten Sie, dass die Kompatibilität nicht in allen Fällen garantiert werden kann, da sich Bluetooth-Protokolle ändern oder unbekannt sein können.\n\nAls Open-Source-Projekt sind Beiträge und Pull-Requests zur Verbesserung der Waagen-Unterstützung sehr willkommen!</string>
351+
<string name="compatibility_dialog_confirm_button">Verstanden &amp; Speichern</string>
352+
<string name="go_to_project_website_button">Zur Projekt-Webseite</string>
349353

350354
<!-- LegacyScaleAdapter (Bluetooth-Treiber) -->
351355
<string name="legacy_adapter_event_initializing">Initialisierungsprozess...</string>

android_app/app/src/main/res/values/strings.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -349,6 +349,10 @@
349349
<string name="bluetooth_disabled_message_enable_for_scan">Please enable Bluetooth to search for scales.</string>
350350
<string name="enable_bluetooth_button">Enable Bluetooth</string>
351351
<string name="error_icon_desc">Error icon</string>
352+
<string name="compatibility_dialog_title">Important Notice</string>
353+
<string name="bluetooth_compatibility_disclaimer">openScale is an open-source project, and I don\'t own every scale. Please note that compatibility cannot be guaranteed in all cases, as Bluetooth protocols may change or be undocumented.\n\nAs an open-source project, pull requests and contributions to improve scale support are very welcome!</string>
354+
<string name="compatibility_dialog_confirm_button">Acknowledge &amp; Save</string>
355+
<string name="go_to_project_website_button">Go to Project Website</string>
352356

353357
<!-- LegacyScaleAdapter (Bluetooth Driver) -->
354358
<string name="legacy_adapter_event_initializing">Initialization process...</string>

0 commit comments

Comments
 (0)