Skip to content

Commit 2857f75

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 7fff772 commit 2857f75

File tree

3 files changed

+55
-59
lines changed

3 files changed

+55
-59
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
@@ -42,13 +42,18 @@ public class FlutterOverlayWindowPlugin implements
4242
FlutterPluginBinding flutterBinding;
4343
@Nullable
4444
ActivityPluginBinding activityPluginBinding;
45+
boolean isMainAppEngine;
4546

4647
@Override
4748
public void onAttachedToEngine(@NonNull FlutterPluginBinding flutterPluginBinding) {
4849
flutterBinding = flutterPluginBinding;
4950
this.context = flutterPluginBinding.getApplicationContext();
5051
channel = new MethodChannel(flutterPluginBinding.getBinaryMessenger(), OverlayConstants.CHANNEL_TAG);
5152
channel.setMethodCallHandler(this);
53+
54+
FlutterEngineGroup overlayEngineGroup = ensureEngineGroupCreated(context);
55+
isMainAppEngine = flutterBinding.getEngineGroup() != overlayEngineGroup;
56+
registerMessageChannel(isMainAppEngine);
5257
}
5358

5459
@Override
@@ -70,7 +75,7 @@ public void onMethodCall(@NonNull MethodCall call, @NonNull Result result) {
7075
return;
7176
}
7277

73-
ensureEngineCreated();
78+
ensureEngineCreated(context);
7479

