Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit cb010f6

Browse files
committed
switched to overloading setMessageHandler
1 parent 4d4cc68 commit cb010f6

File tree

9 files changed

+79
-95
lines changed

9 files changed

+79
-95
lines changed

shell/platform/android/io/flutter/embedding/engine/dart/DartExecutor.java

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -208,8 +208,11 @@ public void setMessageHandler(
208208
@Deprecated
209209
@Override
210210
@UiThread
211-
public void setTaskQueue(@NonNull String channel, @Nullable TaskQueue taskQueue) {
212-
binaryMessenger.setTaskQueue(channel, taskQueue);
211+
public void setMessageHandler(
212+
@NonNull String channel,
213+
@Nullable BinaryMessenger.BinaryMessageHandler handler,
214+
@Nullable TaskQueue taskQueue) {
215+
binaryMessenger.setMessageHandler(channel, handler, taskQueue);
213216
}
214217
// ------ END BinaryMessenger -----
215218

@@ -439,8 +442,11 @@ public void setMessageHandler(
439442

440443
@Override
441444
@UiThread
442-
public void setTaskQueue(@NonNull String channel, @Nullable TaskQueue taskQueue) {
443-
messenger.setTaskQueue(channel, taskQueue);
445+
public void setMessageHandler(
446+
@NonNull String channel,
447+
@Nullable BinaryMessenger.BinaryMessageHandler handler,
448+
@Nullable TaskQueue taskQueue) {
449+
messenger.setMessageHandler(channel, handler, taskQueue);
444450
}
445451
}
446452
}

shell/platform/android/io/flutter/embedding/engine/dart/DartMessenger.java

Lines changed: 16 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,6 @@ class DartMessenger implements BinaryMessenger, PlatformMessageHandler {
3434

3535
@NonNull private final ConcurrentHashMap<String, HandlerInfo> messageHandlers;
3636

37-
@NonNull private final HashMap<String, DartMessengerTaskQueue> taskQueues;
38-
3937
@NonNull private final Map<Integer, BinaryMessenger.BinaryReply> pendingReplies;
4038
private int nextReplyId = 1;
4139

@@ -51,7 +49,6 @@ class DartMessenger implements BinaryMessenger, PlatformMessageHandler {
5149
this.pendingReplies = new HashMap<>();
5250
this.createdTaskQueues = new WeakHashMap<TaskQueue, DartMessengerTaskQueue>();
5351
this.taskQueueFactory = taskQueueFactory;
54-
this.taskQueues = new HashMap<>();
5552
}
5653

5754
DartMessenger(@NonNull FlutterJNI flutterJNI) {
@@ -116,36 +113,31 @@ public TaskQueue makeBackgroundTaskQueue() {
116113
@Override
117114
public void setMessageHandler(
118115
@NonNull String channel, @Nullable BinaryMessenger.BinaryMessageHandler handler) {
116+
setMessageHandler(channel, handler, null);
117+
}
118+
119+
@Override
120+
public void setMessageHandler(
121+
@NonNull String channel,
122+
@Nullable BinaryMessenger.BinaryMessageHandler handler,
123+
@Nullable TaskQueue taskQueue) {
119124
if (handler == null) {
120125
Log.v(TAG, "Removing handler for channel '" + channel + "'");
121126
messageHandlers.remove(channel);
122127
} else {
123-
DartMessengerTaskQueue dartMessengerTaskQueue = taskQueues.get(channel);
128+
DartMessengerTaskQueue dartMessengerTaskQueue = null;
129+
if (taskQueue != null) {
130+
dartMessengerTaskQueue = createdTaskQueues.get(taskQueue);
131+
if (dartMessengerTaskQueue == null) {
132+
throw new IllegalArgumentException(
133+
"Unrecognized TaskQueue, use BinaryMessenger to create your TaskQueue (ex makeBackgroundTaskQueue).");
134+
}
135+
}
124136
Log.v(TAG, "Setting handler for channel '" + channel + "'");
125137
messageHandlers.put(channel, new HandlerInfo(handler, dartMessengerTaskQueue));
126138
}
127139
}
128140

129-
@Override
130-
public void setTaskQueue(@NonNull String channel, @Nullable BinaryMessenger.TaskQueue taskQueue) {
131-
DartMessengerTaskQueue dartMessengerTaskQueue = null;
132-
if (taskQueue == null) {
133-
taskQueues.remove(channel);
134-
} else {
135-
dartMessengerTaskQueue = createdTaskQueues.get(taskQueue);
136-
if (dartMessengerTaskQueue == null) {
137-
throw new IllegalArgumentException(
138-
"Unrecognized TaskQueue, use BinaryMessenger to create your TaskQueue (ex makeBackgroundTaskQueue).");
139-
}
140-
taskQueues.put(channel, dartMessengerTaskQueue);
141-
}
142-
HandlerInfo existingHandlerInfo = messageHandlers.get(channel);
143-
if (existingHandlerInfo != null) {
144-
messageHandlers.put(
145-
channel, new HandlerInfo(existingHandlerInfo.handler, dartMessengerTaskQueue));
146-
}
147-
}
148-
149141
@Override
150142
@UiThread
151143
public void send(@NonNull String channel, @NonNull ByteBuffer message) {

shell/platform/android/io/flutter/plugin/common/BasicMessageChannel.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -122,8 +122,13 @@ public void send(@Nullable T message, @Nullable final Reply<T> callback) {
122122
*/
123123
@UiThread
124124
public void setMessageHandler(@Nullable final MessageHandler<T> handler) {
125-
messenger.setMessageHandler(name, handler == null ? null : new IncomingMessageHandler(handler));
126-
messenger.setTaskQueue(name, handler == null ? null : taskQueue);
125+
if (taskQueue != null) {
126+
messenger.setMessageHandler(
127+
name, handler == null ? null : new IncomingMessageHandler(handler), taskQueue);
128+
} else {
129+
messenger.setMessageHandler(
130+
name, handler == null ? null : new IncomingMessageHandler(handler));
131+
}
127132
}
128133

129134
/**

shell/platform/android/io/flutter/plugin/common/BinaryMessenger.java

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,10 @@ public interface TaskQueue {}
4242
* serial.
4343
*/
4444
@UiThread
45-
TaskQueue makeBackgroundTaskQueue();
45+
default TaskQueue makeBackgroundTaskQueue() {
46+
// TODO(aaclarke): Remove default implementation when it is safe for Google Flutter users.
47+
throw new UnsupportedOperationException("makeBackgroundTaskQueue not implemented.");
48+
}
4649

4750
/**
4851
* Sends a binary message to the Flutter application.
@@ -85,19 +88,32 @@ public interface TaskQueue {}
8588
void setMessageHandler(@NonNull String channel, @Nullable BinaryMessageHandler handler);
8689

8790
/**
88-
* Registers a TaskQueue for a specified channel which controls the threading model to follow when
89-
* invoking the message handler.
91+
* Registers a handler to be invoked when the Flutter application sends a message to its host
92+
* platform.
9093
*
91-
* <p>A null value for taskQueue means to execute the handler on the platform thread.
94+
* <p>Registration overwrites any previous registration for the same channel name. Use a null
95+
* handler to deregister.
9296
*
93-
* <p>See also: {@link BinaryMessenger#makeBackgroundTaskQueue()}
97+
* <p>If no handler has been registered for a particular channel, any incoming message on that
98+
* channel will be handled silently by sending a null reply.
9499
*
95100
* @param channel the name {@link String} of the channel.
101+
* @param handler a {@link BinaryMessageHandler} to be invoked on incoming messages, or null.
96102
* @param taskQueue a {@link BinaryMessenger.TaskQueue} that specifies what thread will execute
97103
* the handler. Specifying null means execute on the platform thread.
98104
*/
99105
@UiThread
100-
void setTaskQueue(@NonNull String channel, @Nullable TaskQueue taskQueue);
106+
default void setMessageHandler(
107+
@NonNull String channel,
108+
@Nullable BinaryMessageHandler handler,
109+
@Nullable TaskQueue taskQueue) {
110+
// TODO(aaclarke): Remove default implementation when it is safe for Google Flutter users.
111+
if (taskQueue != null) {
112+
throw new UnsupportedOperationException(
113+
"setMessageHandler called with nonnull taskQueue is not supported.");
114+
}
115+
setMessageHandler(channel, handler);
116+
}
101117

102118
/** Handler for incoming binary messages from Flutter. */
103119
interface BinaryMessageHandler {

shell/platform/android/io/flutter/plugin/common/EventChannel.java

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -105,9 +105,13 @@ public EventChannel(
105105
*/
106106
@UiThread
107107
public void setStreamHandler(final StreamHandler handler) {
108-
messenger.setMessageHandler(
109-
name, handler == null ? null : new IncomingStreamRequestHandler(handler));
110-
messenger.setTaskQueue(name, handler == null ? null : taskQueue);
108+
if (taskQueue != null) {
109+
messenger.setMessageHandler(
110+
name, handler == null ? null : new IncomingStreamRequestHandler(handler));
111+
} else {
112+
messenger.setMessageHandler(
113+
name, handler == null ? null : new IncomingStreamRequestHandler(handler), taskQueue);
114+
}
111115
}
112116

113117
/**

shell/platform/android/io/flutter/plugin/common/MethodChannel.java

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -137,9 +137,13 @@ public void invokeMethod(String method, @Nullable Object arguments, @Nullable Re
137137
*/
138138
@UiThread
139139
public void setMethodCallHandler(final @Nullable MethodCallHandler handler) {
140-
messenger.setMessageHandler(
141-
name, handler == null ? null : new IncomingMethodCallHandler(handler));
142-
messenger.setTaskQueue(name, handler == null ? null : taskQueue);
140+
if (taskQueue != null) {
141+
messenger.setMessageHandler(
142+
name, handler == null ? null : new IncomingMethodCallHandler(handler), taskQueue);
143+
} else {
144+
messenger.setMessageHandler(
145+
name, handler == null ? null : new IncomingMethodCallHandler(handler));
146+
}
143147
}
144148

145149
/**

shell/platform/android/io/flutter/view/FlutterNativeView.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -155,8 +155,8 @@ public void setMessageHandler(String channel, BinaryMessageHandler handler) {
155155

156156
@Override
157157
@UiThread
158-
public void setTaskQueue(String channel, TaskQueue taskQueue) {
159-
dartExecutor.getBinaryMessenger().setTaskQueue(channel, taskQueue);
158+
public void setMessageHandler(String channel, BinaryMessageHandler handler, TaskQueue taskQueue) {
159+
dartExecutor.getBinaryMessenger().setMessageHandler(channel, handler, taskQueue);
160160
}
161161

162162
/*package*/ FlutterJNI getFlutterJNI() {

shell/platform/android/io/flutter/view/FlutterView.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -852,8 +852,8 @@ public void setMessageHandler(String channel, BinaryMessageHandler handler) {
852852

853853
@Override
854854
@UiThread
855-
public void setTaskQueue(String channel, TaskQueue taskQueue) {
856-
mNativeView.setTaskQueue(channel, taskQueue);
855+
public void setMessageHandler(String channel, BinaryMessageHandler handler, TaskQueue taskQueue) {
856+
mNativeView.setMessageHandler(channel, handler, taskQueue);
857857
}
858858

859859
/** Listener will be called on the Android UI thread once when Flutter renders the first frame. */

shell/platform/android/test/io/flutter/embedding/engine/dart/DartMessengerTest.java

Lines changed: 6 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414
import io.flutter.plugin.common.BinaryMessenger;
1515
import io.flutter.plugin.common.BinaryMessenger.BinaryMessageHandler;
1616
import java.nio.ByteBuffer;
17-
import org.junit.Before;
1817
import org.junit.Test;
1918
import org.junit.runner.RunWith;
2019
import org.mockito.Mockito;
@@ -24,7 +23,7 @@
2423
@Config(manifest = Config.NONE)
2524
@RunWith(RobolectricTestRunner.class)
2625
public class DartMessengerTest {
27-
SynchronousTaskQueue synchronousTaskQueue = null;
26+
SynchronousTaskQueue synchronousTaskQueue = new SynchronousTaskQueue();
2827

2928
private static class ReportingUncaughtExceptionHandler
3029
implements Thread.UncaughtExceptionHandler {
@@ -37,21 +36,9 @@ public void uncaughtException(Thread t, Throwable e) {
3736
}
3837

3938
private static class SynchronousTaskQueue implements DartMessengerTaskQueue {
40-
private boolean didRun = false;
41-
4239
public void dispatch(Runnable runnable) {
43-
didRun = true;
4440
runnable.run();
4541
}
46-
47-
public boolean getDidRun() {
48-
return didRun;
49-
}
50-
}
51-
52-
@Before
53-
public void setUp() {
54-
synchronousTaskQueue = new SynchronousTaskQueue();
5542
}
5643

5744
@Test
@@ -72,8 +59,7 @@ public void itHandlesErrors() {
7259
.when(throwingHandler)
7360
.onMessage(any(ByteBuffer.class), any(DartMessenger.Reply.class));
7461
BinaryMessenger.TaskQueue taskQueue = messenger.makeBackgroundTaskQueue();
75-
messenger.setMessageHandler("test", throwingHandler);
76-
messenger.setTaskQueue("test", taskQueue);
62+
messenger.setMessageHandler("test", throwingHandler, taskQueue);
7763
messenger.handleMessageFromDart("test", ByteBuffer.allocate(0), 0, 0);
7864
assertNotNull(reportingHandler.latestException);
7965
assertTrue(reportingHandler.latestException instanceof AssertionError);
@@ -92,8 +78,7 @@ public void givesDirectByteBuffer() {
9278
wasDirect[0] = message.isDirect();
9379
};
9480
BinaryMessenger.TaskQueue taskQueue = messenger.makeBackgroundTaskQueue();
95-
messenger.setMessageHandler(channel, handler);
96-
messenger.setTaskQueue(channel, taskQueue);
81+
messenger.setMessageHandler(channel, handler, taskQueue);
9782
final ByteBuffer message = ByteBuffer.allocateDirect(4 * 2);
9883
message.rewind();
9984
message.putChar('a');
@@ -102,31 +87,6 @@ public void givesDirectByteBuffer() {
10287
message.putChar('d');
10388
messenger.handleMessageFromDart(channel, message, /*replyId=*/ 123, 0);
10489
assertTrue(wasDirect[0]);
105-
assertTrue(synchronousTaskQueue.didRun);
106-
}
107-
108-
@Test
109-
public void setTaskQueueFirst() {
110-
// The same test as givesDirectByteBuffer, but calls setTaskQueue before setMessageHandler.
111-
final FlutterJNI fakeFlutterJni = mock(FlutterJNI.class);
112-
final DartMessenger messenger = new DartMessenger(fakeFlutterJni, () -> synchronousTaskQueue);
113-
final String channel = "foobar";
114-
final boolean[] wasDirect = {false};
115-
final BinaryMessenger.BinaryMessageHandler handler =
116-
(message, reply) -> {
117-
wasDirect[0] = message.isDirect();
118-
};
119-
BinaryMessenger.TaskQueue taskQueue = messenger.makeBackgroundTaskQueue();
120-
messenger.setTaskQueue(channel, taskQueue);
121-
messenger.setMessageHandler(channel, handler);
122-
final ByteBuffer message = ByteBuffer.allocateDirect(4 * 2);
123-
message.rewind();
124-
message.putChar('a');
125-
message.putChar('b');
126-
message.putChar('c');
127-
message.putChar('d');
128-
messenger.handleMessageFromDart(channel, message, /*replyId=*/ 123, 0);
129-
assertTrue(synchronousTaskQueue.didRun);
13090
}
13191

13292
@Test
@@ -143,8 +103,7 @@ public void directByteBufferLimitZeroAfterUsage() {
143103
assertEquals(bufferSize, byteBuffers[0].limit());
144104
};
145105
BinaryMessenger.TaskQueue taskQueue = messenger.makeBackgroundTaskQueue();
146-
messenger.setMessageHandler(channel, handler);
147-
messenger.setTaskQueue(channel, taskQueue);
106+
messenger.setMessageHandler(channel, handler, taskQueue);
148107
final ByteBuffer message = ByteBuffer.allocateDirect(bufferSize);
149108
message.rewind();
150109
message.putChar('a');
@@ -202,8 +161,7 @@ public void cleansUpMessageData() throws InterruptedException {
202161
(ByteBuffer message, BinaryMessenger.BinaryReply reply) -> {
203162
reply.reply(null);
204163
};
205-
messenger.setMessageHandler(channel, handler);
206-
messenger.setTaskQueue(channel, taskQueue);
164+
messenger.setMessageHandler(channel, handler, taskQueue);
207165
final ByteBuffer message = ByteBuffer.allocateDirect(4 * 2);
208166
int replyId = 1;
209167
long messageData = 1234;
@@ -221,8 +179,7 @@ public void cleansUpMessageDataOnError() throws InterruptedException {
221179
(ByteBuffer message, BinaryMessenger.BinaryReply reply) -> {
222180
throw new RuntimeException("hello");
223181
};
224-
messenger.setMessageHandler(channel, handler);
225-
messenger.setTaskQueue(channel, taskQueue);
182+
messenger.setMessageHandler(channel, handler, taskQueue);
226183
final ByteBuffer message = ByteBuffer.allocateDirect(4 * 2);
227184
int replyId = 1;
228185
long messageData = 1234;

0 commit comments

Comments
 (0)