1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "components/infobars/android/infobar_android.h"
6
7 #include <utility>
8
9 #include "base/android/jni_android.h"
10 #include "base/android/jni_string.h"
11 #include "base/strings/string_util.h"
12 #include "components/infobars/android/jni_headers/InfoBar_jni.h"
13 #include "components/infobars/core/infobar.h"
14 #include "components/infobars/core/infobar_delegate.h"
15
16 using base::android::JavaParamRef;
17 using base::android::JavaRef;
18
19 namespace infobars {
20
21 // InfoBarAndroid -------------------------------------------------------------
22
InfoBarAndroid(std::unique_ptr<InfoBarDelegate> delegate,const ResourceIdMapper & resource_id_mapper)23 InfoBarAndroid::InfoBarAndroid(std::unique_ptr<InfoBarDelegate> delegate,
24 const ResourceIdMapper& resource_id_mapper)
25 : InfoBar(std::move(delegate)), resource_id_mapper_(resource_id_mapper) {}
26
~InfoBarAndroid()27 InfoBarAndroid::~InfoBarAndroid() {
28 if (!java_info_bar_.is_null()) {
29 JNIEnv* env = base::android::AttachCurrentThread();
30 Java_InfoBar_resetNativeInfoBar(env, java_info_bar_);
31 }
32 }
33
SetJavaInfoBar(const base::android::JavaRef<jobject> & java_info_bar)34 void InfoBarAndroid::SetJavaInfoBar(
35 const base::android::JavaRef<jobject>& java_info_bar) {
36 DCHECK(java_info_bar_.is_null());
37 java_info_bar_.Reset(java_info_bar);
38 JNIEnv* env = base::android::AttachCurrentThread();
39 Java_InfoBar_setNativeInfoBar(env, java_info_bar,
40 reinterpret_cast<intptr_t>(this));
41 }
42
GetJavaInfoBar()43 const JavaRef<jobject>& InfoBarAndroid::GetJavaInfoBar() {
44 return java_info_bar_;
45 }
46
HasSetJavaInfoBar() const47 bool InfoBarAndroid::HasSetJavaInfoBar() const {
48 return !java_info_bar_.is_null();
49 }
50
GetInfoBarIdentifier(JNIEnv * env,const JavaParamRef<jobject> & obj)51 int InfoBarAndroid::GetInfoBarIdentifier(JNIEnv* env,
52 const JavaParamRef<jobject>& obj) {
53 return delegate()->GetIdentifier();
54 }
55
OnButtonClicked(JNIEnv * env,const JavaParamRef<jobject> & obj,jint action)56 void InfoBarAndroid::OnButtonClicked(JNIEnv* env,
57 const JavaParamRef<jobject>& obj,
58 jint action) {
59 ProcessButton(action);
60 }
61
OnCloseButtonClicked(JNIEnv * env,const JavaParamRef<jobject> & obj)62 void InfoBarAndroid::OnCloseButtonClicked(JNIEnv* env,
63 const JavaParamRef<jobject>& obj) {
64 if (!owner())
65 return; // We're closing; don't call anything, it might access the owner.
66 delegate()->InfoBarDismissed();
67 RemoveSelf();
68 }
69
CloseJavaInfoBar()70 void InfoBarAndroid::CloseJavaInfoBar() {
71 if (!java_info_bar_.is_null()) {
72 JNIEnv* env = base::android::AttachCurrentThread();
73 Java_InfoBar_closeInfoBar(env, java_info_bar_);
74 Java_InfoBar_resetNativeInfoBar(env, java_info_bar_);
75 java_info_bar_.Reset(nullptr);
76 }
77 }
78
GetJavaIconId()79 int InfoBarAndroid::GetJavaIconId() {
80 return resource_id_mapper_.Run(delegate()->GetIconId());
81 }
82
83 } // namespace infobars
84