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