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

Commit f4bc527

Browse files
committed
Made this PR less of a breaking change by keeping setMessageHandler's signature the same
1 parent 47409d5 commit f4bc527

File tree

13 files changed

+96
-48
lines changed

13 files changed

+96
-48
lines changed

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

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ public DartExecutor(@NonNull FlutterJNI flutterJNI, @NonNull AssetManager assetM
5959
this.flutterJNI = flutterJNI;
6060
this.assetManager = assetManager;
6161
this.dartMessenger = new DartMessenger(flutterJNI);
62-
dartMessenger.setMessageHandler("flutter/isolate", isolateChannelMessageHandler, null);
62+
dartMessenger.setMessageHandler("flutter/isolate", isolateChannelMessageHandler);
6363
this.binaryMessenger = new DefaultBinaryMessenger(dartMessenger);
6464
// The JNI might already be attached if coming from a spawned engine. If so, correctly report
6565
// that this DartExecutor is already running.
@@ -200,10 +200,16 @@ public void send(
200200
@Override
201201
@UiThread
202202
public void setMessageHandler(
203-
@NonNull String channel,
204-
@Nullable BinaryMessenger.BinaryMessageHandler handler,
205-
@Nullable TaskQueue taskQueue) {
206-
binaryMessenger.setMessageHandler(channel, handler, taskQueue);
203+
@NonNull String channel, @Nullable BinaryMessenger.BinaryMessageHandler handler) {
204+
binaryMessenger.setMessageHandler(channel, handler);
205+
}
206+
207+
/** @deprecated Use {@link #getBinaryMessenger()} instead. */
208+
@Deprecated
209+
@Override
210+
@UiThread
211+
public void setTaskQueue(@NonNull String channel, @Nullable TaskQueue taskQueue) {
212+
binaryMessenger.setTaskQueue(channel, taskQueue);
207213
}
208214
// ------ END BinaryMessenger -----
209215

@@ -427,10 +433,14 @@ public void send(
427433
@Override
428434
@UiThread
429435
public void setMessageHandler(
430-
@NonNull String channel,
431-
@Nullable BinaryMessenger.BinaryMessageHandler handler,
432-
@Nullable TaskQueue taskQueue) {
433-
messenger.setMessageHandler(channel, handler, taskQueue);
436+
@NonNull String channel, @Nullable BinaryMessenger.BinaryMessageHandler handler) {
437+
messenger.setMessageHandler(channel, handler);
438+
}
439+
440+
@Override
441+
@UiThread
442+
public void setTaskQueue(@NonNull String channel, @Nullable TaskQueue taskQueue) {
443+
messenger.setTaskQueue(channel, taskQueue);
434444
}
435445
}
436446
}

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

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

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

37+
@NonNull private final HashMap<String, DartMessengerTaskQueue> taskQueues;
38+
3739
@NonNull private final Map<Integer, BinaryMessenger.BinaryReply> pendingReplies;
3840
private int nextReplyId = 1;
3941

@@ -49,6 +51,7 @@ class DartMessenger implements BinaryMessenger, PlatformMessageHandler {
4951
this.pendingReplies = new HashMap<>();
5052
this.createdTaskQueues = new WeakHashMap<TaskQueue, DartMessengerTaskQueue>();
5153
this.taskQueueFactory = taskQueueFactory;
54+
this.taskQueues = new HashMap<>();
5255
}
5356

5457
DartMessenger(@NonNull FlutterJNI flutterJNI) {
@@ -112,26 +115,37 @@ public TaskQueue makeBackgroundTaskQueue() {
112115

113116
@Override
114117
public void setMessageHandler(
115-
@NonNull String channel,
116-
@Nullable BinaryMessenger.BinaryMessageHandler handler,
117-
@Nullable TaskQueue taskQueue) {
118+
@NonNull String channel, @Nullable BinaryMessenger.BinaryMessageHandler handler) {
118119
if (handler == null) {
119120
Log.v(TAG, "Removing handler for channel '" + channel + "'");
120121
messageHandlers.remove(channel);
121122
} else {
122-
DartMessengerTaskQueue dartMessengerTaskQueue = null;
123-
if (taskQueue != null) {
124-
dartMessengerTaskQueue = createdTaskQueues.get(taskQueue);
125-
if (dartMessengerTaskQueue == null) {
126-
throw new IllegalArgumentException(
127-
"Unrecognized TaskQueue, use BinaryMessenger to create your TaskQueue (ex makeBackgroundTaskQueue).");
128-
}
129-
}
123+
DartMessengerTaskQueue dartMessengerTaskQueue = taskQueues.get(channel);
130124
Log.v(TAG, "Setting handler for channel '" + channel + "'");
131125
messageHandlers.put(channel, new HandlerInfo(handler, dartMessengerTaskQueue));
132126
}
133127
}
134128

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+
135149
@Override
136150
@UiThread
137151
public void send(@NonNull String channel, @NonNull ByteBuffer message) {

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -122,8 +122,8 @@ 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(
126-
name, handler == null ? null : new IncomingMessageHandler(handler), taskQueue);
125+
messenger.setMessageHandler(name, handler == null ? null : new IncomingMessageHandler(handler));
126+
messenger.setTaskQueue(name, handler == null ? null : taskQueue);
127127
}
128128

129129
/**

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

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -80,14 +80,24 @@ public interface TaskQueue {}
8080
*
8181
* @param channel the name {@link String} of the channel.
8282
* @param handler a {@link BinaryMessageHandler} to be invoked on incoming messages, or null.
83+
*/
84+
@UiThread
85+
void setMessageHandler(@NonNull String channel, @Nullable BinaryMessageHandler handler);
86+
87+
/**
88+
* Registers a TaskQueue for a specified channel which controls the threading model to follow when
89+
* invoking the message handler.
90+
*
91+
* <p>A null value for taskQueue means to execute the handler on the platform thread.
92+
*
93+
* <p>See also: {@link BinaryMessenger#makeBackgroundTaskQueue()}
94+
*
95+
* @param channel the name {@link String} of the channel.
8396
* @param taskQueue a {@link BinaryMessenger.TaskQueue} that specifies what thread will execute
8497
* the handler. Specifying null means execute on the platform thread.
8598
*/
8699
@UiThread
87-
void setMessageHandler(
88-
@NonNull String channel,
89-
@Nullable BinaryMessageHandler handler,
90-
@Nullable TaskQueue taskQueue);
100+
void setTaskQueue(@NonNull String channel, @Nullable TaskQueue taskQueue);
91101

92102
/** Handler for incoming binary messages from Flutter. */
93103
interface BinaryMessageHandler {

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,8 @@ public EventChannel(
106106
@UiThread
107107
public void setStreamHandler(final StreamHandler handler) {
108108
messenger.setMessageHandler(
109-
name, handler == null ? null : new IncomingStreamRequestHandler(handler), taskQueue);
109+
name, handler == null ? null : new IncomingStreamRequestHandler(handler));
110+
messenger.setTaskQueue(name, handler == null ? null : taskQueue);
110111
}
111112

112113
/**

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,8 @@ public void invokeMethod(String method, @Nullable Object arguments, @Nullable Re
138138
@UiThread
139139
public void setMethodCallHandler(final @Nullable MethodCallHandler handler) {
140140
messenger.setMessageHandler(
141-
name, handler == null ? null : new IncomingMethodCallHandler(handler), taskQueue);
141+
name, handler == null ? null : new IncomingMethodCallHandler(handler));
142+
messenger.setTaskQueue(name, handler == null ? null : taskQueue);
142143
}
143144

144145
/**

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

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -149,8 +149,14 @@ public void send(String channel, ByteBuffer message, BinaryReply callback) {
149149

150150
@Override
151151
@UiThread
152-
public void setMessageHandler(String channel, BinaryMessageHandler handler, TaskQueue taskQueue) {
153-
dartExecutor.getBinaryMessenger().setMessageHandler(channel, handler, taskQueue);
152+
public void setMessageHandler(String channel, BinaryMessageHandler handler) {
153+
dartExecutor.getBinaryMessenger().setMessageHandler(channel, handler);
154+
}
155+
156+
@Override
157+
@UiThread
158+
public void setTaskQueue(String channel, TaskQueue taskQueue) {
159+
dartExecutor.getBinaryMessenger().setTaskQueue(channel, taskQueue);
154160
}
155161

156162
/*package*/ FlutterJNI getFlutterJNI() {

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

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -846,8 +846,14 @@ public void send(String channel, ByteBuffer message, BinaryReply callback) {
846846

847847
@Override
848848
@UiThread
849-
public void setMessageHandler(String channel, BinaryMessageHandler handler, TaskQueue taskQueue) {
850-
mNativeView.setMessageHandler(channel, handler, taskQueue);
849+
public void setMessageHandler(String channel, BinaryMessageHandler handler) {
850+
mNativeView.setMessageHandler(channel, handler);
851+
}
852+
853+
@Override
854+
@UiThread
855+
public void setTaskQueue(String channel, TaskQueue taskQueue) {
856+
mNativeView.setTaskQueue(channel, taskQueue);
851857
}
852858

853859
/** 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: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,8 @@ public void itHandlesErrors() {
5959
.when(throwingHandler)
6060
.onMessage(any(ByteBuffer.class), any(DartMessenger.Reply.class));
6161
BinaryMessenger.TaskQueue taskQueue = messenger.makeBackgroundTaskQueue();
62-
messenger.setMessageHandler("test", throwingHandler, taskQueue);
62+
messenger.setMessageHandler("test", throwingHandler);
63+
messenger.setTaskQueue("test", taskQueue);
6364
messenger.handleMessageFromDart("test", ByteBuffer.allocate(0), 0, 0);
6465
assertNotNull(reportingHandler.latestException);
6566
assertTrue(reportingHandler.latestException instanceof AssertionError);
@@ -78,7 +79,8 @@ public void givesDirectByteBuffer() {
7879
wasDirect[0] = message.isDirect();
7980
};
8081
BinaryMessenger.TaskQueue taskQueue = messenger.makeBackgroundTaskQueue();
81-
messenger.setMessageHandler(channel, handler, taskQueue);
82+
messenger.setMessageHandler(channel, handler);
83+
messenger.setTaskQueue(channel, taskQueue);
8284
final ByteBuffer message = ByteBuffer.allocateDirect(4 * 2);
8385
message.rewind();
8486
message.putChar('a');
@@ -103,7 +105,8 @@ public void directByteBufferLimitZeroAfterUsage() {
103105
assertEquals(bufferSize, byteBuffers[0].limit());
104106
};
105107
BinaryMessenger.TaskQueue taskQueue = messenger.makeBackgroundTaskQueue();
106-
messenger.setMessageHandler(channel, handler, taskQueue);
108+
messenger.setMessageHandler(channel, handler);
109+
messenger.setTaskQueue(channel, taskQueue);
107110
final ByteBuffer message = ByteBuffer.allocateDirect(bufferSize);
108111
message.rewind();
109112
message.putChar('a');
@@ -161,7 +164,8 @@ public void cleansUpMessageData() throws InterruptedException {
161164
(ByteBuffer message, BinaryMessenger.BinaryReply reply) -> {
162165
reply.reply(null);
163166
};
164-
messenger.setMessageHandler(channel, handler, taskQueue);
167+
messenger.setMessageHandler(channel, handler);
168+
messenger.setTaskQueue(channel, taskQueue);
165169
final ByteBuffer message = ByteBuffer.allocateDirect(4 * 2);
166170
int replyId = 1;
167171
long messageData = 1234;
@@ -179,7 +183,8 @@ public void cleansUpMessageDataOnError() throws InterruptedException {
179183
(ByteBuffer message, BinaryMessenger.BinaryReply reply) -> {
180184
throw new RuntimeException("hello");
181185
};
182-
messenger.setMessageHandler(channel, handler, taskQueue);
186+
messenger.setMessageHandler(channel, handler);
187+
messenger.setTaskQueue(channel, taskQueue);
183188
final ByteBuffer message = ByteBuffer.allocateDirect(4 * 2);
184189
int replyId = 1;
185190
long messageData = 1234;

shell/platform/android/test/io/flutter/plugin/editing/TextInputPluginTest.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1884,7 +1884,7 @@ public void respondsToInputChannelMessages() {
18841884
textInputChannel.setTextInputMethodHandler(mockHandler);
18851885

18861886
verify(mockBinaryMessenger, times(1))
1887-
.setMessageHandler(any(String.class), binaryMessageHandlerCaptor.capture(), eq(null));
1887+
.setMessageHandler(any(String.class), binaryMessageHandlerCaptor.capture());
18881888

18891889
BinaryMessenger.BinaryMessageHandler binaryMessageHandler =
18901890
binaryMessageHandlerCaptor.getValue();
@@ -1917,7 +1917,7 @@ public void sendAppPrivateCommand_dataIsEmpty() throws JSONException {
19171917
new TextInputPlugin(testView, textInputChannel, mock(PlatformViewsController.class));
19181918

19191919
verify(mockBinaryMessenger, times(1))
1920-
.setMessageHandler(any(String.class), binaryMessageHandlerCaptor.capture(), eq(null));
1920+
.setMessageHandler(any(String.class), binaryMessageHandlerCaptor.capture());
19211921

19221922
JSONObject arguments = new JSONObject();
19231923
arguments.put("action", "actionCommand");
@@ -1948,7 +1948,7 @@ public void sendAppPrivateCommand_hasData() throws JSONException {
19481948
new TextInputPlugin(testView, textInputChannel, mock(PlatformViewsController.class));
19491949

19501950
verify(mockBinaryMessenger, times(1))
1951-
.setMessageHandler(any(String.class), binaryMessageHandlerCaptor.capture(), eq(null));
1951+
.setMessageHandler(any(String.class), binaryMessageHandlerCaptor.capture());
19521952

19531953
JSONObject arguments = new JSONObject();
19541954
arguments.put("action", "actionCommand");

testing/android_background_image/android/app/src/main/java/dev/flutter/android_background_image/MainActivity.java

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,7 @@ public void onMessage(ByteBuffer message, final BinaryMessenger.BinaryReply call
3131

3232
@Override
3333
public void configureFlutterEngine(@NonNull FlutterEngine flutterEngine) {
34-
flutterEngine
35-
.getDartExecutor()
36-
.getBinaryMessenger()
37-
.setMessageHandler("finish", finishHandler, null);
34+
flutterEngine.getDartExecutor().getBinaryMessenger().setMessageHandler("finish", finishHandler);
3835

3936
final boolean moved = moveTaskToBack(true);
4037
if (!moved) {

testing/scenario_app/android/app/src/main/java/dev/flutter/scenarios/SpawnedEngineActivity.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,7 @@ public FlutterEngine provideFlutterEngine(@NonNull Context context) {
2222

2323
secondEngine
2424
.getDartExecutor()
25-
.setMessageHandler(
26-
"take_screenshot", (byteBuffer, binaryReply) -> notifyFlutterRendered(), null);
25+
.setMessageHandler("take_screenshot", (byteBuffer, binaryReply) -> notifyFlutterRendered());
2726

2827
return secondEngine;
2928
}

testing/scenario_app/android/app/src/main/java/dev/flutter/scenarios/TestableFlutterActivity.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,7 @@ public void configureFlutterEngine(@NonNull FlutterEngine flutterEngine) {
1919
// registration will fail and print a scary exception in the logs.
2020
flutterEngine
2121
.getDartExecutor()
22-
.setMessageHandler(
23-
"take_screenshot", (byteBuffer, binaryReply) -> notifyFlutterRendered(), null);
22+
.setMessageHandler("take_screenshot", (byteBuffer, binaryReply) -> notifyFlutterRendered());
2423
}
2524

2625
protected void notifyFlutterRendered() {

0 commit comments

Comments
 (0)