Skip to content

Commit 489c313

Browse files
committed
feat register message channel at app start in [onAttachedToEngine] method
feat return non-nullable value from [shareData] method doc update documentation for [shareData] method
1 parent 4bfbae1 commit 489c313

File tree

3 files changed

+55
-60
lines changed

3 files changed

+55
-60
lines changed

android/src/main/java/flutter/overlay/window/flutter_overlay_window/FlutterOverlayWindowPlugin.java

Lines changed: 53 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -49,13 +49,18 @@ public class FlutterOverlayWindowPlugin implements
4949
FlutterPluginBinding flutterBinding;
5050
@Nullable
5151
ActivityPluginBinding activityPluginBinding;
52+
boolean isMainAppEngine;
5253

5354
@Override
5455
public void onAttachedToEngine(@NonNull FlutterPluginBinding flutterPluginBinding) {
5556
flutterBinding = flutterPluginBinding;
5657
this.context = flutterPluginBinding.getApplicationContext();
5758
channel = new MethodChannel(flutterPluginBinding.getBinaryMessenger(), OverlayConstants.CHANNEL_TAG);
5859
channel.setMethodCallHandler(this);
60+
61+
FlutterEngineGroup overlayEngineGroup = ensureEngineGroupCreated(context);
62+
isMainAppEngine = flutterBinding.getEngineGroup() != overlayEngineGroup;
63+
registerMessageChannel(isMainAppEngine);
5964
}
6065

6166
@RequiresApi(api = Build.VERSION_CODES.N)
@@ -78,7 +83,7 @@ public void onMethodCall(@NonNull MethodCall call, @NonNull Result result) {
7883
return;
7984
}
8085

81-
ensureEngineCreated();
86+
ensureEngineCreated(context);
8287

