Flutter Engine
The Flutter Engine
Loading...
Searching...
No Matches
Classes | Public Member Functions | Static Public Attributes | Package Functions | List of all members
io.flutter.embedding.engine.renderer.FlutterRenderer Class Reference
Inheritance diagram for io.flutter.embedding.engine.renderer.FlutterRenderer:

Classes

class  DisplayFeature
 
enum  DisplayFeatureState
 
enum  DisplayFeatureType
 
class  ImageReaderSurfaceProducer
 
class  ImageTextureRegistryEntry
 
class  SurfaceTextureRegistryEntry
 
class  TextureFinalizerRunnable
 
class  ViewportMetrics
 

Public Member Functions

 FlutterRenderer (@NonNull FlutterJNI flutterJNI)
 
boolean isDisplayingFlutterUi ()
 
void addIsDisplayingFlutterUiListener (@NonNull FlutterUiDisplayListener listener)
 
void removeIsDisplayingFlutterUiListener (@NonNull FlutterUiDisplayListener listener)
 
SurfaceProducer createSurfaceProducer ()
 
SurfaceTextureEntry createSurfaceTexture ()
 
SurfaceTextureEntry registerSurfaceTexture (@NonNull SurfaceTexture surfaceTexture)
 

Static Public Attributes

static boolean debugForceSurfaceProducerGlTextures = false
 
static boolean debugDisableSurfaceClear = false
 

Package Functions

void addOnTrimMemoryListener (@NonNull OnTrimMemoryListener listener)
 
void removeOnTrimMemoryListener (@NonNull OnTrimMemoryListener listener)
 
ImageTextureEntry createImageTexture ()
 
void onTrimMemory (int level)
 
void startRenderingToSurface (@NonNull Surface surface, boolean onlySwap)
 
void swapSurface (@NonNull Surface surface)
 
void surfaceChanged (int width, int height)
 
void stopRenderingToSurface ()
 
void setViewportMetrics (@NonNull ViewportMetrics viewportMetrics)
 
Bitmap getBitmap ()
 
void dispatchPointerDataPacket (@NonNull ByteBuffer buffer, int position)
 
boolean isSoftwareRenderingEnabled ()
 
void setAccessibilityFeatures (int flags)
 
void setSemanticsEnabled (boolean enabled)
 
void dispatchSemanticsAction (int nodeId, int action, @Nullable ByteBuffer args, int argsPosition)
 

Detailed Description

Represents the rendering responsibilities of a FlutterEngine.

FlutterRenderer works in tandem with a provided RenderSurface to paint Flutter pixels to an Android View hierarchy.

FlutterRenderer manages textures for rendering, and forwards some Java calls to native Flutter code via JNI. The corresponding RenderSurface provides the Android Surface that this renderer paints.

io.flutter.embedding.android.FlutterSurfaceView and io.flutter.embedding.android.FlutterTextureView are implementations of RenderSurface.

Definition at line 54 of file FlutterRenderer.java.

Constructor & Destructor Documentation

◆ FlutterRenderer()

io.flutter.embedding.engine.renderer.FlutterRenderer.FlutterRenderer ( @NonNull FlutterJNI  flutterJNI)
inline

Definition at line 94 of file FlutterRenderer.java.

94 {
95 this.flutterJNI = flutterJNI;
96 this.flutterJNI.addIsDisplayingFlutterUiListener(flutterUiDisplayListener);
97 }
void addIsDisplayingFlutterUiListener(@NonNull FlutterUiDisplayListener listener)

Member Function Documentation

◆ addIsDisplayingFlutterUiListener()

void io.flutter.embedding.engine.renderer.FlutterRenderer.addIsDisplayingFlutterUiListener ( @NonNull FlutterUiDisplayListener  listener)
inline

Adds a listener that is invoked whenever this FlutterRenderer starts and stops painting pixels to an Android View hierarchy.

Definition at line 111 of file FlutterRenderer.java.

