Compare commits
13 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3c77a4d5be | ||
|
|
f9061a3dc6 | ||
|
|
e12a26d5c0 | ||
|
|
6b31d28cd3 | ||
|
bff301fdb3
|
|||
|
|
2049ee4401 | ||
|
18c071826f
|
|||
|
5bfc301088
|
|||
|
a39853ba5a
|
|||
|
639417e952
|
|||
|
|
9de4def4d4 | ||
|
fa0051b606
|
|||
|
9d867fd888
|
BIN
assets/audio/alert.reversed.wav
Normal file
BIN
assets/audio/alert.reversed.wav
Normal file
Binary file not shown.
BIN
assets/audio/alert.wav
Normal file
BIN
assets/audio/alert.wav
Normal file
Binary file not shown.
Binary file not shown.
BIN
assets/audio/messages.wav
Normal file
BIN
assets/audio/messages.wav
Normal file
Binary file not shown.
Binary file not shown.
BIN
assets/audio/notification.wav
Normal file
BIN
assets/audio/notification.wav
Normal file
Binary file not shown.
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -188,7 +188,7 @@ void main() async {
|
||||
|
||||
if (!kIsWeb && (Platform.isAndroid || Platform.isIOS)) {
|
||||
FlutterNativeSplash.remove();
|
||||
talker.info("[SplashScreen] Now hiding the splash screen...");
|
||||
talker.info("[SplashScreen] Now hiding splash screen...");
|
||||
}
|
||||
|
||||
runApp(
|
||||
|
||||
@@ -1,11 +1,7 @@
|
||||
import 'dart:math' as math;
|
||||
|
||||
import 'package:flutter/services.dart';
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
import 'package:just_audio/just_audio.dart';
|
||||
import 'package:island/pods/config.dart';
|
||||
import 'package:audio_session/audio_session.dart';
|
||||
import 'package:dart_midi_pro/dart_midi_pro.dart';
|
||||
|
||||
final sfxPlayerProvider = Provider<AudioPlayer>((ref) {
|
||||
final player = AudioPlayer();
|
||||
@@ -35,7 +31,7 @@ final notificationSfxProvider = FutureProvider<void>((ref) async {
|
||||
final player = ref.watch(sfxPlayerProvider);
|
||||
await player.setVolume(0.75);
|
||||
await player.setAudioSource(
|
||||
AudioSource.asset('assets/audio/notification.mp3'),
|
||||
AudioSource.asset('assets/audio/notification.wav'),
|
||||
preload: true,
|
||||
);
|
||||
});
|
||||
@@ -43,7 +39,7 @@ final notificationSfxProvider = FutureProvider<void>((ref) async {
|
||||
final messageSfxProvider = FutureProvider<void>((ref) async {
|
||||
final player = ref.watch(sfxPlayerProvider);
|
||||
await player.setAudioSource(
|
||||
AudioSource.asset('assets/audio/messages.mp3'),
|
||||
AudioSource.asset('assets/audio/messages.wav'),
|
||||
preload: true,
|
||||
);
|
||||
});
|
||||
@@ -67,110 +63,3 @@ void playMessageSfx(WidgetRef ref) {
|
||||
if (!settings.soundEffects) return;
|
||||
_playSfx('assets/audio/messages.mp3', 0.75);
|
||||
}
|
||||
|
||||
class MiniSampleSynth {
|
||||
final String sampleAsset;
|
||||
final int baseNote; // MIDI note of the sample (usually 72 = C5 for lower pitch playback)
|
||||
|
||||
AudioPlayer? currentPlayer;
|
||||
|
||||
MiniSampleSynth({required this.sampleAsset, this.baseNote = 72});
|
||||
|
||||
Future<void> playMidiAsset(String midiAsset) async {
|
||||
final data = await rootBundle.load(midiAsset);
|
||||
final midi = MidiParser().parseMidiFromBuffer(data.buffer.asUint8List());
|
||||
|
||||
for (final track in midi.tracks) {
|
||||
int currentTick = 0;
|
||||
|
||||
for (final event in track) {
|
||||
currentTick += event.deltaTime;
|
||||
|
||||
if (event is NoteOnEvent && event.velocity > 0) {
|
||||
final note = event.noteNumber;
|
||||
final durationTicks = _estimateDuration(track, event);
|
||||
final durationMs = _ticksToMs(durationTicks, midi);
|
||||
|
||||
_scheduleNote(
|
||||
note: note,
|
||||
startMs: _ticksToMs(currentTick, midi),
|
||||
durationMs: durationMs,
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void _scheduleNote({
|
||||
required int note,
|
||||
required int startMs,
|
||||
required int durationMs,
|
||||
}) {
|
||||
Future.delayed(Duration(milliseconds: startMs), () async {
|
||||
// Stop any currently playing note
|
||||
if (currentPlayer != null) {
|
||||
await currentPlayer!.stop();
|
||||
await currentPlayer!.dispose();
|
||||
currentPlayer = null;
|
||||
}
|
||||
|
||||
final player = AudioPlayer();
|
||||
currentPlayer = player;
|
||||
|
||||
await player.setAudioSource(AudioSource.asset(sampleAsset));
|
||||
final speed = _noteToSpeed(note);
|
||||
await player.setSpeed(speed);
|
||||
await player.play();
|
||||
|
||||
Future.delayed(Duration(milliseconds: durationMs), () async {
|
||||
if (currentPlayer == player) {
|
||||
await player.stop();
|
||||
await player.dispose();
|
||||
currentPlayer = null;
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
double _noteToSpeed(int note) {
|
||||
return math.pow(2, (note - baseNote) / 12).toDouble();
|
||||
}
|
||||
|
||||
int _getTempo(MidiFile midi) {
|
||||
for (var track in midi.tracks) {
|
||||
for (var event in track) {
|
||||
if (event is SetTempoEvent) {
|
||||
return event.microsecondsPerBeat;
|
||||
}
|
||||
}
|
||||
}
|
||||
return 500000; // default 120 BPM
|
||||
}
|
||||
|
||||
int _ticksToMs(int ticks, MidiFile midi) {
|
||||
final tempo = _getTempo(midi);
|
||||
final ticksPerBeat = midi.header.ticksPerBeat ?? 480;
|
||||
|
||||
return ((ticks * tempo) / ticksPerBeat / 1000).round();
|
||||
}
|
||||
|
||||
int _estimateDuration(List<MidiEvent> track, NoteOnEvent on) {
|
||||
int ticks = 0;
|
||||
bool started = false;
|
||||
|
||||
for (final e in track) {
|
||||
if (e == on) {
|
||||
started = true;
|
||||
continue;
|
||||
}
|
||||
if (!started) continue;
|
||||
|
||||
ticks += e.deltaTime;
|
||||
|
||||
if (e is NoteOffEvent && e.noteNumber == on.noteNumber) {
|
||||
return ticks;
|
||||
}
|
||||
}
|
||||
return 200; // fallback
|
||||
}
|
||||
}
|
||||
@@ -85,7 +85,7 @@ final class AppSettingsNotifierProvider
|
||||
}
|
||||
|
||||
String _$appSettingsNotifierHash() =>
|
||||
r'0a7f75bd95850b0c564b29c57912ec8fcac53f09';
|
||||
r'fc474771ced89ec8637c0f773a9c6bc392f0df60';
|
||||
|
||||
abstract class _$AppSettingsNotifier extends $Notifier<AppSettings> {
|
||||
AppSettings build();
|
||||
|
||||
@@ -261,11 +261,11 @@ class FileListScreen extends HookConsumerWidget {
|
||||
context: context,
|
||||
isScrollControlled: true,
|
||||
builder: (context) => SheetScaffold(
|
||||
titleText: 'Usage Overview',
|
||||
child: UsageOverviewWidget(
|
||||
usage: usage,
|
||||
quota: quota,
|
||||
).padding(horizontal: 8, vertical: 16),
|
||||
titleText: 'Usage Overview',
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
@@ -7,8 +7,10 @@ import 'package:gap/gap.dart';
|
||||
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
||||
import 'package:island/main.dart';
|
||||
import 'package:island/models/account.dart';
|
||||
import 'package:island/pods/config.dart';
|
||||
import 'package:island/pods/notification.dart';
|
||||
import 'package:island/talker.dart';
|
||||
import 'package:just_audio/just_audio.dart';
|
||||
import 'package:material_symbols_icons/symbols.dart';
|
||||
import 'package:styled_widget/styled_widget.dart';
|
||||
import 'package:top_snackbar_flutter/top_snack_bar.dart';
|
||||
@@ -241,7 +243,22 @@ bool closeTopmostOverlayDialog() {
|
||||
|
||||
const kDialogMaxWidth = 480.0;
|
||||
|
||||
Future<void> _playSfx(String assetPath, double volume) async {
|
||||
final player = AudioPlayer();
|
||||
await player.setVolume(volume);
|
||||
await player.setAudioSource(AudioSource.asset(assetPath));
|
||||
await player.play();
|
||||
await player.dispose();
|
||||
}
|
||||
|
||||
void showErrorAlert(dynamic err, {IconData? icon}) {
|
||||
final context = globalOverlay.currentState!.context;
|
||||
final ref = ProviderScope.containerOf(context);
|
||||
final settings = ref.read(appSettingsProvider);
|
||||
if (settings.soundEffects) {
|
||||
unawaited(_playSfx('assets/audio/alert.reversed.wav', 0.75));
|
||||
}
|
||||
|
||||
if (err is Error) {
|
||||
talker.error('Something went wrong...', err, err.stackTrace);
|
||||
}
|
||||
@@ -292,6 +309,13 @@ void showErrorAlert(dynamic err, {IconData? icon}) {
|
||||
}
|
||||
|
||||
void showInfoAlert(String message, String title, {IconData? icon}) {
|
||||
final context = globalOverlay.currentState!.context;
|
||||
final ref = ProviderScope.containerOf(context);
|
||||
final settings = ref.read(appSettingsProvider);
|
||||
if (settings.soundEffects) {
|
||||
unawaited(_playSfx('assets/audio/alert.wav', 0.75));
|
||||
}
|
||||
|
||||
showOverlayDialog<void>(
|
||||
builder: (context, close) => ConstrainedBox(
|
||||
constraints: const BoxConstraints(maxWidth: kDialogMaxWidth),
|
||||
@@ -333,6 +357,13 @@ Future<bool> showConfirmAlert(
|
||||
IconData? icon,
|
||||
bool isDanger = false,
|
||||
}) async {
|
||||
final context = globalOverlay.currentState!.context;
|
||||
final ref = ProviderScope.containerOf(context);
|
||||
final settings = ref.read(appSettingsProvider);
|
||||
if (settings.soundEffects) {
|
||||
unawaited(_playSfx('assets/audio/alert.wav', 0.75));
|
||||
}
|
||||
|
||||
final result = await showOverlayDialog<bool>(
|
||||
builder: (context, close) => ConstrainedBox(
|
||||
constraints: const BoxConstraints(maxWidth: kDialogMaxWidth),
|
||||
@@ -422,3 +453,4 @@ Future<void> openExternalLink(Uri url, WidgetRef ref) async {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -3,7 +3,6 @@ import 'package:flutter/services.dart';
|
||||
import 'package:flutter_cache_manager/flutter_cache_manager.dart';
|
||||
import 'package:gap/gap.dart';
|
||||
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
||||
import 'package:island/pods/audio.dart';
|
||||
import 'package:island/pods/message.dart';
|
||||
import 'package:island/pods/network.dart';
|
||||
import 'package:island/services/update_service.dart';
|
||||
@@ -23,7 +22,7 @@ Future<void> _showSetTokenDialog(BuildContext context, WidgetRef ref) async {
|
||||
context: context,
|
||||
builder: (BuildContext context) {
|
||||
return AlertDialog(
|
||||
title: const Text('Set Access Token'),
|
||||
title: const Text('Set access token'),
|
||||
content: TextField(
|
||||
controller: controller,
|
||||
decoration: const InputDecoration(
|
||||
@@ -131,17 +130,26 @@ class DebugSheet extends HookConsumerWidget {
|
||||
const Divider(height: 8),
|
||||
ListTile(
|
||||
minTileHeight: 48,
|
||||
leading: const Icon(Symbols.play_arrow),
|
||||
leading: const Icon(Symbols.error),
|
||||
trailing: const Icon(Symbols.chevron_right),
|
||||
contentPadding: EdgeInsets.symmetric(horizontal: 24),
|
||||
title: Text('Play untitled'),
|
||||
onTap: () async {
|
||||
final synth = MiniSampleSynth(
|
||||
sampleAsset: 'assets/audio/messages.mp3',
|
||||
baseNote: 60,
|
||||
contentPadding: const EdgeInsets.symmetric(horizontal: 24),
|
||||
title: const Text('Test error alert'),
|
||||
onTap: () {
|
||||
showErrorAlert(
|
||||
'This is a test error message for debugging purposes.',
|
||||
);
|
||||
await synth.playMidiAsset(
|
||||
'assets/midi/never-gonna-give-you-up.mid',
|
||||
},
|
||||
),
|
||||
ListTile(
|
||||
minTileHeight: 48,
|
||||
leading: const Icon(Symbols.info),
|
||||
trailing: const Icon(Symbols.chevron_right),
|
||||
contentPadding: const EdgeInsets.symmetric(horizontal: 24),
|
||||
title: const Text('Test info alert'),
|
||||
onTap: () {
|
||||
showInfoAlert(
|
||||
'This is a test info message for debugging purposes.',
|
||||
'Test Alert',
|
||||
);
|
||||
},
|
||||
),
|
||||
|
||||
@@ -102,16 +102,16 @@ class FileListView extends HookConsumerWidget {
|
||||
useEffect(() {
|
||||
// Sync query, order, and orderDesc filters
|
||||
if (mode.value == FileListMode.unindexed) {
|
||||
unindexedNotifier.setQuery(this.query.value);
|
||||
unindexedNotifier.setQuery(query.value);
|
||||
unindexedNotifier.setOrder(order.value);
|
||||
unindexedNotifier.setOrderDesc(orderDesc.value);
|
||||
} else {
|
||||
cloudNotifier.setQuery(this.query.value);
|
||||
cloudNotifier.setQuery(query.value);
|
||||
cloudNotifier.setOrder(order.value);
|
||||
cloudNotifier.setOrderDesc(orderDesc.value);
|
||||
}
|
||||
return null;
|
||||
}, [this.query.value, order.value, orderDesc.value, mode.value]);
|
||||
}, [query.value, order.value, orderDesc.value, mode.value]);
|
||||
|
||||
final isRefreshing = ref.watch(
|
||||
mode.value == FileListMode.normal
|
||||
|
||||
124
pubspec.lock
124
pubspec.lock
@@ -13,10 +13,10 @@ packages:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: _flutterfire_internals
|
||||
sha256: e4a1b612fd2955908e26116075b3a4baf10c353418ca645b4deae231c82bf144
|
||||
sha256: cd83f7d6bd4e4c0b0b4fef802e8796784032e1cc23d7b0e982cf5d05d9bbe182
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.3.65"
|
||||
version: "1.3.66"
|
||||
adaptive_number:
|
||||
dependency: transitive
|
||||
description:
|
||||
@@ -277,10 +277,10 @@ packages:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: code_assets
|
||||
sha256: ae0db647e668cbb295a3527f0938e4039e004c80099dce2f964102373f5ce0b5
|
||||
sha256: "83ccdaa064c980b5596c35dd64a8d3ecc68620174ab9b90b6343b753aa721687"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.19.10"
|
||||
version: "1.0.0"
|
||||
code_builder:
|
||||
dependency: transitive
|
||||
description:
|
||||
@@ -313,14 +313,6 @@ packages:
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.0.1"
|
||||
console:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: console
|
||||
sha256: e04e7824384c5b39389acdd6dc7d33f3efe6b232f6f16d7626f194f6a01ad69a
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "4.1.0"
|
||||
convert:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
@@ -417,14 +409,6 @@ packages:
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.3.1"
|
||||
dart_midi_pro:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: dart_midi_pro
|
||||
sha256: "9a0273c92c0336e5694c7318fd936f64f06e938a936dd5fac6563c39954b7f6d"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.0.4+2"
|
||||
dart_style:
|
||||
dependency: transitive
|
||||
description:
|
||||
@@ -677,34 +661,34 @@ packages:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: firebase_analytics
|
||||
sha256: "8ca4832c7a6d145ce987fd07d6dfbb8c91d9058178342f20de6305fb77b1b40d"
|
||||
sha256: "91e2739bad690da2826c0cd5b28328fd15fb87adf54634cded703f34fd797a81"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "12.1.0"
|
||||
version: "12.1.1"
|
||||
firebase_analytics_platform_interface:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: firebase_analytics_platform_interface
|
||||
sha256: d00234716f415f89eb5c2cefb1238d7fd2f3120275d71414b84ae434dcdb7a19
|
||||
sha256: "62fd3f27f342c898bd819fb97fa87c0b971e9fbe03357477282c0e14e1a40c3c"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "5.0.5"
|
||||
version: "5.0.6"
|
||||
firebase_analytics_web:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: firebase_analytics_web
|
||||
sha256: e42b294e51aedb4bd4b761a886c8d6b473c44b44aa4c0b47cab06b2c66ac3fba
|
||||
sha256: "8fc488bb008439fc3b850cfac892dec1ff4cd438eee44438919a14c5e61b9828"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.6.1+1"
|
||||
version: "0.6.1+2"
|
||||
firebase_core:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: firebase_core
|
||||
sha256: "29cfa93c771d8105484acac340b5ea0835be371672c91405a300303986f4eba9"
|
||||
sha256: "923085c881663ef685269b013e241b428e1fb03cdd0ebde265d9b40ff18abf80"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "4.3.0"
|
||||
version: "4.4.0"
|
||||
firebase_core_platform_interface:
|
||||
dependency: transitive
|
||||
description:
|
||||
@@ -717,50 +701,50 @@ packages:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: firebase_core_web
|
||||
sha256: a631bbfbfa26963d68046aed949df80b228964020e9155b086eff94f462bbf1f
|
||||
sha256: "83e7356c704131ca4d8d8dd57e360d8acecbca38b1a3705c7ae46cc34c708084"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.3.1"
|
||||
version: "3.4.0"
|
||||
firebase_crashlytics:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: firebase_crashlytics
|
||||
sha256: "8d52022ee6fdd224e92c042f297d1fd0ec277195c49f39fa61b8cc500a639f00"
|
||||
sha256: a6e6cb8b2ea1214533a54e4c1b11b19c40f6a29333f3ab0854a479fdc3237c5b
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "5.0.6"
|
||||
version: "5.0.7"
|
||||
firebase_crashlytics_platform_interface:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: firebase_crashlytics_platform_interface
|
||||
sha256: "97c6a97b35e3d3dafe38fb053a65086a1efb125022d292161405848527cc25a4"
|
||||
sha256: fc6837c4c64c48fa94cab8a872a632b9194fa9208ca76a822f424b3da945584d
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.8.16"
|
||||
version: "3.8.17"
|
||||
firebase_messaging:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: firebase_messaging
|
||||
sha256: "1ad663fbb6758acec09d7e84a2e6478265f0a517f40ef77c573efd5e0089f400"
|
||||
sha256: "06fad40ea14771e969a8f2bbce1944aa20ee2f4f57f4eca5b3ba346b65f3f644"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "16.1.0"
|
||||
version: "16.1.1"
|
||||
firebase_messaging_platform_interface:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: firebase_messaging_platform_interface
|
||||
sha256: ea620e841fbcec62a96984295fc628f53ef5a8da4f53238159719ed0af7db834
|
||||
sha256: "6c49e901c77e6e10e86d98e32056a087eb1ca1b93acdf58524f1961e617657b7"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "4.7.5"
|
||||
version: "4.7.6"
|
||||
firebase_messaging_web:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: firebase_messaging_web
|
||||
sha256: "7d0fb6256202515bba8489a3d69c6bc9d52d69a4999bad789053b486c8e7323e"
|
||||
sha256: "2756f8fea583ffb9d294d15ddecb3a9ad429b023b70c9990c151fc92c54a32b3"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "4.1.1"
|
||||
version: "4.1.2"
|
||||
fixnum:
|
||||
dependency: transitive
|
||||
description:
|
||||
@@ -1253,14 +1237,6 @@ packages:
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.0.1"
|
||||
get_it:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: get_it
|
||||
sha256: ae78de7c3f2304b8d81f2bb6e320833e5e81de942188542328f074978cc0efa9
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "8.3.0"
|
||||
glob:
|
||||
dependency: transitive
|
||||
description:
|
||||
@@ -1281,10 +1257,10 @@ packages:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: google_fonts
|
||||
sha256: ca1cc501704c47e478f69a667d7f2d882755ddf7baad3f60c3b1256594467022
|
||||
sha256: "6996212014b996eaa17074e02b1b925b212f5e053832d9048970dc27255a8fb3"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "7.0.2"
|
||||
version: "7.1.0"
|
||||
graphs:
|
||||
dependency: transitive
|
||||
description:
|
||||
@@ -1321,10 +1297,10 @@ packages:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: hooks
|
||||
sha256: "5410b9f4f6c9f01e8ff0eb81c9801ea13a3c3d39f8f0b1613cda08e27eab3c18"
|
||||
sha256: "5d309c86e7ce34cd8e37aa71cb30cb652d3829b900ab145e4d9da564b31d59f7"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.20.5"
|
||||
version: "1.0.0"
|
||||
hooks_riverpod:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
@@ -1433,10 +1409,10 @@ packages:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: image_picker_android
|
||||
sha256: "5e9bf126c37c117cf8094215373c6d561117a3cfb50ebc5add1a61dc6e224677"
|
||||
sha256: "539e0030d442ce11d168896d979e04e66e28ef819eadc59aeb62b9d374a139d7"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.8.13+10"
|
||||
version: "0.8.13+11"
|
||||
image_picker_for_web:
|
||||
dependency: transitive
|
||||
description:
|
||||
@@ -1861,14 +1837,6 @@ packages:
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.0.0"
|
||||
msix:
|
||||
dependency: "direct dev"
|
||||
description:
|
||||
name: msix
|
||||
sha256: f88033fcb9e0dd8de5b18897cbebbd28ea30596810f4a7c86b12b0c03ace87e5
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.16.12"
|
||||
native_exif:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
@@ -1881,10 +1849,10 @@ packages:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: native_toolchain_c
|
||||
sha256: f8872ea6c7a50ce08db9ae280ca2b8efdd973157ce462826c82f3c3051d154ce
|
||||
sha256: "89e83885ba09da5fdf2cdacc8002a712ca238c28b7f717910b34bcd27b0d03ac"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.17.2"
|
||||
version: "0.17.4"
|
||||
nested:
|
||||
dependency: transitive
|
||||
description:
|
||||
@@ -1913,10 +1881,10 @@ packages:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: objective_c
|
||||
sha256: "55eb67ede1002d9771b3f9264d2c9d30bc364f0267bc1c6cc0883280d5f0c7cb"
|
||||
sha256: "9922a1ad59ac5afb154cc948aa6ded01987a75003651d0a2866afc23f4da624e"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "9.2.2"
|
||||
version: "9.2.3"
|
||||
octo_image:
|
||||
dependency: transitive
|
||||
description:
|
||||
@@ -2735,10 +2703,10 @@ packages:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: source_gen
|
||||
sha256: "585bc140f20da42c584ece2df28f4d9ef2566955332b626f655957b3a8c8ad54"
|
||||
sha256: "1d562a3c1f713904ebbed50d2760217fd8a51ca170ac4b05b0db490699dbac17"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "4.1.2"
|
||||
version: "4.2.0"
|
||||
source_helper:
|
||||
dependency: transitive
|
||||
description:
|
||||
@@ -3007,42 +2975,42 @@ packages:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: talker
|
||||
sha256: c300f9ea5f5433b2db03b6ff61224f25e024ad94b0b6ed996f61686118ae68ec
|
||||
sha256: a9a76f677905bc5cf62ace21a6eea49303cf06ac187bcad52b2004f0b9623fd7
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "5.1.11"
|
||||
version: "5.1.12"
|
||||
talker_dio_logger:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: talker_dio_logger
|
||||
sha256: a55fe723f3d6f34ecc7ec589b6d66dd6cf9465bd70ea2243573926c994b01255
|
||||
sha256: "51b0ca82c842abb787fd48d409e4e0299dca1cda010c17b42db74c8a81389b59"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "5.1.11"
|
||||
version: "5.1.12"
|
||||
talker_flutter:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: talker_flutter
|
||||
sha256: "5010a5309c8ff2910407634d38415576a52e689bd631378d0882db5d2e129a31"
|
||||
sha256: "93a287fd7f5a898de6b4b02a5def9acd1cda73ff3f2aa9873877a0cefa943281"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "5.1.11"
|
||||
version: "5.1.12"
|
||||
talker_logger:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: talker_logger
|
||||
sha256: "6ae95df093f1eabd2827b2e2d72c96ca881acb47dd19456beb1b1e589304916e"
|
||||
sha256: da3d91c36bad10838cba5123b6bdf7d4310411f8f7500539ce364deda3550ac6
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "5.1.11"
|
||||
version: "5.1.12"
|
||||
talker_riverpod_logger:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: talker_riverpod_logger
|
||||
sha256: "60ffe027b45a7fde3bc77af63e111ae0eae4c77dde1f0700aa564b43866f7036"
|
||||
sha256: dc20d93765a405f6c5f7a00ac4f890843b8996b9921e3f4c5d04654c0234ae12
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "5.1.11"
|
||||
version: "5.1.12"
|
||||
term_glyph:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
||||
37
pubspec.yaml
37
pubspec.yaml
@@ -19,7 +19,7 @@ publish_to: "none" # Remove this line if you wish to publish to pub.dev
|
||||
version: 3.5.0+164
|
||||
|
||||
environment:
|
||||
sdk: ^3.8.0
|
||||
sdk: ">3.10.0"
|
||||
|
||||
# Dependencies specify other packages that your package needs in order to work.
|
||||
# To automatically upgrade your package dependencies to the latest versions
|
||||
@@ -52,7 +52,7 @@ dependencies:
|
||||
flutter_highlight: ^0.7.0
|
||||
uuid: ^4.5.2
|
||||
url_launcher: ^6.3.2
|
||||
google_fonts: ^7.0.2
|
||||
google_fonts: ^7.1.0
|
||||
gap: ^3.0.1
|
||||
cached_network_image: ^3.4.1
|
||||
web: ^1.1.1
|
||||
@@ -73,12 +73,12 @@ dependencies:
|
||||
file_picker: ^10.3.8
|
||||
riverpod_annotation: ^4.0.0
|
||||
image_picker_platform_interface: ^2.11.1
|
||||
image_picker_android: ^0.8.13+10
|
||||
image_picker_android: ^0.8.13+11
|
||||
super_context_menu: ^0.9.1
|
||||
modal_bottom_sheet: ^3.0.0
|
||||
firebase_messaging: ^16.1.0
|
||||
firebase_messaging: ^16.1.1
|
||||
flutter_udid: ^4.1.1
|
||||
firebase_core: ^4.3.0
|
||||
firebase_core: ^4.4.0
|
||||
web_socket_channel: ^3.0.3
|
||||
material_symbols_icons: ^4.2892.0
|
||||
drift: ^2.30.1
|
||||
@@ -131,8 +131,8 @@ dependencies:
|
||||
flutter_app_update: ^3.2.2
|
||||
archive: ^4.0.7
|
||||
process_run: ^1.2.4
|
||||
firebase_crashlytics: ^5.0.6
|
||||
firebase_analytics: ^12.1.0
|
||||
firebase_crashlytics: ^5.0.7
|
||||
firebase_analytics: ^12.1.1
|
||||
material_color_utilities: ^0.11.1
|
||||
screenshot: ^3.0.0
|
||||
flutter_card_swiper: ^7.2.0
|
||||
@@ -150,11 +150,11 @@ dependencies:
|
||||
dart_ipc: ^1.0.1
|
||||
pretty_diff_text: ^2.1.0
|
||||
window_manager: ^0.5.1
|
||||
talker: ^5.1.11
|
||||
talker_flutter: ^5.1.11
|
||||
talker_logger: ^5.1.11
|
||||
talker_dio_logger: ^5.1.11
|
||||
talker_riverpod_logger: ^5.1.11
|
||||
talker: ^5.1.12
|
||||
talker_flutter: ^5.1.12
|
||||
talker_logger: ^5.1.12
|
||||
talker_dio_logger: ^5.1.12
|
||||
talker_riverpod_logger: ^5.1.12
|
||||
syncfusion_flutter_pdfviewer: ^31.1.21
|
||||
swipe_to: ^1.0.6
|
||||
dio_smart_retry: ^7.0.1
|
||||
@@ -174,7 +174,6 @@ dependencies:
|
||||
video_thumbnail: ^0.5.6
|
||||
just_audio: ^0.10.5
|
||||
audio_session: ^0.2.2
|
||||
dart_midi_pro: ^1.0.4+2
|
||||
|
||||
dev_dependencies:
|
||||
flutter_test:
|
||||
@@ -194,7 +193,6 @@ dev_dependencies:
|
||||
riverpod_lint: ^3.1.0
|
||||
drift_dev: ^2.30.1
|
||||
flutter_launcher_icons: ^0.14.4
|
||||
msix: ^3.16.12
|
||||
|
||||
# For information on the generic Dart part of this file, see the
|
||||
# following page: https://dart.dev/tools/pub/pubspec
|
||||
@@ -208,7 +206,6 @@ flutter:
|
||||
|
||||
# To add assets to your application, add an assets section, like this:
|
||||
assets:
|
||||
- assets/midi/
|
||||
- assets/i18n/
|
||||
- assets/images/
|
||||
- assets/images/oidc/
|
||||
@@ -267,13 +264,3 @@ flutter_native_splash:
|
||||
image_dark: "assets/icons/icon-dark.png"
|
||||
color: "#ffffff"
|
||||
color_dark: "#121212"
|
||||
|
||||
msix_config:
|
||||
display_name: Solian
|
||||
publisher_display_name: Solsynth LLC
|
||||
identity_name: dev.solian.app
|
||||
msix_version: 3.2.0.0
|
||||
logo_path: .\assets\icons\icon.png
|
||||
protocol_activation: solian, https
|
||||
app_uri_handler_hosts: solian.app
|
||||
capabilities: internetClientServer, location, microphone, webcam
|
||||
|
||||
Reference in New Issue
Block a user