UI Previews

UI Previews was added for service dialogs
This commit is contained in:
2024-01-02 20:25:49 +07:00
parent 70cd547fb7
commit 77a3b19b24
6 changed files with 92 additions and 11 deletions

View File

@@ -15,7 +15,7 @@ import androidx.lifecycle.viewmodel.compose.viewModel
import androidx.navigation.compose.NavHost import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable import androidx.navigation.compose.composable
import androidx.navigation.compose.rememberNavController import androidx.navigation.compose.rememberNavController
import com.helible.pilot.components.scannerScreen.BluetoothScannerScreen import com.helible.pilot.components.scannerScreen.ScannerScreen
import com.helible.pilot.components.deviceScreen.DeviceControlScreen import com.helible.pilot.components.deviceScreen.DeviceControlScreen
import com.helible.pilot.viewmodels.AppPreferences import com.helible.pilot.viewmodels.AppPreferences
import com.helible.pilot.viewmodels.SavedPreferencesImpl import com.helible.pilot.viewmodels.SavedPreferencesImpl
@@ -101,7 +101,7 @@ class MainActivity : ComponentActivity() {
startDestination = "device" startDestination = "device"
) { ) {
composable("scanner") { composable("scanner") {
BluetoothScannerScreen( ScannerScreen(
bluetoothState = bluetoothState, bluetoothState = bluetoothState,
selectedDevice = selectedDevice, selectedDevice = selectedDevice,
startScan = { bluetoothViewModel.startScan() }, startScan = { bluetoothViewModel.startScan() },

View File

@@ -6,8 +6,8 @@ import androidx.compose.material3.Divider
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.material3.TextButton import androidx.compose.material3.TextButton
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.MutableState
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.tooling.preview.Preview
@Composable @Composable
fun RequiredHardwareFeatures( fun RequiredHardwareFeatures(
@@ -36,3 +36,16 @@ fun RequiredHardwareFeatures(
) )
} }
} }
@Preview
@Composable
fun RequiredHardwareFeaturesPreview() {
RequiredHardwareFeatures(
title = "Turn on Bluetooth",
description = "App requires Bluetooth turned on to continue",
confirmButtonText = "Turn on",
featureState = false,
requestFeature = {},
onDismissRequest = {}
)
}

View File

@@ -13,6 +13,7 @@ import androidx.compose.material3.Divider
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
@Composable @Composable
@@ -82,6 +83,16 @@ fun PermissionDialog(
) )
} }
@Preview
@Composable
fun PermissionDialogPreview() {
PermissionDialog(
LocationPermissionTextProvider(),
false,
{}, {}, {}, {}
)
}
interface PermissionTextProvider { interface PermissionTextProvider {
fun getDescription(isPermanentDeclined: Boolean): String fun getDescription(isPermanentDeclined: Boolean): String
} }

View File

