infobar_container_android.cc revision effb81e5f8246d0db0270817048dc992db66e9fb
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 "chrome/browser/ui/android/infobars/infobar_container_android.h"
6
7#include "base/android/jni_android.h"
8#include "base/logging.h"
9#include "base/message_loop/message_loop.h"
10#include "chrome/browser/infobars/infobar.h"
11#include "chrome/browser/infobars/infobar_delegate.h"
12#include "chrome/browser/infobars/infobar_service.h"
13#include "chrome/browser/ui/android/infobars/auto_login_infobar_delegate_android.h"
14#include "chrome/browser/ui/android/infobars/infobar_android.h"
15#include "content/public/browser/web_contents.h"
16#include "jni/InfoBarContainer_jni.h"
17
18
19// InfoBarContainerAndroid ----------------------------------------------------
20
21InfoBarContainerAndroid::InfoBarContainerAndroid(JNIEnv* env,
22                                                 jobject obj,
23                                                 jobject auto_login_delegate)
24    : InfoBarContainer(NULL),
25      weak_java_infobar_container_(env, obj),
26      weak_java_auto_login_delegate_(env, auto_login_delegate) {
27}
28
29InfoBarContainerAndroid::~InfoBarContainerAndroid() {
30  RemoveAllInfoBarsForDestruction();
31}
32
33void InfoBarContainerAndroid::Destroy(JNIEnv* env, jobject obj) {
34  delete this;
35}
36
37void InfoBarContainerAndroid::PlatformSpecificAddInfoBar(InfoBar* infobar,
38                                                         size_t position) {
39  DCHECK(infobar);
40  InfoBarAndroid* android_bar = static_cast<InfoBarAndroid*>(infobar);
41  if (!android_bar) {
42    // TODO(bulach): CLANK: implement other types of InfoBars.
43    // TODO(jrg): this will always print out WARNING_TYPE as an int.
44    // Try and be more helpful.
45    NOTIMPLEMENTED() << "CLANK: infobar type "
46                     << infobar->delegate()->GetInfoBarType();
47    return;
48  }
49
50  if (infobar->delegate()->AsAutoLoginInfoBarDelegate()) {
51    AutoLoginInfoBarDelegateAndroid* auto_login_delegate =
52        static_cast<AutoLoginInfoBarDelegateAndroid*>(
53            infobar->delegate()->AsAutoLoginInfoBarDelegate());
54    if (!auto_login_delegate->AttachAccount(weak_java_auto_login_delegate_))
55      return;
56  }
57
58  AttachJavaInfoBar(android_bar);
59}
60
61void InfoBarContainerAndroid::AttachJavaInfoBar(InfoBarAndroid* android_bar) {
62  if (android_bar->HasSetJavaInfoBar())
63    return;
64  JNIEnv* env = base::android::AttachCurrentThread();
65  base::android::ScopedJavaLocalRef<jobject> java_infobar =
66      android_bar->CreateRenderInfoBar(env);
67  Java_InfoBarContainer_addInfoBar(
68      env, weak_java_infobar_container_.get(env).obj(), java_infobar.obj());
69  android_bar->set_java_infobar(java_infobar);
70}
71
72void InfoBarContainerAndroid::PlatformSpecificReplaceInfoBar(
73    InfoBar* old_infobar,
74    InfoBar* new_infobar) {
75  static_cast<InfoBarAndroid*>(new_infobar)->PassJavaInfoBar(
76      static_cast<InfoBarAndroid*>(old_infobar));
77}
78
79void InfoBarContainerAndroid::PlatformSpecificRemoveInfoBar(InfoBar* infobar) {
80  InfoBarAndroid* android_infobar = static_cast<InfoBarAndroid*>(infobar);
81  android_infobar->CloseJavaInfoBar();
82}
83
84
85// Native JNI methods ---------------------------------------------------------
86
87static jlong Init(JNIEnv* env,
88                  jobject obj,
89                  jobject web_contents,
90                  jobject auto_login_delegate) {
91  InfoBarContainerAndroid* infobar_container =
92      new InfoBarContainerAndroid(env, obj, auto_login_delegate);
93  infobar_container->ChangeInfoBarService(InfoBarService::FromWebContents(
94      content::WebContents::FromJavaWebContents(web_contents)));
95  return reinterpret_cast<intptr_t>(infobar_container);
96}
97
98bool RegisterInfoBarContainer(JNIEnv* env) {
99  return RegisterNativesImpl(env);
100}
101