diff options
Diffstat (limited to 'chromium/weblayer/browser/infobar_android.cc')
-rw-r--r-- | chromium/weblayer/browser/infobar_android.cc | 91 |
1 files changed, 91 insertions, 0 deletions
diff --git a/chromium/weblayer/browser/infobar_android.cc b/chromium/weblayer/browser/infobar_android.cc new file mode 100644 index 00000000000..4aa24af9285 --- /dev/null +++ b/chromium/weblayer/browser/infobar_android.cc @@ -0,0 +1,91 @@ +// 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/infobar_android.h" + +#include <utility> + +#include "base/android/jni_android.h" +#include "base/android/jni_string.h" +#include "base/strings/string_util.h" +#include "components/infobars/core/infobar.h" +#include "components/infobars/core/infobar_delegate.h" +#include "weblayer/browser/android/resource_mapper.h" +#include "weblayer/browser/java/jni/InfoBar_jni.h" + +using base::android::JavaParamRef; +using base::android::JavaRef; + +namespace weblayer { + +// InfoBarAndroid ------------------------------------------------------------- + +InfoBarAndroid::InfoBarAndroid( + std::unique_ptr<infobars::InfoBarDelegate> delegate) + : infobars::InfoBar(std::move(delegate)) {} + +InfoBarAndroid::~InfoBarAndroid() { + if (!java_info_bar_.is_null()) { + JNIEnv* env = base::android::AttachCurrentThread(); + Java_InfoBar_onNativeDestroyed(env, java_info_bar_); + } +} + +void InfoBarAndroid::ReassignJavaInfoBar(InfoBarAndroid* replacement) { + DCHECK(replacement); + if (!java_info_bar_.is_null()) { + replacement->SetJavaInfoBar(java_info_bar_); + java_info_bar_.Reset(); + } +} + +void InfoBarAndroid::SetJavaInfoBar( + const base::android::JavaRef<jobject>& java_info_bar) { + DCHECK(java_info_bar_.is_null()); + java_info_bar_.Reset(java_info_bar); + JNIEnv* env = base::android::AttachCurrentThread(); + Java_InfoBar_setNativeInfoBar(env, java_info_bar, + reinterpret_cast<intptr_t>(this)); +} + +const JavaRef<jobject>& InfoBarAndroid::GetJavaInfoBar() { + return java_info_bar_; +} + +bool InfoBarAndroid::HasSetJavaInfoBar() const { + return !java_info_bar_.is_null(); +} + +int InfoBarAndroid::GetInfoBarIdentifier(JNIEnv* env, + const JavaParamRef<jobject>& obj) { + return delegate()->GetIdentifier(); +} + +void InfoBarAndroid::OnButtonClicked(JNIEnv* env, + const JavaParamRef<jobject>& obj, + jint action) { + ProcessButton(action); +} + +void InfoBarAndroid::OnCloseButtonClicked(JNIEnv* env, + const JavaParamRef<jobject>& obj) { + if (!owner()) + return; // We're closing; don't call anything, it might access the owner. + delegate()->InfoBarDismissed(); + RemoveSelf(); +} + +void InfoBarAndroid::CloseJavaInfoBar() { + if (!java_info_bar_.is_null()) { + JNIEnv* env = base::android::AttachCurrentThread(); + Java_InfoBar_closeInfoBar(env, java_info_bar_); + java_info_bar_.Reset(nullptr); + } +} + +int InfoBarAndroid::GetJavaIconId() { + return weblayer::MapToJavaDrawableId(delegate()->GetIconId()); +} + +} // namespace weblayer |