1d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
2d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// found in the LICENSE file.
4d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "chrome/browser/ui/android/infobars/infobar_container_android.h"
6d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
7d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "base/android/jni_android.h"
8d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "base/logging.h"
9d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "base/message_loop/message_loop.h"
10d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "chrome/browser/infobars/infobar_service.h"
11effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "chrome/browser/ui/android/infobars/auto_login_infobar_delegate_android.h"
1268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "chrome/browser/ui/android/infobars/infobar_android.h"
130529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "components/infobars/core/infobar.h"
140529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "components/infobars/core/infobar_delegate.h"
15d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "content/public/browser/web_contents.h"
16d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "jni/InfoBarContainer_jni.h"
17d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
18d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
1968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// InfoBarContainerAndroid ----------------------------------------------------
2068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
21d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)InfoBarContainerAndroid::InfoBarContainerAndroid(JNIEnv* env,
22d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                                                 jobject obj,
23d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                                                 jobject auto_login_delegate)
240529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    : infobars::InfoBarContainer(NULL),
25d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      weak_java_infobar_container_(env, obj),
260529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      weak_java_auto_login_delegate_(env, auto_login_delegate) {}
27d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
28d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)InfoBarContainerAndroid::~InfoBarContainerAndroid() {
29d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  RemoveAllInfoBarsForDestruction();
30d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
31d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
32d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)void InfoBarContainerAndroid::Destroy(JNIEnv* env, jobject obj) {
33d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  delete this;
34d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
35d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
360529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochvoid InfoBarContainerAndroid::PlatformSpecificAddInfoBar(
370529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    infobars::InfoBar* infobar,
380529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    size_t position) {
39d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  DCHECK(infobar);
40d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  InfoBarAndroid* android_bar = static_cast<InfoBarAndroid*>(infobar);
41d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  if (!android_bar) {
42d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    // TODO(bulach): CLANK: implement other types of InfoBars.
43d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    // TODO(jrg): this will always print out WARNING_TYPE as an int.
44d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    // Try and be more helpful.
45d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    NOTIMPLEMENTED() << "CLANK: infobar type "
46d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                     << infobar->delegate()->GetInfoBarType();
47d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    return;
48d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  }
49d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
50d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  if (infobar->delegate()->AsAutoLoginInfoBarDelegate()) {
51effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    AutoLoginInfoBarDelegateAndroid* auto_login_delegate =
52effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        static_cast<AutoLoginInfoBarDelegateAndroid*>(
53d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)            infobar->delegate()->AsAutoLoginInfoBarDelegate());
5468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    if (!auto_login_delegate->AttachAccount(weak_java_auto_login_delegate_))
55d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      return;
56d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  }
57d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
58d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  AttachJavaInfoBar(android_bar);
59d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
60d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
61d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)void InfoBarContainerAndroid::AttachJavaInfoBar(InfoBarAndroid* android_bar) {
62d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  if (android_bar->HasSetJavaInfoBar())
63d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    return;
6468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  JNIEnv* env = base::android::AttachCurrentThread();
6568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  base::android::ScopedJavaLocalRef<jobject> java_infobar =
66d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      android_bar->CreateRenderInfoBar(env);
67d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  Java_InfoBarContainer_addInfoBar(
68d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      env, weak_java_infobar_container_.get(env).obj(), java_infobar.obj());
69d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  android_bar->set_java_infobar(java_infobar);
70d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
71d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
72d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)void InfoBarContainerAndroid::PlatformSpecificReplaceInfoBar(
730529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    infobars::InfoBar* old_infobar,
740529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    infobars::InfoBar* new_infobar) {
75f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  static_cast<InfoBarAndroid*>(new_infobar)->PassJavaInfoBar(
76f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      static_cast<InfoBarAndroid*>(old_infobar));
77d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
78d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
790529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochvoid InfoBarContainerAndroid::PlatformSpecificRemoveInfoBar(
800529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    infobars::InfoBar* infobar) {
81d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  InfoBarAndroid* android_infobar = static_cast<InfoBarAndroid*>(infobar);
82d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  android_infobar->CloseJavaInfoBar();
83d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
84d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
8568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
8668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// Native JNI methods ---------------------------------------------------------
8768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
88f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)static jlong Init(JNIEnv* env,
89f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                  jobject obj,
90a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                  jobject web_contents,
91f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                  jobject auto_login_delegate) {
92d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  InfoBarContainerAndroid* infobar_container =
93d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      new InfoBarContainerAndroid(env, obj, auto_login_delegate);
94a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  InfoBarService* infobar_service = InfoBarService::FromWebContents(
95a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      content::WebContents::FromJavaWebContents(web_contents));
96a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  infobar_container->ChangeInfoBarManager(infobar_service);
97f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return reinterpret_cast<intptr_t>(infobar_container);
98d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
99d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
100d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)bool RegisterInfoBarContainer(JNIEnv* env) {
101d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  return RegisterNativesImpl(env);
102d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
103