// Copyright 2020 The Chromium 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 "weblayer/browser/confirm_infobar_android.h" #include #include #include "base/android/jni_string.h" #include "components/infobars/core/confirm_infobar_delegate.h" #include "content/public/browser/web_contents.h" #include "ui/android/window_android.h" #include "ui/gfx/android/java_bitmap.h" #include "ui/gfx/image/image.h" #include "weblayer/browser/infobar_service.h" #include "weblayer/browser/java/jni/ConfirmInfoBar_jni.h" using base::android::JavaParamRef; using base::android::ScopedJavaLocalRef; namespace weblayer { // InfoBarService ------------------------------------------------------------- std::unique_ptr InfoBarService::CreateConfirmInfoBar( std::unique_ptr delegate) { return std::make_unique(std::move(delegate)); } // ConfirmInfoBar ------------------------------------------------------------- ConfirmInfoBar::ConfirmInfoBar(std::unique_ptr delegate) : InfoBarAndroid(std::move(delegate)) {} ConfirmInfoBar::~ConfirmInfoBar() = default; base::string16 ConfirmInfoBar::GetTextFor( ConfirmInfoBarDelegate::InfoBarButton button) { ConfirmInfoBarDelegate* delegate = GetDelegate(); return (delegate->GetButtons() & button) ? delegate->GetButtonLabel(button) : base::string16(); } ConfirmInfoBarDelegate* ConfirmInfoBar::GetDelegate() { return delegate()->AsConfirmInfoBarDelegate(); } ScopedJavaLocalRef ConfirmInfoBar::CreateRenderInfoBar(JNIEnv* env) { ScopedJavaLocalRef ok_button_text = base::android::ConvertUTF16ToJavaString( env, GetTextFor(ConfirmInfoBarDelegate::BUTTON_OK)); ScopedJavaLocalRef cancel_button_text = base::android::ConvertUTF16ToJavaString( env, GetTextFor(ConfirmInfoBarDelegate::BUTTON_CANCEL)); ConfirmInfoBarDelegate* delegate = GetDelegate(); ScopedJavaLocalRef message_text = base::android::ConvertUTF16ToJavaString(env, delegate->GetMessageText()); ScopedJavaLocalRef link_text = base::android::ConvertUTF16ToJavaString(env, delegate->GetLinkText()); ScopedJavaLocalRef java_bitmap; if (delegate->GetIconId() == infobars::InfoBarDelegate::kNoIconID && !delegate->GetIcon().IsEmpty()) { java_bitmap = gfx::ConvertToJavaBitmap(delegate->GetIcon().ToSkBitmap()); } return Java_ConfirmInfoBar_create(env, GetJavaIconId(), java_bitmap, message_text, link_text, ok_button_text, cancel_button_text); } void ConfirmInfoBar::OnLinkClicked(JNIEnv* env, const JavaParamRef& obj) { if (!owner()) return; // We're closing; don't call anything, it might access the owner. if (GetDelegate()->LinkClicked(WindowOpenDisposition::NEW_FOREGROUND_TAB)) RemoveSelf(); } void ConfirmInfoBar::ProcessButton(int action) { if (!owner()) return; // We're closing; don't call anything, it might access the owner. DCHECK((action == InfoBarAndroid::ACTION_OK) || (action == InfoBarAndroid::ACTION_CANCEL)); ConfirmInfoBarDelegate* delegate = GetDelegate(); if ((action == InfoBarAndroid::ACTION_OK) ? delegate->Accept() : delegate->Cancel()) { RemoveSelf(); } } } // namespace weblayer