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