Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_platform_widgets/flutter_platform_widgets.dart';
import 'package:open_earable_flutter/open_earable_flutter.dart';

class AudioModeWidget extends StatefulWidget {
final AudioModeManager device;

const AudioModeWidget({
super.key,
required this.device,
});

@override
State<AudioModeWidget> createState() => _AudioModeWidgetState();
}

class _AudioModeWidgetState extends State<AudioModeWidget> {
AudioMode? _selectedAudioMode;

@override
void initState() {
super.initState();
_getSelectedAudioMode();
}

Future<void> _getSelectedAudioMode() async {
final mode = await widget.device.getAudioMode();
setState(() {
_selectedAudioMode = mode;
});
}

@override
Widget build(BuildContext context) {
return PlatformWidget(
cupertino:(context, platform) => CupertinoSlidingSegmentedControl(
children: {
for (var item in widget.device.availableAudioModes)
item : Text(item.key)
},
onValueChanged: (AudioMode? mode) {
if (mode == null) return;
widget.device.setAudioMode(mode);
},
groupValue: _selectedAudioMode,
),
material: (context, platform) => SegmentedButton<AudioMode>(
segments:
widget.device.availableAudioModes.map((item) {
return ButtonSegment<AudioMode>(
value: item,
label: Text(item.key),
);
}).toList(),
onSelectionChanged: (Set<AudioMode> selected) {
if (selected.isEmpty) return;
widget.device.setAudioMode(selected.first);
setState(() {
_selectedAudioMode = selected.first;
});
},
selected: _selectedAudioMode != null ? { _selectedAudioMode! } : {},
emptySelectionAllowed: true,
),
);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,11 @@ import 'package:flutter_platform_widgets/flutter_platform_widgets.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:open_earable_flutter/open_earable_flutter.dart';
import 'package:open_wearable/widgets/devices/battery_state.dart';
import 'package:open_wearable/widgets/devices/rgb_control.dart';
import 'package:open_wearable/widgets/devices/device_detail/audio_mode_widget.dart';

import 'rgb_control.dart';
import 'microphone_selection_widget.dart';
import 'status_led_widget.dart';

/// A page that displays the details of a device.
///
Expand All @@ -19,6 +23,22 @@ class DeviceDetailPage extends StatefulWidget {

class _DeviceDetailPageState extends State<DeviceDetailPage> {
bool showStatusLED = true;
Microphone? selectedMicrophone;

@override
void initState() {
super.initState();
_initSelectedMicrophone();
}

Future<void> _initSelectedMicrophone() async {
if (widget.device is MicrophoneManager) {
final mic = await (widget.device as MicrophoneManager).getMicrophone();
setState(() {
selectedMicrophone = mic;
});
}
}

@override
Widget build(BuildContext context) {
Expand Down Expand Up @@ -48,6 +68,13 @@ class _DeviceDetailPageState extends State<DeviceDetailPage> {
)
],
),
// MARK: Audio Mode
if (widget.device is AudioModeManager)
AudioModeWidget(device: widget.device as AudioModeManager),
// MARK: Microphone Control
if (widget.device is MicrophoneManager)
MicrophoneSelectionWidget(device: widget.device as MicrophoneManager),
// MARK: Device info
Text("Device Info", style: Theme.of(context).textTheme.titleSmall),
PlatformListTile(
title: Text("Bluetooth Address", style: Theme.of(context).textTheme.bodyLarge),
Expand Down Expand Up @@ -187,40 +214,3 @@ class _DeviceDetailPageState extends State<DeviceDetailPage> {
);
}
}

// MARK: - Status LED Widget
class StatusLEDControlWidget extends StatefulWidget {
final StatusLed statusLED;
final RgbLed rgbLed;
const StatusLEDControlWidget({super.key, required this.statusLED, required this.rgbLed});

@override
State<StatusLEDControlWidget> createState() => _StatusLEDControlWidgetState();
}

class _StatusLEDControlWidgetState extends State<StatusLEDControlWidget> {
bool _overrideColor = false;

@override
Widget build(BuildContext context) {
return PlatformListTile(
title: Text("Override LED Color", style: Theme.of(context).textTheme.bodyLarge),
trailing: Row(
mainAxisSize: MainAxisSize.min,
children: [
if (_overrideColor)
RgbControlView(rgbLed: widget.rgbLed),
PlatformSwitch(
value: _overrideColor,
onChanged: (value) async {
setState(() {
_overrideColor = value;
});
widget.statusLED.showStatus(!value);
},
),
],
)
);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_platform_widgets/flutter_platform_widgets.dart';
import 'package:open_earable_flutter/open_earable_flutter.dart';

class MicrophoneSelectionWidget extends StatefulWidget {
final MicrophoneManager device;

const MicrophoneSelectionWidget({
super.key,
required this.device,
});

@override
State<MicrophoneSelectionWidget> createState() => _MicrophoneSelectionWidgetState();
}

class _MicrophoneSelectionWidgetState extends State<MicrophoneSelectionWidget> {
Microphone? _selectedMicrophone;

@override
void initState() {
super.initState();
_getSelectedMicrophone();
}

Future<void> _getSelectedMicrophone() async {
final mode = await widget.device.getMicrophone();
setState(() {
_selectedMicrophone = mode;
});
}

@override
Widget build(BuildContext context) {
return PlatformWidget(
cupertino:(context, platform) => CupertinoSlidingSegmentedControl(
children: {
for (var item in widget.device.availableMicrophones)
item : Text(item.key)
},
onValueChanged: (Microphone? mode) {
if (mode == null) return;
widget.device.setMicrophone(mode);
},
groupValue: _selectedMicrophone,
),
material: (context, platform) => SegmentedButton<Microphone>(
segments:
widget.device.availableMicrophones.map((item) {
return ButtonSegment<Microphone>(
value: item,
label: Text(item.key),
);
}).toList(),
onSelectionChanged: (Set<Microphone> selected) {
if (selected.isEmpty) return;
widget.device.setMicrophone(selected.first);
setState(() {
_selectedMicrophone = selected.first;
});
},
selected: _selectedMicrophone != null ? { _selectedMicrophone! } : {},
emptySelectionAllowed: true,
),
);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
import 'package:flutter/material.dart';
import 'package:flutter_platform_widgets/flutter_platform_widgets.dart';
import 'package:open_earable_flutter/open_earable_flutter.dart';
import 'rgb_control.dart';

// MARK: - Status LED Widget
class StatusLEDControlWidget extends StatefulWidget {
final StatusLed statusLED;
final RgbLed rgbLed;
const StatusLEDControlWidget({super.key, required this.statusLED, required this.rgbLed});

@override
State<StatusLEDControlWidget> createState() => _StatusLEDControlWidgetState();
}

class _StatusLEDControlWidgetState extends State<StatusLEDControlWidget> {
bool _overrideColor = false;

@override
Widget build(BuildContext context) {
return PlatformListTile(
title: Text("Override LED Color", style: Theme.of(context).textTheme.bodyLarge),
trailing: Row(
mainAxisSize: MainAxisSize.min,
children: [
if (_overrideColor)
RgbControlView(rgbLed: widget.rgbLed),
PlatformSwitch(
value: _overrideColor,
onChanged: (value) async {
setState(() {
_overrideColor = value;
});
widget.statusLED.showStatus(!value);
},
),
],
)
);
}
}
2 changes: 1 addition & 1 deletion open_wearable/lib/widgets/devices/devices_page.dart
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import 'package:open_earable_flutter/open_earable_flutter.dart';
import 'package:open_wearable/view_models/wearables_provider.dart';
import 'package:open_wearable/widgets/devices/battery_state.dart';
import 'package:open_wearable/widgets/devices/connect_devices_page.dart';
import 'package:open_wearable/widgets/devices/device_detail_page.dart';
import 'package:open_wearable/widgets/devices/device_detail/device_detail_page.dart';
import 'package:provider/provider.dart';

/// On this page the user can see all connected devices.
Expand Down
Loading