| // 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 |