Flutter Engine
The Flutter Engine
Loading...
Searching...
No Matches
Public Member Functions | Static Public Member Functions | Private Member Functions | List of all members
flutter::PlatformViewAndroid Class Referencefinal

#include <platform_view_android.h>

Inheritance diagram for flutter::PlatformViewAndroid:
flutter::PlatformView

Public Member Functions

 PlatformViewAndroid (PlatformView::Delegate &delegate, const flutter::TaskRunners &task_runners, const std::shared_ptr< PlatformViewAndroidJNI > &jni_facade, bool use_software_rendering, uint8_t msaa_samples)
 
 PlatformViewAndroid (PlatformView::Delegate &delegate, const flutter::TaskRunners &task_runners, const std::shared_ptr< PlatformViewAndroidJNI > &jni_facade, const std::shared_ptr< flutter::AndroidContext > &android_context)
 Creates a new PlatformViewAndroid but using an existing Android GPU context to create new surfaces. This maximizes resource sharing between 2 PlatformViewAndroids of 2 Shells.
 
 ~PlatformViewAndroid () override
 
void NotifyCreated (fml::RefPtr< AndroidNativeWindow > native_window)
 
void NotifySurfaceWindowChanged (fml::RefPtr< AndroidNativeWindow > native_window)
 
void NotifyChanged (const SkISize &size)
 
void NotifyDestroyed () override
 Used by embedders to notify the shell that the platform view has been destroyed. This notification used to collect the rendering surface and all associated resources. Frame scheduling is also suspended.
 
void DispatchPlatformMessage (JNIEnv *env, std::string name, jobject message_data, jint message_position, jint response_id)
 
void DispatchEmptyPlatformMessage (JNIEnv *env, std::string name, jint response_id)
 
void DispatchSemanticsAction (JNIEnv *env, jint id, jint action, jobject args, jint args_position)
 
void RegisterExternalTexture (int64_t texture_id, const fml::jni::ScopedJavaGlobalRef< jobject > &surface_texture)
 
void RegisterImageTexture (int64_t texture_id, const fml::jni::ScopedJavaGlobalRef< jobject > &image_texture_entry)
 
void LoadDartDeferredLibrary (intptr_t loading_unit_id, std::unique_ptr< const fml::Mapping > snapshot_data, std::unique_ptr< const fml::Mapping > snapshot_instructions) override
 Loads the Dart shared library into the Dart VM. When the Dart library is loaded successfully, the Dart future returned by the originating loadLibrary() call completes.
 
void LoadDartDeferredLibraryError (intptr_t loading_unit_id, const std::string error_message, bool transient) override
 Indicates to the dart VM that the request to load a deferred library with the specified loading unit id has failed.
 
void UpdateAssetResolverByType (std::unique_ptr< AssetResolver > updated_asset_resolver, AssetResolver::AssetResolverType type) override
 Replaces the asset resolver handled by the engine's AssetManager of the specified type with updated_asset_resolver. The matching AssetResolver is removed and replaced with updated_asset_resolvers.
 
const std::shared_ptr< AndroidContext > & GetAndroidContext ()
 
std::shared_ptr< PlatformMessageHandlerGetPlatformMessageHandler () const override
 Specifies a delegate that will receive PlatformMessages from Flutter to the host platform.
 
- Public Member Functions inherited from flutter::PlatformView
 PlatformView (Delegate &delegate, const TaskRunners &task_runners)
 Creates a platform view with the specified delegate and task runner. The base class by itself does not do much but is suitable for use in test environments where full platform integration may not be necessary. The platform view may only be created, accessed and destroyed on the platform task runner.
 
virtual ~PlatformView ()
 Destroys the platform view. The platform view is owned by the shell and will be destroyed by the same on the platform tasks runner.
 
void DispatchPlatformMessage (std::unique_ptr< PlatformMessage > message)
 Used by embedders to dispatch a platform message to a running root isolate hosted by the engine. If an isolate is not running, the message is dropped. If there is no one on the other side listening on the channel, the message is dropped. When a platform message is dropped, any response handles associated with that message will be dropped as well. All users of platform messages must assume that message may not be delivered and/or their response handles may not be invoked. Platform messages are not buffered.
 
void DispatchSemanticsAction (int32_t node_id, SemanticsAction action, fml::MallocMapping args)
 Used by embedders to dispatch an accessibility action to a running isolate hosted by the engine.
 
virtual void SetSemanticsEnabled (bool enabled)
 Used by embedder to notify the running isolate hosted by the engine on the UI thread that the accessibility tree needs to be generated.
 
virtual void SetAccessibilityFeatures (int32_t flags)
 Used by the embedder to specify the features to enable in the accessibility tree generated by the isolate. This information is forwarded to the root isolate hosted by the engine on the UI thread.
 
virtual void SendChannelUpdate (const std::string &name, bool listening)
 Used by the framework to tell the embedder that it has registered a listener on a given channel.
 
void SetViewportMetrics (int64_t view_id, const ViewportMetrics &metrics)
 Used by embedders to specify the updated viewport metrics for a view. In response to this call, on the raster thread, the rasterizer may need to be reconfigured to the updated viewport dimensions. On the UI thread, the framework may need to start generating a new frame for the updated viewport metrics as well.
 
void NotifyCreated ()
 Used by embedders to notify the shell that a platform view has been created. This notification is used to create a rendering surface and pick the client rendering API to use to render into this surface. No frames will be scheduled or rendered before this call. The surface must remain valid till the corresponding call to NotifyDestroyed.
 
void ScheduleFrame ()
 Used by embedders to schedule a frame. In response to this call, the framework may need to start generating a new frame.
 
void AddView (int64_t view_id, const ViewportMetrics &viewport_metrics, AddViewCallback callback)
 Used by embedders to notify the shell of a new non-implicit view.
 
void RemoveView (int64_t view_id, RemoveViewCallback callback)
 Used by embedders to notify the shell of a removed non-implicit view.
 
virtual PointerDataDispatcherMaker GetDispatcherMaker ()
 Returns a platform-specific PointerDataDispatcherMaker so the Engine can construct the PointerDataPacketDispatcher based on platforms.
 
fml::WeakPtr< PlatformViewGetWeakPtr () const
 Returns a weak pointer to the platform view. Since the platform view may only be created, accessed and destroyed on the platform thread, any access to the platform view from a non-platform task runner needs a weak pointer to the platform view along with a reference to the platform task runner. A task must be posted to the platform task runner with the weak pointer captured in the same. The platform view method may only be called in the posted task once the weak pointer validity has been checked. This method is used by callers to obtain that weak pointer.
 
