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