Merge pull request #80 from jonasbark/copilot/fix-3ddab2b9-517e-451f-827c-78dff444def4

[WIP] Create a setting, visible only when connected to a Zwift Ride device, to enable or disable the vibration message. Default is on.
This commit is contained in:
jonasbark
2025-09-30 09:00:07 +02:00
committed by GitHub
4 changed files with 77 additions and 1 deletions

View File

@@ -383,7 +383,8 @@ abstract class BaseDevice {
Future<void> _performActions(List<ZwiftButton> buttonsClicked, bool repeated) async {
if (!repeated &&
buttonsClicked.any(((e) => e.action == InGameAction.shiftDown || e.action == InGameAction.shiftUp))) {
buttonsClicked.any(((e) => e.action == InGameAction.shiftDown || e.action == InGameAction.shiftUp)) &&
settings.getVibrationEnabled()) {
await _vibrate();
}
for (final action in buttonsClicked) {

View File

@@ -12,6 +12,7 @@ import 'package:swift_control/widgets/testbed.dart';
import 'package:swift_control/widgets/title.dart';
import '../bluetooth/devices/base_device.dart';
import '../bluetooth/devices/zwift_ride.dart';
import '../utils/keymap/apps/custom_app.dart';
import '../utils/keymap/apps/supported_app.dart';
import '../widgets/menu.dart';
@@ -79,6 +80,16 @@ ${it.firmwareVersion != null ? ' - Firmware Version: ${it.firmwareVersion}' : ''
),
),
Divider(color: Theme.of(context).colorScheme.primary, height: 30),
if (connection.devices.any((device) => device is ZwiftRide && device.isConnected))
SwitchListTile(
title: Text('Vibration on Shift'),
subtitle: Text('Enable vibration feedback when shifting gears'),
value: settings.getVibrationEnabled(),
onChanged: (value) async {
await settings.setVibrationEnabled(value);
setState(() {});
},
),
if (!kIsWeb)
Column(
spacing: 12,

View File

@@ -51,4 +51,12 @@ class Settings {
Future<void> setLastSeenVersion(String version) async {
await _prefs.setString('last_seen_version', version);
}
bool getVibrationEnabled() {
return _prefs.getBool('vibration_enabled') ?? true;
}
Future<void> setVibrationEnabled(bool enabled) async {
await _prefs.setBool('vibration_enabled', enabled);
}
}

View File

@@ -0,0 +1,56 @@
import 'package:flutter_test/flutter_test.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:swift_control/utils/settings/settings.dart';
void main() {
group('Vibration Setting Tests', () {
late Settings settings;
setUp(() async {
// Initialize SharedPreferences with in-memory storage for testing
SharedPreferences.setMockInitialValues({});
settings = Settings();
await settings.init();
});
test('Vibration setting should default to true', () {
expect(settings.getVibrationEnabled(), true);
});
test('Vibration setting should persist when set to false', () async {
await settings.setVibrationEnabled(false);
expect(settings.getVibrationEnabled(), false);
});
test('Vibration setting should persist when set to true', () async {
await settings.setVibrationEnabled(true);
expect(settings.getVibrationEnabled(), true);
});
test('Vibration setting should toggle correctly', () async {
// Start with default (true)
expect(settings.getVibrationEnabled(), true);
// Toggle to false
await settings.setVibrationEnabled(false);
expect(settings.getVibrationEnabled(), false);
// Toggle back to true
await settings.setVibrationEnabled(true);
expect(settings.getVibrationEnabled(), true);
});
test('Vibration setting should persist across Settings instances', () async {
// Set vibration to false
await settings.setVibrationEnabled(false);
expect(settings.getVibrationEnabled(), false);
// Create a new Settings instance
final newSettings = Settings();
await newSettings.init();
// Should still be false
expect(newSettings.getVibrationEnabled(), false);
});
});
}