diff --git a/lib/dynamic_color_scheme.dart b/lib/dynamic_color_scheme.dart new file mode 100644 index 0000000..83d346b --- /dev/null +++ b/lib/dynamic_color_scheme.dart @@ -0,0 +1,53 @@ +import 'package:flutter/material.dart'; + +class DynamicColorScheme extends StatefulWidget { + final Color Function(Brightness brightness) data; + final Widget Function(BuildContext context, ColorScheme colorScheme) builder; + + const DynamicColorScheme({ + required this.data, + required this.builder, + Key? key, + }) : super(key: key); + + @override + createState() => _DynamicColorSchemeState(); +} + +class _DynamicColorSchemeState extends State { + late final ValueNotifier brightness; + + @override + void initState() { + super.initState(); + brightness = ValueNotifier(MediaQuery.of(context).platformBrightness); + } + + @override + void didChangeDependencies() { + super.didChangeDependencies(); + brightness.value = MediaQuery.of(context).platformBrightness; + } + + @override + Widget build(BuildContext context) { + return ValueListenableBuilder( + valueListenable: brightness, + builder: (context, platformBrightness, child) { + final colorScheme = ColorScheme.fromSwatch( + brightness: platformBrightness, + primarySwatch: Colors.blue, + accentColor: Colors.blueAccent, + ).copyWith( + secondary: Colors.red, + ); + final color = widget.data(platformBrightness); + return widget.builder( + context, + colorScheme.copyWith( + primary: color, + )); + }, + ); + } +} diff --git a/lib/settings_page.dart b/lib/settings_page.dart index 2e906d5..d17d26d 100644 --- a/lib/settings_page.dart +++ b/lib/settings_page.dart @@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; import 'package:flutter/material.dart' as material; import 'package:fmassive/database.dart'; import 'package:fmassive/main.dart'; +import 'package:fmassive/sound_picker.dart'; import 'package:moor/moor.dart'; class SettingsPage extends StatelessWidget { @@ -47,7 +48,6 @@ class _SettingsPageState extends State<_SettingsPage> { return const Center(child: CircularProgressIndicator()); return SingleChildScrollView( - padding: const EdgeInsets.all(8.0), child: material.Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ @@ -105,46 +105,14 @@ class _SettingsPageState extends State<_SettingsPage> { .write(SettingsCompanion(steps: Value(value))); }, ), - TextField( - decoration: const InputDecoration( - labelText: 'Sound', - ), - onChanged: (value) { - db - .update(db.settings) - .write(SettingsCompanion(sound: Value(value))); - }, - ), - TextField( - decoration: const InputDecoration( - labelText: 'Light Color', - ), - onChanged: (value) { - db - .update(db.settings) - .write(SettingsCompanion(lightColor: Value(value))); - }, - ), - TextField( - decoration: const InputDecoration( - labelText: 'Dark Color', - ), - onChanged: (value) { - db - .update(db.settings) - .write(SettingsCompanion(darkColor: Value(value))); - }, - ), - TextField( - decoration: const InputDecoration( - labelText: 'Date', - ), - onChanged: (value) { - db - .update(db.settings) - .write(SettingsCompanion(date: Value(value))); - }, - ), + Center( + child: SoundPicker( + path: settings.sound, + onSelect: (path) { + db + .update(db.settings) + .write(SettingsCompanion(sound: Value(path))); + })), ], ), ); diff --git a/lib/sound_picker.dart b/lib/sound_picker.dart new file mode 100644 index 0000000..518ce33 --- /dev/null +++ b/lib/sound_picker.dart @@ -0,0 +1,43 @@ +import 'package:audioplayers/audioplayers.dart'; +import 'package:file_picker/file_picker.dart'; +import 'package:flutter/material.dart'; +import 'package:path/path.dart'; + +class SoundPicker extends StatefulWidget { + const SoundPicker({super.key, required this.onSelect, required this.path}); + + final Function(String path) onSelect; + final String? path; + + @override + createState() => _SoundPickerState(); +} + +class _SoundPickerState extends State { + final audioPlayer = AudioPlayer(); + + @override + void dispose() { + audioPlayer.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return ElevatedButton( + onPressed: () async { + FilePickerResult? result = await FilePicker.platform.pickFiles( + type: FileType.audio, + ); + if (result == null) return; + final path = result.files.first.path; + if (path == null) return; + await audioPlayer.play(DeviceFileSource(path)); + widget.onSelect(path); + }, + child: Text(widget.path != null + ? "Sound: ${basename(widget.path!)}" + : 'Alarm sound'), + ); + } +} diff --git a/linux/flutter/generated_plugin_registrant.cc b/linux/flutter/generated_plugin_registrant.cc index 2c1ec4f..b395979 100644 --- a/linux/flutter/generated_plugin_registrant.cc +++ b/linux/flutter/generated_plugin_registrant.cc @@ -6,9 +6,13 @@ #include "generated_plugin_registrant.h" +#include #include void fl_register_plugins(FlPluginRegistry* registry) { + g_autoptr(FlPluginRegistrar) audioplayers_linux_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "AudioplayersLinuxPlugin"); + audioplayers_linux_plugin_register_with_registrar(audioplayers_linux_registrar); g_autoptr(FlPluginRegistrar) sqlite3_flutter_libs_registrar = fl_plugin_registry_get_registrar_for_plugin(registry, "Sqlite3FlutterLibsPlugin"); sqlite3_flutter_libs_plugin_register_with_registrar(sqlite3_flutter_libs_registrar); diff --git a/linux/flutter/generated_plugins.cmake b/linux/flutter/generated_plugins.cmake index 7ea2a80..1ff0854 100644 --- a/linux/flutter/generated_plugins.cmake +++ b/linux/flutter/generated_plugins.cmake @@ -3,6 +3,7 @@ # list(APPEND FLUTTER_PLUGIN_LIST + audioplayers_linux sqlite3_flutter_libs ) diff --git a/macos/Flutter/GeneratedPluginRegistrant.swift b/macos/Flutter/GeneratedPluginRegistrant.swift index d2798e4..b18a3e1 100644 --- a/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/macos/Flutter/GeneratedPluginRegistrant.swift @@ -5,11 +5,13 @@ import FlutterMacOS import Foundation +import audioplayers_darwin import path_provider_foundation import sqflite import sqlite3_flutter_libs func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { + AudioplayersDarwinPlugin.register(with: registry.registrar(forPlugin: "AudioplayersDarwinPlugin")) PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin")) SqflitePlugin.register(with: registry.registrar(forPlugin: "SqflitePlugin")) Sqlite3FlutterLibsPlugin.register(with: registry.registrar(forPlugin: "Sqlite3FlutterLibsPlugin")) diff --git a/pubspec.lock b/pubspec.lock index 1d604c2..f5cc1fd 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -41,6 +41,62 @@ packages: url: "https://pub.dev" source: hosted version: "2.10.0" + audioplayers: + dependency: "direct main" + description: + name: audioplayers + sha256: "6063c05f987596ba7a3dad9bb9a5d8adfa5e7c07b9bae5301b27c11d0b3a239f" + url: "https://pub.dev" + source: hosted + version: "4.0.1" + audioplayers_android: + dependency: transitive + description: + name: audioplayers_android + sha256: fb6bca878ad175d8f6ddc0e0a2d4226d81fa7c10747c12db420e96c7a096b2cc + url: "https://pub.dev" + source: hosted + version: "3.0.1" + audioplayers_darwin: + dependency: transitive + description: + name: audioplayers_darwin + sha256: c4a56c49347b2e85ac4e1efea218948ca0fba87f04d2a3d3de07ce2410037038 + url: "https://pub.dev" + source: hosted + version: "4.0.1" + audioplayers_linux: + dependency: transitive + description: + name: audioplayers_linux + sha256: "897e24f190232a3fbb88134b062aa83a9240f55789b5e8d17c114283284ef56b" + url: "https://pub.dev" + source: hosted + version: "2.0.1" + audioplayers_platform_interface: + dependency: transitive + description: + name: audioplayers_platform_interface + sha256: "3a90a46198d375fc7d47bc1d3070c8fd8863b6469b7d87ca80f953efb090f976" + url: "https://pub.dev" + source: hosted + version: "5.0.0" + audioplayers_web: + dependency: transitive + description: + name: audioplayers_web + sha256: "4f5dcbfec0bf98ea09e243d5f5b64ea43a4e6710a2f292724bed16cdba3c691e" + url: "https://pub.dev" + source: hosted + version: "3.0.1" + audioplayers_windows: + dependency: transitive + description: + name: audioplayers_windows + sha256: "010f575653c01ccbe9756050b18df83d89426740e04b684f6438aa26c775a965" + url: "https://pub.dev" + source: hosted + version: "2.0.1" boolean_selector: dependency: transitive description: @@ -241,6 +297,14 @@ packages: url: "https://pub.dev" source: hosted version: "6.1.4" + file_picker: + dependency: "direct main" + description: + name: file_picker + sha256: dcde5ad1a0cebcf3715ea3f24d0db1888bf77027a26c77d7779e8ef63b8ade62 + url: "https://pub.dev" + source: hosted + version: "5.2.9" fixnum: dependency: transitive description: @@ -262,11 +326,24 @@ packages: url: "https://pub.dev" source: hosted version: "2.0.1" + flutter_plugin_android_lifecycle: + dependency: transitive + description: + name: flutter_plugin_android_lifecycle + sha256: c224ac897bed083dabf11f238dd11a239809b446740be0c2044608c50029ffdf + url: "https://pub.dev" + source: hosted + version: "2.0.9" flutter_test: dependency: "direct dev" description: flutter source: sdk version: "0.0.0" + flutter_web_plugins: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" frontend_server_client: dependency: transitive description: @@ -291,6 +368,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.2.0" + http: + dependency: transitive + description: + name: http + sha256: "6aa2946395183537c8b880962d935877325d6a09a2867c3970c05c0fed6ac482" + url: "https://pub.dev" + source: hosted + version: "0.13.5" http_multi_server: dependency: transitive description: @@ -672,6 +757,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.3.1" + uuid: + dependency: transitive + description: + name: uuid + sha256: "648e103079f7c64a36dc7d39369cabb358d377078a051d6ae2ad3aa539519313" + url: "https://pub.dev" + source: hosted + version: "3.0.7" vector_math: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 7c43a92..b8e0ffc 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -42,6 +42,8 @@ dependencies: path_provider: ^2.0.14 sqlite3_flutter_libs: ^0.5.13 moor: ^4.6.1+1 + file_picker: ^5.2.9 + audioplayers: ^4.0.1 dev_dependencies: flutter_test: diff --git a/windows/flutter/generated_plugin_registrant.cc b/windows/flutter/generated_plugin_registrant.cc index 988f3c8..d26368f 100644 --- a/windows/flutter/generated_plugin_registrant.cc +++ b/windows/flutter/generated_plugin_registrant.cc @@ -6,9 +6,12 @@ #include "generated_plugin_registrant.h" +#include #include void RegisterPlugins(flutter::PluginRegistry* registry) { + AudioplayersWindowsPluginRegisterWithRegistrar( + registry->GetRegistrarForPlugin("AudioplayersWindowsPlugin")); Sqlite3FlutterLibsPluginRegisterWithRegistrar( registry->GetRegistrarForPlugin("Sqlite3FlutterLibsPlugin")); } diff --git a/windows/flutter/generated_plugins.cmake b/windows/flutter/generated_plugins.cmake index 8abff95..aa9fefa 100644 --- a/windows/flutter/generated_plugins.cmake +++ b/windows/flutter/generated_plugins.cmake @@ -3,6 +3,7 @@ # list(APPEND FLUTTER_PLUGIN_LIST + audioplayers_windows sqlite3_flutter_libs )