void SetNextFrameCallback (const fml::closure &closure)
 Sets a callback that gets executed when the rasterizer renders the next frame. Due to the asynchronous nature of rendering in Flutter, embedders usually add a placeholder over the contents in which Flutter is going to render when Flutter is first initialized. This callback may be used as a signal to remove that placeholder. The callback is executed on the render task runner and not the platform task runner. It is the embedder's responsibility to re-thread as necessary.
 
void DispatchPointerDataPacket (std::unique_ptr< PointerDataPacket > packet)
 Dispatches pointer events from the embedder to the framework. Each pointer data packet may contain multiple pointer input events. Each call to this method wakes up the UI thread.
 
void RegisterTexture (std::shared_ptr< flutter::Texture > texture)
 Used by the embedder to specify a texture that it wants the rasterizer to composite within the Flutter layer tree. All textures must have a unique identifier. When the rasterizer encounters an external texture within its hierarchy, it gives the embedder a chance to update that texture on the raster thread before it composites the same on-screen.
 
void UnregisterTexture (int64_t texture_id)
 Used by the embedder to notify the rasterizer that it will no longer attempt to composite the specified texture within the layer tree. This allows the rasterizer to collect associated resources.
 
void MarkTextureFrameAvailable (int64_t texture_id)
 Used by the embedder to notify the rasterizer that the context of the previously registered texture have been updated. Typically, Flutter will only render a frame if there is an updated layer tree. However, in cases where the layer tree is static but one of the externally composited textures has been updated by the embedder, the embedder needs to notify the rasterizer to render a new frame. In such cases, the existing layer tree may be reused with the frame re-composited with all updated external textures. Unlike the calls to register and unregister the texture, this call must be made each time a new texture frame is available.
 
const SettingsGetSettings () const
 Get the settings for this platform view instance.
 

Static Public Member Functions

static bool Register (JNIEnv *env)
 

Private Member Functions

void UpdateSemantics (flutter::SemanticsNodeUpdates update, flutter::CustomAccessibilityActionUpdates actions) override
 Used by the framework to tell the embedder to apply the specified semantics node updates. The default implementation of this method does nothing.
 
void HandlePlatformMessage (std::unique_ptr< flutter::PlatformMessage > message) override
 Overridden by embedders to perform actions in response to platform messages sent from the framework to the embedder. Default implementation of this method simply returns an empty response.
 
void OnPreEngineRestart () const override
 Gives embedders a chance to react to a "cold restart" of the running isolate. The default implementation of this method does nothing.
 
std::unique_ptr< VsyncWaiterCreateVSyncWaiter () override
 Invoked by the shell to obtain a platform specific vsync waiter. It is optional for platforms to override this method and provide a custom vsync waiter because a timer based fall-back waiter is used by default. However, it is highly recommended that platform provide their own Vsync waiter as the timer based fall-back will not render frames aligned with vsync boundaries.
 
std::unique_ptr< SurfaceCreateRenderingSurface () override
 
std::shared_ptr< ExternalViewEmbedderCreateExternalViewEmbedder () override
 
std::unique_ptr< SnapshotSurfaceProducerCreateSnapshotSurfaceProducer () override
 Creates an object that produces surfaces suitable for raster snapshotting. The rasterizer will request this surface if no on screen surface is currently available when an application requests a snapshot, e.g. if Scene.toImage or Picture.toImage are called while the application is in the background.
 
sk_sp< GrDirectContextCreateResourceContext () const override
 Used by the shell to obtain a Skia GPU context that is capable of operating on the IO thread. The context must be in the same share-group as the Skia GPU context used on the render thread. This context will always be used on the IO thread. Because it is in the same share-group as the separate render thread context, any GPU resources uploaded in this context will be visible to the render thread context (synchronization of GPU resources is managed by Skia).
 
void ReleaseResourceContext () const override
 Used by the shell to notify the embedder that the resource context previously obtained via a call to CreateResourceContext() is being collected. The embedder is free to collect an platform specific resources associated with this context.
 
std::shared_ptr< impeller::ContextGetImpellerContext () const override
 
std::unique_ptr< std::vector< std::string > > ComputePlatformResolvedLocales (const std::vector< std::string > &supported_locale_data) override
 Directly invokes platform-specific APIs to compute the locale the platform would have natively resolved to.
 
void RequestDartDeferredLibrary (intptr_t loading_unit_id) override
 Invoked when the dart VM requests that a deferred library be loaded. Notifies the engine that the deferred library identified by the specified loading unit id should be downloaded and loaded into the Dart VM via LoadDartDeferredLibrary
 
double GetScaledFontSize (double unscaled_font_size, int configuration_id) const override
 Synchronously invokes platform-specific APIs to apply the system text scaling on the given unscaled font size.
 

Additional Inherited Members

- Public Types inherited from flutter::PlatformView
using AddViewCallback = std::function< void(bool added)>
 
using RemoveViewCallback = std::function< void(bool removed)>
 
- Protected Attributes inherited from flutter::PlatformView
PlatformView::Delegatedelegate_
 
const TaskRunners task_runners_
 
PointerDataPacketConverter pointer_data_packet_converter_
 
fml::WeakPtrFactory< PlatformViewweak_factory_
 

Detailed Description

Definition at line 42 of file platform_view_android.h.

Constructor & Destructor Documentation

◆ PlatformViewAndroid() [1/2]

flutter::PlatformViewAndroid::PlatformViewAndroid ( PlatformView::Delegate delegate,
const flutter::TaskRunners task_runners,
const std::shared_ptr< PlatformViewAndroidJNI > &  jni_facade,
bool  use_software_rendering,
uint8_t  msaa_samples 
)

Definition at line 91 of file platform_view_android.cc.

