diff --git a/lib/main.dart b/lib/main.dart index ce96c56b..2a2d8d18 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -183,8 +183,8 @@ class SpotubeState extends ConsumerState { ref.watch(paletteProvider.select((s) => s?.dominantColor?.color)); final router = ref.watch(routerProvider); - ref.read(connectServerProvider); - ref.read(connectClientsProvider); + ref.listen(connectServerProvider, (_, __) {}); + ref.listen(connectClientsProvider, (_, __) {}); useDisableBatteryOptimizations(); useInitSysTray(ref); diff --git a/lib/provider/connect/clients.dart b/lib/provider/connect/clients.dart index d2d51725..282c96aa 100644 --- a/lib/provider/connect/clients.dart +++ b/lib/provider/connect/clients.dart @@ -1,5 +1,6 @@ import 'package:bonsoir/bonsoir.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:spotube/services/device_info/device_info.dart'; class ConnectClientsState { final List services; @@ -31,9 +32,15 @@ class ConnectClientsNotifier extends AsyncNotifier { @override build() async { final discovery = BonsoirDiscovery(type: '_spotube._tcp'); + final deviceId = await DeviceInfoService.instance.deviceId(); await discovery.ready; final subscription = discovery.eventStream?.listen((event) { + // ignore device itself + if (event.service?.attributes["deviceId"] == deviceId) { + return; + } + switch (event.type) { case BonsoirDiscoveryEventType.discoveryServiceFound: state = AsyncData(state.value!.copyWith( diff --git a/lib/provider/connect/server.dart b/lib/provider/connect/server.dart index 895cd37e..0469e3f5 100644 --- a/lib/provider/connect/server.dart +++ b/lib/provider/connect/server.dart @@ -239,6 +239,7 @@ final connectServerProvider = FutureProvider((ref) async { port: port, attributes: { "id": PrimitiveUtils.uuid.v4(), + "deviceId": await DeviceInfoService.instance.deviceId(), }, ); diff --git a/lib/services/device_info/device_info.dart b/lib/services/device_info/device_info.dart index 156b5e6e..87ddd6eb 100644 --- a/lib/services/device_info/device_info.dart +++ b/lib/services/device_info/device_info.dart @@ -6,6 +6,19 @@ class DeviceInfoService { static final instance = DeviceInfoService._(); + Future deviceId() async { + final info = await deviceInfo.deviceInfo; + + return switch (info) { + AndroidDeviceInfo() => info.id, + IosDeviceInfo() => info.identifierForVendor ?? info.model, + MacOsDeviceInfo() => info.systemGUID ?? info.model, + WindowsDeviceInfo() => info.deviceId, + LinuxDeviceInfo() => info.machineId ?? info.id, + _ => 'Unknown', + }; + } + Future computerName() async { final info = await deviceInfo.deviceInfo;