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 13 namespace { 14 struct 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 28 base::LazyInstance<ObserverListThreadSafe< 29 base::android::ApplicationStatusListener>, 30 LeakyLazyObserverListTraits> g_observers = LAZY_INSTANCE_INITIALIZER; 31 32 } // namespace 33 34 namespace base { 35 namespace android { 36 37 ApplicationStatusListener::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 47 ApplicationStatusListener::~ApplicationStatusListener() { 48 g_observers.Get().RemoveObserver(this); 49 } 50 51 void ApplicationStatusListener::Notify(ApplicationState state) { 52 callback_.Run(state); 53 } 54 55 // static 56 bool ApplicationStatusListener::RegisterBindings(JNIEnv* env) { 57 return RegisterNativesImpl(env); 58 } 59 60 // static 61 void ApplicationStatusListener::NotifyApplicationStateChange( 62 ApplicationState state) { 63 g_observers.Get().Notify(&ApplicationStatusListener::Notify, state); 64 } 65 66 static 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