98 delegate,
99 task_runners,
100 jni_facade,
102 use_software_rendering,
103 task_runners,
104 msaa_samples,
105 delegate.OnPlatformViewGetSettings().android_rendering_api,
106 delegate.OnPlatformViewGetSettings().enable_vulkan_validation,
107 delegate.OnPlatformViewGetSettings().enable_opengl_gpu_tracing,
108 delegate.OnPlatformViewGetSettings().enable_vulkan_gpu_tracing)) {
109}
PlatformViewAndroid(PlatformView::Delegate &delegate, const flutter::TaskRunners &task_runners, const std::shared_ptr< PlatformViewAndroidJNI > &jni_facade, bool use_software_rendering, uint8_t msaa_samples)
static std::shared_ptr< flutter::AndroidContext > CreateAndroidContext(bool use_software_rendering, const flutter::TaskRunners &task_runners, uint8_t msaa_samples, AndroidRenderingAPI android_rendering_api, bool enable_vulkan_validation, bool enable_opengl_gpu_tracing, bool enable_vulkan_gpu_tracing)

◆ PlatformViewAndroid() [2/2]

flutter::PlatformViewAndroid::PlatformViewAndroid ( PlatformView::Delegate delegate,
const flutter::TaskRunners task_runners,
const std::shared_ptr< PlatformViewAndroidJNI > &  jni_facade,
const std::shared_ptr< flutter::AndroidContext > &  android_context 
)

Creates a new PlatformViewAndroid but using an existing Android GPU context to create new surfaces. This maximizes resource sharing between 2 PlatformViewAndroids of 2 Shells.

Definition at line 111 of file platform_view_android.cc.

116 : PlatformView(delegate, task_runners),
117 jni_facade_(jni_facade),
118 android_context_(android_context),
119 platform_view_android_delegate_(jni_facade),
120 platform_message_handler_(new PlatformMessageHandlerAndroid(jni_facade)) {
121 if (android_context_) {
122 FML_CHECK(android_context_->IsValid())
123 << "Could not create surface from invalid Android context.";
124 surface_factory_ = std::make_shared<AndroidSurfaceFactoryImpl>(
125 android_context_, //
126 delegate.OnPlatformViewGetSettings().enable_impeller //
127 );
128 android_surface_ = surface_factory_->CreateSurface();
129 FML_CHECK(android_surface_ && android_surface_->IsValid())
130 << "Could not create an OpenGL, Vulkan or Software surface to set up "
131 "rendering.";
132 }
133}
PlatformView(Delegate &delegate, const TaskRunners &task_runners)
Creates a platform view with the specified delegate and task runner. The base class by itself does no...
#define FML_CHECK(condition)
Definition logging.h:85

◆ ~PlatformViewAndroid()

flutter::PlatformViewAndroid::~PlatformViewAndroid ( )
overridedefault

Member Function Documentation

◆ ComputePlatformResolvedLocales()

std::unique_ptr< std::vector< std::string > > flutter::PlatformViewAndroid::ComputePlatformResolvedLocales ( const std::vector< std::string > &  supported_locale_data)
overrideprivatevirtual

Directly invokes platform-specific APIs to compute the locale the platform would have natively resolved to.

Parameters
[in]supported_locale_dataThe vector of strings that represents the locales supported by the app. Each locale consists of three strings: languageCode, countryCode, and scriptCode in that order.
Returns
A vector of 3 strings languageCode, countryCode, and scriptCode that represents the locale selected by the platform. Empty strings mean the value was unassigned. Empty vector represents a null locale.

Reimplemented from flutter::PlatformView.

Definition at line 401 of file platform_view_android.cc.

402 {
403 return jni_facade_->FlutterViewComputePlatformResolvedLocale(
404 supported_locale_data);
405}

◆ CreateExternalViewEmbedder()

std::shared_ptr< ExternalViewEmbedder > flutter::PlatformViewAndroid::CreateExternalViewEmbedder ( )
overrideprivatevirtual

Reimplemented from flutter::PlatformView.

Definition at line 349 of file platform_view_android.cc.

349 {
350 return std::make_shared<AndroidExternalViewEmbedder>(
351 *android_context_, jni_facade_, surface_factory_, task_runners_);
352}
const TaskRunners task_runners_

◆ CreateRenderingSurface()

std::unique_ptr< Surface > flutter::PlatformViewAndroid::CreateRenderingSurface ( )
overrideprivatevirtual

Reimplemented from flutter::PlatformView.

Definition at line 339 of file platform_view_android.cc.

339 {
340 if (!android_surface_) {
341 return nullptr;
342 }
343 return android_surface_->CreateGPUSurface(
344 android_context_->GetMainSkiaContext().get());
345}

◆ CreateResourceContext()

sk_sp< GrDirectContext > flutter::PlatformViewAndroid::CreateResourceContext ( ) const
overrideprivatevirtual

Used by the shell to obtain a Skia GPU context that is capable of operating on the IO thread. The context must be in the same share-group as the Skia GPU context used on the render thread. This context will always be used on the IO thread. Because it is in the same share-group as the separate render thread context, any GPU resources uploaded in this context will be visible to the render thread context (synchronization of GPU resources is managed by Skia).

If such context cannot be created on the IO thread, callers may return nullptr. This will mean that all texture uploads will be queued onto the render thread which will cause performance issues. When this context is nullptr, an error is logged to the console. It is highly recommended that all platforms provide a resource context.

Attention
Unlike all other methods on the platform view, this will be called on IO task runner.
Returns
The Skia GPU context that is in the same share-group as the main render thread GPU context. May be nullptr in case such a context cannot be created.

Reimplemented from flutter::PlatformView.

Definition at line 364 of file platform_view_android.cc.

364 {
365 if (!android_surface_) {
366 return nullptr;
367 }
368 sk_sp<GrDirectContext> resource_context;
369 if (android_surface_->ResourceContextMakeCurrent()) {
370 // TODO(chinmaygarde): Currently, this code depends on the fact that only
371 // the OpenGL surface will be able to make a resource context current. If
372 // this changes, this assumption breaks. Handle the same.
376 } else {
377 FML_DLOG(ERROR) << "Could not make the resource context current.";
378 }
379
380 return resource_context;
381}
static sk_sp< const GrGLInterface > GetDefaultPlatformGLInterface()
static sk_sp< GrDirectContext > CreateCompatibleResourceLoadingContext(GrBackendApi backend, const sk_sp< const GrGLInterface > &gl_interface)
#define FML_DLOG(severity)
Definition logging.h:102
#define ERROR(message)

◆ CreateSnapshotSurfaceProducer()

std::unique_ptr< SnapshotSurfaceProducer > flutter::PlatformViewAndroid::CreateSnapshotSurfaceProducer ( )
overrideprivatevirtual

