Skip to content

Commit 531a9cf

Browse files
author
Michael Klimushyn
authored
Fire PlatformViewController FlutterView callbacks (flutter#13015)
Fixes a bug where `PlatformViewController` was not being notified of `FlutterView` attachment changes.
1 parent e3742a9 commit 531a9cf

File tree

8 files changed

+76
-7
lines changed

8 files changed

+76
-7
lines changed

shell/platform/android/BUILD.gn

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -417,6 +417,7 @@ action("robolectric_tests") {
417417
"test/io/flutter/embedding/android/FlutterActivityAndFragmentDelegateTest.java",
418418
"test/io/flutter/embedding/android/FlutterActivityTest.java",
419419
"test/io/flutter/embedding/android/FlutterFragmentTest.java",
420+
"test/io/flutter/embedding/android/FlutterViewTest.java",
420421
"test/io/flutter/embedding/engine/FlutterEngineCacheTest.java",
421422
"test/io/flutter/embedding/engine/FlutterJNITest.java",
422423
"test/io/flutter/embedding/engine/RenderingComponentTest.java",

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -633,6 +633,8 @@ public void attachToFlutterEngine(
633633
sendLocalesToFlutter(getResources().getConfiguration());
634634
sendViewportMetricsToFlutter();
635635

636+
flutterEngine.getPlatformViewsController().attachToView(this);
637+
636638
// Notify engine attachment listeners of the attachment.
637639
for (FlutterEngineAttachmentListener listener : flutterEngineAttachmentListeners) {
638640
listener.onFlutterEngineAttachedToFlutterView(flutterEngine);
@@ -668,6 +670,8 @@ public void detachFromFlutterEngine() {
668670
listener.onFlutterEngineDetachedFromFlutterView();
669671
}
670672

673+
flutterEngine.getPlatformViewsController().detachFromView();
674+
671675
// Disconnect the FlutterEngine's PlatformViewsController from the AccessibilityBridge.
672676
flutterEngine.getPlatformViewsController().detachAccessibiltyBridge();
673677

shell/platform/android/io/flutter/embedding/engine/FlutterEngine.java

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -143,14 +143,19 @@ public void onPreEngineRestart() {
143143
* and {@link FlutterLoader#ensureInitializationComplete(Context, String[])}.
144144
*/
145145
public FlutterEngine(@NonNull Context context) {
146-
this(context, FlutterLoader.getInstance());
146+
this(context, FlutterLoader.getInstance(), new FlutterJNI());
147147
}
148148

149-
/* package */ FlutterEngine(@NonNull Context context, @NonNull FlutterLoader flutterLoader) {
149+
/**
150+
* Constructs a new {@code FlutterEngine}. See {@link #FlutterEngine(Context)}.
151+
*
152+
* {@code flutterJNI} should be a new instance that has never been attached to an engine before.
153+
*/
154+
public FlutterEngine(@NonNull Context context, @NonNull FlutterLoader flutterLoader, @NonNull FlutterJNI flutterJNI) {
155+
this.flutterJNI = flutterJNI;
150156
flutterLoader.startInitialization(context);
151157
flutterLoader.ensureInitializationComplete(context, null);
152158

153-
this.flutterJNI = new FlutterJNI();
154159
flutterJNI.addEngineLifecycleListener(engineLifecycleListener);
155160
attachToJni();
156161

shell/platform/android/io/flutter/embedding/engine/FlutterJNI.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ public static native void nativeInit(
121121

122122
// TODO(mattcarroll): add javadocs
123123
@UiThread
124-
public static native boolean nativeGetIsSoftwareRenderingEnabled();
124+
public native boolean nativeGetIsSoftwareRenderingEnabled();
125125

126126
@Nullable
127127
// TODO(mattcarroll): add javadocs

shell/platform/android/io/flutter/embedding/engine/renderer/FlutterRenderer.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -281,7 +281,7 @@ private void unregisterTexture(long textureId) {
281281

282282
// TODO(mattcarroll): describe the native behavior that this invokes
283283
public boolean isSoftwareRenderingEnabled() {
284-
return FlutterJNI.nativeGetIsSoftwareRenderingEnabled();
284+
return flutterJNI.nativeGetIsSoftwareRenderingEnabled();
285285
}
286286

287287
// TODO(mattcarroll): describe the native behavior that this invokes

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

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,6 @@
3838
import android.view.inputmethod.InputMethodManager;
3939

4040
import java.nio.ByteBuffer;
41-
import java.nio.ByteOrder;
4241
import java.util.ArrayList;
4342
import java.util.List;
4443
import java.util.Locale;
@@ -162,7 +161,7 @@ public FlutterView(Context context, AttributeSet attrs, FlutterNativeView native
162161

163162
dartExecutor = mNativeView.getDartExecutor();
164163
flutterRenderer = new FlutterRenderer(mNativeView.getFlutterJNI());
165-
mIsSoftwareRenderingEnabled = FlutterJNI.nativeGetIsSoftwareRenderingEnabled();
164+
mIsSoftwareRenderingEnabled = mNativeView.getFlutterJNI().nativeGetIsSoftwareRenderingEnabled();
166165
mMetrics = new ViewportMetrics();
167166
mMetrics.devicePixelRatio = context.getResources().getDisplayMetrics().density;
168167
setFocusable(true);

shell/platform/android/test/io/flutter/FlutterTestSuite.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111
import io.flutter.embedding.android.FlutterActivityTest;
1212
import io.flutter.embedding.android.FlutterFragmentTest;
13+
import io.flutter.embedding.android.FlutterViewTest;
1314
import io.flutter.embedding.engine.FlutterEngineCacheTest;
1415
import io.flutter.embedding.engine.FlutterJNITest;
1516
import io.flutter.embedding.engine.RenderingComponentTest;
@@ -28,6 +29,7 @@
2829
FlutterFragmentTest.class,
2930
FlutterJNITest.class,
3031
FlutterRendererTest.class,
32+
FlutterViewTest.class,
3133
PlatformChannelTest.class,
3234
PreconditionsTest.class,
3335
RenderingComponentTest.class,
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
package io.flutter.embedding.android;
2+
3+
import static org.mockito.Mockito.spy;
4+
import static org.mockito.Mockito.times;
5+
import static org.mockito.Mockito.verify;
6+
import static org.mockito.Mockito.when;
7+
8+
import io.flutter.embedding.engine.FlutterJNI;
9+
import io.flutter.embedding.engine.loader.FlutterLoader;
10+
import io.flutter.plugin.platform.PlatformViewsController;
11+
import org.junit.Before;
12+
import org.junit.Test;
13+
import org.junit.runner.RunWith;
14+
import org.mockito.Mock;
15+
import org.mockito.MockitoAnnotations;
16+
import org.mockito.Spy;
17+
import org.robolectric.RobolectricTestRunner;
18+
import org.robolectric.RuntimeEnvironment;
19+
import org.robolectric.annotation.Config;
20+
21+
import io.flutter.embedding.engine.FlutterEngine;
22+
23+
@Config(manifest = Config.NONE)
24+
@RunWith(RobolectricTestRunner.class)
25+
public class FlutterViewTest {
26+
@Mock FlutterJNI mockFlutterJni;
27+
@Mock FlutterLoader mockFlutterLoader;
28+
@Spy PlatformViewsController platformViewsController;
29+
30+
@Before
31+
public void setUp() {
32+
MockitoAnnotations.initMocks(this);
33+
when(mockFlutterJni.isAttached()).thenReturn(true);
34+
}
35+
36+
@Test
37+
public void attachToFlutterEngine_alertsPlatformViews() {
38+
FlutterView flutterView = new FlutterView(RuntimeEnvironment.application);
39+
FlutterEngine flutterEngine = spy(new FlutterEngine(RuntimeEnvironment.application, mockFlutterLoader, mockFlutterJni));
40+
when(flutterEngine.getPlatformViewsController()).thenReturn(platformViewsController);
41+
42+
flutterView.attachToFlutterEngine(flutterEngine);
43+
44+
verify(platformViewsController, times(1)).attachToView(flutterView);
45+
}
46+
47+
@Test
48+
public void detachFromFlutterEngine_alertsPlatformViews() {
49+
FlutterView flutterView = new FlutterView(RuntimeEnvironment.application);
50+
FlutterEngine flutterEngine = spy(new FlutterEngine(RuntimeEnvironment.application, mockFlutterLoader, mockFlutterJni));
51+
when(flutterEngine.getPlatformViewsController()).thenReturn(platformViewsController);
52+
53+
flutterView.attachToFlutterEngine(flutterEngine);
54+
flutterView.detachFromFlutterEngine();
55+
56+
verify(platformViewsController, times(1)).detachFromView();
57+
}
58+
}

0 commit comments

Comments
 (0)