From 2a4a23f6aaa06d3f3c32b8457da3fba615c9c231 Mon Sep 17 00:00:00 2001 From: Nutcake Date: Thu, 4 May 2023 14:44:40 +0200 Subject: [PATCH] Add platform checks and add auto refresh with rate limiting --- lib/main.dart | 14 +++++++++----- lib/widgets/friends_list.dart | 16 ++++++++++++---- lib/widgets/login_screen.dart | 2 +- lib/widgets/message_audio_player.dart | 22 +++++++++++++++++++++- lib/widgets/messages_list.dart | 2 ++ 5 files changed, 45 insertions(+), 11 deletions(-) diff --git a/lib/main.dart b/lib/main.dart index 53b589c..6f0032b 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,4 +1,5 @@ import 'dart:developer'; +import 'dart:io' show Platform; import 'package:contacts_plus_plus/clients/neos_hub.dart'; import 'package:contacts_plus_plus/clients/settings_client.dart'; @@ -12,12 +13,15 @@ import 'clients/api_client.dart'; import 'models/authentication_data.dart'; void main() async { - await Workmanager().initialize( - callbackDispatcher, // The top level function, aka callbackDispatcher - isInDebugMode: true // If enabled it will post a notification whenever the task is running. Handy for debugging tasks - ); - Logger.root.onRecord.listen((event) => log(event.message, name: event.loggerName)); WidgetsFlutterBinding.ensureInitialized(); + if (Platform.isAndroid) { + await Workmanager().initialize( + callbackDispatcher, // The top level function, aka callbackDispatcher + isInDebugMode: true // If enabled it will post a notification whenever the task is running. Handy for debugging tasks + ); + } + + Logger.root.onRecord.listen((event) => log(event.message, name: event.loggerName)); final settingsClient = SettingsClient(); await settingsClient.loadSettings(); runApp(Phoenix(child: ContactsPlusPlus(settingsClient: settingsClient,))); diff --git a/lib/widgets/friends_list.dart b/lib/widgets/friends_list.dart index 448b686..9a78fbb 100644 --- a/lib/widgets/friends_list.dart +++ b/lib/widgets/friends_list.dart @@ -19,15 +19,19 @@ class FriendsList extends StatefulWidget { } class _FriendsListState extends State { + static const Duration _autoRefreshDuration = Duration(seconds: 90); + static const Duration _refreshTimeoutDuration = Duration(seconds: 30); + final _unreads = >{}; Future>? _friendsFuture; ClientHolder? _clientHolder; - Timer? _debouncer; + Timer? _autoRefresh; + Timer? _refreshTimeout; String _searchFilter = ""; - final _unreads = >{}; @override void dispose() { - _debouncer?.cancel(); + _autoRefresh?.cancel(); + _refreshTimeout?.cancel(); super.dispose(); } @@ -42,6 +46,7 @@ class _FriendsListState extends State { } void _refreshFriendsList() { + if (_refreshTimeout?.isActive == true) return; _friendsFuture = FriendApi.getFriendsList(_clientHolder!.apiClient).then((Iterable value) async { final unreadMessages = await MessageApi.getUserMessages(_clientHolder!.apiClient, unreadOnly: true); _unreads.clear(); @@ -66,6 +71,10 @@ class _FriendsListState extends State { aVal += a.userStatus.onlineStatus.compareTo(b.userStatus.onlineStatus) * 2; return aVal.compareTo(bVal); }); + _autoRefresh?.cancel(); + _autoRefresh = Timer(_autoRefreshDuration, () => setState(() => _refreshFriendsList())); + _refreshTimeout?.cancel(); + _refreshTimeout = Timer(_refreshTimeoutDuration, () {}); return friends; }); } @@ -147,7 +156,6 @@ class _FriendsListState extends State { }); }, onExpansionChanged: (expanded) { - if (_debouncer?.isActive ?? false) _debouncer?.cancel(); if (!expanded) { setState(() { _searchFilter = ""; diff --git a/lib/widgets/login_screen.dart b/lib/widgets/login_screen.dart index 37d564b..8c0348f 100644 --- a/lib/widgets/login_screen.dart +++ b/lib/widgets/login_screen.dart @@ -104,7 +104,7 @@ class _LoginScreenState extends State { final requestResult = await notificationManager.resolvePlatformSpecificImplementation< AndroidFlutterLocalNotificationsPlugin>() ?.requestPermission(); - await settingsClient.changeSettings(settingsClient.currentSettings.copyWith(notificationsDenied: requestResult == null ? null : !requestResult)); + await settingsClient.changeSettings(settingsClient.currentSettings.copyWith(notificationsDenied: requestResult == null ? false : !requestResult)); }, child: const Text("Yes"), ) diff --git a/lib/widgets/message_audio_player.dart b/lib/widgets/message_audio_player.dart index a866842..2680b29 100644 --- a/lib/widgets/message_audio_player.dart +++ b/lib/widgets/message_audio_player.dart @@ -1,4 +1,5 @@ import 'dart:convert'; +import 'dart:io' show Platform; import 'package:contacts_plus_plus/clients/api_client.dart'; import 'package:contacts_plus_plus/auxiliary.dart'; @@ -25,13 +26,32 @@ class _MessageAudioPlayerState extends State { @override void initState() { super.initState(); - _audioPlayer.setAudioSource(AudioSource.uri(Uri.parse( + if (Platform.isAndroid) { + _audioPlayer.setAudioSource(AudioSource.uri(Uri.parse( Aux.neosDbToHttp(AudioClipContent.fromMap(jsonDecode(widget.message.content)).assetUri) ))).whenComplete(() => _audioPlayer.setLoopMode(LoopMode.off)); + } } @override Widget build(BuildContext context) { + if (!Platform.isAndroid) { + return Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Icon(Icons.error_outline, color: Theme.of(context).colorScheme.error,), + const SizedBox(height: 4,), + Text("Sorry, audio-messages are not\n supported on this platform.", textAlign: TextAlign.center, + softWrap: true, + maxLines: 3, + style: Theme.of(context).textTheme.bodySmall?.copyWith(color: Theme.of(context).colorScheme.error), + ), + ], + ), + ); + } return IntrinsicWidth( child: StreamBuilder( stream: _audioPlayer.playerStateStream, diff --git a/lib/widgets/messages_list.dart b/lib/widgets/messages_list.dart index 7840685..695fedc 100644 --- a/lib/widgets/messages_list.dart +++ b/lib/widgets/messages_list.dart @@ -1,3 +1,5 @@ +import 'dart:async'; + import 'package:cached_network_image/cached_network_image.dart'; import 'package:contacts_plus_plus/clients/api_client.dart'; import 'package:contacts_plus_plus/auxiliary.dart';