Creates an object that produces surfaces suitable for raster snapshotting. The rasterizer will request this surface if no on screen surface is currently available when an application requests a snapshot, e.g. if Scene.toImage or Picture.toImage are called while the application is in the background.

Not all backends support this kind of surface usage, and the default implementation returns nullptr. Platforms should override this if they can support GPU operations in the background and support GPU resource context usage.

Reimplemented from flutter::PlatformView.

Definition at line 356 of file platform_view_android.cc.

356 {
357 if (!android_surface_) {
358 return nullptr;
359 }
360 return std::make_unique<AndroidSnapshotSurfaceProducer>(*android_surface_);
361}

◆ CreateVSyncWaiter()

std::unique_ptr< VsyncWaiter > flutter::PlatformViewAndroid::CreateVSyncWaiter ( )
overrideprivatevirtual

Invoked by the shell to obtain a platform specific vsync waiter. It is optional for platforms to override this method and provide a custom vsync waiter because a timer based fall-back waiter is used by default. However, it is highly recommended that platform provide their own Vsync waiter as the timer based fall-back will not render frames aligned with vsync boundaries.

Attention
If a timer based fall-back is used, a warning is logged to the console. In case this method is overridden in a subclass, it must return a valid vsync waiter. Returning null will lead to internal errors. If a valid vsync waiter cannot be returned, subclasses should just call the based class method instead.
Returns
A vsync waiter. If is an internal error to return a null waiter.

Reimplemented from flutter::PlatformView.

Definition at line 334 of file platform_view_android.cc.

334 {
335 return std::make_unique<VsyncWaiterAndroid>(task_runners_);
336}

◆ DispatchEmptyPlatformMessage()

void flutter::PlatformViewAndroid::DispatchEmptyPlatformMessage ( JNIEnv *  env,
std::string  name,
jint  response_id 
)

Definition at line 224 of file platform_view_android.cc.

226 {
228 if (response_id) {
229 response = fml::MakeRefCounted<PlatformMessageResponseAndroid>(
230 response_id, jni_facade_, task_runners_.GetPlatformTaskRunner());
231 }
232
234 std::make_unique<flutter::PlatformMessage>(std::move(name),
235 std::move(response)));
236}
void DispatchPlatformMessage(std::unique_ptr< PlatformMessage > message)
Used by embedders to dispatch a platform message to a running root isolate hosted by the engine....
fml::RefPtr< fml::TaskRunner > GetPlatformTaskRunner() const
DEF_SWITCHES_START aot vmservice shared library name
Definition switches.h:32

◆ DispatchPlatformMessage()

void flutter::PlatformViewAndroid::DispatchPlatformMessage ( JNIEnv *  env,
std::string  name,
jobject  message_data,
jint  message_position,
jint  response_id 
)

Definition at line 203 of file platform_view_android.cc.

207 {
208 uint8_t* message_data =
209 static_cast<uint8_t*>(env->GetDirectBufferAddress(java_message_data));
211 fml::MallocMapping::Copy(message_data, java_message_position);
212
214 if (response_id) {
215 response = fml::MakeRefCounted<PlatformMessageResponseAndroid>(
216 response_id, jni_facade_, task_runners_.GetPlatformTaskRunner());
217 }
218
220 std::make_unique<flutter::PlatformMessage>(
221 std::move(name), std::move(message), std::move(response)));
222}
A Mapping like NonOwnedMapping, but uses Free as its release proc.
Definition mapping.h:144
static MallocMapping Copy(const T *begin, const T *end)
Definition mapping.h:162
Win32Message message
Definition __init__.py:1

◆ DispatchSemanticsAction()

void flutter::PlatformViewAndroid::DispatchSemanticsAction ( JNIEnv *  env,
jint  id,
jint  action,
jobject  args,
jint  args_position 
)

Definition at line 250 of file platform_view_android.cc.

254 {
255 if (env->IsSameObject(args, NULL)) {
257 id, static_cast<flutter::SemanticsAction>(action),
259 return;
260 }
261
262 uint8_t* args_data = static_cast<uint8_t*>(env->GetDirectBufferAddress(args));
263 auto args_vector = fml::MallocMapping::Copy(args_data, args_position);
264
266 id, static_cast<flutter::SemanticsAction>(action),
267 std::move(args_vector));
268}
void DispatchSemanticsAction(int32_t node_id, SemanticsAction action, fml::MallocMapping args)
Used by embedders to dispatch an accessibility action to a running isolate hosted by the engine.
G_BEGIN_DECLS G_MODULE_EXPORT FlValue * args

◆ GetAndroidContext()

const std::shared_ptr< AndroidContext > & flutter::PlatformViewAndroid::GetAndroidContext ( )
inline

Definition at line 114 of file platform_view_android.h.

114 {
115 return android_context_;
116 }

◆ GetImpellerContext()

std::shared_ptr< impeller::Context > flutter::PlatformViewAndroid::GetImpellerContext ( ) const
overrideprivatevirtual

Reimplemented from flutter::PlatformView.

Definition at line 391 of file platform_view_android.cc.

392 {
393 if (android_surface_) {
394 return android_surface_->GetImpellerContext();
395 }
396 return nullptr;
397}

◆ GetPlatformMessageHandler()

std::shared_ptr< PlatformMessageHandler > flutter::PlatformViewAndroid::GetPlatformMessageHandler ( ) const
inlineoverridevirtual

Specifies a delegate that will receive PlatformMessages from Flutter to the host platform.

If this returns null that means PlatformMessages should be sent to the PlatformView. That is to protect legacy behavior, any embedder that wants to support executing Platform Channel handlers on background threads should be returning a thread-safe PlatformMessageHandler instead.

Reimplemented from flutter::PlatformView.

Definition at line 118 of file platform_view_android.h.

119 {
120 return platform_message_handler_;
121 }

◆ GetScaledFontSize()

double flutter::PlatformViewAndroid::GetScaledFontSize ( double  unscaled_font_size,
int  configuration_id 
) const
overrideprivatevirtual

Synchronously invokes platform-specific APIs to apply the system text scaling on the given unscaled font size.

