Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
960f9e7
refactor recorder: extract controls into separate widget
o-bagge Jan 6, 2026
6a293e5
add custom audio waveform to the Sensors tab with device selector
o-bagge Jan 16, 2026
648a72c
fix scrolling problems with charts screen
o-bagge Jan 19, 2026
4f11d0d
auto select OpenEarable as audio source, improve UI of Chart tab, fix…
o-bagge Jan 19, 2026
4800892
add audio file to recording folder. Fixed some bugs: switching tabs d…
o-bagge Jan 23, 2026
cadb81f
fix bug
o-bagge Jan 26, 2026
0095fe6
starting of audio streaming is now manuallycontrolled
o-bagge Jan 26, 2026
f6a8d0b
microphone stream can now be turned on and off together with the sens…
o-bagge Jan 27, 2026
d2c65d0
microphone now also stops when the recording is stopeed with the 'tur…
o-bagge Jan 28, 2026
bd4dd92
disable streaming option for iOS, remove audio recorder app because i…
o-bagge Feb 2, 2026
29b6c6e
add missing trailing commas
o-bagge Feb 2, 2026
d424fc5
only use one instance of AudioRecorder for both streaming and recording
o-bagge Feb 4, 2026
65494b3
resolve merge conflict
o-bagge Mar 31, 2026
eac29ae
fix(audio): keep waveform repainting
DennisMoschina May 5, 2026
3daa7c3
chore(analyzer): clean sensor configuration warnings
DennisMoschina May 5, 2026
69a9edb
fix recorder on web
o-bagge May 13, 2026
164c9a4
fix recorder on macos
o-bagge Apr 21, 2026
53d57db
fix recorder in macos
o-bagge May 13, 2026
e281f41
remove export
o-bagge May 13, 2026
6f305ed
fix(recorder): cancel web sensor subscriptions
DennisMoschina May 20, 2026
1991efc
fix(web): replace deprecated html APIs
DennisMoschina May 20, 2026
e7cf4b3
style(recorder): format local recorder helpers
DennisMoschina May 20, 2026
68003fd
build(macos): refresh pod lockfile
DennisMoschina May 20, 2026
f988881
fix(sensors): remove duplicate stereo badge
TobiasRoeddiger May 21, 2026
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
2 changes: 2 additions & 0 deletions open_wearable/android/app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,8 @@
<!-- internet persmission, for fetching firmware update -->
<uses-permission android:name="android.permission.INTERNET"/>

<uses-permission android:name="android.permission.RECORD_AUDIO" />

<!-- Provide required visibility configuration for API level 30 and above -->
<queries>
<!-- If your app checks for SMS support -->
Expand Down
6 changes: 6 additions & 0 deletions open_wearable/ios/Podfile.lock
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,8 @@ PODS:
- flutter_archive (0.0.1):
- Flutter
- ZIPFoundation (= 0.9.19)
- flutter_headset_detector (3.1.0):
- Flutter
- iOSMcuManagerLibrary (1.10.1):
- SwiftCBOR (= 0.4.7)
- ZIPFoundation (= 0.9.19)
Expand Down Expand Up @@ -86,6 +88,7 @@ DEPENDENCIES:
- file_selector_ios (from `.symlinks/plugins/file_selector_ios/ios`)
- Flutter (from `Flutter`)
- flutter_archive (from `.symlinks/plugins/flutter_archive/ios`)
- flutter_headset_detector (from `.symlinks/plugins/flutter_headset_detector/ios`)
- mcumgr_flutter (from `.symlinks/plugins/mcumgr_flutter/ios`)
- open_file_ios (from `.symlinks/plugins/open_file_ios/ios`)
- package_info_plus (from `.symlinks/plugins/package_info_plus/ios`)
Expand Down Expand Up @@ -121,6 +124,8 @@ EXTERNAL SOURCES:
:path: Flutter
flutter_archive:
:path: ".symlinks/plugins/flutter_archive/ios"
flutter_headset_detector:
:path: ".symlinks/plugins/flutter_headset_detector/ios"
mcumgr_flutter:
:path: ".symlinks/plugins/mcumgr_flutter/ios"
open_file_ios:
Expand Down Expand Up @@ -151,6 +156,7 @@ SPEC CHECKSUMS:
file_selector_ios: ec57ec07954363dd730b642e765e58f199bb621a
Flutter: cabc95a1d2626b1b06e7179b784ebcf0c0cde467
flutter_archive: ad8edfd7f7d1bb12058d05424ba93e27d9930efe
flutter_headset_detector: 37d2407c6c59aa6e8a9daecf732854862ff6dd4a
iOSMcuManagerLibrary: e9555825af11a61744fe369c12e1e66621061b58
mcumgr_flutter: 969e99cc15e9fe658242669ce1075bf4612aef8a
open_file_ios: 46184d802ee7959203f6392abcfa0dd49fdb5be0
Expand Down
2 changes: 1 addition & 1 deletion open_wearable/lib/main.dart
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ import 'package:open_wearable/models/wearable_connector.dart'
hide WearableEvent;
import 'package:open_wearable/router.dart';
import 'package:open_wearable/theme/app_theme.dart';
import 'package:open_wearable/view_models/sensor_recorder_provider.dart';
import 'package:open_wearable/view_models/sensor_recorder_provider_facade.dart';
import 'package:open_wearable/widgets/app_banner.dart';
import 'package:open_wearable/widgets/global_app_banner_overlay.dart';
import 'package:open_wearable/widgets/app_toast.dart';
Expand Down
18 changes: 15 additions & 3 deletions open_wearable/lib/models/bluetooth_auto_connector.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import 'dart:async';
import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_platform_widgets/flutter_platform_widgets.dart';
import 'package:open_earable_flutter/open_earable_flutter.dart' hide logger;
Expand Down Expand Up @@ -60,6 +61,14 @@ class BluetoothAutoConnector {
});

void start() async {
if (kIsWeb) {
logger.i(
'Bluetooth auto-connect is disabled on web because Web Bluetooth requires a direct user gesture.',
);
_stopInternal();
return;
}

final token = ++_sessionToken;
_stopInternal();
_connectedDeviceIds.clear();
Expand Down Expand Up @@ -271,7 +280,7 @@ class BluetoothAutoConnector {
}

Future<void> _applyIosScanCooldownIfNeeded() async {
if (!Platform.isIOS) {
if (kIsWeb || !Platform.isIOS) {
return;
}
final stoppedAt = _lastScanStoppedAt;
Expand All @@ -296,14 +305,17 @@ class BluetoothAutoConnector {
}

_isAttemptingConnection = true;
if (!Platform.isIOS) {

if (!kIsWeb && Platform.isAndroid) {
final hasPerm = await wearableManager.hasPermissions();
if (activeToken != _sessionToken) {
_isAttemptingConnection = false;
return;
}
if (!hasPerm) {
logger.w('Bluetooth permissions not granted. Showing permissions dialog.');
logger.w(
'Bluetooth permissions not granted. Showing permissions dialog.',
);
if (!_askedPermissionsThisSession) {
_askedPermissionsThisSession = true;
_showPermissionsDialog();
Expand Down
Loading
Loading