Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions ci/licenses_golden/licenses_flutter
Original file line number Diff line number Diff line change
Expand Up @@ -702,6 +702,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
Expand Down
1 change: 1 addition & 0 deletions shell/platform/android/BUILD.gn
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down
11 changes: 11 additions & 0 deletions shell/platform/android/io/flutter/embedding/engine/FlutterJNI.java
Original file line number Diff line number Diff line change
Expand Up @@ -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");
}
return platformViewsController.createOverlaySurface();
}
// ----- End Engine Lifecycle Support ----

// @SuppressWarnings("unused")
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
// 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;
import androidx.annotation.Keep;
import androidx.annotation.NonNull;

public class FlutterOverlaySurface {
@NonNull private final Surface surface;

private final long id;

@Keep
public FlutterOverlaySurface(long id, @NonNull Surface surface) {
this.id = id;
this.surface = surface;
}

public long getId() {
return id;
}

public Surface getSurface() {
return surface;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
}
}
8 changes: 8 additions & 0 deletions shell/platform/android/jni/platform_view_android_jni.h
Original file line number Diff line number Diff line change
Expand Up @@ -130,6 +130,7 @@ class PlatformViewAndroidJNI {
int y,
int width,
int height) = 0;

//----------------------------------------------------------------------------
/// @brief Initiates a frame if using hybrid composition.
///
Expand All @@ -145,6 +146,13 @@ class PlatformViewAndroidJNI {
/// @note Must be called from the platform thread.
///
virtual void FlutterViewEndFrame() = 0;

//----------------------------------------------------------------------------
/// @brief Instantiates an overlay surface in hybrid composition.
///
/// @note Must be called from the platform thread.
///
virtual void FlutterViewCreateOverlaySurface() = 0;
};

} // namespace flutter
Expand Down
32 changes: 32 additions & 0 deletions shell/platform/android/platform_view_android_jni_impl.cc
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
#include "flutter/shell/platform/android/android_shell_holder.h"
#include "flutter/shell/platform/android/apk_asset_provider.h"
#include "flutter/shell/platform/android/flutter_main.h"
#include "flutter/shell/platform/android/jni/platform_view_android_jni.h"
#include "flutter/shell/platform/android/platform_view_android.h"

#define ANDROID_SHELL_HOLDER \
Expand Down Expand Up @@ -80,6 +81,8 @@ 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_on_begin_frame_method = nullptr;

static jmethodID g_on_end_frame_method = nullptr;
Expand Down Expand Up @@ -683,6 +686,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;
}

Expand All @@ -707,6 +714,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<jclass>(
env, env->FindClass("io/flutter/embedding/engine/FlutterJNI"));
if (g_flutter_jni_class->is_null()) {
Expand Down Expand Up @@ -738,6 +749,14 @@ bool PlatformViewAndroid::Register(JNIEnv* env) {
return false;
}

g_create_overlay_surface_method = env->GetMethodID(
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

sorry, I didn't catch this one: g_create_overlay_surface_method is being set multiple times.

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");

Expand Down Expand Up @@ -1080,4 +1099,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
2 changes: 2 additions & 0 deletions shell/platform/android/platform_view_android_jni_impl.h
Original file line number Diff line number Diff line change
Expand Up @@ -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_;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -111,4 +111,18 @@ 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.createOverlaySurface();

// --- Verify Results ---
verify(platformViewsController, times(1)).createOverlaySurface();
}
}