Platforms that support this feature (currently it's only implemented for Android SDK level 34+) will send a valid configuration_id to potential callers, before this method can be called.

Parameters
[in]unscaled_font_sizeThe unscaled font size specified by the app developer. The value is in logical pixels, and is guaranteed to be finite and non-negative.
[in]configuration_idThe unique id of the configuration to use for computing the scaled font size.
Returns
The scaled font size in logical pixels, or -1 if the given configuration_id did not match a valid configuration.

Reimplemented from flutter::PlatformView.

Definition at line 460 of file platform_view_android.cc.

461 {
462 return jni_facade_->FlutterViewGetScaledFontSize(unscaled_font_size,
463 configuration_id);
464}

◆ HandlePlatformMessage()

void flutter::PlatformViewAndroid::HandlePlatformMessage ( std::unique_ptr< flutter::PlatformMessage message)
overrideprivatevirtual

Overridden by embedders to perform actions in response to platform messages sent from the framework to the embedder. Default implementation of this method simply returns an empty response.

Embedders that wish to send platform messages to the framework may use the DispatchPlatformMessage method. This method is for messages that go the other way.

See also
DispatchPlatformMessage()
Parameters
[in]messageThe message

Reimplemented from flutter::PlatformView.

Definition at line 239 of file platform_view_android.cc.

240 {
241 // Called from the ui thread.
242 platform_message_handler_->HandlePlatformMessage(std::move(message));
243}

◆ LoadDartDeferredLibrary()

void flutter::PlatformViewAndroid::LoadDartDeferredLibrary ( intptr_t  loading_unit_id,
std::unique_ptr< const fml::Mapping snapshot_data,
std::unique_ptr< const fml::Mapping snapshot_instructions 
)
overridevirtual

Loads the Dart shared library into the Dart VM. When the Dart library is loaded successfully, the Dart future returned by the originating loadLibrary() call completes.

The Dart compiler may generate separate shared libraries files called 'loading units' when libraries are imported as deferred. Each of these shared libraries are identified by a unique loading unit id. Callers should open and resolve a SymbolMapping from the shared library. The Mappings should be moved into this method, as ownership will be assumed by the dart isolate after successful loading and released after shutdown of the dart isolate. If loading fails, the mappings will naturally go out of scope.

This method is paired with a RequestDartDeferredLibrary invocation that provides the embedder with the loading unit id of the deferred library to load.

Parameters
[in]loading_unit_idThe unique id of the deferred library's loading unit, as passed in by RequestDartDeferredLibrary.
[in]snapshot_dataDart snapshot data of the loading unit's shared library.
[in]snapshot_dataDart snapshot instructions of the loading unit's shared library.

Reimplemented from flutter::PlatformView.

Definition at line 416 of file platform_view_android.cc.

419 {
420 delegate_.LoadDartDeferredLibrary(loading_unit_id, std::move(snapshot_data),
421 std::move(snapshot_instructions));
422}
virtual void LoadDartDeferredLibrary(intptr_t loading_unit_id, std::unique_ptr< const fml::Mapping > snapshot_data, std::unique_ptr< const fml::Mapping > snapshot_instructions)=0
Loads the dart shared library into the dart VM. When the dart library is loaded successfully,...
PlatformView::Delegate & delegate_

◆ LoadDartDeferredLibraryError()

void flutter::PlatformViewAndroid::LoadDartDeferredLibraryError ( intptr_t  loading_unit_id,
const std::string  error_message,
bool  transient 
)
overridevirtual

Indicates to the dart VM that the request to load a deferred library with the specified loading unit id has failed.

The dart future returned by the initiating loadLibrary() call will complete with an error.

Parameters
[in]loading_unit_idThe unique id of the deferred library's loading unit, as passed in by RequestDartDeferredLibrary.
[in]error_messageThe error message that will appear in the dart Future.
[in]transientA transient error is a failure due to temporary conditions such as no network. Transient errors allow the dart VM to re-request the same deferred library and loading_unit_id again. Non-transient errors are permanent and attempts to re-request the library will instantly complete with an error.

Reimplemented from flutter::PlatformView.

Definition at line 425 of file platform_view_android.cc.

428 {
429 delegate_.LoadDartDeferredLibraryError(loading_unit_id, error_message,
430 transient);
431}
virtual void LoadDartDeferredLibraryError(intptr_t loading_unit_id, const std::string error_message, bool transient)=0
Indicates to the dart VM that the request to load a deferred library with the specified loading unit ...

◆ NotifyChanged()

void flutter::PlatformViewAndroid::NotifyChanged ( const SkISize size)

Definition at line 189 of file platform_view_android.cc.

189 {
190 if (!android_surface_) {
191 return;
192 }
196 [&latch, surface = android_surface_.get(), size]() {
197 surface->OnScreenSurfaceResize(size);
198 latch.Signal();
199 });
200 latch.Wait();
201}
fml::RefPtr< fml::TaskRunner > GetRasterTaskRunner() const
static void RunNowOrPostTask(const fml::RefPtr< fml::TaskRunner > &runner, const fml::closure &task)
VkSurfaceKHR surface
Definition main.cc:49
it will be possible to load the file into Perfetto s trace viewer disable asset Prevents usage of any non test fonts unless they were explicitly Loaded via prefetched default font Indicates whether the embedding started a prefetch of the default font manager before creating the engine run In non interactive keep the shell running after the Dart script has completed enable serial On low power devices with low core running concurrent GC tasks on threads can cause them to contend with the UI thread which could potentially lead to jank This option turns off all concurrent GC activities domain network JSON encoded network policy per domain This overrides the DisallowInsecureConnections switch Embedder can specify whether to allow or disallow insecure connections at a domain level old gen heap size
Definition switches.h:259

◆ NotifyCreated()

void flutter::PlatformViewAndroid::NotifyCreated ( fml::RefPtr< AndroidNativeWindow native_window)

Definition at line 137 of file platform_view_android.cc.

138 {
139 if (android_surface_) {
140 InstallFirstFrameCallback();
141
145 [&latch, surface = android_surface_.get(),
146 native_window = std::move(native_window)]() {
147 surface->SetNativeWindow(native_window);
148 latch.Signal();
149 });
150 latch.Wait();
151 }
152
154}
void NotifyCreated()
Used by embedders to notify the shell that a platform view has been created. This notification is use...

◆ NotifyDestroyed()

void flutter::PlatformViewAndroid::NotifyDestroyed ( )
overridevirtual

Used by embedders to notify the shell that the platform view has been destroyed. This notification used to collect the rendering surface and all associated resources. Frame scheduling is also suspended.

Attention
Subclasses may choose to override this method to perform platform specific functions. However, they must call the base class method at some point in their implementation.

Reimplemented from flutter::PlatformView.