7580
Integer height = call.argument("height");
7681
Integer width = call.argument("width");
@@ -117,18 +122,16 @@ public void onMethodCall(@NonNull MethodCall call, @NonNull Result result) {
117122
public void onDetachedFromEngine(@NonNull FlutterPluginBinding binding) {
118123
channel.setMethodCallHandler(null);
119124
flutterBinding = null;
125+
unregisterMessageChannel(isMainAppEngine);
126+
FlutterEngineGroupCache.getInstance().remove(OverlayConstants.CACHED_TAG);
120127
}
121128

122129
@Override
123130
public void onAttachedToActivity(@NonNull ActivityPluginBinding binding) {
124131
activityPluginBinding = binding;
125132
mActivity = binding.getActivity();
126133

127-
ensureEngineGroupCreated();
128-
129-
ensureEngineCreated();
130-
131-
setupMainAppMessageChannel();
134+
ensureEngineCreated(context);
132135

133136
binding.addActivityResultListener(this);
134137
}
@@ -148,33 +151,56 @@ public void onDetachedFromActivity() {
148151
Objects.requireNonNull(activityPluginBinding).removeActivityResultListener(this);
149152
activityPluginBinding = null;
150153
mActivity = null;
151-
FlutterEngineGroupCache.getInstance().remove(OverlayConstants.CACHED_TAG);
152-
if (CachedMessageChannels.mainAppMessageChannel != null) {
154+
}
155+
156+
private void registerMessageChannel(boolean isMainAppEngine) {
157+
io.flutter.plugin.common.BinaryMessenger binaryMessenger = Objects.requireNonNull(flutterBinding).getBinaryMessenger();
158+
if(isMainAppEngine) {
159+
registerMainAppMessageChannel(binaryMessenger);
160+
} else {
161+
registerOverlayMessageChannel(binaryMessenger);
162+
}
163+
}
164+
165+
private void unregisterMessageChannel(boolean isMainAppEngine) {
166+
if(isMainAppEngine) {
167+
if (CachedMessageChannels.mainAppMessageChannel == null) return;
153168
CachedMessageChannels.mainAppMessageChannel.setMessageHandler(null);
154169
CachedMessageChannels.mainAppMessageChannel = null;
170+
} else {
171+
if(CachedMessageChannels.overlayMessageChannel == null) return;
172+
CachedMessageChannels.overlayMessageChannel.setMessageHandler(null);
173+
CachedMessageChannels.overlayMessageChannel = null;
155174
}
156175
}
157176

158-
private void setupMainAppMessageChannel() {
159-
FlutterEngineGroup enn = FlutterEngineGroupCache.getInstance().get(OverlayConstants.CACHED_TAG);
160-
161-
boolean isMainAppEngineGroup = Objects.requireNonNull(flutterBinding).getEngineGroup() != enn;
177+
private void registerOverlayMessageChannel(io.flutter.plugin.common.BinaryMessenger overlyEngineBinaryMessenger) {
178+
BasicMessageChannel<Object> overlayMessageChannel = new BasicMessageChannel<>(overlyEngineBinaryMessenger, OverlayConstants.MESSENGER_TAG, JSONMessageCodec.INSTANCE);
179+
overlayMessageChannel.setMessageHandler((message, reply) -> {
180+
if (CachedMessageChannels.mainAppMessageChannel == null) {
181+
reply.reply(false);
182+
return;
183+
}
184+
CachedMessageChannels.mainAppMessageChannel.send(message);
185+
reply.reply(true);
186+
});
187+
CachedMessageChannels.overlayMessageChannel = overlayMessageChannel;
188+
}
162189

163-
if(isMainAppEngineGroup) {
164-
BasicMessageChannel<Object> mainAppMessageChannel = new BasicMessageChannel<>(flutterBinding.getBinaryMessenger(), OverlayConstants.MESSENGER_TAG, JSONMessageCodec.INSTANCE);
165-
mainAppMessageChannel.setMessageHandler((message, reply) -> {
166-
if (CachedMessageChannels.overlayMessageChannel == null) {
167-
reply.reply(false);
168-
return;
169-
}
170-
CachedMessageChannels.overlayMessageChannel.send(message);
171-
reply.reply(true);
172-
});
173-
CachedMessageChannels.mainAppMessageChannel = mainAppMessageChannel;
174-
}
190+
private void registerMainAppMessageChannel(io.flutter.plugin.common.BinaryMessenger mainAppEngineBinaryMessenger) {
191+
BasicMessageChannel<Object> mainAppMessageChannel = new BasicMessageChannel<>(mainAppEngineBinaryMessenger, OverlayConstants.MESSENGER_TAG, JSONMessageCodec.INSTANCE);
192+
mainAppMessageChannel.setMessageHandler((message, reply) -> {
193+
if (CachedMessageChannels.overlayMessageChannel == null) {
194+
reply.reply(false);
195+
return;
196+
}
197+
CachedMessageChannels.overlayMessageChannel.send(message);
198+
reply.reply(true);
199+
});
200+
CachedMessageChannels.mainAppMessageChannel = mainAppMessageChannel;
175201
}
176202

177-
private FlutterEngineGroup ensureEngineGroupCreated() {
203+
private FlutterEngineGroup ensureEngineGroupCreated(android.content.Context context) {
178204
FlutterEngineGroup enn = FlutterEngineGroupCache.getInstance().get(OverlayConstants.CACHED_TAG);
179205

180206
if(enn == null) {
@@ -184,10 +210,10 @@ private FlutterEngineGroup ensureEngineGroupCreated() {
184210

185211
return enn;
186212
}
187-
private void ensureEngineCreated() {
213+
private void ensureEngineCreated(android.content.Context context) {
188214
FlutterEngine engine = FlutterEngineCache.getInstance().get(OverlayConstants.CACHED_TAG);
189215
if(engine == null) {
190-
FlutterEngineGroup enn = ensureEngineGroupCreated();
216+
FlutterEngineGroup enn = ensureEngineGroupCreated(context);
191217
DartExecutor.DartEntrypoint dEntry = new DartExecutor.DartEntrypoint(
192218
FlutterInjector.instance().flutterLoader().findAppBundlePath(),
193219
"overlayMain");

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

Lines changed: 0 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,6 @@
3636
import io.flutter.embedding.android.FlutterView;
3737
import io.flutter.embedding.engine.FlutterEngine;
3838
import io.flutter.embedding.engine.FlutterEngineCache;
39-
import io.flutter.plugin.common.BasicMessageChannel;
40-
import io.flutter.plugin.common.JSONMessageCodec;
4139
import io.flutter.plugin.common.MethodChannel;
4240

4341
public class OverlayService extends Service implements View.OnTouchListener {
@@ -86,10 +84,6 @@ public void onDestroy() {
8684
}
8785
NotificationManager notificationManager = (NotificationManager) getApplicationContext().getSystemService(Context.NOTIFICATION_SERVICE);
8886
notificationManager.cancel(OverlayConstants.NOTIFICATION_ID);
89-
if(CachedMessageChannels.overlayMessageChannel != null){
90-
CachedMessageChannels.overlayMessageChannel.setMessageHandler(null);
91-
CachedMessageChannels.overlayMessageChannel = null;
92-
}
9387
}
9488

9589
@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR1)
@@ -130,17 +124,6 @@ public int onStartCommand(Intent intent, int flags, int startId) {
130124
}
131125
});
132126

133-
BasicMessageChannel<Object> overlayMessageChannel = new BasicMessageChannel<>(FlutterEngineCache.getInstance().get(OverlayConstants.CACHED_TAG).getDartExecutor().getBinaryMessenger(), OverlayConstants.MESSENGER_TAG, JSONMessageCodec.INSTANCE);
134-
overlayMessageChannel.setMessageHandler((message, reply) -> {
135-
if (CachedMessageChannels.mainAppMessageChannel == null) {
136-
reply.reply(false);
137-
return;
138-
}
139-
CachedMessageChannels.mainAppMessageChannel.send(message);
140-
reply.reply(true);
141-
});
142-
CachedMessageChannels.overlayMessageChannel = overlayMessageChannel;
143-
144127
windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
145128

146129
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
@@ -89,24 +89,11 @@ class FlutterOverlayWindow {
8989
///
9090
/// If `false` is returned, it indicates that the [data] was not sent.
9191
///
92-
/// This method may return `false` under the following conditions:
93-
/// - The overlay is closed.
94-
/// - The application is detached from the activity, i.e. the application is closed.
92+
/// This method may return `false` when invoked from the overlay while the application is closed.
9593
///
9694
/// Returns `true` if the [data] was sent successfully, otherwise `false`.
97-
///
98-
/// May return `null`, indicating a failure to send the [data] (This is unexpected behavior,
99-
/// and if encountered, indicates a bug within plugin implementation that should be addressed).
100-
static Future<bool?> shareData(dynamic data) async {
95+
static Future<bool> shareData(dynamic data) async {
10196
final isSent = await _overlayMessageChannel.send(data);
102-
if (isSent == null) {
103-
debugPrintStack(
104-
stackTrace: StackTrace.current,
105-
label: "[FlutterOverlayWindow] ERROR: "
106-
"Failed to send the [data] using the [shareData] method. "
107-
"Message channel handler is not registered.");
108-
return null;
109-
}
11097
return isSent as bool;
11198
}
11299

0 commit comments

Comments
 (0)