blob: af51a4bc5b748b2b757d6579fdc3b8a0b0399f59 [file] [log] [blame]
// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef FLUTTER_IMPELLER_TOOLKIT_ANDROID_SURFACE_CONTROL_H_
#define FLUTTER_IMPELLER_TOOLKIT_ANDROID_SURFACE_CONTROL_H_
#include "flutter/fml/unique_object.h"
#include "impeller/toolkit/android/proc_table.h"
namespace impeller::android {
//------------------------------------------------------------------------------
/// @brief A wrapper for ASurfaceControl.
/// https://developer.android.com/ndk/reference/group/native-activity#asurfacecontrol
///
/// Instances of this class represent a node in the hierarchy of
/// surfaces sent to the system compositor for final composition.
///
/// This wrapper is only available on Android API 29 and above.
///
class SurfaceControl {
public:
//----------------------------------------------------------------------------
/// @return `true` if any surface controls can be created on this
/// platform.
///
static bool IsAvailableOnPlatform();
//----------------------------------------------------------------------------
/// @brief Creates a new surface control and adds it as a child of the
/// given window.
///
/// @param window The window
/// @param[in] debug_name A debug name. See it using
/// `adb shell dumpsys SurfaceFlinger` along with
/// other control properties. If no debug name is
/// specified, the value "Impeller Layer" is used.
///
explicit SurfaceControl(ANativeWindow* window,
const char* debug_name = nullptr);
//----------------------------------------------------------------------------
/// @brief Removes the surface control from the presentation hierarchy
/// managed by the system compositor and release the client side
/// reference to the control. At this point, it may be collected
/// when the compositor is also done using it.
///
~SurfaceControl();
SurfaceControl(const SurfaceControl&) = delete;
SurfaceControl& operator=(const SurfaceControl&) = delete;
bool IsValid() const;
ASurfaceControl* GetHandle() const;
//----------------------------------------------------------------------------
/// @brief Remove the surface control from the hierarchy of nodes
/// presented by the system compositor.
///
/// @return `true` If the control will be removed from the hierarchy of
/// nodes presented by the system compositor.
///
bool RemoveFromParent() const;
private:
struct UniqueASurfaceControlTraits {
static ASurfaceControl* InvalidValue() { return nullptr; }
static bool IsValid(ASurfaceControl* value) {
return value != InvalidValue();
}
static void Free(ASurfaceControl* value) {
GetProcTable().ASurfaceControl_release(value);
}
};
fml::UniqueObject<ASurfaceControl*, UniqueASurfaceControlTraits> control_;
};
} // namespace impeller::android
#endif // FLUTTER_IMPELLER_TOOLKIT_ANDROID_SURFACE_CONTROL_H_