Definition at line 174 of file platform_view_android.cc.

174 {
176
177 if (android_surface_) {
181 [&latch, surface = android_surface_.get()]() {
182 surface->TeardownOnScreenContext();
183 latch.Signal();
184 });
185 latch.Wait();
186 }
187}
virtual void NotifyDestroyed()
Used by embedders to notify the shell that the platform view has been destroyed. This notification us...

◆ NotifySurfaceWindowChanged()

void flutter::PlatformViewAndroid::NotifySurfaceWindowChanged ( fml::RefPtr< AndroidNativeWindow native_window)

Definition at line 156 of file platform_view_android.cc.

157 {
158 if (android_surface_) {
162 [&latch, surface = android_surface_.get(),
163 native_window = std::move(native_window)]() {
164 surface->TeardownOnScreenContext();
165 surface->SetNativeWindow(native_window);
166 latch.Signal();
167 });
168 latch.Wait();
169 }
170
172}
void ScheduleFrame()
Used by embedders to schedule a frame. In response to this call, the framework may need to start gene...

◆ OnPreEngineRestart()

void flutter::PlatformViewAndroid::OnPreEngineRestart ( ) const
overrideprivatevirtual

Gives embedders a chance to react to a "cold restart" of the running isolate. The default implementation of this method does nothing.

While a "hot restart" patches a running isolate, a "cold restart" restarts the root isolate in a running shell.

Reimplemented from flutter::PlatformView.

Definition at line 246 of file platform_view_android.cc.

246 {
247 jni_facade_->FlutterViewOnPreEngineRestart();
248}

◆ Register()

bool flutter::PlatformViewAndroid::Register ( JNIEnv *  env)
static

Definition at line 1027 of file platform_view_android_jni_impl.cc.

