feat(discord): add opt-in mobile rich presence with track artwork

This commit is contained in:
zarzet committed 2026-10-03 02:14:11 +07:00
1 parent bbe2caa754
commit 0b2cf0e4e5
40 files changed
+1839 -18

No files matched your search

@@ -0,0 +1,76 @@
import 'dart:async';
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:spotiflac_android/l10n/l10n.dart';
import 'package:spotiflac_android/providers/settings_provider.dart';
import 'package:spotiflac_android/services/discord_presence_service.dart';
import 'package:spotiflac_android/widgets/settings_group.dart';
class DiscordPresenceSettings extends ConsumerWidget {
const DiscordPresenceSettings({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
final enabled = ref.watch(
settingsProvider.select((s) => s.discordRichPresenceEnabled),
);
final service = DiscordPresenceService.instance;
final l10n = context.l10n;
return ValueListenableBuilder<DiscordPresenceStatus>(
valueListenable: service.status,
builder: (context, status, _) => SettingsGroup(
children: [
SettingsSwitchItem(
icon: Icons.headphones_outlined,
title: 'Discord Rich Presence',
subtitle: l10n.discordPresenceDescription,
value: enabled,
onChanged: ref
.read(settingsProvider.notifier)
.setDiscordRichPresenceEnabled,
showDivider: enabled,
),
if (enabled)
SettingsItem(
icon: status == DiscordPresenceStatus.active
? Icons.check_circle_outline
: Icons.info_outline,
title: switch (status) {
DiscordPresenceStatus.disabled => l10n.discordPresenceDisabled,
DiscordPresenceStatus.linkRequired => l10n.discordPresenceLink,
DiscordPresenceStatus.connecting =>
l10n.discordPresenceConnecting,
DiscordPresenceStatus.ready => l10n.discordPresenceReady,
DiscordPresenceStatus.active => l10n.discordPresenceActive,
DiscordPresenceStatus.unavailable =>
l10n.discordPresenceUnavailable,
DiscordPresenceStatus.sdkUnavailable =>
l10n.discordPresenceBuildUnavailable,
},
subtitle: Platform.isAndroid
? l10n.discordPresenceAndroidHelp
: l10n.discordPresenceIosHelp,
onTap: status == DiscordPresenceStatus.linkRequired
? () => unawaited(service.link())
: null,
showDivider: Platform.isIOS,
),
if (enabled && Platform.isIOS)
SettingsItem(
icon: Icons.link_off,
title: l10n.discordPresenceDisconnect,
onTap: () {
ref
.read(settingsProvider.notifier)
.setDiscordRichPresenceEnabled(false);
unawaited(service.forgetAccount());
},
showDivider: false,
),
],
),
);
}
}