| // Copyright 2024 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "ui/android/fake_modal_dialog_manager_bridge.h" |
| |
| #include <vector> |
| |
| #include "base/android/jni_android.h" |
| #include "third_party/skia/include/core/SkBitmap.h" |
| #include "ui/android/window_android.h" |
| #include "ui/gfx/android/java_bitmap.h" |
| |
| // Must come after all headers that specialize FromJniType() / ToJniType(). |
| #include "ui/android/ui_javatest_jni_headers/FakeModalDialogManager_jni.h" |
| |
| namespace ui { |
| |
| // static. |
| std::unique_ptr<FakeModalDialogManagerBridge> |
| FakeModalDialogManagerBridge::CreateForTab(WindowAndroid* window, |
| bool use_empty_java_presenter) { |
| JNIEnv* env = base::android::AttachCurrentThread(); |
| auto fake_manager = base::WrapUnique(new FakeModalDialogManagerBridge( |
| Java_FakeModalDialogManager_createForTab(env, use_empty_java_presenter), |
| window)); |
| window->SetModalDialogManagerForTesting(fake_manager->j_fake_manager_); |
| return fake_manager; |
| } |
| |
| FakeModalDialogManagerBridge::~FakeModalDialogManagerBridge() { |
| window_->SetModalDialogManagerForTesting( |
| base::android::ScopedJavaLocalRef<jobject>()); |
| } |
| |
| void FakeModalDialogManagerBridge::ClickPositiveButton() { |
| JNIEnv* env = base::android::AttachCurrentThread(); |
| Java_FakeModalDialogManager_clickPositiveButton(env, j_fake_manager_); |
| } |
| |
| void FakeModalDialogManagerBridge::ClickNegativeButton() { |
| JNIEnv* env = base::android::AttachCurrentThread(); |
| Java_FakeModalDialogManager_clickNegativeButton(env, j_fake_manager_); |
| } |
| |
| void FakeModalDialogManagerBridge::ToggleCheckbox() { |
| JNIEnv* env = base::android::AttachCurrentThread(); |
| Java_FakeModalDialogManager_toggleCheckbox(env, j_fake_manager_); |
| } |
| |
| bool FakeModalDialogManagerBridge::IsCheckboxChecked() { |
| JNIEnv* env = base::android::AttachCurrentThread(); |
| return static_cast<bool>( |
| Java_FakeModalDialogManager_isCheckboxChecked(env, j_fake_manager_)); |
| } |
| |
| int FakeModalDialogManagerBridge::GetButtonStyles() { |
| JNIEnv* env = base::android::AttachCurrentThread(); |
| return Java_FakeModalDialogManager_getButtonStyles(env, j_fake_manager_); |
| } |
| |
| std::vector<std::u16string> |
| FakeModalDialogManagerBridge::GetMessageParagraphs() { |
| JNIEnv* env = base::android::AttachCurrentThread(); |
| auto java_paragraphs = |
| Java_FakeModalDialogManager_getMessageParagraphs(env, j_fake_manager_); |
| auto paragraphs = std::vector<std::u16string>(); |
| base::android::AppendJavaStringArrayToStringVector(env, java_paragraphs, |
| ¶graphs); |
| return paragraphs; |
| } |
| |
| std::vector<std::u16string> FakeModalDialogManagerBridge::GetMenuItemTexts() { |
| JNIEnv* env = base::android::AttachCurrentThread(); |
| auto java_texts = |
| Java_FakeModalDialogManager_getMenuItemTexts(env, j_fake_manager_); |
| auto texts = std::vector<std::u16string>(); |
| base::android::AppendJavaStringArrayToStringVector(env, java_texts, &texts); |
| return texts; |
| } |
| |
| void FakeModalDialogManagerBridge::ClickMenuItem(int index) { |
| JNIEnv* env = base::android::AttachCurrentThread(); |
| Java_FakeModalDialogManager_clickMenuItem(env, j_fake_manager_, index); |
| } |
| |
| std::vector<SkBitmap> FakeModalDialogManagerBridge::GetMenuItemIcons() { |
| JNIEnv* env = base::android::AttachCurrentThread(); |
| base::android::ScopedJavaLocalRef<jobjectArray> java_icons = |
| Java_FakeModalDialogManager_getMenuItemIcons(env, j_fake_manager_); |
| |
| std::vector<SkBitmap> icons; |
| if (java_icons) { |
| size_t len = base::android::SafeGetArrayLength(env, java_icons); |
| icons.reserve(len); |
| for (size_t i = 0; i < len; ++i) { |
| base::android::ScopedJavaLocalRef<jobject> java_bitmap = |
| base::android::ScopedJavaLocalRef<jobject>::Adopt( |
| env, env->GetObjectArrayElement(java_icons.obj(), i)); |
| if (java_bitmap) { |
| icons.push_back( |
| gfx::CreateSkBitmapFromJavaBitmap(gfx::JavaBitmap(java_bitmap))); |
| } else { |
| icons.emplace_back(); |
| } |
| } |
| } |
| return icons; |
| } |
| |
| SkBitmap FakeModalDialogManagerBridge::GetTitleIcon() { |
| JNIEnv* env = base::android::AttachCurrentThread(); |
| base::android::ScopedJavaLocalRef<jobject> java_bitmap = |
| Java_FakeModalDialogManager_getTitleIcon(env, j_fake_manager_); |
| if (java_bitmap.is_null()) { |
| return SkBitmap(); |
| } |
| return gfx::CreateSkBitmapFromJavaBitmap(gfx::JavaBitmap(java_bitmap)); |
| } |
| |
| bool FakeModalDialogManagerBridge::IsSuspend( |
| ModalDialogManagerBridge::ModalDialogType dialog_type) { |
| JNIEnv* env = base::android::AttachCurrentThread(); |
| return static_cast<bool>(Java_FakeModalDialogManager_isSuspended( |
| env, j_fake_manager_, static_cast<int>(dialog_type))); |
| } |
| |
| // private. |
| FakeModalDialogManagerBridge::FakeModalDialogManagerBridge( |
| base::android::ScopedJavaLocalRef<jobject> j_fake_manager, |
| WindowAndroid* window) |
| : j_fake_manager_(j_fake_manager), window_(window) {} |
| |
| } // namespace ui |