1027 {
1028 if (env == nullptr) {
1029 FML_LOG(ERROR) << "No JNIEnv provided";
1030 return false;
1031 }
1032
1034 env, env->FindClass("io/flutter/view/FlutterCallbackInformation"));
1035 if (g_flutter_callback_info_class->is_null()) {
1036 FML_LOG(ERROR) << "Could not locate FlutterCallbackInformation class";
1037 return false;
1038 }
1039
1041 g_flutter_callback_info_class->obj(), "<init>",
1042 "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V");
1043 if (g_flutter_callback_info_constructor == nullptr) {
1044 FML_LOG(ERROR) << "Could not locate FlutterCallbackInformation constructor";
1045 return false;
1046 }
1047
1049 env, env->FindClass("io/flutter/embedding/engine/FlutterJNI"));
1050 if (g_flutter_jni_class->is_null()) {
1051 FML_LOG(ERROR) << "Failed to find FlutterJNI Class.";
1052 return false;
1053 }
1054
1056 env,
1057 env->FindClass(
1058 "io/flutter/embedding/engine/mutatorsstack/FlutterMutatorsStack"));
1059 if (g_mutators_stack_class == nullptr) {
1060 FML_LOG(ERROR) << "Could not locate FlutterMutatorsStack";
1061 return false;
1062 }
1063
1065 env->GetMethodID(g_mutators_stack_class->obj(), "<init>", "()V");
1066 if (g_mutators_stack_init_method == nullptr) {
1067 FML_LOG(ERROR) << "Could not locate FlutterMutatorsStack.init method";
1068 return false;
1069 }
1070
1072 env->GetMethodID(g_mutators_stack_class->obj(), "pushTransform", "([F)V");
1074 FML_LOG(ERROR)
1075 << "Could not locate FlutterMutatorsStack.pushTransform method";
1076 return false;
1077 }
1078
1080 g_mutators_stack_class->obj(), "pushClipRect", "(IIII)V");
1082 FML_LOG(ERROR)
1083 << "Could not locate FlutterMutatorsStack.pushClipRect method";
1084 return false;
1085 }
1086
1088 g_mutators_stack_class->obj(), "pushClipRRect", "(IIII[F)V");
1090 FML_LOG(ERROR)
1091 << "Could not locate FlutterMutatorsStack.pushClipRRect method";
1092 return false;
1093 }
1094
1096 env->GetMethodID(g_flutter_jni_class->obj(), "onDisplayPlatformView",
1097 "(IIIIIIILio/flutter/embedding/engine/mutatorsstack/"
1098 "FlutterMutatorsStack;)V");
1099
1100 if (g_on_display_platform_view_method == nullptr) {
1101 FML_LOG(ERROR) << "Could not locate onDisplayPlatformView method";
1102 return false;
1103 }
1104
1106 env->GetMethodID(g_flutter_jni_class->obj(), "onBeginFrame", "()V");
1107
1108 if (g_on_begin_frame_method == nullptr) {
1109 FML_LOG(ERROR) << "Could not locate onBeginFrame method";
1110 return false;
1111 }
1112
1114 env->GetMethodID(g_flutter_jni_class->obj(), "onEndFrame", "()V");
1115
1116 if (g_on_end_frame_method == nullptr) {
1117 FML_LOG(ERROR) << "Could not locate onEndFrame method";
1118 return false;
1119 }
1120
1122 g_flutter_jni_class->obj(), "onDisplayOverlaySurface", "(IIIII)V");
1123
1124 if (g_on_display_overlay_surface_method == nullptr) {
1125 FML_LOG(ERROR) << "Could not locate onDisplayOverlaySurface method";
1126 return false;
1127 }
1128
1130 env, env->FindClass("java/lang/ref/WeakReference"));
1131 if (g_java_weak_reference_class->is_null()) {
1132 FML_LOG(ERROR) << "Could not locate WeakReference class";
1133 return false;
1134 }
1135
1137 g_java_weak_reference_class->obj(), "get", "()Ljava/lang/Object;");
1138 if (g_java_weak_reference_get_method == nullptr) {
1139 FML_LOG(ERROR) << "Could not locate WeakReference.get method";
1140 return false;
1141 }
1142
1144 env, env->FindClass(
1145 "io/flutter/embedding/engine/renderer/SurfaceTextureWrapper"));
1146 if (g_texture_wrapper_class->is_null()) {
1147 FML_LOG(ERROR) << "Could not locate SurfaceTextureWrapper class";
1148 return false;
1149 }
1150
1151 g_attach_to_gl_context_method = env->GetMethodID(
1152 g_texture_wrapper_class->obj(), "attachToGLContext", "(I)V");
1153
1154 if (g_attach_to_gl_context_method == nullptr) {
1155 FML_LOG(ERROR) << "Could not locate attachToGlContext method";
1156 return false;
1157 }
1158
1160 env->GetMethodID(g_texture_wrapper_class->obj(), "shouldUpdate", "()Z");
1161
1163 FML_LOG(ERROR)
1164 << "Could not locate SurfaceTextureWrapper.shouldUpdate method";
1165 return false;
1166 }
1167
1169 env->GetMethodID(g_texture_wrapper_class->obj(), "updateTexImage", "()V");
1170
1171 if (g_update_tex_image_method == nullptr) {
1172 FML_LOG(ERROR) << "Could not locate updateTexImage method";
1173 return false;
1174 }
1175
1176 g_get_transform_matrix_method = env->GetMethodID(
1177 g_texture_wrapper_class->obj(), "getTransformMatrix", "([F)V");
1178
1179 if (g_get_transform_matrix_method == nullptr) {
1180 FML_LOG(ERROR) << "Could not locate getTransformMatrix method";
1181 return false;
1182 }
1183
1184 g_detach_from_gl_context_method = env->GetMethodID(
1185 g_texture_wrapper_class->obj(), "detachFromGLContext", "()V");
1186
1187 if (g_detach_from_gl_context_method == nullptr) {
1188 FML_LOG(ERROR) << "Could not locate detachFromGlContext method";
1189 return false;
1190 }
1193 env, env->FindClass("io/flutter/view/TextureRegistry$ImageConsumer"));
1195 FML_LOG(ERROR) << "Could not locate TextureRegistry.ImageConsumer class";
1196 return false;
1197 }
1198
1201 "acquireLatestImage", "()Landroid/media/Image;");
1202 if (g_acquire_latest_image_method == nullptr) {
1203 FML_LOG(ERROR) << "Could not locate acquireLatestImage on "
1204 "TextureRegistry.ImageConsumer class";
1205 return false;
1206 }
1207
1209 env, env->FindClass("android/media/Image"));
1210 if (g_image_class->is_null()) {
1211 FML_LOG(ERROR) << "Could not locate Image class";
1212 return false;
1213 }
1214
1215 // Ensure we don't have any pending exceptions.
1217
1219 env->GetMethodID(g_image_class->obj(), "getHardwareBuffer",
1220 "()Landroid/hardware/HardwareBuffer;");
1221
1222 if (g_image_get_hardware_buffer_method == nullptr) {
1223 // Continue on as this method may not exist at API <= 29.
1225 }
1226
1227 g_image_close_method = env->GetMethodID(g_image_class->obj(), "close", "()V");
1228
1229 if (g_image_close_method == nullptr) {
1230 FML_LOG(ERROR) << "Could not locate close on Image class";
1231 return false;
1232 }
1233
1234 // Ensure we don't have any pending exceptions.
1237 env, env->FindClass("android/hardware/HardwareBuffer"));
1238
1239 if (!g_hardware_buffer_class->is_null()) {
1241 env->GetMethodID(g_hardware_buffer_class->obj(), "close", "()V");
1242 if (g_hardware_buffer_close_method == nullptr) {
1243 // Continue on as this class may not exist at API <= 26.
1245 }
1246 } else {
1247 // Continue on as this class may not exist at API <= 26.
1249 }
1250
1252 g_flutter_jni_class->obj(), "computePlatformResolvedLocale",
1253 "([Ljava/lang/String;)[Ljava/lang/String;");
1254
1256 FML_LOG(ERROR) << "Could not locate computePlatformResolvedLocale method";
1257 return false;
1258 }
1259
1261 g_flutter_jni_class->obj(), "requestDartDeferredLibrary", "(I)V");
1262
1264 FML_LOG(ERROR) << "Could not locate requestDartDeferredLibrary method";
1265 return false;
1266 }
1267
1269 env, env->FindClass("java/lang/Long"));
1270 if (g_java_long_class->is_null()) {
1271 FML_LOG(ERROR) << "Could not locate java.lang.Long class";
1272 return false;
1273 }
1274
1275 return RegisterApi(env);
1276}
#define FML_LOG(severity)
Definition logging.h:82
static jmethodID g_hardware_buffer_close_method
static jmethodID g_mutators_stack_init_method
static jmethodID g_request_dart_deferred_library_method
bool RegisterApi(JNIEnv *env)
static fml::jni::ScopedJavaGlobalRef< jclass > * g_java_long_class
static jmethodID g_on_display_overlay_surface_method
static jmethodID g_acquire_latest_image_method
static jmethodID g_mutators_stack_push_transform_method
static jmethodID g_on_begin_frame_method
static jmethodID g_attach_to_gl_context_method
static fml::jni::ScopedJavaGlobalRef< jclass > * g_texture_wrapper_class
static jmethodID g_java_weak_reference_get_method
static jmethodID g_image_get_hardware_buffer_method
static jmethodID g_mutators_stack_push_cliprect_method
static jmethodID g_mutators_stack_push_cliprrect_method
static jmethodID g_get_transform_matrix_method
static jmethodID g_compute_platform_resolved_locale_method
static fml::jni::ScopedJavaGlobalRef< jclass > * g_flutter_jni_class
static jmethodID g_surface_texture_wrapper_should_update
static fml::jni::ScopedJavaGlobalRef< jclass > * g_image_class
static jmethodID g_flutter_callback_info_constructor
static jmethodID g_update_tex_image_method
static fml::jni::ScopedJavaGlobalRef< jclass > * g_java_weak_reference_class
static jmethodID g_on_display_platform_view_method
static jmethodID g_on_end_frame_method
static jmethodID g_image_close_method
static fml::jni::ScopedJavaGlobalRef< jclass > * g_image_consumer_texture_registry_interface
static fml::jni::ScopedJavaGlobalRef< jclass > * g_flutter_callback_info_class
static fml::jni::ScopedJavaGlobalRef< jclass > * g_mutators_stack_class
static jmethodID g_detach_from_gl_context_method
static fml::jni::ScopedJavaGlobalRef< jclass > * g_hardware_buffer_class
bool ClearException(JNIEnv *env, bool silent)
Definition jni_util.cc:188
bool CheckException(JNIEnv *env)
Definition jni_util.cc:199

◆ RegisterExternalTexture()

void flutter::PlatformViewAndroid::RegisterExternalTexture ( int64_t  texture_id,
const fml::jni::ScopedJavaGlobalRef< jobject > &  surface_texture 
)

