From ea31a75bd4a7ce5801ebfc74114bc14d8462c15b Mon Sep 17 00:00:00 2001 From: cg021 <40409839+cg021@users.noreply.github.com> Date: Fri, 12 Jun 2020 16:21:25 -0500 Subject: [PATCH] onEndFrame JNI (flutter/engine#18867) * onEndFrame JNI * beginFrame brief change --- .../flutter/embedding/engine/FlutterJNI.java | 11 +++++++++ .../platform/PlatformViewsController.java | 4 ++++ .../android/jni/platform_view_android_jni.h | 8 +++++++ .../android/platform_view_android_jni_impl.cc | 23 +++++++++++++++++++ .../android/platform_view_android_jni_impl.h | 2 ++ .../embedding/engine/FlutterJNITest.java | 15 ++++++++++++ 6 files changed, 63 insertions(+) diff --git a/engine/src/flutter/shell/platform/android/io/flutter/embedding/engine/FlutterJNI.java b/engine/src/flutter/shell/platform/android/io/flutter/embedding/engine/FlutterJNI.java index c6678ef478c..8ce1e014610 100644 --- a/engine/src/flutter/shell/platform/android/io/flutter/embedding/engine/FlutterJNI.java +++ b/engine/src/flutter/shell/platform/android/io/flutter/embedding/engine/FlutterJNI.java @@ -810,6 +810,17 @@ public class FlutterJNI { } platformViewsController.onBeginFrame(); } + + @SuppressWarnings("unused") + @UiThread + public void onEndFrame() { + ensureRunningOnMainThread(); + if (platformViewsController == null) { + throw new RuntimeException( + "platformViewsController must be set before attempting to end the frame"); + } + platformViewsController.onEndFrame(); + } // ----- End Engine Lifecycle Support ---- // @SuppressWarnings("unused") diff --git a/engine/src/flutter/shell/platform/android/io/flutter/plugin/platform/PlatformViewsController.java b/engine/src/flutter/shell/platform/android/io/flutter/plugin/platform/PlatformViewsController.java index ff5747bd5dc..8a394fa43fd 100644 --- a/engine/src/flutter/shell/platform/android/io/flutter/plugin/platform/PlatformViewsController.java +++ b/engine/src/flutter/shell/platform/android/io/flutter/plugin/platform/PlatformViewsController.java @@ -545,4 +545,8 @@ public class PlatformViewsController implements PlatformViewsAccessibilityDelega public void onBeginFrame() { // TODO: Implement this method. https://github.com/flutter/flutter/issues/58288 } + + public void onEndFrame() { + // TODO: Implement this method. https://github.com/flutter/flutter/issues/58288 + } } diff --git a/engine/src/flutter/shell/platform/android/jni/platform_view_android_jni.h b/engine/src/flutter/shell/platform/android/jni/platform_view_android_jni.h index ff87ee382cb..5d00ef13b1f 100644 --- a/engine/src/flutter/shell/platform/android/jni/platform_view_android_jni.h +++ b/engine/src/flutter/shell/platform/android/jni/platform_view_android_jni.h @@ -137,6 +137,14 @@ class PlatformViewAndroidJNI { /// @note Must be called from the platform thread. /// virtual void FlutterViewBeginFrame() = 0; + + //---------------------------------------------------------------------------- + /// @brief Indicates that the current frame ended. + /// It's used to clean up state. + /// + /// @note Must be called from the platform thread. + /// + virtual void FlutterViewEndFrame() = 0; }; } // namespace flutter diff --git a/engine/src/flutter/shell/platform/android/platform_view_android_jni_impl.cc b/engine/src/flutter/shell/platform/android/platform_view_android_jni_impl.cc index b89820227dc..6de577e833e 100644 --- a/engine/src/flutter/shell/platform/android/platform_view_android_jni_impl.cc +++ b/engine/src/flutter/shell/platform/android/platform_view_android_jni_impl.cc @@ -82,6 +82,8 @@ static jmethodID g_on_engine_restart_method = nullptr; static jmethodID g_on_begin_frame_method = nullptr; +static jmethodID g_on_end_frame_method = nullptr; + static jmethodID g_attach_to_gl_context_method = nullptr; static jmethodID g_update_tex_image_method = nullptr; @@ -717,6 +719,14 @@ bool PlatformViewAndroid::Register(JNIEnv* env) { return false; } + g_on_end_frame_method = + env->GetMethodID(g_flutter_jni_class->obj(), "onEndFrame", "()V"); + + if (g_on_end_frame_method == nullptr) { + FML_LOG(ERROR) << "Could not locate onEndFrame method"; + return false; + } + g_on_display_overlay_surface_method = env->GetMethodID( g_flutter_jni_class->obj(), "onDisplayOverlaySurface", "(IIIII)V"); @@ -1046,4 +1056,17 @@ void PlatformViewAndroidJNIImpl::FlutterViewBeginFrame() { FML_CHECK(CheckException(env)); } +void PlatformViewAndroidJNIImpl::FlutterViewEndFrame() { + JNIEnv* env = fml::jni::AttachCurrentThread(); + + auto java_object = java_object_.get(env); + if (java_object.is_null()) { + return; + } + + env->CallVoidMethod(java_object.obj(), g_on_end_frame_method); + + FML_CHECK(CheckException(env)); +} + } // namespace flutter diff --git a/engine/src/flutter/shell/platform/android/platform_view_android_jni_impl.h b/engine/src/flutter/shell/platform/android/platform_view_android_jni_impl.h index 2a53e307ca1..0ab94a28c68 100644 --- a/engine/src/flutter/shell/platform/android/platform_view_android_jni_impl.h +++ b/engine/src/flutter/shell/platform/android/platform_view_android_jni_impl.h @@ -64,6 +64,8 @@ class PlatformViewAndroidJNIImpl final : public PlatformViewAndroidJNI { void FlutterViewBeginFrame() override; + void FlutterViewEndFrame() override; + private: // Reference to FlutterJNI object. const fml::jni::JavaObjectWeakGlobalRef java_object_; diff --git a/engine/src/flutter/shell/platform/android/test/io/flutter/embedding/engine/FlutterJNITest.java b/engine/src/flutter/shell/platform/android/test/io/flutter/embedding/engine/FlutterJNITest.java index cee3e985d42..8918e4102aa 100644 --- a/engine/src/flutter/shell/platform/android/test/io/flutter/embedding/engine/FlutterJNITest.java +++ b/engine/src/flutter/shell/platform/android/test/io/flutter/embedding/engine/FlutterJNITest.java @@ -96,4 +96,19 @@ public class FlutterJNITest { // --- Verify Results --- verify(platformViewsController, times(1)).onBeginFrame(); } + + @Test + public void onEndFrame__callsPlatformViewsController() { + PlatformViewsController platformViewsController = mock(PlatformViewsController.class); + + // --- Test Setup --- + FlutterJNI flutterJNI = new FlutterJNI(); + flutterJNI.setPlatformViewsController(platformViewsController); + + // --- Execute Test --- + flutterJNI.onEndFrame(); + + // --- Verify Results --- + verify(platformViewsController, times(1)).onEndFrame(); + } }