diff --git a/open_wearable/ios/Flutter/AppFrameworkInfo.plist b/open_wearable/ios/Flutter/AppFrameworkInfo.plist
index be767884..391a902b 100644
--- a/open_wearable/ios/Flutter/AppFrameworkInfo.plist
+++ b/open_wearable/ios/Flutter/AppFrameworkInfo.plist
@@ -20,7 +20,5 @@
????
CFBundleVersion
1.0
- MinimumOSVersion
- 13.0
-
\ No newline at end of file
+
diff --git a/open_wearable/lib/router.dart b/open_wearable/lib/router.dart
index 20b29ae2..d4293e40 100644
--- a/open_wearable/lib/router.dart
+++ b/open_wearable/lib/router.dart
@@ -55,8 +55,9 @@ final GoRouter router = GoRouter(
name: 'fota',
redirect: (context, state) {
final bool isAndroid = !kIsWeb && Platform.isAndroid;
+ final bool isIOS = !kIsWeb && Platform.isIOS;
- if (!isAndroid) {
+ if (!isAndroid && !isIOS) {
WidgetsBinding.instance.addPostFrameCallback((_) {
final ctx = rootNavigatorKey.currentContext;
if (ctx == null) return;
diff --git a/open_wearable/lib/view_models/wearables_provider.dart b/open_wearable/lib/view_models/wearables_provider.dart
index f58f2c2a..1eb50be0 100644
--- a/open_wearable/lib/view_models/wearables_provider.dart
+++ b/open_wearable/lib/view_models/wearables_provider.dart
@@ -53,7 +53,9 @@ class WearableTimeSynchronizedEvent extends WearableEvent {
WearableTimeSynchronizedEvent({
required super.wearable,
String? description,
- }) : super(description: description ?? 'Time synchronized for ${wearable.name}');
+ }) : super(
+ description: description ?? 'Time synchronized for ${wearable.name}',
+ );
@override
String toString() => 'WearableTimeSynchronizedEvent for ${wearable.name}';
@@ -65,14 +67,16 @@ class WearableErrorEvent extends WearableEvent {
required super.wearable,
required this.errorMessage,
String? description,
- }) : super(description: description ?? 'Error for ${wearable.name}: $errorMessage');
+ }) : super(
+ description:
+ description ?? 'Error for ${wearable.name}: $errorMessage',
+ );
@override
String toString() =>
'WearableErrorEvent for ${wearable.name}: $errorMessage, description: $description';
}
-
// MARK: WearablesProvider
class WearablesProvider with ChangeNotifier {
@@ -89,9 +93,9 @@ class WearablesProvider with ChangeNotifier {
Stream get unsupportedFirmwareStream =>
_unsupportedFirmwareEventsController.stream;
- final _wearableEventController =
- StreamController.broadcast();
- Stream get wearableEventStream => _wearableEventController.stream;
+ final _wearableEventController = StreamController.broadcast();
+ Stream get wearableEventStream =>
+ _wearableEventController.stream;
final Map _capabilitySubscriptions = {};
@@ -135,7 +139,8 @@ class WearablesProvider with ChangeNotifier {
}) async {
try {
logger.d('Synchronizing time for wearable ${wearable.name}');
- await (wearable.requireCapability()).synchronizeTime();
+ await (wearable.requireCapability())
+ .synchronizeTime();
logger.d('Time synchronized for wearable ${wearable.name}');
_emitWearableEvent(
WearableTimeSynchronizedEvent(
@@ -144,7 +149,9 @@ class WearablesProvider with ChangeNotifier {
),
);
} catch (e, st) {
- logger.w('Failed to synchronize time for wearable ${wearable.name}: $e\n$st');
+ logger.w(
+ 'Failed to synchronize time for wearable ${wearable.name}: $e\n$st',
+ );
_emitWearableError(
wearable: wearable,
errorMessage: 'Failed to synchronize time with ${wearable.name}: $e',
@@ -159,8 +166,12 @@ class WearablesProvider with ChangeNotifier {
_wearables.add(wearable);
- _capabilitySubscriptions[wearable] = wearable.capabilityRegistered.listen((addedCapabilities) {
- _handleCapabilitiesChanged(wearable: wearable, addedCapabilites: addedCapabilities);
+ _capabilitySubscriptions[wearable] =
+ wearable.capabilityRegistered.listen((addedCapabilities) {
+ _handleCapabilitiesChanged(
+ wearable: wearable,
+ addedCapabilites: addedCapabilities,
+ );
});
// Init SensorConfigurationProvider synchronously (no awaits here)
@@ -168,7 +179,8 @@ class WearablesProvider with ChangeNotifier {
_ensureSensorConfigProvider(wearable);
final notifier = _sensorConfigurationProviders[wearable]!;
for (final config
- in (wearable.requireCapability()).sensorConfigurations) {
+ in (wearable.requireCapability())
+ .sensorConfigurations) {
if (notifier.getSelectedConfigurationValue(config) == null &&
config.values.isNotEmpty) {
notifier.addSensorConfiguration(config, config.values.first);
@@ -176,11 +188,13 @@ class WearablesProvider with ChangeNotifier {
}
}
if (wearable.hasCapability()) {
- _scheduleMicrotask(() => _syncTimeAndEmit(
- wearable: wearable,
- successDescription: 'Time synchronized for ${wearable.name}',
- failureDescription: 'Failed to synchronize time for ${wearable.name}',
- ),);
+ _scheduleMicrotask(
+ () => _syncTimeAndEmit(
+ wearable: wearable,
+ successDescription: 'Time synchronized for ${wearable.name}',
+ failureDescription: 'Failed to synchronize time for ${wearable.name}',
+ ),
+ );
}
// Disconnect listener (sync)
@@ -195,17 +209,29 @@ class WearablesProvider with ChangeNotifier {
// 2) Slow/async work: run in microtasks so it doesn't block the add
// Stereo pairing (if applicable)
if (wearable.hasCapability()) {
- _scheduleMicrotask(() => _maybeAutoPairStereoAsync(wearable.requireCapability()));
+ _scheduleMicrotask(
+ () => _maybeAutoPairStereoAsync(
+ wearable.requireCapability(),
+ ),
+ );
}
// Firmware support check (if applicable)
if (wearable.hasCapability()) {
- _scheduleMicrotask(() => _maybeEmitUnsupportedFirmwareAsync(wearable.requireCapability()));
+ _scheduleMicrotask(
+ () => _maybeEmitUnsupportedFirmwareAsync(
+ wearable.requireCapability(),
+ ),
+ );
}
// Check for newer firmware (if applicable)
if (wearable.hasCapability()) {
- _scheduleMicrotask(() => _checkForNewerFirmwareAsync(wearable.requireCapability()));
+ _scheduleMicrotask(
+ () => _checkForNewerFirmwareAsync(
+ wearable.requireCapability(),
+ ),
+ );
}
}
@@ -214,7 +240,8 @@ class WearablesProvider with ChangeNotifier {
void _ensureSensorConfigProvider(Wearable wearable) {
if (!_sensorConfigurationProviders.containsKey(wearable)) {
_sensorConfigurationProviders[wearable] = SensorConfigurationProvider(
- sensorConfigurationManager: wearable.requireCapability(),
+ sensorConfigurationManager:
+ wearable.requireCapability(),
);
}
}
@@ -285,7 +312,8 @@ class WearablesProvider with ChangeNotifier {
final currentVersion = await dev.readDeviceFirmwareVersion();
if (currentVersion == null || currentVersion.isEmpty) {
- logger.d('Could not read firmware version for ${(dev as Wearable).name}');
+ logger
+ .d('Could not read firmware version for ${(dev as Wearable).name}');
return;
}
@@ -338,18 +366,23 @@ class WearablesProvider with ChangeNotifier {
return _sensorConfigurationProviders[wearable]!;
}
- void _handleCapabilitiesChanged({required Wearable wearable, required List addedCapabilites}) {
+ void _handleCapabilitiesChanged({
+ required Wearable wearable,
+ required List addedCapabilites,
+ }) {
if (addedCapabilites.contains(SensorConfigurationManager)) {
_ensureSensorConfigProvider(wearable);
}
if (addedCapabilites.contains(TimeSynchronizable)) {
- _scheduleMicrotask(() => _syncTimeAndEmit(
- wearable: wearable,
- successDescription:
- 'Time synchronized for ${wearable.name} after capability change',
- failureDescription:
- 'Failed to synchronize time for ${wearable.name} after capability change',
- ),);
+ _scheduleMicrotask(
+ () => _syncTimeAndEmit(
+ wearable: wearable,
+ successDescription:
+ 'Time synchronized for ${wearable.name} after capability change',
+ failureDescription:
+ 'Failed to synchronize time for ${wearable.name} after capability change',
+ ),
+ );
}
}
}
diff --git a/open_wearable/lib/widgets/fota/firmware_select/firmware_list.dart b/open_wearable/lib/widgets/fota/firmware_select/firmware_list.dart
index 564cc03c..b526c687 100644
--- a/open_wearable/lib/widgets/fota/firmware_select/firmware_list.dart
+++ b/open_wearable/lib/widgets/fota/firmware_select/firmware_list.dart
@@ -16,10 +16,11 @@ class FirmwareList extends StatefulWidget {
}
class _FirmwareListState extends State {
- late Future> _firmwareFuture;
- final repository = FirmwareImageRepository();
+ late Future> _firmwareFuture;
+ final _repository = UnifiedFirmwareRepository();
String? firmwareVersion;
bool _expanded = false;
+ bool _showBeta = false;
@override
void initState() {
@@ -29,7 +30,7 @@ class _FirmwareListState extends State {
}
void _loadFirmwares() {
- _firmwareFuture = repository.getFirmwareImages();
+ _firmwareFuture = _repository.getAllFirmwares(includeBeta: _showBeta);
}
void _loadFirmwareVersion() async {
@@ -37,35 +38,44 @@ class _FirmwareListState extends State {
Provider.of(context, listen: false)
.selectedWearable;
if (wearable != null && wearable.hasCapability()) {
- final version =
- await wearable.requireCapability().readDeviceFirmwareVersion();
+ final version = await wearable
+ .requireCapability()
+ .readDeviceFirmwareVersion();
setState(() {
firmwareVersion = version;
});
}
}
+ void _toggleBeta() {
+ setState(() {
+ _showBeta = !_showBeta;
+ _loadFirmwares();
+ });
+ print(_showBeta ? 'Beta firmware enabled' : 'Beta firmware disabled');
+ }
+
@override
Widget build(BuildContext context) {
return PlatformScaffold(
appBar: PlatformAppBar(
- title: PlatformText('Select Firmware'),
+ title: GestureDetector(
+ onLongPress: _toggleBeta,
+ child: PlatformText('Select Firmware'),
+ ),
trailingActions: [
IconButton(
- onPressed: () => onFirmwareSelect(context),
+ onPressed: () => _onCustomFirmwareSelect(context),
icon: Icon(Icons.add),
padding: EdgeInsets.zero,
),
],
),
- body: Material(
- type: MaterialType.transparency,
- child: _body(),
- ),
+ body: _body(), // Remove Material wrapper
);
}
- void onFirmwareSelect(BuildContext context) async {
+ void _onCustomFirmwareSelect(BuildContext context) async {
final confirmed = await showDialog(
context: context,
builder: (_) => PlatformAlertDialog(
@@ -92,18 +102,14 @@ class _FirmwareListState extends State {
),
);
- if (confirmed != true) {
- return;
- }
+ if (confirmed != true) return;
- // Navigator.pop(context, 'Firmware');
FilePickerResult? result = await FilePicker.platform.pickFiles(
type: FileType.custom,
allowedExtensions: ['zip', 'bin'],
);
- if (result == null) {
- return;
- }
+ if (result == null) return;
+
final ext = result.files.first.extension;
final fwType =
ext == 'zip' ? FirmwareType.multiImage : FirmwareType.singleImage;
@@ -122,166 +128,264 @@ class _FirmwareListState extends State {
Navigator.pop(context);
}
- Container _body() {
- // ignore: avoid_unnecessary_containers
- return Container(
- alignment: Alignment.center,
- child: FutureBuilder>(
- future: _firmwareFuture,
- builder: (context, snapshot) {
- if (snapshot.hasData) {
- List apps = snapshot.data!;
- return _listBuilder(apps);
- } else if (snapshot.hasError) {
- return Expanded(
- child: Column(
- children: [
- PlatformText("Could not fetch firmware update, plase try again"),
- const SizedBox(height: 16),
- PlatformElevatedButton(
- onPressed: () {
- setState(_loadFirmwares);
- },
- child: PlatformText('Reload'),
- ),
- ],
- ),
- );
+ Widget _body() {
+ return FutureBuilder>(
+ future: _firmwareFuture,
+ builder: (context, snapshot) {
+ if (snapshot.hasData) {
+ final entries = snapshot.data!;
+ if (entries.isEmpty) {
+ return Center(child: PlatformText('No firmware available'));
}
- return const CircularProgressIndicator();
- },
+ return _listBuilder(entries);
+ } else if (snapshot.hasError) {
+ return _errorWidget();
+ }
+ return const Center(child: CircularProgressIndicator());
+ },
+ );
+ }
+
+ Widget _errorWidget() {
+ return Center(
+ child: Column(
+ mainAxisSize: MainAxisSize.min,
+ crossAxisAlignment: CrossAxisAlignment.center,
+ children: [
+ PlatformText("Could not fetch firmware, please try again"),
+ const SizedBox(height: 16),
+ PlatformElevatedButton(
+ onPressed: _loadFirmwares,
+ child: PlatformText('Reload'),
+ ),
+ ],
),
);
}
- Widget _listBuilder(List apps) {
- final visibleApps = _expanded ? apps : [apps.first];
-
- return Column(
- children: [
- ListView.builder(
- shrinkWrap: true,
- physics: const NeverScrollableScrollPhysics(),
- itemCount: visibleApps.length,
- itemBuilder: (context, index) {
- final firmware = visibleApps[index];
- final isLatest = firmware == apps.first;
- final remarks = [];
- bool isInstalled = false;
-
- if (firmwareVersion != null &&
- firmware.version
- .contains(firmwareVersion!.replaceAll('\x00', ''))) {
- remarks.add('Current');
- isInstalled = true;
- }
-
- if (isLatest) {
- remarks.add('Latest');
- }
-
- return ListTile(
- title: PlatformText(
- firmware.name,
- style: TextStyle(
- color: isLatest ? Colors.black : Colors.grey,
- ),
- ),
- subtitle: PlatformText(
- remarks.join(', '),
- style: TextStyle(
- color: isLatest ? Colors.black : Colors.grey,
- ),
+ Widget _listBuilder(List entries) {
+ final stableEntries = entries.where((e) => e.isStable).toList();
+ final betaEntries = entries.where((e) => e.isBeta).toList();
+ final latestStable = stableEntries.isNotEmpty ? stableEntries.first : null;
+
+ final visibleEntries = _expanded ? entries : [entries.first];
+
+ return SafeArea(
+ child: SingleChildScrollView(
+ child: Column(
+ children: [
+ if (_showBeta && betaEntries.isNotEmpty) _betaWarningBanner(),
+ ListView.builder(
+ shrinkWrap: true,
+ physics: const NeverScrollableScrollPhysics(),
+ itemCount: visibleEntries.length,
+ itemBuilder: (context, index) =>
+ _firmwareListItem(visibleEntries[index], latestStable, index),
+ ),
+ if (entries.length > 1) _expandButton(),
+ const SizedBox(height: 16), // Simple bottom padding
+ ],
+ ),
+ ),
+ );
+ }
+
+ Widget _betaWarningBanner() {
+ return Container(
+ width: double.infinity,
+ padding: const EdgeInsets.all(12),
+ color: Colors.orange.withValues(alpha: 0.2),
+ child: Row(
+ children: [
+ Icon(Icons.warning, color: Colors.orange, size: 20),
+ const SizedBox(width: 8),
+ Expanded(
+ child: PlatformText(
+ 'Beta firmware is experimental and may be unstable. Use at your own risk.',
+ style: TextStyle(
+ color: Colors.orange.shade900,
+ fontSize: 12,
+ fontWeight: FontWeight.w500,
),
- onTap: () {
- if (isInstalled) {
- showDialog(
- context: context,
- builder: (context) => PlatformAlertDialog(
- title: PlatformText('Already Installed'),
- content: PlatformText(
- 'This firmware version is already installed on the device.',
- ),
- actions: [
- PlatformTextButton(
- onPressed: () => Navigator.of(context).pop(),
- child: PlatformText('Cancel'),
- ),
- PlatformTextButton(
- onPressed: () {
- final selectedFW = apps[index];
- context
- .read()
- .setFirmware(selectedFW);
- Navigator.of(context).pop();
- Navigator.pop(context, 'Firmware $index');
- },
- child: PlatformText('Install Anyway'),
- ),
- ],
- ),
- );
- } else if (!isLatest) {
- showDialog(
- context: context,
- builder: (context) => PlatformAlertDialog(
- title: PlatformText('Warning'),
- content: PlatformText(
- 'You are selecting an old firmware version. We recommend installing the newest version.',
- ),
- actions: [
- PlatformTextButton(
- onPressed: () => Navigator.of(context).pop(),
- child: PlatformText('Cancel'),
- ),
- PlatformTextButton(
- onPressed: () {
- final selectedFW = apps[index];
- context
- .read()
- .setFirmware(selectedFW);
- Navigator.of(context).pop();
- Navigator.pop(context, 'Firmware $index');
- },
- child: PlatformText('Proceed'),
- ),
- ],
- ),
- );
- } else {
- context
- .read()
- .setFirmware(firmware);
- Navigator.pop(context, 'Firmware $index');
- }
- },
- );
- },
+ ),
+ ),
+ ],
+ ),
+ );
+ }
+
+ Widget _firmwareListItem(
+ FirmwareEntry entry,
+ FirmwareEntry? latestStable,
+ int index,
+ ) {
+ final firmware = entry.firmware;
+ final isBeta = entry.isBeta;
+ final isLatestStable = entry == latestStable;
+ final remarks = [];
+ bool isInstalled = false;
+
+ if (firmwareVersion != null &&
+ firmware.version.contains(firmwareVersion!.replaceAll('\x00', ''))) {
+ remarks.add('Current');
+ isInstalled = true;
+ }
+
+ if (isLatestStable) {
+ remarks.add('Latest');
+ }
+
+ if (isBeta) {
+ remarks.add('Beta');
+ }
+
+ return ListTile(
+ leading: isBeta ? Icon(Icons.bug_report, color: Colors.orange) : null,
+ title: PlatformText(
+ firmware.name,
+ style: TextStyle(
+ color: isLatestStable ? Colors.black : Colors.grey,
),
- if (apps.length > 1)
+ ),
+ subtitle: PlatformText(
+ remarks.join(', '),
+ style: TextStyle(
+ color: isLatestStable ? Colors.black : Colors.grey,
+ ),
+ ),
+ onTap: () => _onFirmwareTap(
+ firmware,
+ index,
+ isInstalled,
+ isLatestStable,
+ isBeta,
+ ),
+ );
+ }
+
+ Widget _expandButton() {
+ return PlatformTextButton(
+ child: Row(
+ mainAxisSize: MainAxisSize.min,
+ children: [
+ PlatformText(
+ _expanded ? 'Hide older versions' : 'Show older versions',
+ style: TextStyle(color: Colors.black),
+ ),
+ SizedBox(width: 8),
+ Icon(
+ _expanded ? Icons.keyboard_arrow_up : Icons.keyboard_arrow_down,
+ ),
+ ],
+ ),
+ onPressed: () {
+ setState(() {
+ _expanded = !_expanded;
+ });
+ },
+ );
+ }
+
+ void _onFirmwareTap(
+ RemoteFirmware firmware,
+ int index,
+ bool isInstalled,
+ bool isLatest,
+ bool isBeta,
+ ) {
+ if (isInstalled) {
+ _showInstalledDialog(firmware, index);
+ } else if (isBeta) {
+ _showBetaWarningDialog(firmware, index);
+ } else if (!isLatest) {
+ _showOldVersionWarningDialog(firmware, index);
+ } else {
+ _installFirmware(firmware, index);
+ }
+ }
+
+ void _showInstalledDialog(RemoteFirmware firmware, int index) {
+ showDialog(
+ context: context,
+ builder: (context) => PlatformAlertDialog(
+ title: PlatformText('Already Installed'),
+ content: PlatformText(
+ 'This firmware version is already installed on the device.',
+ ),
+ actions: [
+ PlatformTextButton(
+ onPressed: () => Navigator.of(context).pop(),
+ child: PlatformText('Cancel'),
+ ),
PlatformTextButton(
- child: Row(
- mainAxisSize: MainAxisSize.min,
- children: [
- PlatformText(
- _expanded ? 'Hide older versions' : 'Show older versions',
- style: TextStyle(color: Colors.black),
- ),
- SizedBox(width: 8),
- Icon(
- _expanded
- ? Icons.keyboard_arrow_up
- : Icons.keyboard_arrow_down,
- ),
- ],
+ onPressed: () {
+ _installFirmware(firmware, index);
+ Navigator.of(context).pop();
+ },
+ child: PlatformText('Install Anyway'),
+ ),
+ ],
+ ),
+ );
+ }
+
+ void _showBetaWarningDialog(RemoteFirmware firmware, int index) {
+ showDialog(
+ context: context,
+ builder: (context) => PlatformAlertDialog(
+ title: PlatformText('Beta Firmware Warning'),
+ content: PlatformText(
+ 'You are about to install beta firmware from a pull request. '
+ 'This firmware may be unstable or incomplete. '
+ 'Proceed at your own risk.',
+ ),
+ actions: [
+ PlatformTextButton(
+ onPressed: () => Navigator.of(context).pop(),
+ child: PlatformText('Cancel'),
+ ),
+ PlatformTextButton(
+ onPressed: () {
+ _installFirmware(firmware, index);
+ Navigator.of(context).pop();
+ },
+ child: PlatformText(
+ 'Install',
+ style: TextStyle(color: Colors.red),
),
+ ),
+ ],
+ ),
+ );
+ }
+
+ void _showOldVersionWarningDialog(RemoteFirmware firmware, int index) {
+ showDialog(
+ context: context,
+ builder: (context) => PlatformAlertDialog(
+ title: PlatformText('Warning'),
+ content: PlatformText(
+ 'You are selecting an old firmware version. We recommend installing the newest version.',
+ ),
+ actions: [
+ PlatformTextButton(
+ onPressed: () => Navigator.of(context).pop(),
+ child: PlatformText('Cancel'),
+ ),
+ PlatformTextButton(
onPressed: () {
- setState(() {
- _expanded = !_expanded;
- });
+ _installFirmware(firmware, index);
+ Navigator.of(context).pop();
},
+ child: PlatformText('Proceed'),
),
- ],
+ ],
+ ),
);
}
+
+ void _installFirmware(RemoteFirmware firmware, int index) {
+ context.read().setFirmware(firmware);
+ Navigator.pop(context, 'Firmware $index');
+ }
}
diff --git a/open_wearable/macos/Flutter/GeneratedPluginRegistrant.swift b/open_wearable/macos/Flutter/GeneratedPluginRegistrant.swift
index a3e457d4..7da018f9 100644
--- a/open_wearable/macos/Flutter/GeneratedPluginRegistrant.swift
+++ b/open_wearable/macos/Flutter/GeneratedPluginRegistrant.swift
@@ -9,7 +9,6 @@ import file_picker
import file_selector_macos
import flutter_archive
import open_file_mac
-import path_provider_foundation
import share_plus
import shared_preferences_foundation
import universal_ble
@@ -20,7 +19,6 @@ func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
FileSelectorPlugin.register(with: registry.registrar(forPlugin: "FileSelectorPlugin"))
FlutterArchivePlugin.register(with: registry.registrar(forPlugin: "FlutterArchivePlugin"))
OpenFilePlugin.register(with: registry.registrar(forPlugin: "OpenFilePlugin"))
- PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin"))
SharePlusMacosPlugin.register(with: registry.registrar(forPlugin: "SharePlusMacosPlugin"))
SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin"))
UniversalBlePlugin.register(with: registry.registrar(forPlugin: "UniversalBlePlugin"))
diff --git a/open_wearable/pubspec.lock b/open_wearable/pubspec.lock
index 78870ac3..034ce0e3 100644
--- a/open_wearable/pubspec.lock
+++ b/open_wearable/pubspec.lock
@@ -57,6 +57,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "1.1.2"
+ code_assets:
+ dependency: transitive
+ description:
+ name: code_assets
+ sha256: "83ccdaa064c980b5596c35dd64a8d3ecc68620174ab9b90b6343b753aa721687"
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.0.0"
collection:
dependency: transitive
description:
@@ -93,10 +101,10 @@ packages:
dependency: transitive
description:
name: cross_file
- sha256: "701dcfc06da0882883a2657c445103380e53e647060ad8d9dfb710c100996608"
+ sha256: "28bb3ae56f117b5aec029d702a90f57d285cd975c3c5c281eaca38dbc47c5937"
url: "https://pub.dev"
source: hosted
- version: "0.3.5+1"
+ version: "0.3.5+2"
crypto:
dependency: transitive
description:
@@ -157,10 +165,10 @@ packages:
dependency: "direct main"
description:
name: file_picker
- sha256: d974b6ba2606371ac71dd94254beefb6fa81185bde0b59bdc1df09885da85fde
+ sha256: "57d9a1dd5063f85fa3107fb42d1faffda52fdc948cefd5fe5ea85267a5fc7343"
url: "https://pub.dev"
source: hosted
- version: "10.3.8"
+ version: "10.3.10"
file_selector:
dependency: "direct main"
description:
@@ -328,6 +336,14 @@ packages:
description: flutter
source: sdk
version: "0.0.0"
+ glob:
+ dependency: transitive
+ description:
+ name: glob
+ sha256: c3f1ee72c96f8f78935e18aa8cecced9ab132419e8625dc187e1c2408efc20de
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.1.3"
go_router:
dependency: "direct main"
description:
@@ -336,8 +352,16 @@ packages:
url: "https://pub.dev"
source: hosted
version: "14.8.1"
- http:
+ hooks:
dependency: transitive
+ description:
+ name: hooks
+ sha256: "7a08a0d684cb3b8fb604b78455d5d352f502b68079f7b80b831c62220ab0a4f6"
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.0.1"
+ http:
+ dependency: "direct main"
description:
name: http
sha256: "87721a4a50b19c7f1d49001e51409bddc46303966ce89a65af4f4e6004896412"
@@ -364,10 +388,10 @@ packages:
dependency: transitive
description:
name: json_annotation
- sha256: "1ce844379ca14835a50d2f019a3099f419082cfdd231cd86a142af94dd5c6bb1"
+ sha256: "805fa86df56383000f640384b282ce0cb8431f1a7a2396de92fb66186d8c57df"
url: "https://pub.dev"
source: hosted
- version: "4.9.0"
+ version: "4.10.0"
leak_tracker:
dependency: transitive
description:
@@ -396,10 +420,10 @@ packages:
dependency: transitive
description:
name: lints
- sha256: a5e2b223cb7c9c8efdc663ef484fdd95bb243bff242ef5b13e26883547fce9a0
+ sha256: "12f842a479589fea194fe5c5a3095abc7be0c1f2ddfa9a0e76aed1dbd26a87df"
url: "https://pub.dev"
source: hosted
- version: "6.0.0"
+ version: "6.1.0"
logger:
dependency: "direct main"
description:
@@ -456,6 +480,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "2.0.0"
+ native_toolchain_c:
+ dependency: transitive
+ description:
+ name: native_toolchain_c
+ sha256: "89e83885ba09da5fdf2cdacc8002a712ca238c28b7f717910b34bcd27b0d03ac"
+ url: "https://pub.dev"
+ source: hosted
+ version: "0.17.4"
nested:
dependency: transitive
description:
@@ -464,14 +496,22 @@ packages:
url: "https://pub.dev"
source: hosted
version: "1.0.0"
+ objective_c:
+ dependency: transitive
+ description:
+ name: objective_c
+ sha256: "983c7fa1501f6dcc0cb7af4e42072e9993cb28d73604d25ebf4dab08165d997e"
+ url: "https://pub.dev"
+ source: hosted
+ version: "9.2.5"
open_earable_flutter:
dependency: "direct main"
description:
name: open_earable_flutter
- sha256: beec110a534837dedec5ab92118824def851d9a712d1f749b486affef0af9d7d
+ sha256: "23b784abdb9aa2a67afd6bcf22778cc9e3d124eba5a4d02f49443581fa3f8958"
url: "https://pub.dev"
source: hosted
- version: "2.3.0"
+ version: "2.3.1"
open_file:
dependency: "direct main"
description:
@@ -572,10 +612,10 @@ packages:
dependency: transitive
description:
name: path_provider_foundation
- sha256: "6d13aece7b3f5c5a9731eaf553ff9dcbc2eff41087fd2df587fd0fed9a3eb0c4"
+ sha256: "2a376b7d6392d80cd3705782d2caa734ca4727776db0b6ec36ef3f1855197699"
url: "https://pub.dev"
source: hosted
- version: "2.5.1"
+ version: "2.6.0"
path_provider_linux:
dependency: transitive
description:
@@ -732,10 +772,10 @@ packages:
dependency: transitive
description:
name: shared_preferences_android
- sha256: "83af5c682796c0f7719c2bbf74792d113e40ae97981b8f266fa84574573556bc"
+ sha256: cbc40be9be1c5af4dab4d6e0de4d5d3729e6f3d65b89d21e1815d57705644a6f
url: "https://pub.dev"
source: hosted
- version: "2.4.18"
+ version: "2.4.20"
shared_preferences_foundation:
dependency: transitive
description:
@@ -905,10 +945,10 @@ packages:
dependency: transitive
description:
name: url_launcher_web
- sha256: "4bd2b7b4dc4d4d0b94e5babfffbca8eac1a126c7f3d6ecbc1a11013faa3abba2"
+ sha256: d0412fcf4c6b31ecfdb7762359b7206ffba3bbffd396c6d9f9c4616ece476c1f
url: "https://pub.dev"
source: hosted
- version: "2.4.1"
+ version: "2.4.2"
url_launcher_windows:
dependency: transitive
description:
@@ -945,10 +985,10 @@ packages:
dependency: transitive
description:
name: vector_graphics_compiler
- sha256: d354a7ec6931e6047785f4db12a1f61ec3d43b207fc0790f863818543f8ff0dc
+ sha256: "201e876b5d52753626af64b6359cd13ac6011b80728731428fd34bc840f71c9b"
url: "https://pub.dev"
source: hosted
- version: "1.1.19"
+ version: "1.1.20"
vector_math:
dependency: transitive
description:
@@ -997,6 +1037,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "6.6.1"
+ yaml:
+ dependency: transitive
+ description:
+ name: yaml
+ sha256: b9da305ac7c39faa3f030eccd175340f968459dae4af175130b3fc47e40d76ce
+ url: "https://pub.dev"
+ source: hosted
+ version: "3.1.3"
sdks:
- dart: ">=3.10.0 <4.0.0"
- flutter: ">=3.38.0"
+ dart: ">=3.10.3 <4.0.0"
+ flutter: ">=3.38.4"
diff --git a/open_wearable/pubspec.yaml b/open_wearable/pubspec.yaml
index 4f1365d1..b16076c9 100644
--- a/open_wearable/pubspec.yaml
+++ b/open_wearable/pubspec.yaml
@@ -35,7 +35,7 @@ dependencies:
# Use with the CupertinoIcons class for iOS style icons.
cupertino_icons: ^1.0.8
open_file: ^3.3.2
- open_earable_flutter: ^2.3.0
+ open_earable_flutter: ^2.3.1
flutter_platform_widgets: ^9.0.0
provider: ^6.1.2
logger: ^2.5.0
@@ -54,6 +54,7 @@ dependencies:
shared_preferences: ^2.5.3
url_launcher: ^6.3.2
go_router: ^14.6.2
+ http: ^1.6.0
dev_dependencies:
flutter_test: