@@ -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" );
0 commit comments