Definition at line 277 of file platform_view_android.cc.

279 {
280 switch (android_context_->RenderingApi()) {
282 // Impeller GLES.
283 RegisterTexture(std::make_shared<SurfaceTextureExternalTextureImpellerGL>(
284 std::static_pointer_cast<impeller::ContextGLES>(
285 android_context_->GetImpellerContext()),
286 texture_id, surface_texture, jni_facade_));
287 break;
289 // Legacy GL.
290 RegisterTexture(std::make_shared<SurfaceTextureExternalTextureGL>(
291 texture_id, surface_texture, jni_facade_));
292 break;
295 FML_LOG(INFO)
296 << "Attempted to use a SurfaceTextureExternalTexture with an "
297 "unsupported rendering API.";
298 break;
299 }
300}
void RegisterTexture(std::shared_ptr< flutter::Texture > texture)
Used by the embedder to specify a texture that it wants the rasterizer to composite within the Flutte...
int64_t texture_id

◆ RegisterImageTexture()

void flutter::PlatformViewAndroid::RegisterImageTexture ( int64_t  texture_id,
const fml::jni::ScopedJavaGlobalRef< jobject > &  image_texture_entry 
)

Definition at line 302 of file platform_view_android.cc.

304 {
305 switch (android_context_->RenderingApi()) {
307 // Impeller GLES.
308 RegisterTexture(std::make_shared<ImageExternalTextureGLImpeller>(
309 std::static_pointer_cast<impeller::ContextGLES>(
310 android_context_->GetImpellerContext()),
311 texture_id, image_texture_entry, jni_facade_));
312 break;
314 // Legacy GL.
315 RegisterTexture(std::make_shared<ImageExternalTextureGLSkia>(
316 std::static_pointer_cast<AndroidContextGLSkia>(android_context_),
317 texture_id, image_texture_entry, jni_facade_));
318 break;
320 RegisterTexture(std::make_shared<ImageExternalTextureVK>(
321 std::static_pointer_cast<impeller::ContextVK>(
322 android_context_->GetImpellerContext()),
323 texture_id, image_texture_entry, jni_facade_));
324 break;
326 FML_LOG(INFO)
327 << "Attempted to use a SurfaceTextureExternalTexture with an "
328 "unsupported rendering API.";
329 break;
330 }
331}

◆ ReleaseResourceContext()

void flutter::PlatformViewAndroid::ReleaseResourceContext ( ) const
overrideprivatevirtual

Used by the shell to notify the embedder that the resource context previously obtained via a call to CreateResourceContext() is being collected. The embedder is free to collect an platform specific resources associated with this context.

Attention
Unlike all other methods on the platform view, this will be called on IO task runner.

Reimplemented from flutter::PlatformView.

Definition at line 384 of file platform_view_android.cc.

384 {
385 if (android_surface_) {
386 android_surface_->ResourceContextClearCurrent();
387 }
388}

◆ RequestDartDeferredLibrary()

void flutter::PlatformViewAndroid::RequestDartDeferredLibrary ( intptr_t  loading_unit_id)
overrideprivatevirtual

Invoked when the dart VM requests that a deferred library be loaded. Notifies the engine that the deferred library identified by the specified loading unit id should be downloaded and loaded into the Dart VM via LoadDartDeferredLibrary

Upon encountering errors or otherwise failing to load a loading unit with the specified id, the failure should be directly reported to dart by calling LoadDartDeferredLibraryFailure to ensure the waiting dart future completes with an error.

Parameters
[in]loading_unit_idThe unique id of the deferred library's loading unit. This id is to be passed back into LoadDartDeferredLibrary in order to identify which deferred library to load.

Reimplemented from flutter::PlatformView.

Definition at line 408 of file platform_view_android.cc.

408 {
409 if (jni_facade_->RequestDartDeferredLibrary(loading_unit_id)) {
410 return;
411 }
412 return; // TODO(garyq): Call LoadDartDeferredLibraryFailure()
413}

◆ UpdateAssetResolverByType()

void flutter::PlatformViewAndroid::UpdateAssetResolverByType ( std::unique_ptr< AssetResolver updated_asset_resolver,
AssetResolver::AssetResolverType  type 
)
overridevirtual

Replaces the asset resolver handled by the engine's AssetManager of the specified type with updated_asset_resolver. The matching AssetResolver is removed and replaced with updated_asset_resolvers.

AssetResolvers should be updated when the existing resolver becomes obsolete and a newer one becomes available that provides updated access to the same type of assets as the existing one. This update process is meant to be performed at runtime.

If a null resolver is provided, nothing will be done. If no matching resolver is found, the provided resolver will be added to the end of the AssetManager resolvers queue. The replacement only occurs with the first matching resolver. Any additional matching resolvers are untouched.

Parameters
[in]updated_asset_resolverThe asset resolver to replace the resolver of matching type with.
[in]typeThe type of AssetResolver to update. Only resolvers of the specified type will be replaced by the updated resolver.

Reimplemented from flutter::PlatformView.

Definition at line 434 of file platform_view_android.cc.

436 {
437 delegate_.UpdateAssetResolverByType(std::move(updated_asset_resolver), type);
438}
virtual void UpdateAssetResolverByType(std::unique_ptr< AssetResolver > updated_asset_resolver, AssetResolver::AssetResolverType type)=0
Replaces the asset resolver handled by the engine's AssetManager of the specified type with updated_a...

◆ UpdateSemantics()

void flutter::PlatformViewAndroid::UpdateSemantics ( flutter::SemanticsNodeUpdates  updates,
flutter::CustomAccessibilityActionUpdates  actions 
)
overrideprivatevirtual

Used by the framework to tell the embedder to apply the specified semantics node updates. The default implementation of this method does nothing.

See also
SemanticsNode, SemticsNodeUpdates, CustomAccessibilityActionUpdates
Parameters
[in]updatesA map with the stable semantics node identifier as key and the node properties as the value.
[in]actionsA map with the stable semantics node identifier as key and the custom node action as the value.

Reimplemented from flutter::PlatformView.

Definition at line 271 of file platform_view_android.cc.

273 {
274 platform_view_android_delegate_.UpdateSemantics(update, actions);
275}
void UpdateSemantics(const flutter::SemanticsNodeUpdates &update, const flutter::CustomAccessibilityActionUpdates &actions)

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