@@ -7,7 +7,6 @@ import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.layout.fillMaxHeight
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.size
import androidx.compose.material3.CardDefaults import androidx.compose.material3.CardDefaults
@@ -22,8 +21,9 @@ import androidx.compose.ui.res.painterResource
import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import com.helible.pilot.dataclasses.BluetoothDevice
import com.helible.pilot.R import com.helible.pilot.R
import com.helible.pilot.dataclasses.BluetoothDevice
@SuppressLint("MissingPermission") @SuppressLint("MissingPermission")
@Composable @Composable
@@ -44,7 +44,9 @@ fun DeviceItem(
) )
) { ) {
Row(modifier = Modifier.padding(8.dp)) { Row(modifier = Modifier.padding(8.dp)) {
Column(verticalArrangement = Arrangement.Center, modifier = Modifier.fillMaxHeight()) { Column(verticalArrangement = Arrangement.Center,
modifier = Modifier.fillMaxHeight().weight(1f, true)
) {
Text( Text(
text = deviceInfo.name, text = deviceInfo.name,
fontWeight = FontWeight.Bold, fontWeight = FontWeight.Bold,
@@ -56,9 +58,10 @@ fun DeviceItem(
) )
} }
if (deviceInfo.isScanned) { if (deviceInfo.isScanned) {
Box(contentAlignment = Alignment.CenterEnd, modifier = Modifier.fillMaxSize()) { val icon = getSignalIconForRssiValue(deviceInfo.rssi)
Box(contentAlignment = Alignment.CenterEnd, modifier = Modifier.weight(0.3f)) {
Icon( Icon(
painterResource(id = getSignalIconForRssiValue(deviceInfo.rssi)), painterResource(id = icon),
contentDescription = null, contentDescription = null,
modifier = Modifier modifier = Modifier
.fillMaxHeight() .fillMaxHeight()

View File

@@ -7,14 +7,15 @@ import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items import androidx.compose.foundation.lazy.items
import androidx.compose.material3.CircularProgressIndicator import androidx.compose.material3.CircularProgressIndicator
import androidx.compose.material3.Surface
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import com.helible.pilot.components.scannerScreen.DeviceItem
import com.helible.pilot.dataclasses.BluetoothUiState import com.helible.pilot.dataclasses.BluetoothUiState
import com.helible.pilot.dataclasses.BluetoothDevice import com.helible.pilot.dataclasses.BluetoothDevice
@@ -102,3 +103,26 @@ fun DiscoveredDevicesList(
} }
} }
} }
@Preview
@Composable
fun DiscoveredDevicesListPreview() {
val state = BluetoothUiState(
pairedBluetoothDevices = listOf(
BluetoothDevice("My car", "AA:BB:CC:DD:FF", -70, false),
BluetoothDevice("Speaker", "AA:BB:CC:DD:FF", -20, false),
BluetoothDevice("My TV", "AA:BB:CC:DD:FF", 10, false),
BluetoothDevice("My phone", "AA:BB:CC:DD:FF", -50, false),
BluetoothDevice("Mi Band 6", "AA:BB:CC:DD:FF", -100, false),
),
scannedBluetoothDevices = listOf(
BluetoothDevice("Watch", "AA:BB:CC:DD:FF", -10, true),
BluetoothDevice("Mi Cleaner", "AA:BB:CC:DD:FF", -90, true),
BluetoothDevice("My fridge", "AA:BB:CC:DD:FF", -100, true),
BluetoothDevice("Unknown device", "AA:BB:CC:DD:FF", -130, true)
)
)
Surface {
DiscoveredDevicesList(bluetoothState = state, selectedDevice = null, choiceDevice = {})
}
}

View File

@@ -18,6 +18,7 @@ import androidx.compose.material3.Text
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.constraintlayout.compose.ConstraintLayout import androidx.constraintlayout.compose.ConstraintLayout
import androidx.constraintlayout.compose.Dimension import androidx.constraintlayout.compose.Dimension
@@ -28,7 +29,7 @@ import com.helible.pilot.dataclasses.BluetoothDevice
@SuppressLint("MissingPermission") @SuppressLint("MissingPermission")
@Composable @Composable
fun BluetoothScannerScreen( fun ScannerScreen(
bluetoothState: BluetoothUiState, bluetoothState: BluetoothUiState,
selectedDevice: BluetoothDevice?, selectedDevice: BluetoothDevice?,
startScan: () -> Unit, startScan: () -> Unit,
@@ -107,3 +108,32 @@ fun BluetoothScannerScreen(
} }
} }
} }
@Preview
@Composable
fun ScannerScreenPreview() {
val state = BluetoothUiState(
pairedBluetoothDevices = listOf(
BluetoothDevice("My car", "AA:BB:CC:DD:FF", -70, false),
BluetoothDevice("Speaker", "AA:BB:CC:DD:FF", -20, false),
BluetoothDevice("My TV", "AA:BB:CC:DD:FF", 10, false),
BluetoothDevice("My phone", "AA:BB:CC:DD:FF", -50, false),
BluetoothDevice("Mi Band 6", "AA:BB:CC:DD:FF", -100, false),
),
scannedBluetoothDevices = listOf(
BluetoothDevice("Watch", "AA:BB:CC:DD:FF", -10, true),
BluetoothDevice("Mi Cleaner", "AA:BB:CC:DD:FF", -90, true),
BluetoothDevice("My fridge", "AA:BB:CC:DD:FF", -100, true),
BluetoothDevice("Unknown device", "AA:BB:CC:DD:FF", -130, true)
)
)
Surface {
ScannerScreen(
state,
state.scannedBluetoothDevices[1],
{}, {},
{_ -> },
{},
)
}
}