diff --git a/.vscode/launch.json b/.vscode/launch.json
index deabf1d3..df4131e5 100644
--- a/.vscode/launch.json
+++ b/.vscode/launch.json
@@ -14,7 +14,7 @@
"program": "lib/main.dart",
"args": [
"--flavor",
- "dev"
+ "nightly"
]
},
{
diff --git a/android/app/src/nightly/res/drawable/ic_launcher_monochrome.xml b/android/app/src/nightly/res/drawable/ic_launcher_monochrome.xml
new file mode 100644
index 00000000..8aae0e6c
--- /dev/null
+++ b/android/app/src/nightly/res/drawable/ic_launcher_monochrome.xml
@@ -0,0 +1,27 @@
+
+
+
+
+
diff --git a/android/app/src/nightly/res/mipmap-anydpi-v26/ic_launcher.xml b/android/app/src/nightly/res/mipmap-anydpi-v26/ic_launcher.xml
index c79c58a3..83e651db 100644
--- a/android/app/src/nightly/res/mipmap-anydpi-v26/ic_launcher.xml
+++ b/android/app/src/nightly/res/mipmap-anydpi-v26/ic_launcher.xml
@@ -1,9 +1,6 @@
-
-
-
-
-
+
+
+
+
\ No newline at end of file
diff --git a/lib/pages/settings/logs.dart b/lib/pages/settings/logs.dart
index f9439317..3a4f7715 100644
--- a/lib/pages/settings/logs.dart
+++ b/lib/pages/settings/logs.dart
@@ -25,75 +25,76 @@ class LogsPage extends HookConsumerWidget {
return Scaffold(
headers: [
- TitleBar(
- title: Text(context.l10n.logs),
- leading: const [BackButton()],
- trailing: [
- IconButton.ghost(
- icon: const Icon(SpotubeIcons.clipboard, size: 16),
- onPressed: () async {
- final logsSnapshot = await ref.read(logsProvider.future);
+ SafeArea(
+ bottom: false,
+ child: TitleBar(
+ title: Text(context.l10n.logs),
+ leading: const [BackButton()],
+ trailing: [
+ IconButton.ghost(
+ icon: const Icon(SpotubeIcons.clipboard, size: 16),
+ onPressed: () async {
+ final logsSnapshot = await ref.read(logsProvider.future);
- await Clipboard.setData(ClipboardData(text: logsSnapshot));
- if (context.mounted) {
- showToast(
- context: context,
- location: ToastLocation.topRight,
- builder: (context, overlay) {
- return SurfaceCard(
- child: Basic(
- title: Text(context.l10n.copied_to_clipboard("")),
- ),
- );
- },
- );
- }
- },
- ),
- IconButton.ghost(
- icon: const Icon(
- SpotubeIcons.trash,
- size: 16,
+ await Clipboard.setData(ClipboardData(text: logsSnapshot));
+ if (context.mounted) {
+ showToast(
+ context: context,
+ location: ToastLocation.topRight,
+ builder: (context, overlay) {
+ return SurfaceCard(
+ child: Basic(
+ title: Text(context.l10n.copied_to_clipboard("")),
+ ),
+ );
+ },
+ );
+ }
+ },
),
- onPressed: () async {
- ref.invalidate(logsProvider);
+ IconButton.ghost(
+ icon: const Icon(
+ SpotubeIcons.trash,
+ size: 16,
+ ),
+ onPressed: () async {
+ ref.invalidate(logsProvider);
- final logsFile = await AppLogger.getLogsPath();
+ final logsFile = await AppLogger.getLogsPath();
- await logsFile.writeAsString("");
- },
- )
- ],
+ await logsFile.writeAsString("");
+ },
+ )
+ ],
+ ),
)
],
- child: SafeArea(
- child: switch (logsQuery) {
- AsyncData(:final value) => InterScrollbar(
+ child: switch (logsQuery) {
+ AsyncData(:final value) => InterScrollbar(
+ controller: controller,
+ child: SingleChildScrollView(
+ padding: const EdgeInsets.all(8.0),
controller: controller,
- child: SingleChildScrollView(
- padding: const EdgeInsets.all(8.0),
- controller: controller,
- child: Card(child: SelectableText(value)),
- ),
+ child: Card(child: SelectableText(value)),
),
- AsyncError(:final error) => switch (error) {
- StateError() => Column(
- mainAxisAlignment: MainAxisAlignment.center,
- children: [
- Undraw(
- illustration: UndrawIllustration.noData,
- height: 200 * context.theme.scaling,
- width: 200 * context.theme.scaling,
- color: context.theme.colorScheme.primary,
- ),
- Text(context.l10n.no_logs_found).muted().small(),
- ],
- ),
- _ => Center(child: Text(error.toString())),
- },
- _ => const Center(child: CircularProgressIndicator()),
- },
- ),
+ ),
+ AsyncError(:final error) => switch (error) {
+ StateError() => Column(
+ mainAxisAlignment: MainAxisAlignment.center,
+ children: [
+ Undraw(
+ illustration: UndrawIllustration.noData,
+ height: 200 * context.theme.scaling,
+ width: 200 * context.theme.scaling,
+ color: context.theme.colorScheme.primary,
+ ),
+ Text(context.l10n.no_logs_found).muted().small(),
+ ],
+ ),
+ _ => Center(child: Text(error.toString())),
+ },
+ _ => const Center(child: CircularProgressIndicator()),
+ },
);
}
}
diff --git a/lib/provider/logs/logs_provider.dart b/lib/provider/logs/logs_provider.dart
index 571d96cc..d39059ac 100644
--- a/lib/provider/logs/logs_provider.dart
+++ b/lib/provider/logs/logs_provider.dart
@@ -5,12 +5,14 @@ import 'package:spotube/services/logger/logger.dart';
final logsProvider = StreamProvider.autoDispose((ref) async* {
final file = await AppLogger.getLogsPath();
- final stream = file.openRead().transform(utf8.decoder);
+ // Check if file is empty or non-existent
- if (await stream.isEmpty) {
- throw StateError('No logs found');
+ if (await file.length() == 0) {
+ throw StateError("Logs file is empty or non-existent");
}
+ final stream = file.openRead().transform(utf8.decoder);
+
await for (final line in stream) {
yield line;
}
diff --git a/lib/services/audio_services/audio_services.dart b/lib/services/audio_services/audio_services.dart
index 0b1843c4..6433707d 100644
--- a/lib/services/audio_services/audio_services.dart
+++ b/lib/services/audio_services/audio_services.dart
@@ -2,6 +2,7 @@ import 'package:audio_service/audio_service.dart';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:spotify/spotify.dart';
+import 'package:spotube/collections/env.dart';
import 'package:spotube/extensions/artist_simple.dart';
import 'package:spotube/extensions/image.dart';
import 'package:spotube/provider/audio_player/audio_player.dart';
@@ -27,8 +28,14 @@ class AudioServices with WidgetsBindingObserver {
? await AudioService.init(
builder: () => MobileAudioService(playback),
config: AudioServiceConfig(
- androidNotificationChannelId:
- kIsLinux ? 'spotube' : 'com.krtirtho.Spotube',
+ androidNotificationChannelId: switch ((
+ kIsLinux,
+ Env.releaseChannel
+ )) {
+ (true, _) => "spotube",
+ (_, ReleaseChannel.stable) => "com.krtirtho.Spotube",
+ (_, ReleaseChannel.nightly) => "com.krtirtho.Spotube.nightly",
+ },
androidNotificationChannelName: 'Spotube',
androidNotificationOngoing: false,
androidStopForegroundOnPause: false,
diff --git a/pubspec.lock b/pubspec.lock
index 1a35f9c9..1e9d9265 100644
--- a/pubspec.lock
+++ b/pubspec.lock
@@ -98,10 +98,10 @@ packages:
dependency: "direct main"
description:
name: async
- sha256: d2872f9c19731c2e5f10444b14686eb7cc85c76274bd6c16e1816bff9a3bab63
+ sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c"
url: "https://pub.dev"
source: hosted
- version: "2.12.0"
+ version: "2.11.0"
audio_service:
dependency: "direct main"
description:
@@ -203,10 +203,10 @@ packages:
dependency: transitive
description:
name: boolean_selector
- sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea"
+ sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66"
url: "https://pub.dev"
source: hosted
- version: "2.1.2"
+ version: "2.1.1"
build:
dependency: transitive
description:
@@ -347,10 +347,10 @@ packages:
dependency: transitive
description:
name: clock
- sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b
+ sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf
url: "https://pub.dev"
source: hosted
- version: "1.1.2"
+ version: "1.1.1"
code_builder:
dependency: transitive
description:
@@ -614,10 +614,10 @@ packages:
dependency: transitive
description:
name: fake_async
- sha256: "6a95e56b2449df2273fd8c45a662d6947ce1ebb7aafe80e550a3f68297f3cacc"
+ sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78"
url: "https://pub.dev"
source: hosted
- version: "1.3.2"
+ version: "1.3.1"
ffi:
dependency: transitive
description:
@@ -630,10 +630,10 @@ packages:
dependency: transitive
description:
name: file
- sha256: a3b4f84adafef897088c160faf7dfffb7696046cb13ae90b508c2cbc95d3b8d4
+ sha256: "5fc22d7c25582e38ad9a8515372cd9a93834027aacf1801cf01164dac0ffa08c"
url: "https://pub.dev"
source: hosted
- version: "7.0.1"
+ version: "7.0.0"
file_picker:
dependency: "direct main"
description:
@@ -1370,18 +1370,18 @@ packages:
dependency: transitive
description:
name: leak_tracker
- sha256: c35baad643ba394b40aac41080300150a4f08fd0fd6a10378f8f7c6bc161acec
+ sha256: "7bb2830ebd849694d1ec25bf1f44582d6ac531a57a365a803a6034ff751d2d06"
url: "https://pub.dev"
source: hosted
- version: "10.0.8"
+ version: "10.0.7"
leak_tracker_flutter_testing:
dependency: transitive
description:
name: leak_tracker_flutter_testing
- sha256: f8b613e7e6a13ec79cfdc0e97638fddb3ab848452eff057653abd3edba760573
+ sha256: "9491a714cca3667b60b5c420da8217e6de0d1ba7a5ec322fab01758f6998f379"
url: "https://pub.dev"
source: hosted
- version: "3.0.9"
+ version: "3.0.8"
leak_tracker_testing:
dependency: transitive
description:
@@ -1690,10 +1690,10 @@ packages:
dependency: "direct main"
description:
name: path
- sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5"
+ sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af"
url: "https://pub.dev"
source: hosted
- version: "1.9.1"
+ version: "1.9.0"
path_parsing:
dependency: transitive
description:
@@ -1826,10 +1826,10 @@ packages:
dependency: transitive
description:
name: platform
- sha256: "5d6b1b0036a5f331ebc77c850ebc8506cbc1e9416c27e59b439f917a902a4984"
+ sha256: "9b71283fc13df574056616011fb138fd3b793ea47cc509c189a6c3fa5f8a1a65"
url: "https://pub.dev"
source: hosted
- version: "3.1.6"
+ version: "3.1.5"
plugin_platform_interface:
dependency: transitive
description:
@@ -1866,10 +1866,10 @@ packages:
dependency: transitive
description:
name: process
- sha256: "107d8be718f120bbba9dcd1e95e3bd325b1b4a4f07db64154635ba03f2567a0d"
+ sha256: "21e54fd2faf1b5bdd5102afd25012184a6793927648ea81eea80552ac9405b32"
url: "https://pub.dev"
source: hosted
- version: "5.0.3"
+ version: "5.0.2"
process_run:
dependency: "direct dev"
description:
@@ -2305,10 +2305,10 @@ packages:
dependency: transitive
description:
name: string_scanner
- sha256: "0bd04f5bb74fcd6ff0606a888a30e917af9bd52820b178eaa464beb11dca84b6"
+ sha256: "688af5ed3402a4bde5b3a6c15fd768dbf2621a614950b17f04626c431ab3c4c3"
url: "https://pub.dev"
source: hosted
- version: "1.4.0"
+ version: "1.3.0"
stroke_text:
dependency: "direct main"
description:
@@ -2609,10 +2609,10 @@ packages:
dependency: transitive
description:
name: vm_service
- sha256: "0968250880a6c5fe7edc067ed0a13d4bae1577fe2771dcf3010d52c4a9d3ca14"
+ sha256: f6be3ed8bd01289b34d679c2b62226f63c0e69f9fd2e50a6b3c1c729a961041b
url: "https://pub.dev"
source: hosted
- version: "14.3.1"
+ version: "14.3.0"
watcher:
dependency: transitive
description: