| // 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 <memory> | |
| #include "flutter/shell/platform/android/android_shell_holder.h" | |
| #include "gmock/gmock.h" | |
| #include "gtest/gtest.h" | |
| #include "shell/platform/android/jni/platform_view_android_jni.h" | |
| namespace flutter { | |
| namespace testing { | |
| namespace { | |
| class MockPlatformViewAndroidJNI : public PlatformViewAndroidJNI { | |
| public: | |
| MOCK_METHOD(void, | |
| FlutterViewHandlePlatformMessage, | |
| (std::unique_ptr<flutter::PlatformMessage> message, | |
| int responseId), | |
| (override)); | |
| MOCK_METHOD(void, | |
| FlutterViewHandlePlatformMessageResponse, | |
| (int responseId, std::unique_ptr<fml::Mapping> data), | |
| (override)); | |
| MOCK_METHOD(void, | |
| FlutterViewUpdateSemantics, | |
| (std::vector<uint8_t> buffer, | |
| std::vector<std::string> strings, | |
| std::vector<std::vector<uint8_t>> string_attribute_args), | |
| (override)); | |
| MOCK_METHOD(void, | |
| FlutterViewUpdateCustomAccessibilityActions, | |
| (std::vector<uint8_t> actions_buffer, | |
| std::vector<std::string> strings), | |
| (override)); | |
| MOCK_METHOD(void, FlutterViewOnFirstFrame, (), (override)); | |
| MOCK_METHOD(void, FlutterViewOnPreEngineRestart, (), (override)); | |
| MOCK_METHOD(void, | |
| SurfaceTextureAttachToGLContext, | |
| (JavaLocalRef surface_texture, int textureId), | |
| (override)); | |
| MOCK_METHOD(bool, | |
| SurfaceTextureShouldUpdate, | |
| (JavaLocalRef surface_texture), | |
| (override)); | |
| MOCK_METHOD(void, | |
| SurfaceTextureUpdateTexImage, | |
| (JavaLocalRef surface_texture), | |
| (override)); | |
| MOCK_METHOD(void, | |
| SurfaceTextureGetTransformMatrix, | |
| (JavaLocalRef surface_texture, SkMatrix& transform), | |
| (override)); | |
| MOCK_METHOD(void, | |
| SurfaceTextureDetachFromGLContext, | |
| (JavaLocalRef surface_texture), | |
| (override)); | |
| MOCK_METHOD(JavaLocalRef, | |
| ImageProducerTextureEntryAcquireLatestImage, | |
| (JavaLocalRef image_texture_entry), | |
| (override)); | |
| MOCK_METHOD(JavaLocalRef, | |
| ImageGetHardwareBuffer, | |
| (JavaLocalRef image), | |
| (override)); | |
| MOCK_METHOD(void, ImageClose, (JavaLocalRef image), (override)); | |
| MOCK_METHOD(void, | |
| HardwareBufferClose, | |
| (JavaLocalRef hardware_buffer), | |
| (override)); | |
| MOCK_METHOD(void, | |
| FlutterViewOnDisplayPlatformView, | |
| (int view_id, | |
| int x, | |
| int y, | |
| int width, | |
| int height, | |
| int viewWidth, | |
| int viewHeight, | |
| MutatorsStack mutators_stack), | |
| (override)); | |
| MOCK_METHOD(void, | |
| FlutterViewDisplayOverlaySurface, | |
| (int surface_id, int x, int y, int width, int height), | |
| (override)); | |
| MOCK_METHOD(void, FlutterViewBeginFrame, (), (override)); | |
| MOCK_METHOD(void, FlutterViewEndFrame, (), (override)); | |
| MOCK_METHOD(std::unique_ptr<PlatformViewAndroidJNI::OverlayMetadata>, | |
| FlutterViewCreateOverlaySurface, | |
| (), | |
| (override)); | |
| MOCK_METHOD(void, FlutterViewDestroyOverlaySurfaces, (), (override)); | |
| MOCK_METHOD(std::unique_ptr<std::vector<std::string>>, | |
| FlutterViewComputePlatformResolvedLocale, | |
| (std::vector<std::string> supported_locales_data), | |
| (override)); | |
| MOCK_METHOD(double, GetDisplayRefreshRate, (), (override)); | |
| MOCK_METHOD(double, GetDisplayWidth, (), (override)); | |
| MOCK_METHOD(double, GetDisplayHeight, (), (override)); | |
| MOCK_METHOD(double, GetDisplayDensity, (), (override)); | |
| MOCK_METHOD(bool, | |
| RequestDartDeferredLibrary, | |
| (int loading_unit_id), | |
| (override)); | |
| MOCK_METHOD(double, | |
| FlutterViewGetScaledFontSize, | |
| (double font_size, int configuration_id), | |
| (const, override)); | |
| }; | |
| class MockPlatformMessageResponse : public PlatformMessageResponse { | |
| public: | |
| static fml::RefPtr<MockPlatformMessageResponse> Create() { | |
| return fml::AdoptRef(new MockPlatformMessageResponse()); | |
| } | |
| MOCK_METHOD(void, Complete, (std::unique_ptr<fml::Mapping> data), (override)); | |
| MOCK_METHOD(void, CompleteEmpty, (), (override)); | |
| }; | |
| } // namespace | |
| TEST(AndroidShellHolder, Create) { | |
| Settings settings; | |
| settings.enable_software_rendering = false; | |
| auto jni = std::make_shared<MockPlatformViewAndroidJNI>(); | |
| auto holder = std::make_unique<AndroidShellHolder>(settings, jni); | |
| EXPECT_NE(holder.get(), nullptr); | |
| EXPECT_TRUE(holder->IsValid()); | |
| EXPECT_NE(holder->GetPlatformView().get(), nullptr); | |
| auto window = fml::MakeRefCounted<AndroidNativeWindow>( | |
| nullptr, /*is_fake_window=*/true); | |
| holder->GetPlatformView()->NotifyCreated(window); | |
| } | |
| TEST(AndroidShellHolder, HandlePlatformMessage) { | |
| Settings settings; | |
| settings.enable_software_rendering = false; | |
| auto jni = std::make_shared<MockPlatformViewAndroidJNI>(); | |
| auto holder = std::make_unique<AndroidShellHolder>(settings, jni); | |
| EXPECT_NE(holder.get(), nullptr); | |
| EXPECT_TRUE(holder->IsValid()); | |
| EXPECT_NE(holder->GetPlatformView().get(), nullptr); | |
| auto window = fml::MakeRefCounted<AndroidNativeWindow>( | |
| nullptr, /*is_fake_window=*/true); | |
| holder->GetPlatformView()->NotifyCreated(window); | |
| EXPECT_TRUE(holder->GetPlatformMessageHandler()); | |
| size_t data_size = 4; | |
| fml::MallocMapping bytes = | |
| fml::MallocMapping(static_cast<uint8_t*>(malloc(data_size)), data_size); | |
| fml::RefPtr<MockPlatformMessageResponse> response = | |
| MockPlatformMessageResponse::Create(); | |
| auto message = std::make_unique<PlatformMessage>( | |
| /*channel=*/"foo", /*data=*/std::move(bytes), /*response=*/response); | |
| int response_id = 1; | |
| EXPECT_CALL(*jni, | |
| FlutterViewHandlePlatformMessage(::testing::_, response_id)); | |
| EXPECT_CALL(*response, CompleteEmpty()); | |
| holder->GetPlatformMessageHandler()->HandlePlatformMessage( | |
| std::move(message)); | |
| holder->GetPlatformMessageHandler() | |
| ->InvokePlatformMessageEmptyResponseCallback(response_id); | |
| } | |
| } // namespace testing | |
| } // namespace flutter |