From 539bac13ecd9de0bf8f1c4b6975a50cb6a479ec7 Mon Sep 17 00:00:00 2001 From: russellwheatley Date: Thu, 13 Jan 2022 15:33:33 +0000 Subject: [PATCH 1/4] fix(database): fix event channel name bug --- .../database/FirebaseDatabasePlugin.java | 26 +++++++------------ 1 file changed, 10 insertions(+), 16 deletions(-) diff --git a/packages/firebase_database/firebase_database/android/src/main/java/io/flutter/plugins/firebase/database/FirebaseDatabasePlugin.java b/packages/firebase_database/firebase_database/android/src/main/java/io/flutter/plugins/firebase/database/FirebaseDatabasePlugin.java index f77c75cda874..f9b20f90f3e1 100644 --- a/packages/firebase_database/firebase_database/android/src/main/java/io/flutter/plugins/firebase/database/FirebaseDatabasePlugin.java +++ b/packages/firebase_database/firebase_database/android/src/main/java/io/flutter/plugins/firebase/database/FirebaseDatabasePlugin.java @@ -27,6 +27,7 @@ import io.flutter.plugin.common.MethodChannel.MethodCallHandler; import io.flutter.plugin.common.MethodChannel.Result; import io.flutter.plugins.firebase.core.FlutterFirebasePlugin; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -36,7 +37,8 @@ public class FirebaseDatabasePlugin implements FlutterFirebasePlugin, FlutterPlugin, MethodCallHandler { protected static final HashMap databaseInstanceCache = new HashMap<>(); private static final String METHOD_CHANNEL_NAME = "plugins.flutter.io/firebase_database"; - private final Map queryListenersCount = new HashMap<>(); + private int listenerCount = 0; + private final ArrayList queryListeners = new ArrayList<>(); private final Map streamHandlers = new HashMap<>(); private MethodChannel methodChannel; private BinaryMessenger messenger; @@ -272,27 +274,19 @@ private Task observe(Map arguments) { final Query query = getQuery(arguments); final String eventChannelNamePrefix = (String) arguments.get(Constants.EVENT_CHANNEL_NAME_PREFIX); - - int newListenersCount; - synchronized (queryListenersCount) { - Integer currentListenersCount = queryListenersCount.get(eventChannelNamePrefix); - newListenersCount = currentListenersCount == null ? 1 : currentListenersCount + 1; - queryListenersCount.put(eventChannelNamePrefix, newListenersCount); + final String eventChannelName = eventChannelNamePrefix + "#" + listenerCount++; + synchronized (queryListeners) { + queryListeners.add(eventChannelName); } - final String eventChannelName = eventChannelNamePrefix + "#" + newListenersCount; final EventChannel eventChannel = new EventChannel(messenger, eventChannelName); final EventStreamHandler streamHandler = new EventStreamHandler( query, () -> { eventChannel.setStreamHandler(null); - synchronized (queryListenersCount) { - Integer currentListenersCount = - queryListenersCount.get(eventChannelNamePrefix); - queryListenersCount.put( - eventChannelNamePrefix, - currentListenersCount == null ? 0 : currentListenersCount - 1); + synchronized (queryListeners) { + queryListeners.remove(eventChannelName); } }); @@ -476,8 +470,8 @@ public Task didReinitializeFirebaseCore() { private void cleanup() { removeEventStreamHandlers(); - synchronized (queryListenersCount) { - queryListenersCount.clear(); + synchronized (queryListeners) { + queryListeners.clear(); } databaseInstanceCache.clear(); } From f4a01197724a0a09c4a30dbde4d8c928af9c71bf Mon Sep 17 00:00:00 2001 From: russellwheatley Date: Tue, 18 Jan 2022 15:37:21 +0000 Subject: [PATCH 2/4] chore(database): rm android rtdb listener array --- .../firebase/database/FirebaseDatabasePlugin.java | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/packages/firebase_database/firebase_database/android/src/main/java/io/flutter/plugins/firebase/database/FirebaseDatabasePlugin.java b/packages/firebase_database/firebase_database/android/src/main/java/io/flutter/plugins/firebase/database/FirebaseDatabasePlugin.java index f9b20f90f3e1..bdfd6af2e621 100644 --- a/packages/firebase_database/firebase_database/android/src/main/java/io/flutter/plugins/firebase/database/FirebaseDatabasePlugin.java +++ b/packages/firebase_database/firebase_database/android/src/main/java/io/flutter/plugins/firebase/database/FirebaseDatabasePlugin.java @@ -27,7 +27,6 @@ import io.flutter.plugin.common.MethodChannel.MethodCallHandler; import io.flutter.plugin.common.MethodChannel.Result; import io.flutter.plugins.firebase.core.FlutterFirebasePlugin; -import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -38,7 +37,6 @@ public class FirebaseDatabasePlugin protected static final HashMap databaseInstanceCache = new HashMap<>(); private static final String METHOD_CHANNEL_NAME = "plugins.flutter.io/firebase_database"; private int listenerCount = 0; - private final ArrayList queryListeners = new ArrayList<>(); private final Map streamHandlers = new HashMap<>(); private MethodChannel methodChannel; private BinaryMessenger messenger; @@ -275,9 +273,6 @@ private Task observe(Map arguments) { final String eventChannelNamePrefix = (String) arguments.get(Constants.EVENT_CHANNEL_NAME_PREFIX); final String eventChannelName = eventChannelNamePrefix + "#" + listenerCount++; - synchronized (queryListeners) { - queryListeners.add(eventChannelName); - } final EventChannel eventChannel = new EventChannel(messenger, eventChannelName); final EventStreamHandler streamHandler = @@ -285,9 +280,6 @@ private Task observe(Map arguments) { query, () -> { eventChannel.setStreamHandler(null); - synchronized (queryListeners) { - queryListeners.remove(eventChannelName); - } }); eventChannel.setStreamHandler(streamHandler); @@ -470,9 +462,6 @@ public Task didReinitializeFirebaseCore() { private void cleanup() { removeEventStreamHandlers(); - synchronized (queryListeners) { - queryListeners.clear(); - } databaseInstanceCache.clear(); } From 0ec4bbef2585b616fae44c4feda87dce7546ce78 Mon Sep 17 00:00:00 2001 From: russellwheatley Date: Tue, 18 Jan 2022 15:40:43 +0000 Subject: [PATCH 3/4] chore(rtdb): update iOS listener implementation --- .../ios/Classes/FLTFirebaseDatabasePlugin.m | 21 ++++--------------- 1 file changed, 4 insertions(+), 17 deletions(-) diff --git a/packages/firebase_database/firebase_database/ios/Classes/FLTFirebaseDatabasePlugin.m b/packages/firebase_database/firebase_database/ios/Classes/FLTFirebaseDatabasePlugin.m index e7c1ea5e1a2f..d8b86d1c601f 100644 --- a/packages/firebase_database/firebase_database/ios/Classes/FLTFirebaseDatabasePlugin.m +++ b/packages/firebase_database/firebase_database/ios/Classes/FLTFirebaseDatabasePlugin.m @@ -13,10 +13,10 @@ @implementation FLTFirebaseDatabasePlugin { // Used by FlutterStreamHandlers. NSObject *_binaryMessenger; - NSMutableDictionary *_listenerCounts; NSMutableDictionary *_streamHandlers; // Used by transactions. FlutterMethodChannel *_channel; + int _listenerCount; } #pragma mark - FlutterPlugin @@ -27,8 +27,8 @@ - (instancetype)init:(NSObject *)messenger if (self) { _channel = channel; _binaryMessenger = messenger; - _listenerCounts = [NSMutableDictionary dictionary]; _streamHandlers = [NSMutableDictionary dictionary]; + _listenerCount = 0; } return self; } @@ -355,30 +355,17 @@ - (void)queryKeepSynced:(id)arguments withMethodCallResult:(FLTFirebaseMethodCal - (void)queryObserve:(id)arguments withMethodCallResult:(FLTFirebaseMethodCallResult *)result { FIRDatabaseQuery *databaseQuery = [FLTFirebaseDatabaseUtils databaseQueryFromArguments:arguments]; NSString *eventChannelNamePrefix = arguments[@"eventChannelNamePrefix"]; - int newListenersCount; - @synchronized(_listenerCounts) { - NSNumber *currentListenersCount = _listenerCounts[eventChannelNamePrefix]; - newListenersCount = currentListenersCount == nil ? 1 : [currentListenersCount intValue] + 1; - _listenerCounts[eventChannelNamePrefix] = @(newListenersCount); - } + _listenerCount = _listenerCount + 1; NSString *eventChannelName = - [NSString stringWithFormat:@"%@#%d", eventChannelNamePrefix, newListenersCount]; + [NSString stringWithFormat:@"%@#%i", eventChannelNamePrefix, _listenerCount]; FlutterEventChannel *eventChannel = [FlutterEventChannel eventChannelWithName:eventChannelName binaryMessenger:_binaryMessenger]; - __weak FLTFirebaseDatabasePlugin *weakSelf = self; FLTFirebaseDatabaseObserveStreamHandler *streamHandler = [[FLTFirebaseDatabaseObserveStreamHandler alloc] initWithFIRDatabaseQuery:databaseQuery andOnDisposeBlock:^() { - __strong FLTFirebaseDatabasePlugin *strongSelf = weakSelf; [eventChannel setStreamHandler:nil]; - @synchronized(strongSelf->_listenerCounts) { - NSNumber *currentListenersCount = - strongSelf->_listenerCounts[eventChannelNamePrefix]; - strongSelf->_listenerCounts[eventChannelNamePrefix] = - @(currentListenersCount == nil ? 0 : [currentListenersCount intValue] - 1); - } }]; [eventChannel setStreamHandler:streamHandler]; _streamHandlers[eventChannelName] = streamHandler; From c2171ad7930d1b73866f07a22cdfb8f71009f7d2 Mon Sep 17 00:00:00 2001 From: russellwheatley Date: Tue, 18 Jan 2022 16:43:15 +0000 Subject: [PATCH 4/4] format --- .../ios/Classes/FLTFirebaseDatabasePlugin.m | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/packages/firebase_database/firebase_database/ios/Classes/FLTFirebaseDatabasePlugin.m b/packages/firebase_database/firebase_database/ios/Classes/FLTFirebaseDatabasePlugin.m index d8b86d1c601f..46fab907925f 100644 --- a/packages/firebase_database/firebase_database/ios/Classes/FLTFirebaseDatabasePlugin.m +++ b/packages/firebase_database/firebase_database/ios/Classes/FLTFirebaseDatabasePlugin.m @@ -357,16 +357,15 @@ - (void)queryObserve:(id)arguments withMethodCallResult:(FLTFirebaseMethodCallRe NSString *eventChannelNamePrefix = arguments[@"eventChannelNamePrefix"]; _listenerCount = _listenerCount + 1; NSString *eventChannelName = - [NSString stringWithFormat:@"%@#%i", eventChannelNamePrefix, _listenerCount]; + [NSString stringWithFormat:@"%@#%i", eventChannelNamePrefix, _listenerCount]; FlutterEventChannel *eventChannel = [FlutterEventChannel eventChannelWithName:eventChannelName binaryMessenger:_binaryMessenger]; FLTFirebaseDatabaseObserveStreamHandler *streamHandler = - [[FLTFirebaseDatabaseObserveStreamHandler alloc] - initWithFIRDatabaseQuery:databaseQuery - andOnDisposeBlock:^() { - [eventChannel setStreamHandler:nil]; - }]; + [[FLTFirebaseDatabaseObserveStreamHandler alloc] initWithFIRDatabaseQuery:databaseQuery + andOnDisposeBlock:^() { + [eventChannel setStreamHandler:nil]; + }]; [eventChannel setStreamHandler:streamHandler]; _streamHandlers[eventChannelName] = streamHandler; result.success(eventChannelName);