8388
Integer height = call.argument("height");
8489
Integer width = call.argument("width");
@@ -139,18 +144,16 @@ public void onMethodCall(@NonNull MethodCall call, @NonNull Result result) {
139144
public void onDetachedFromEngine(@NonNull FlutterPluginBinding binding) {
140145
channel.setMethodCallHandler(null);
141146
flutterBinding = null;
147+
unregisterMessageChannel(isMainAppEngine);
148+
FlutterEngineGroupCache.getInstance().remove(OverlayConstants.CACHED_TAG);
142149
}
143150

144151
@Override
145152
public void onAttachedToActivity(@NonNull ActivityPluginBinding binding) {
146153
activityPluginBinding = binding;
147154
mActivity = binding.getActivity();
148155

149-
ensureEngineGroupCreated();
150-
151-
ensureEngineCreated();
152-
153-
setupMainAppMessageChannel();
156+
ensureEngineCreated(context);
154157

155158
binding.addActivityResultListener(this);
156159
}
@@ -170,33 +173,56 @@ public void onDetachedFromActivity() {
170173
Objects.requireNonNull(activityPluginBinding).removeActivityResultListener(this);
171174
activityPluginBinding = null;
172175
mActivity = null;
173-
FlutterEngineGroupCache.getInstance().remove(OverlayConstants.CACHED_TAG);
174-
if (CachedMessageChannels.mainAppMessageChannel != null) {
176+
}
177+
178+
private void registerMessageChannel(boolean isMainAppEngine) {
179+
io.flutter.plugin.common.BinaryMessenger binaryMessenger = Objects.requireNonNull(flutterBinding).getBinaryMessenger();
180+
if(isMainAppEngine) {
181+
registerMainAppMessageChannel(binaryMessenger);
182+
} else {
183+
registerOverlayMessageChannel(binaryMessenger);
184+
}
185+
}
186+
187+
private void unregisterMessageChannel(boolean isMainAppEngine) {
188+
if(isMainAppEngine) {
189+
if (CachedMessageChannels.mainAppMessageChannel == null) return;
175190
CachedMessageChannels.mainAppMessageChannel.setMessageHandler(null);
176191
CachedMessageChannels.mainAppMessageChannel = null;
192+
} else {
193+
if(CachedMessageChannels.overlayMessageChannel == null) return;
194+
CachedMessageChannels.overlayMessageChannel.setMessageHandler(null);
195+
CachedMessageChannels.overlayMessageChannel = null;
177196
}
178197
}
179198

180-
private void setupMainAppMessageChannel() {
181-
FlutterEngineGroup enn = FlutterEngineGroupCache.getInstance().get(OverlayConstants.CACHED_TAG);
182-
183-
boolean isMainAppEngineGroup = Objects.requireNonNull(flutterBinding).getEngineGroup() != enn;
199+
private void registerOverlayMessageChannel(io.flutter.plugin.common.BinaryMessenger overlyEngineBinaryMessenger) {
200+
BasicMessageChannel<Object> overlayMessageChannel = new BasicMessageChannel<>(overlyEngineBinaryMessenger, OverlayConstants.MESSENGER_TAG, JSONMessageCodec.INSTANCE);
201+
overlayMessageChannel.setMessageHandler((message, reply) -> {
202+
if (CachedMessageChannels.mainAppMessageChannel == null) {
203+
reply.reply(false);
204+
return;
205+
}
206+
CachedMessageChannels.mainAppMessageChannel.send(message);
207+
reply.reply(true);
208+
});
209+
CachedMessageChannels.overlayMessageChannel = overlayMessageChannel;
210+
}
184211

185-
if(isMainAppEngineGroup) {
186-
BasicMessageChannel<Object> mainAppMessageChannel = new BasicMessageChannel<>(flutterBinding.getBinaryMessenger(), OverlayConstants.MESSENGER_TAG, JSONMessageCodec.INSTANCE);
187-
mainAppMessageChannel.setMessageHandler((message, reply) -> {
188-
if (CachedMessageChannels.overlayMessageChannel == null) {
189-
reply.reply(false);
190-
return;
191-
}
192-
CachedMessageChannels.overlayMessageChannel.send(message);
193-
reply.reply(true);
194-
});
195-
CachedMessageChannels.mainAppMessageChannel = mainAppMessageChannel;
196-
}
212+
private void registerMainAppMessageChannel(io.flutter.plugin.common.BinaryMessenger mainAppEngineBinaryMessenger) {
213+
BasicMessageChannel<Object> mainAppMessageChannel = new BasicMessageChannel<>(mainAppEngineBinaryMessenger, OverlayConstants.MESSENGER_TAG, JSONMessageCodec.INSTANCE);
214+
mainAppMessageChannel.setMessageHandler((message, reply) -> {
215+
if (CachedMessageChannels.overlayMessageChannel == null) {
216+
reply.reply(false);
217+
return;
218+
}
219+
CachedMessageChannels.overlayMessageChannel.send(message);
220+
reply.reply(true);
221+
});
222+
CachedMessageChannels.mainAppMessageChannel = mainAppMessageChannel;
197223
}
198224

199-
private FlutterEngineGroup ensureEngineGroupCreated() {
225+
private FlutterEngineGroup ensureEngineGroupCreated(android.content.Context context) {
200226
FlutterEngineGroup enn = FlutterEngineGroupCache.getInstance().get(OverlayConstants.CACHED_TAG);
201227

202228
if(enn == null) {
@@ -206,10 +232,10 @@ private FlutterEngineGroup ensureEngineGroupCreated() {
206232

207233
return enn;
208234
}
209-
private void ensureEngineCreated() {
235+
private void ensureEngineCreated(android.content.Context context) {
210236
FlutterEngine engine = FlutterEngineCache.getInstance().get(OverlayConstants.CACHED_TAG);
211237
if(engine == null) {
212-
FlutterEngineGroup enn = ensureEngineGroupCreated();
238+
FlutterEngineGroup enn = ensureEngineGroupCreated(context);
213239
DartExecutor.DartEntrypoint dEntry = new DartExecutor.DartEntrypoint(
214240
FlutterInjector.instance().flutterLoader().findAppBundlePath(),
215241
"overlayMain");

android/src/main/java/flutter/overlay/window/flutter_overlay_window/OverlayService.java

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,6 @@
3737
import io.flutter.embedding.android.FlutterView;
3838
import io.flutter.embedding.engine.FlutterEngine;
3939
import io.flutter.embedding.engine.FlutterEngineCache;
40-
import io.flutter.plugin.common.BasicMessageChannel;
41-
import io.flutter.plugin.common.JSONMessageCodec;
4240
import io.flutter.plugin.common.MethodChannel;
4341

4442
public class OverlayService extends Service implements View.OnTouchListener {
@@ -91,11 +89,6 @@ public void onDestroy() {
9189
notificationManager.cancel(OverlayConstants.NOTIFICATION_ID);
9290

9391
instance = null;
94-
95-
if(CachedMessageChannels.overlayMessageChannel != null){
96-
CachedMessageChannels.overlayMessageChannel.setMessageHandler(null);
97-
CachedMessageChannels.overlayMessageChannel = null;
98-
}
9992
}
10093

10194
@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR1)
@@ -143,17 +136,6 @@ public int onStartCommand(Intent intent, int flags, int startId) {
143136
}
144137
});
145138

146-
BasicMessageChannel<Object> overlayMessageChannel = new BasicMessageChannel<>(FlutterEngineCache.getInstance().get(OverlayConstants.CACHED_TAG).getDartExecutor().getBinaryMessenger(), OverlayConstants.MESSENGER_TAG, JSONMessageCodec.INSTANCE);
147-
overlayMessageChannel.setMessageHandler((message, reply) -> {
148-
if (CachedMessageChannels.mainAppMessageChannel == null) {
149-
reply.reply(false);
150-
return;
151-
}
152-
CachedMessageChannels.mainAppMessageChannel.send(message);
153-
reply.reply(true);
154-
});
155-
CachedMessageChannels.overlayMessageChannel = overlayMessageChannel;
156-
157139
windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
158140

159141
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {

lib/src/overlay_window.dart

Lines changed: 2 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -103,24 +103,11 @@ class FlutterOverlayWindow {
103103
///
104104
/// If `false` is returned, it indicates that the [data] was not sent.
105105
///
106-
/// This method may return `false` under the following conditions:
107-
/// - The overlay is closed.
108-
/// - The application is detached from the activity, i.e. the application is closed.
106+
/// This method may return `false` when invoked from the overlay while the application is closed.
109107
///
110108
/// Returns `true` if the [data] was sent successfully, otherwise `false`.
111-
///
112-
/// May return `null`, indicating a failure to send the [data] (This is unexpected behavior,
113-
/// and if encountered, indicates a bug within plugin implementation that should be addressed).
114-
static Future<bool?> shareData(dynamic data) async {
109+
static Future<bool> shareData(dynamic data) async {
115110
final isSent = await _overlayMessageChannel.send(data);
116-
if (isSent == null) {
117-
debugPrintStack(
118-
stackTrace: StackTrace.current,
119-
label: "[FlutterOverlayWindow] ERROR: "
120-
"Failed to send the [data] using the [shareData] method. "
121-
"Message channel handler is not registered.");
122-
return null;
123-
}
124111
return isSent as bool;
125112
}
126113

0 commit comments

Comments
 (0)