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