1// Copyright 2014 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 "base/android/application_status_listener.h" 6 7#include <jni.h> 8 9#include "base/lazy_instance.h" 10#include "base/observer_list_threadsafe.h" 11#include "jni/ApplicationStatus_jni.h" 12 13namespace { 14struct LeakyLazyObserverListTraits : 15 base::internal::LeakyLazyInstanceTraits< 16 ObserverListThreadSafe<base::android::ApplicationStatusListener> > { 17 static ObserverListThreadSafe<base::android::ApplicationStatusListener>* 18 New(void* instance) { 19 ObserverListThreadSafe<base::android::ApplicationStatusListener>* ret = 20 base::internal::LeakyLazyInstanceTraits<ObserverListThreadSafe< 21 base::android::ApplicationStatusListener> >::New(instance); 22 // Leaky. 23 ret->AddRef(); 24 return ret; 25 } 26}; 27 28base::LazyInstance<ObserverListThreadSafe< 29 base::android::ApplicationStatusListener>, 30 LeakyLazyObserverListTraits> g_observers = LAZY_INSTANCE_INITIALIZER; 31 32} // namespace 33 34namespace base { 35namespace android { 36 37ApplicationStatusListener::ApplicationStatusListener( 38 const ApplicationStatusListener::ApplicationStateChangeCallback& callback) 39 : callback_(callback) { 40 DCHECK(!callback_.is_null()); 41 g_observers.Get().AddObserver(this); 42 43 Java_ApplicationStatus_registerThreadSafeNativeApplicationStateListener( 44 base::android::AttachCurrentThread()); 45} 46 47ApplicationStatusListener::~ApplicationStatusListener() { 48 g_observers.Get().RemoveObserver(this); 49} 50 51void ApplicationStatusListener::Notify(ApplicationState state) { 52 callback_.Run(state); 53} 54 55// static 56bool ApplicationStatusListener::RegisterBindings(JNIEnv* env) { 57 return RegisterNativesImpl(env); 58} 59 60// static 61void ApplicationStatusListener::NotifyApplicationStateChange( 62 ApplicationState state) { 63 g_observers.Get().Notify(&ApplicationStatusListener::Notify, state); 64} 65 66static void OnApplicationStateChange(JNIEnv* env, 67 jclass clazz, 68 jint new_state) { 69 ApplicationState application_state = static_cast<ApplicationState>(new_state); 70 ApplicationStatusListener::NotifyApplicationStateChange(application_state); 71} 72 73} // namespace android 74} // namespace base 75