Skip to content

Commit f709caa

Browse files
committed
Refactor app theme colors and remove unused color schemes
- Updated primary and onPrimaryContainer colors in BorneoTheme. - Removed lightMediumContrastScheme and lightHighContrastScheme methods. - Removed darkMediumContrastScheme and darkHighContrastScheme methods. - Cleaned up DeviceDiscoveryViewModel by removing group manager dependency and countdown timer logic. - Introduced ProvisioningWizardViewModel for handling WiFi provisioning steps. - Added ProvisioningScreen for the new provisioning wizard UI. - Updated DeviceDiscoveryScreen to use ProvisioningScreen instead of WifiSelectionScreen. - Adjusted AboutScreen to use theme colors for better consistency. - Cleaned up device_discovery_view_model_test by removing FakeGroupManager.
1 parent 788a2fd commit f709caa

8 files changed

Lines changed: 695 additions & 302 deletions

File tree

client/lib/app/app_theme.dart

Lines changed: 2 additions & 222 deletions
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,9 @@ class BorneoTheme {
2727
brightness: Brightness.light,
2828
primary: Color(0xff493b72),
2929
surfaceTint: Color(0xff64568e),
30-
onPrimary: Color(0xffffffff),
30+
onPrimary: Color(0xffE3D009),
3131
primaryContainer: Color(0xff6d5f98),
32-
onPrimaryContainer: Color(0xffffffff),
32+
onPrimaryContainer: Color(0xFFE3D009),
3333
secondary: Color(0xff625b73),
3434
onSecondary: Color(0xffffffff),
3535
secondaryContainer: Color(0xffe9dffc),
@@ -77,116 +77,6 @@ class BorneoTheme {
7777
return theme(lightScheme());
7878
}
7979

80-
static ColorScheme lightMediumContrastScheme() {
81-
return const ColorScheme(
82-
brightness: Brightness.light,
83-
primary: Color(0xff483a70),
84-
surfaceTint: Color(0xff64568e),
85-
onPrimary: Color(0xffffffff),
86-
primaryContainer: Color(0xff6d5f98),
87-
onPrimaryContainer: Color(0xffffffff),
88-
secondary: Color(0xff453f56),
89-
onSecondary: Color(0xffffffff),
90-
secondaryContainer: Color(0xff78718a),
91-
onSecondaryContainer: Color(0xffffffff),
92-
tertiary: Color(0xff66304f),
93-
onTertiary: Color(0xffffffff),
94-
tertiaryContainer: Color(0xff915576),
95-
onTertiaryContainer: Color(0xffffffff),
96-
error: Color(0xff8c0009),
97-
onError: Color(0xffffffff),
98-
errorContainer: Color(0xffda342e),
99-
onErrorContainer: Color(0xffffffff),
100-
surface: Color(0xfffdf8fd),
101-
onSurface: Color(0xff1c1b1f),
102-
onSurfaceVariant: Color(0xff45414b),
103-
outline: Color(0xff615d67),
104-
outlineVariant: Color(0xff7d7983),
105-
shadow: Color(0xff000000),
106-
scrim: Color(0xff000000),
107-
inverseSurface: Color(0xff313034),
108-
inversePrimary: Color(0xffcebdfd),
109-
primaryFixed: Color(0xff7a6ca6),
110-
onPrimaryFixed: Color(0xffffffff),
111-
primaryFixedDim: Color(0xff61538b),
112-
onPrimaryFixedVariant: Color(0xffffffff),
113-
secondaryFixed: Color(0xff78718a),
114-
onSecondaryFixed: Color(0xffffffff),
115-
secondaryFixedDim: Color(0xff5f5870),
116-
onSecondaryFixedVariant: Color(0xffffffff),
117-
tertiaryFixed: Color(0xff9f6182),
118-
onTertiaryFixed: Color(0xffffffff),
119-
tertiaryFixedDim: Color(0xff844969),
120-
onTertiaryFixedVariant: Color(0xffffffff),
121-
surfaceDim: Color(0xffddd8de),
122-
surfaceBright: Color(0xfffdf8fd),
123-
surfaceContainerLowest: Color(0xffffffff),
124-
surfaceContainerLow: Color(0xfff7f2f7),
125-
surfaceContainer: Color(0xfff1ecf2),
126-
surfaceContainerHigh: Color(0xffece6ec),
127-
surfaceContainerHighest: Color(0xffe6e1e6),
128-
);
129-
}
130-
131-
ThemeData lightMediumContrast() {
132-
return theme(lightMediumContrastScheme());
133-
}
134-
135-
static ColorScheme lightHighContrastScheme() {
136-
return const ColorScheme(
137-
brightness: Brightness.light,
138-
primary: Color(0xff26184d),
139-
surfaceTint: Color(0xff64568e),
140-
onPrimary: Color(0xffffffff),
141-
primaryContainer: Color(0xff483a70),
142-
onPrimaryContainer: Color(0xffffffff),
143-
secondary: Color(0xff241f34),
144-
onSecondary: Color(0xffffffff),
145-
secondaryContainer: Color(0xff453f56),
146-
onSecondaryContainer: Color(0xffffffff),
147-
tertiary: Color(0xff3f0f2d),
148-
onTertiary: Color(0xffffffff),
149-
tertiaryContainer: Color(0xff66304f),
150-
onTertiaryContainer: Color(0xffffffff),
151-
error: Color(0xff4e0002),
152-
onError: Color(0xffffffff),
153-
errorContainer: Color(0xff8c0009),
154-
onErrorContainer: Color(0xffffffff),
155-
surface: Color(0xfffdf8fd),
156-
onSurface: Color(0xff000000),
157-
onSurfaceVariant: Color(0xff25232b),
158-
outline: Color(0xff45414b),
159-
outlineVariant: Color(0xff45414b),
160-
shadow: Color(0xff000000),
161-
scrim: Color(0xff000000),
162-
inverseSurface: Color(0xff313034),
163-
inversePrimary: Color(0xfff1e8ff),
164-
primaryFixed: Color(0xff483a70),
165-
onPrimaryFixed: Color(0xffffffff),
166-
primaryFixedDim: Color(0xff312358),
167-
onPrimaryFixedVariant: Color(0xffffffff),
168-
secondaryFixed: Color(0xff453f56),
169-
onSecondaryFixed: Color(0xffffffff),
170-
secondaryFixedDim: Color(0xff2f293f),
171-
onSecondaryFixedVariant: Color(0xffffffff),
172-
tertiaryFixed: Color(0xff66304f),
173-
onTertiaryFixed: Color(0xffffffff),
174-
tertiaryFixedDim: Color(0xff4c1a38),
175-
onTertiaryFixedVariant: Color(0xffffffff),
176-
surfaceDim: Color(0xffddd8de),
177-
surfaceBright: Color(0xfffdf8fd),
178-
surfaceContainerLowest: Color(0xffffffff),
179-
surfaceContainerLow: Color(0xfff7f2f7),
180-
surfaceContainer: Color(0xfff1ecf2),
181-
surfaceContainerHigh: Color(0xffece6ec),
182-
surfaceContainerHighest: Color(0xffe6e1e6),
183-
);
184-
}
185-
186-
ThemeData lightHighContrast() {
187-
return theme(lightHighContrastScheme());
188-
}
189-
19080
static ColorScheme darkScheme() {
19181
return const ColorScheme(
19282
brightness: Brightness.dark,
@@ -242,116 +132,6 @@ class BorneoTheme {
242132
return theme(darkScheme());
243133
}
244134

245-
static ColorScheme darkMediumContrastScheme() {
246-
return const ColorScheme(
247-
brightness: Brightness.dark,
248-
primary: Color(0xffd2c2ff),
249-
surfaceTint: Color(0xffcebdfd),
250-
onPrimary: Color(0xff1a0a41),
251-
primaryContainer: Color(0xff9788c4),
252-
onPrimaryContainer: Color(0xff000000),
253-
secondary: Color(0xffd0c6e3),
254-
onSecondary: Color(0xff181327),
255-
secondaryContainer: Color(0xff958da7),
256-
onSecondaryContainer: Color(0xff000000),
257-
tertiary: Color(0xffffb5da),
258-
onTertiary: Color(0xff300321),
259-
tertiaryContainer: Color(0xffbf7c9f),
260-
onTertiaryContainer: Color(0xff000000),
261-
error: Color(0xffffbab1),
262-
onError: Color(0xff370001),
263-
errorContainer: Color(0xffff5449),
264-
onErrorContainer: Color(0xff000000),
265-
surface: Color(0xff141317),
266-
onSurface: Color(0xfffff9ff),
267-
onSurfaceVariant: Color(0xffcec8d4),
268-
outline: Color(0xffa6a1ac),
269-
outlineVariant: Color(0xff86818c),
270-
shadow: Color(0xff000000),
271-
scrim: Color(0xff000000),
272-
inverseSurface: Color(0xffe6e1e6),
273-
inversePrimary: Color(0xff4d3f76),
274-
primaryFixed: Color(0xffe8ddff),
275-
onPrimaryFixed: Color(0xff15043c),
276-
primaryFixedDim: Color(0xffcebdfd),
277-
onPrimaryFixedVariant: Color(0xff3b2d63),
278-
secondaryFixed: Color(0xffe8defb),
279-
onSecondaryFixed: Color(0xff130e22),
280-
secondaryFixedDim: Color(0xffcbc2de),
281-
onSecondaryFixedVariant: Color(0xff393349),
282-
tertiaryFixed: Color(0xffffd8e9),
283-
onTertiaryFixed: Color(0xff2a001b),
284-
tertiaryFixedDim: Color(0xfffab1d6),
285-
onTertiaryFixedVariant: Color(0xff582442),
286-
surfaceDim: Color(0xff141317),
287-
surfaceBright: Color(0xff3a383d),
288-
surfaceContainerLowest: Color(0xff0f0e11),
289-
surfaceContainerLow: Color(0xff1c1b1f),
290-
surfaceContainer: Color(0xff201f23),
291-
surfaceContainerHigh: Color(0xff2b292d),
292-
surfaceContainerHighest: Color(0xff363438),
293-
);
294-
}
295-
296-
ThemeData darkMediumContrast() {
297-
return theme(darkMediumContrastScheme());
298-
}
299-
300-
static ColorScheme darkHighContrastScheme() {
301-
return const ColorScheme(
302-
brightness: Brightness.dark,
303-
primary: Color(0xfffff9ff),
304-
surfaceTint: Color(0xffcebdfd),
305-
onPrimary: Color(0xff000000),
306-
primaryContainer: Color(0xffd2c2ff),
307-
onPrimaryContainer: Color(0xff000000),
308-
secondary: Color(0xfffff9ff),
309-
onSecondary: Color(0xff000000),
310-
secondaryContainer: Color(0xffd0c6e3),
311-
onSecondaryContainer: Color(0xff000000),
312-
tertiary: Color(0xfffff9f9),
313-
onTertiary: Color(0xff000000),
314-
tertiaryContainer: Color(0xffffb5da),
315-
onTertiaryContainer: Color(0xff000000),
316-
error: Color(0xfffff9f9),
317-
onError: Color(0xff000000),
318-
errorContainer: Color(0xffffbab1),
319-
onErrorContainer: Color(0xff000000),
320-
surface: Color(0xff141317),
321-
onSurface: Color(0xffffffff),
322-
onSurfaceVariant: Color(0xfffff9ff),
323-
outline: Color(0xffcec8d4),
324-
outlineVariant: Color(0xffcec8d4),
325-
shadow: Color(0xff000000),
326-
scrim: Color(0xff000000),
327-
inverseSurface: Color(0xffe6e1e6),
328-
inversePrimary: Color(0xff2e2056),
329-
primaryFixed: Color(0xffece2ff),
330-
onPrimaryFixed: Color(0xff000000),
331-
primaryFixedDim: Color(0xffd2c2ff),
332-
onPrimaryFixedVariant: Color(0xff1a0a41),
333-
secondaryFixed: Color(0xffece2ff),
334-
onSecondaryFixed: Color(0xff000000),
335-
secondaryFixedDim: Color(0xffd0c6e3),
336-
onSecondaryFixedVariant: Color(0xff181327),
337-
tertiaryFixed: Color(0xffffdeec),
338-
onTertiaryFixed: Color(0xff000000),
339-
tertiaryFixedDim: Color(0xffffb5da),
340-
onTertiaryFixedVariant: Color(0xff300321),
341-
surfaceDim: Color(0xff141317),
342-
surfaceBright: Color(0xff3a383d),
343-
surfaceContainerLowest: Color(0xff0f0e11),
344-
surfaceContainerLow: Color(0xff1c1b1f),
345-
surfaceContainer: Color(0xff201f23),
346-
surfaceContainerHigh: Color(0xff2b292d),
347-
surfaceContainerHighest: Color(0xff363438),
348-
);
349-
}
350-
351-
ThemeData darkHighContrast() {
352-
return theme(darkHighContrastScheme());
353-
}
354-
355135
ThemeData theme(ColorScheme colorScheme) => ThemeData(
356136
useMaterial3: true,
357137
brightness: colorScheme.brightness,

client/lib/features/devices/view_models/device_discovery_view_model.dart

Lines changed: 27 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
11
import 'dart:async';
22
import 'package:flutter/services.dart';
33
import 'package:borneo_app/features/devices/models/device_entity.dart';
4-
import 'package:borneo_app/features/devices/models/device_group_entity.dart';
54
import 'package:borneo_app/features/devices/models/discoverable_device.dart';
65
import 'package:borneo_app/core/services/devices/device_module_registry.dart';
7-
import 'package:borneo_app/core/services/group_manager.dart';
86
import 'package:borneo_app/shared/view_models/abstract_screen_view_model.dart';
97
import 'package:borneo_kernel_abstractions/models/supported_device_descriptor.dart';
108
import 'package:cancellation_token/cancellation_token.dart';
@@ -16,11 +14,14 @@ import '../models/events.dart';
1614
import 'package:borneo_app/core/services/devices/device_manager.dart';
1715
import 'package:borneo_app/core/services/devices/ble_provisioner.dart';
1816

17+
const int kDiscoveryTimeoutSeconds = 10;
18+
1919
class DeviceDiscoveryViewModel extends AbstractScreenViewModel {
2020
bool _disposed = false;
2121
late CancellationToken _scanCancelToken = CancellationToken();
22+
Timer? _countdownTimer;
23+
int _remainingSeconds = kDiscoveryTimeoutSeconds;
2224
final Logger _logger;
23-
final IGroupManager _groupManager;
2425
final IDeviceManager _deviceManager;
2526
final IBleProvisioner _bleProvisioner;
2627
final IDeviceModuleRegistry deviceMdoules;
@@ -45,17 +46,14 @@ class DeviceDiscoveryViewModel extends AbstractScreenViewModel {
4546
DeviceEntity? _lastestAddedDevice;
4647
DeviceEntity? get lastestAddedDevice => _lastestAddedDevice;
4748

48-
late final List<DeviceGroupEntity> _availableGroups = [];
49-
List<DeviceGroupEntity> get availableGroups => _availableGroups;
50-
5149
bool get isDiscovering => _isRefreshing;
50+
int get remainingSeconds => _remainingSeconds;
5251

5352
// Platform check
5453
bool get isMobile => defaultTargetPlatform == TargetPlatform.android || defaultTargetPlatform == TargetPlatform.iOS;
5554

5655
DeviceDiscoveryViewModel(
5756
this._logger,
58-
this._groupManager,
5957
this._deviceManager,
6058
this._bleProvisioner,
6159
this.deviceMdoules, {
@@ -77,7 +75,6 @@ class DeviceDiscoveryViewModel extends AbstractScreenViewModel {
7775
@override
7876
Future<void> onInitialize() async {
7977
try {
80-
_availableGroups.addAll(await _groupManager.fetchAllGroupsInCurrentScene());
8178
// 延迟到下一帧,确保 UI 完全初始化
8279
await Future.delayed(Duration.zero);
8380
await startDiscovery();
@@ -87,6 +84,8 @@ class DeviceDiscoveryViewModel extends AbstractScreenViewModel {
8784
@override
8885
void dispose() {
8986
if (!_disposed) {
87+
_countdownTimer?.cancel();
88+
_countdownTimer = null;
9089
_deviceAddedEventSub.cancel();
9190
_newDeviceFoundEventSub.cancel();
9291
_discoverableDevices.dispose();
@@ -100,6 +99,9 @@ class DeviceDiscoveryViewModel extends AbstractScreenViewModel {
10099
}
101100

102101
Future<void> _stopRefresh() async {
102+
_countdownTimer?.cancel();
103+
_countdownTimer = null;
104+
_remainingSeconds = kDiscoveryTimeoutSeconds;
103105
_isRefreshing = false;
104106
_scanCancelToken.cancel();
105107
try {
@@ -138,6 +140,21 @@ class DeviceDiscoveryViewModel extends AbstractScreenViewModel {
138140
_updateDiscoverableList();
139141

140142
_isRefreshing = true;
143+
_remainingSeconds = kDiscoveryTimeoutSeconds;
144+
_countdownTimer = Timer.periodic(const Duration(seconds: 1), (timer) {
145+
if (_disposed) {
146+
timer.cancel();
147+
return;
148+
}
149+
_remainingSeconds--;
150+
if (_remainingSeconds <= 0) {
151+
timer.cancel();
152+
_countdownTimer = null;
153+
stopDiscovery();
154+
} else {
155+
notifyListeners();
156+
}
157+
});
141158
if (!_disposed) {
142159
notifyListeners(); // Update UI to show loading
143160
}
@@ -231,8 +248,8 @@ class DeviceDiscoveryViewModel extends AbstractScreenViewModel {
231248
}
232249
}
233250

234-
Future<void> addNewDevice(SupportedDeviceDescriptor deviceInfo, DeviceGroupEntity? group) async {
235-
await _deviceManager.addNewDevice(deviceInfo, groupID: group?.id);
251+
Future<void> addNewDevice(SupportedDeviceDescriptor deviceInfo) async {
252+
await _deviceManager.addNewDevice(deviceInfo, groupID: null);
236253
}
237254

238255
Future<void> _onNewDeviceEntityAdded(NewDeviceEntityAddedEvent event) async {

0 commit comments

Comments
 (0)