111 {
112 flutterJNI.addIsDisplayingFlutterUiListener(listener);
113
114 if (isDisplayingFlutterUi) {
115 listener.onFlutterUiDisplayed();
116 }
117 }

◆ addOnTrimMemoryListener()

void io.flutter.embedding.engine.renderer.FlutterRenderer.addOnTrimMemoryListener ( @NonNull OnTrimMemoryListener  listener)
inlinepackage

Adds a listener that is invoked when a memory pressure warning was forward.

Definition at line 140 of file FlutterRenderer.java.

140 {
141 // Purge dead listener to avoid accumulating.
142 clearDeadListeners();
143 onTrimMemoryListeners.add(new WeakReference<>(listener));
144 }

◆ createImageTexture()

ImageTextureEntry io.flutter.embedding.engine.renderer.FlutterRenderer.createImageTexture ( )
inline

Definition at line 259 of file FlutterRenderer.java.

259 {
260 final ImageTextureRegistryEntry entry =
261 new ImageTextureRegistryEntry(nextTextureId.getAndIncrement());
262 Log.v(TAG, "New ImageTextureEntry ID: " + entry.id());
263 registerImageTexture(entry.id(), entry);
264 return entry;
265 }
void Log(const char *format,...) SK_PRINTF_LIKE(1

◆ createSurfaceProducer()

SurfaceProducer io.flutter.embedding.engine.renderer.FlutterRenderer.createSurfaceProducer ( )
inline

Creates and returns a new external texture SurfaceProducer managed by the Flutter engine that is also made available to Flutter code.

Definition at line 168 of file FlutterRenderer.java.

168 {
169 // Prior to Impeller, Flutter on Android *only* ran on OpenGLES (via Skia). That
170 // meant that
171 // plugins (i.e. end-users) either explicitly created a SurfaceTexture (via
172 // createX/registerX) or an ImageTexture (via createX/registerX).
173 //
174 // In an Impeller world, which for the first time uses (if available) a Vulkan
175 // rendering
176 // backend, it is no longer possible (at least not trivially) to render an
177 // OpenGLES-provided
178 // texture (SurfaceTexture) in a Vulkan context.
179 //
180 // This function picks the "best" rendering surface based on the Android
181 // runtime, and
182 // provides a consumer-agnostic SurfaceProducer (which in turn vends a Surface),
183 // and has
184 // plugins (i.e. end-users) use the Surface instead, letting us "hide" the
185 // consumer-side
186 // of the implementation.
187 //
188 // tl;dr: If ImageTexture is available, we use it, otherwise we use a
189 // SurfaceTexture.
190 // Coincidentally, if ImageTexture is available, we are also on an Android
191 // version that is
192 // running Vulkan, so we don't have to worry about it not being supported.
193 final SurfaceProducer entry;
194 if (!debugForceSurfaceProducerGlTextures && Build.VERSION.SDK_INT >= API_LEVELS.API_29) {
195 final long id = nextTextureId.getAndIncrement();
196 final ImageReaderSurfaceProducer producer = new ImageReaderSurfaceProducer(id);
197 registerImageTexture(id, producer);
198 addOnTrimMemoryListener(producer);
199 Log.v(TAG, "New ImageReaderSurfaceProducer ID: " + id);
200 entry = producer;
201 } else {
202 // TODO(matanlurey): Actually have the class named "*Producer" to well, produce
203 // something. This is a code smell, but does guarantee the paths for both
204 // createSurfaceTexture and createSurfaceProducer doesn't diverge. As we get more
205 // confident in this API and any possible bugs (and have tests to check we don't
206 // regress), reconsider this pattern.
207 final SurfaceTextureEntry texture = createSurfaceTexture();
208 final SurfaceTextureSurfaceProducer producer =
209 new SurfaceTextureSurfaceProducer(texture.id(), handler, flutterJNI, texture);
210 Log.v(TAG, "New SurfaceTextureSurfaceProducer ID: " + texture.id());
211 entry = producer;
212 }
213 return entry;
214 }
void addOnTrimMemoryListener(@NonNull OnTrimMemoryListener listener)
FlTexture * texture
Build(configs, env, options)
Definition build.py:232

◆ createSurfaceTexture()

SurfaceTextureEntry io.flutter.embedding.engine.renderer.FlutterRenderer.createSurfaceTexture ( )
inline

Creates and returns a new SurfaceTexture managed by the Flutter engine that is also made available to Flutter code.

Definition at line 222 of file FlutterRenderer.java.

222 {
223 Log.v(TAG, "Creating a SurfaceTexture.");
224 final SurfaceTexture surfaceTexture = new SurfaceTexture(0);
225 return registerSurfaceTexture(surfaceTexture);
226 }
SurfaceTextureEntry registerSurfaceTexture(@NonNull SurfaceTexture surfaceTexture)

◆ dispatchPointerDataPacket()

void io.flutter.embedding.engine.renderer.FlutterRenderer.dispatchPointerDataPacket ( @NonNull ByteBuffer  buffer,
int  position 
)
inline

Definition at line 1183 of file FlutterRenderer.java.

1183 {
1184 flutterJNI.dispatchPointerDataPacket(buffer, position);
1185 }
void dispatchPointerDataPacket(@NonNull ByteBuffer buffer, int position)
static const uint8_t buffer[]

◆ dispatchSemanticsAction()

void io.flutter.embedding.engine.renderer.FlutterRenderer.dispatchSemanticsAction ( int  nodeId,
int  action,
@Nullable ByteBuffer  args,
int  argsPosition 
)
inline

Definition at line 1227 of file FlutterRenderer.java.

1228 {
1229 flutterJNI.dispatchSemanticsAction(nodeId, action, args, argsPosition);
1230 }
void dispatchSemanticsAction(int nodeId, @NonNull AccessibilityBridge.Action action)
G_BEGIN_DECLS G_MODULE_EXPORT FlValue * args

◆ getBitmap()

Bitmap io.flutter.embedding.engine.renderer.FlutterRenderer.getBitmap ( )
inline

Definition at line 1178 of file FlutterRenderer.java.

1178 {
1179 return flutterJNI.getBitmap();
1180 }

◆ isDisplayingFlutterUi()

boolean io.flutter.embedding.engine.renderer.FlutterRenderer.isDisplayingFlutterUi ( )
inline

Returns true if this FlutterRenderer is painting pixels to an Android View hierarchy, false otherwise.

Definition at line 103 of file FlutterRenderer.java.

103 {
104 return isDisplayingFlutterUi;
105 }

◆ isSoftwareRenderingEnabled()

boolean io.flutter.embedding.engine.renderer.FlutterRenderer.isSoftwareRenderingEnabled ( )
inline

Definition at line 1212 of file FlutterRenderer.java.

1212 {
1213 return flutterJNI.getIsSoftwareRenderingEnabled();
1214 }

◆ onTrimMemory()

void io.flutter.embedding.engine.renderer.FlutterRenderer.onTrimMemory ( int  level)
inline

Definition at line 268 of file FlutterRenderer.java.

268 {
269 final Iterator<WeakReference<OnTrimMemoryListener>> iterator = onTrimMemoryListeners.iterator();
270 while (iterator.hasNext()) {
271 WeakReference<OnTrimMemoryListener> listenerRef = iterator.next();
272 final OnTrimMemoryListener listener = listenerRef.get();
273 if (listener != null) {
274 listener.onTrimMemory(level);
275 } else {
276 // Purge cleared refs to avoid accumulating a lot of dead listener
277 iterator.remove();
278 }
279 }
280 }

◆ registerSurfaceTexture()

SurfaceTextureEntry io.flutter.embedding.engine.renderer.FlutterRenderer.registerSurfaceTexture ( @NonNull SurfaceTexture  surfaceTexture)
inline

Registers and returns a SurfaceTexture managed by the Flutter engine that is also made available to Flutter code.

Definition at line 234 of file FlutterRenderer.java.

234 {
235 return registerSurfaceTexture(nextTextureId.getAndIncrement(), surfaceTexture);
236 }

◆ removeIsDisplayingFlutterUiListener()

void io.flutter.embedding.engine.renderer.FlutterRenderer.removeIsDisplayingFlutterUiListener ( @NonNull FlutterUiDisplayListener  listener)
inline

Removes a listener added via addIsDisplayingFlutterUiListener(FlutterUiDisplayListener).

Definition at line 123 of file FlutterRenderer.java.

123 {
124 flutterJNI.removeIsDisplayingFlutterUiListener(listener);
125 }
void removeIsDisplayingFlutterUiListener(@NonNull FlutterUiDisplayListener listener)

◆ removeOnTrimMemoryListener()

void io.flutter.embedding.engine.renderer.FlutterRenderer.removeOnTrimMemoryListener ( @NonNull OnTrimMemoryListener  listener)
inlinepackage

Removes a OnTrimMemoryListener that was added with addOnTrimMemoryListener(OnTrimMemoryListener).

Definition at line 151 of file FlutterRenderer.java.

151 {
152 for (WeakReference<OnTrimMemoryListener> listenerRef : onTrimMemoryListeners) {
153 if (listenerRef.get() == listener) {
154 onTrimMemoryListeners.remove(listenerRef);
155 break;
156 }
157 }
158 }

◆ setAccessibilityFeatures()

void io.flutter.embedding.engine.renderer.FlutterRenderer.setAccessibilityFeatures ( int  flags)
inline

Definition at line 1217 of file FlutterRenderer.java.

1217 {
1218 flutterJNI.setAccessibilityFeatures(flags);
1219 }
FlutterSemanticsFlag flags

◆ setSemanticsEnabled()

void io.flutter.embedding.engine.renderer.FlutterRenderer.setSemanticsEnabled ( boolean  enabled)
inline

Definition at line 1222 of file FlutterRenderer.java.

1222 {
1223 flutterJNI.setSemanticsEnabled(enabled);
1224 }
void setSemanticsEnabled(boolean enabled)

◆ setViewportMetrics()

void io.flutter.embedding.engine.renderer.FlutterRenderer.setViewportMetrics ( @NonNull ViewportMetrics  viewportMetrics)
inline

Notifies Flutter that the viewport metrics, e.g. window height and width, have changed.

If the width, height, or devicePixelRatio are less than or equal to 0, this update is ignored.

Parameters
viewportMetricsThe metrics to send to the Dart application.

Definition at line 1097 of file FlutterRenderer.java.

1097 {
1098 // We might get called with just the DPR if width/height aren't available yet.
1099 // Just ignore, as it will get called again when width/height are set.
1100 if (!viewportMetrics.validate()) {
1101 return;
1102 }
1103 Log.v(
1104 TAG,
1105 "Setting viewport metrics\n"
1106 + "Size: "
1107 + viewportMetrics.width
1108 + " x "
1109 + viewportMetrics.height
1110 + "\n"
1111 + "Padding - L: "
1112 + viewportMetrics.viewPaddingLeft
1113 + ", T: "
1114 + viewportMetrics.viewPaddingTop
1115 + ", R: "
1116 + viewportMetrics.viewPaddingRight
1117 + ", B: "
1118 + viewportMetrics.viewPaddingBottom
1119 + "\n"
1120 + "Insets - L: "
1121 + viewportMetrics.viewInsetLeft
1122 + ", T: "
1123 + viewportMetrics.viewInsetTop
1124 + ", R: "
1125 + viewportMetrics.viewInsetRight
1126 + ", B: "
1127 + viewportMetrics.viewInsetBottom
1128 + "\n"
1129 + "System Gesture Insets - L: "
1130 + viewportMetrics.systemGestureInsetLeft
1131 + ", T: "
1132 + viewportMetrics.systemGestureInsetTop
1133 + ", R: "
1134 + viewportMetrics.systemGestureInsetRight
1135 + ", B: "
1136 + viewportMetrics.systemGestureInsetRight
1137 + "\n"
1138 + "Display Features: "
1139 + viewportMetrics.displayFeatures.size());
1140
1141 int[] displayFeaturesBounds = new int[viewportMetrics.displayFeatures.size() * 4];
1142 int[] displayFeaturesType = new int[viewportMetrics.displayFeatures.size()];
1143 int[] displayFeaturesState = new int[viewportMetrics.displayFeatures.size()];
1144 for (int i = 0; i < viewportMetrics.displayFeatures.size(); i++) {
1145 DisplayFeature displayFeature = viewportMetrics.displayFeatures.get(i);
1146 displayFeaturesBounds[4 * i] = displayFeature.bounds.left;
1147 displayFeaturesBounds[4 * i + 1] = displayFeature.bounds.top;
1148 displayFeaturesBounds[4 * i + 2] = displayFeature.bounds.right;
1149 displayFeaturesBounds[4 * i + 3] = displayFeature.bounds.bottom;
1150 displayFeaturesType[i] = displayFeature.type.encodedValue;
1151 displayFeaturesState[i] = displayFeature.state.encodedValue;
1152 }
1153
1154 flutterJNI.setViewportMetrics(
1155 viewportMetrics.devicePixelRatio,
1156 viewportMetrics.width,
1157 viewportMetrics.height,
1158 viewportMetrics.viewPaddingTop,
1159 viewportMetrics.viewPaddingRight,
1160 viewportMetrics.viewPaddingBottom,
1161 viewportMetrics.viewPaddingLeft,
1162 viewportMetrics.viewInsetTop,
1163 viewportMetrics.viewInsetRight,
1164 viewportMetrics.viewInsetBottom,
1165 viewportMetrics.viewInsetLeft,
1166 viewportMetrics.systemGestureInsetTop,
1167 viewportMetrics.systemGestureInsetRight,
1168 viewportMetrics.systemGestureInsetBottom,
1169 viewportMetrics.systemGestureInsetLeft,
1170 viewportMetrics.physicalTouchSlop,
1171 displayFeaturesBounds,
1172 displayFeaturesType,
1173 displayFeaturesState);
1174 }
void setViewportMetrics(float devicePixelRatio, int physicalWidth, int physicalHeight, int physicalPaddingTop, int physicalPaddingRight, int physicalPaddingBottom, int physicalPaddingLeft, int physicalViewInsetTop, int physicalViewInsetRight, int physicalViewInsetBottom, int physicalViewInsetLeft, int systemGestureInsetTop, int systemGestureInsetRight, int systemGestureInsetBottom, int systemGestureInsetLeft, int physicalTouchSlop, int[] displayFeaturesBounds, int[] displayFeaturesType, int[] displayFeaturesState)

◆ startRenderingToSurface()

void io.flutter.embedding.engine.renderer.FlutterRenderer.startRenderingToSurface ( @NonNull Surface  surface,
boolean  onlySwap 
)
inline

Notifies Flutter that the given surface was created and is available for Flutter rendering.

If called more than once, the current native resources are released. This can be undesired if the Engine expects to reuse this surface later. For example, this is true when platform views are displayed in a frame, and then removed in the next frame.

To avoid releasing the current surface resources, set keepCurrentSurface to true.

See android.view.SurfaceHolder.Callback and android.view.TextureView.SurfaceTextureListener

Parameters
surfaceThe render surface.
onlySwapTrue if the current active surface should not be detached.

Definition at line 1020 of file FlutterRenderer.java.

1020 {
1021 if (!onlySwap) {
1022 // Stop rendering to the surface releases the associated native resources, which causes
1023 // a glitch when toggling between rendering to an image view (hybrid composition) and
1024 // rendering directly to a Surface or Texture view. For more,
1025 // https://github.com/flutter/flutter/issues/95343
1027 }
1028
1029 this.surface = surface;
1030
1031 if (onlySwap) {
1032 // In the swap case we are just swapping the surface that we render to.
1033 flutterJNI.onSurfaceWindowChanged(surface);
1034 } else {
1035 // In the non-swap case we are creating a new surface to render to.
1036 flutterJNI.onSurfaceCreated(surface);
1037 }
1038 }
void onSurfaceCreated(@NonNull Surface surface)
void onSurfaceWindowChanged(@NonNull Surface surface)

◆ stopRenderingToSurface()

void io.flutter.embedding.engine.renderer.FlutterRenderer.stopRenderingToSurface ( )
inline

Notifies Flutter that a surface previously registered with startRenderingToSurface(Surface, boolean) has been destroyed and needs to be released and cleaned up on the Flutter side.

See android.view.SurfaceHolder.Callback and android.view.TextureView.SurfaceTextureListener

Definition at line 1072 of file FlutterRenderer.java.

1072 {
1073 if (surface != null) {
1074 flutterJNI.onSurfaceDestroyed();
1075
1076 // TODO(mattcarroll): the source of truth for this call should be FlutterJNI, which is
1077 // where the call to onFlutterUiDisplayed() comes from. However, no such native callback
1078 // exists yet, so until the engine and FlutterJNI are configured to call us back when
1079 // rendering stops, we will manually monitor that change here.
1080 if (isDisplayingFlutterUi) {
1081 flutterUiDisplayListener.onFlutterUiNoLongerDisplayed();
1082 }
1083
1084 isDisplayingFlutterUi = false;
1085 surface = null;
1086 }
1087 }

◆ surfaceChanged()

void io.flutter.embedding.engine.renderer.FlutterRenderer.surfaceChanged ( int  width,
int  height 
)
inline

Notifies Flutter that a surface previously registered with startRenderingToSurface(Surface, boolean) has changed size to the given width and height.

See android.view.SurfaceHolder.Callback and android.view.TextureView.SurfaceTextureListener

Definition at line 1060 of file FlutterRenderer.java.

1060 {
1061 flutterJNI.onSurfaceChanged(width, height);
1062 }
void onSurfaceChanged(int width, int height)
int32_t height
int32_t width

◆ swapSurface()

void io.flutter.embedding.engine.renderer.FlutterRenderer.swapSurface ( @NonNull Surface  surface)
inline

Swaps the Surface used to render the current frame.

In hybrid composition, the root surfaces changes from android.view.SurfaceHolder#getSurface() to android.media.ImageReader#getSurface() when a platform view is in the current frame.

Definition at line 1047 of file FlutterRenderer.java.

1047 {
1048 this.surface = surface;
1049 flutterJNI.onSurfaceWindowChanged(surface);
1050 }

Member Data Documentation

◆ debugDisableSurfaceClear

boolean io.flutter.embedding.engine.renderer.FlutterRenderer.debugDisableSurfaceClear = false
static

Whether to disable clearing of the Surface used to render platform views.

Definition at line 66 of file FlutterRenderer.java.

◆ debugForceSurfaceProducerGlTextures

boolean io.flutter.embedding.engine.renderer.FlutterRenderer.debugForceSurfaceProducerGlTextures = false
static

Whether to always use GL textures for FlutterRenderer#createSurfaceProducer().

This is a debug-only API intended for local development. For example, when using a newer Android device (that normally would use ImageReaderSurfaceProducer, but wanting to test the OpenGLES/SurfaceTextureSurfaceProducer code branch. This flag has undefined behavior if set to true while running in a Vulkan (Impeller) context.

Definition at line 63 of file FlutterRenderer.java.


The documentation for this class was generated from the following file: