diff --git a/.gradle/6.5/fileChanges/last-build.bin b/.gradle/6.5/fileChanges/last-build.bin new file mode 100644 index 0000000000000..f76dd238ade08 Binary files /dev/null and b/.gradle/6.5/fileChanges/last-build.bin differ diff --git a/.gradle/6.5/gc.properties b/.gradle/6.5/gc.properties new file mode 100644 index 0000000000000..e69de29bb2d1d diff --git a/.gradle/buildOutputCleanup/cache.properties b/.gradle/buildOutputCleanup/cache.properties new file mode 100644 index 0000000000000..114f6aa826de3 --- /dev/null +++ b/.gradle/buildOutputCleanup/cache.properties @@ -0,0 +1,2 @@ +#Fri Jun 05 11:53:05 CDT 2020 +gradle.version=6.5 diff --git a/.gradle/vcs-1/gc.properties b/.gradle/vcs-1/gc.properties new file mode 100644 index 0000000000000..e69de29bb2d1d diff --git a/ci/licenses_golden/licenses_flutter b/ci/licenses_golden/licenses_flutter index 4497a763ed419..20815ece951df 100755 --- a/ci/licenses_golden/licenses_flutter +++ b/ci/licenses_golden/licenses_flutter @@ -11,6 +11,8 @@ LIBRARY: txt ORIGIN: ../../../flutter/LICENSE TYPE: LicenseType.bsd FILE: ../../../flutter/.clang-tidy +FILE: ../../../flutter/.gradle/6.5/fileChanges/last-build.bin +FILE: ../../../flutter/.gradle/buildOutputCleanup/cache.properties FILE: ../../../flutter/DEPS FILE: ../../../flutter/assets/asset_manager.cc FILE: ../../../flutter/assets/asset_manager.h @@ -702,6 +704,7 @@ FILE: ../../../flutter/shell/platform/android/io/flutter/embedding/engine/Flutte FILE: ../../../flutter/shell/platform/android/io/flutter/embedding/engine/FlutterEngineCache.java FILE: ../../../flutter/shell/platform/android/io/flutter/embedding/engine/FlutterEnginePluginRegistry.java FILE: ../../../flutter/shell/platform/android/io/flutter/embedding/engine/FlutterJNI.java +FILE: ../../../flutter/shell/platform/android/io/flutter/embedding/engine/FlutterOverlaySurface.java FILE: ../../../flutter/shell/platform/android/io/flutter/embedding/engine/FlutterShellArgs.java FILE: ../../../flutter/shell/platform/android/io/flutter/embedding/engine/dart/DartExecutor.java FILE: ../../../flutter/shell/platform/android/io/flutter/embedding/engine/dart/DartMessenger.java diff --git a/shell/platform/android/BUILD.gn b/shell/platform/android/BUILD.gn index a14e3809d22d8..94ee1f77d8a33 100644 --- a/shell/platform/android/BUILD.gn +++ b/shell/platform/android/BUILD.gn @@ -150,6 +150,7 @@ android_java_sources = [ "io/flutter/embedding/engine/FlutterEngineCache.java", "io/flutter/embedding/engine/FlutterEnginePluginRegistry.java", "io/flutter/embedding/engine/FlutterJNI.java", + "io/flutter/embedding/engine/FlutterOverlaySurface.java", "io/flutter/embedding/engine/FlutterShellArgs.java", "io/flutter/embedding/engine/dart/DartExecutor.java", "io/flutter/embedding/engine/dart/DartMessenger.java", diff --git a/shell/platform/android/io/flutter/embedding/engine/FlutterJNI.java b/shell/platform/android/io/flutter/embedding/engine/FlutterJNI.java index 397c99e41dcd2..787cf9a90e6ff 100644 --- a/shell/platform/android/io/flutter/embedding/engine/FlutterJNI.java +++ b/shell/platform/android/io/flutter/embedding/engine/FlutterJNI.java @@ -821,6 +821,17 @@ public void onEndFrame() { } platformViewsController.onEndFrame(); } + + @SuppressWarnings("unused") + @UiThread + public FlutterOverlaySurface createOverlaySurface() { + ensureRunningOnMainThread(); + if (platformViewsController == null) { + throw new RuntimeException( + "platformViewsController must be set before attempting to position an overlay surface"); + } + platformViewsController.onDisplayOverlaySurface(id, x, y, width, height); + } // ----- End Engine Lifecycle Support ---- // @SuppressWarnings("unused") diff --git a/shell/platform/android/io/flutter/embedding/engine/FlutterOverlaySurface.java b/shell/platform/android/io/flutter/embedding/engine/FlutterOverlaySurface.java new file mode 100644 index 0000000000000..842cb1873c79d --- /dev/null +++ b/shell/platform/android/io/flutter/embedding/engine/FlutterOverlaySurface.java @@ -0,0 +1,28 @@ +// 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. + +package io.flutter.embedding.engine; + +import android.view.Surface; + +public class FlutterOverlaySurface { + // @NonNull + private final Surface surface; + + private final long id; + + // @Keep + public FlutterOverlaySurface(long id, Surface surface) { + this.id = id; + this.surface = surface; + } + + public long getId() { + return id; + } + + public Surface getSurface() { + return surface; + } +} diff --git a/shell/platform/android/io/flutter/plugin/platform/PlatformViewsController.java b/shell/platform/android/io/flutter/plugin/platform/PlatformViewsController.java index 8a394fa43fdc3..706b31228a090 100644 --- a/shell/platform/android/io/flutter/plugin/platform/PlatformViewsController.java +++ b/shell/platform/android/io/flutter/plugin/platform/PlatformViewsController.java @@ -17,6 +17,7 @@ import androidx.annotation.NonNull; import androidx.annotation.UiThread; import androidx.annotation.VisibleForTesting; +import io.flutter.embedding.engine.FlutterOverlaySurface; import io.flutter.embedding.engine.dart.DartExecutor; import io.flutter.embedding.engine.systemchannels.PlatformViewsChannel; import io.flutter.plugin.editing.TextInputPlugin; @@ -549,4 +550,9 @@ public void onBeginFrame() { public void onEndFrame() { // TODO: Implement this method. https://github.com/flutter/flutter/issues/58288 } + + public FlutterOverlaySurface createOverlaySurface() { + // TODO: Implement this method. https://github.com/flutter/flutter/issues/58288 + return null; + } } diff --git a/shell/platform/android/jni/platform_view_android_jni.h b/shell/platform/android/jni/platform_view_android_jni.h index 5d00ef13b1fce..6de25ff4f1faf 100644 --- a/shell/platform/android/jni/platform_view_android_jni.h +++ b/shell/platform/android/jni/platform_view_android_jni.h @@ -130,6 +130,7 @@ class PlatformViewAndroidJNI { int y, int width, int height) = 0; + //---------------------------------------------------------------------------- /// @brief Initiates a frame if using hybrid composition. /// @@ -145,6 +146,14 @@ class PlatformViewAndroidJNI { /// @note Must be called from the platform thread. /// virtual void FlutterViewEndFrame() = 0; + + //---------------------------------------------------------------------------- + /// @brief Indicates that the current frame ended. + /// It's used to clean up state. + /// + /// @note Must be called from the platform thread. + /// + virtual FlutterOverlaySurface FlutterViewCreateOverlaySurface() = 0; }; } // namespace flutter diff --git a/shell/platform/android/platform_view_android_jni.h b/shell/platform/android/platform_view_android_jni.h new file mode 100644 index 0000000000000..1ba25e0f05498 --- /dev/null +++ b/shell/platform/android/platform_view_android_jni.h @@ -0,0 +1,69 @@ +// 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_SHELL_PLATFORM_ANDROID_PLATFORM_VIEW_ANDROID_JNI_H_ +#define FLUTTER_SHELL_PLATFORM_ANDROID_PLATFORM_VIEW_ANDROID_JNI_H_ + +#include +#include "flutter/fml/macros.h" +#include "flutter/shell/platform/android/platform_view_android.h" + +namespace flutter { + +void FlutterViewHandlePlatformMessage(JNIEnv* env, + jobject obj, + jstring channel, + jobject message, + jint responseId); + +void FlutterViewHandlePlatformMessageResponse(JNIEnv* env, + jobject obj, + jint responseId, + jobject response); + +void FlutterViewUpdateSemantics(JNIEnv* env, + jobject obj, + jobject buffer, + jobjectArray strings); + +void FlutterViewUpdateCustomAccessibilityActions(JNIEnv* env, + jobject obj, + jobject buffer, + jobjectArray strings); + +void FlutterViewOnFirstFrame(JNIEnv* env, jobject obj); + +void FlutterViewOnPreEngineRestart(JNIEnv* env, jobject obj); + +class AndroidFlutterOverlaySurface { + public: + AndroidFlutterOverlaySurface(long id, fml::RefPtr window) + : id_(id), window_(std::move(window)){}; + + long GetId() { return id_; } + + fml::RefPtr GetWindow() { return window_; } + + private: + long id_; + fml::RefPtr window_; +}; + +std::unique_ptr FlutterViewCreateOverlaySurface( + JNIEnv* env, + jobject obj); + +void SurfaceTextureAttachToGLContext(JNIEnv* env, jobject obj, jint textureId); + +void SurfaceTextureUpdateTexImage(JNIEnv* env, jobject obj); + +void SurfaceTextureGetTransformMatrix(JNIEnv* env, + jobject obj, + jfloatArray result); + +void SurfaceTextureDetachFromGLContext(JNIEnv* env, jobject obj); + +} // namespace flutter + +#endif // FLUTTER_SHELL_PLATFORM_ANDROID_PLATFORM_VIEW_ANDROID_JNI_H_ diff --git a/shell/platform/android/platform_view_android_jni_impl.cc b/shell/platform/android/platform_view_android_jni_impl.cc index 4e2d0db99b637..feb4678b932a6 100644 --- a/shell/platform/android/platform_view_android_jni_impl.cc +++ b/shell/platform/android/platform_view_android_jni_impl.cc @@ -80,10 +80,36 @@ static jmethodID g_on_first_frame_method = nullptr; static jmethodID g_on_engine_restart_method = nullptr; +static jmethodID g_create_overlay_surface_method = nullptr; +static jmethodID g_flutter_overlay_layer_get_id_method = nullptr; +static jmethodID g_flutter_overlay_layer_get_surface_method = nullptr; + +std::unique_ptr FlutterViewCreateOverlaySurface( + JNIEnv* env, + jobject obj) { + jobject joverlay_layer = + env->CallObjectMethod(obj, g_create_overlay_surface_method); + jlong layer_id = env->CallLongMethod(joverlay_layer, + g_flutter_overlay_layer_get_id_method); + jobject surface = env->CallObjectMethod( + joverlay_layer, g_flutter_overlay_layer_get_surface_method); + + FML_CHECK(CheckException(env)); + return std::make_unique( + layer_id, fml::MakeRefCounted( + ANativeWindow_fromSurface(env, surface))); +} + static jmethodID g_on_begin_frame_method = nullptr; static jmethodID g_on_end_frame_method = nullptr; +static jmethodID g_create_overlay_surface_method = nullptr; + +static jmethodID g_flutter_overlay_layer_get_id_method = nullptr; + +static jmethodID g_flutter_overlay_layer_get_surface_method = nullptr; + static jmethodID g_attach_to_gl_context_method = nullptr; static jmethodID g_update_tex_image_method = nullptr; @@ -683,6 +709,10 @@ bool RegisterApi(JNIEnv* env) { return false; } + g_create_overlay_surface_method = + env->GetMethodID(g_flutter_jni_class->obj(), "createOverlaySurface", + "()Lio/flutter/embedding/engine/FlutterOverlaySurface;"); + return true; } @@ -707,6 +737,10 @@ bool PlatformViewAndroid::Register(JNIEnv* env) { return false; } + g_create_overlay_surface_method = + env->GetMethodID(g_flutter_jni_class->obj(), "createOverlaySurface", + "()Lio/flutter/embedding/engine/FlutterOverlaySurface;"); + g_flutter_jni_class = new fml::jni::ScopedJavaGlobalRef( env, env->FindClass("io/flutter/embedding/engine/FlutterJNI")); if (g_flutter_jni_class->is_null()) { @@ -738,6 +772,14 @@ bool PlatformViewAndroid::Register(JNIEnv* env) { return false; } + g_create_overlay_surface_method = env->GetMethodID( + g_flutter_jni_class->obj(), "createOverlaySurface", "()V"); + + if (g_create_overlay_surface_method == nullptr) { + FML_LOG(ERROR) << "Could not locate createOverlaySurface method"; + return false; + } + g_on_display_overlay_surface_method = env->GetMethodID( g_flutter_jni_class->obj(), "onDisplayOverlaySurface", "(IIIII)V"); @@ -1080,4 +1122,17 @@ void PlatformViewAndroidJNIImpl::FlutterViewEndFrame() { FML_CHECK(CheckException(env)); } +void PlatformViewAndroidJNIImpl::FlutterViewCreateOverlaySurface() { + JNIEnv* env = fml::jni::AttachCurrentThread(); + + auto java_object = java_object_.get(env); + if (java_object.is_null()) { + return; + } + + env->CallVoidMethod(java_object.obj(), g_create_overlay_surface_method); + + FML_CHECK(CheckException(env)); +} + } // namespace flutter diff --git a/shell/platform/android/platform_view_android_jni_impl.h b/shell/platform/android/platform_view_android_jni_impl.h index 0ab94a28c685f..25b62987ebf18 100644 --- a/shell/platform/android/platform_view_android_jni_impl.h +++ b/shell/platform/android/platform_view_android_jni_impl.h @@ -66,6 +66,8 @@ class PlatformViewAndroidJNIImpl final : public PlatformViewAndroidJNI { void FlutterViewEndFrame() override; + void FlutterViewCreateOverlaySurface() override; + private: // Reference to FlutterJNI object. const fml::jni::JavaObjectWeakGlobalRef java_object_; diff --git a/shell/platform/android/test/io/flutter/embedding/engine/FlutterJNITest.java b/shell/platform/android/test/io/flutter/embedding/engine/FlutterJNITest.java index 8918e4102aace..ac88420509bb4 100644 --- a/shell/platform/android/test/io/flutter/embedding/engine/FlutterJNITest.java +++ b/shell/platform/android/test/io/flutter/embedding/engine/FlutterJNITest.java @@ -111,4 +111,20 @@ public void onEndFrame__callsPlatformViewsController() { // --- Verify Results --- verify(platformViewsController, times(1)).onEndFrame(); } + + @Test + public void createOverlaySurface__callsPlatformViewsController() { + PlatformViewsController platformViewsController = mock(PlatformViewsController.class); + + FlutterJNI flutterJNI = new FlutterJNI(); + flutterJNI.setPlatformViewsController(platformViewsController); + + // --- Execute Test --- + flutterJNI.onDisplayOverlaySurface( + /*id=*/ 1, /*x=*/ 10, /*y=*/ 20, /*width=*/ 100, /*height=*/ 200); + + // --- Verify Results --- + verify(platformViewsController, times(1)) + .onDisplayOverlaySurface(/*id=*/ 1, /*x=*/ 10, /*y=*/ 20, /*width=*/ 100, /*height=*/ 200); + } }