| // 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. | |
| #include "impeller/toolkit/android/surface_control.h" | |
| #include "impeller/base/validation.h" | |
| #include "impeller/toolkit/android/surface_transaction.h" | |
| namespace impeller::android { | |
| SurfaceControl::SurfaceControl(ANativeWindow* window, const char* debug_name) { | |
| if (window == nullptr) { | |
| VALIDATION_LOG << "Parent window of surface was null."; | |
| return; | |
| } | |
| if (debug_name == nullptr) { | |
| debug_name = "Impeller Layer"; | |
| } | |
| control_.reset( | |
| GetProcTable().ASurfaceControl_createFromWindow(window, debug_name)); | |
| } | |
| SurfaceControl::~SurfaceControl() { | |
| if (IsValid() && !RemoveFromParent()) { | |
| VALIDATION_LOG << "Surface control could not be removed from its parent. " | |
| "Expect a leak."; | |
| } | |
| } | |
| bool SurfaceControl::IsValid() const { | |
| return control_.is_valid(); | |
| } | |
| ASurfaceControl* SurfaceControl::GetHandle() const { | |
| return control_.get(); | |
| } | |
| bool SurfaceControl::RemoveFromParent() const { | |
| if (!IsValid()) { | |
| return false; | |
| } | |
| SurfaceTransaction transaction; | |
| if (!transaction.SetParent(*this, nullptr)) { | |
| return false; | |
| } | |
| return transaction.Apply(); | |
| } | |
| bool SurfaceControl::IsAvailableOnPlatform() { | |
| auto api_level = android_get_device_api_level(); | |
| // Technically SurfaceControl is supported on API 29 but I've observed | |
| // enough reported bugs that I'm bumping the constraint to 30. If | |
| // we had more time to test all of these older devices maybe we could | |
| // figure out what the problem is. | |
| // https://github.com/flutter/flutter/issues/155877 | |
| return api_level >= 30 && GetProcTable().IsValid() && | |
| GetProcTable().ASurfaceControl_createFromWindow.IsAvailable(); | |
| } | |
| } // namespace impeller::android |