1 // Copyright 2014 The Chromium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "base/android/application_status_listener.h"
9 #include "base/base_jni/ApplicationStatus_jni.h"
10 #include "base/functional/callback.h"
11 #include "base/lazy_instance.h"
12 #include "base/metrics/user_metrics.h"
13 #include "base/observer_list_threadsafe.h"
14 #include "base/trace_event/base_tracing.h"
16 #if BUILDFLAG(ENABLE_BASE_TRACING)
17 #include "base/trace_event/application_state_proto_android.h" // no-presubmit-check
18 #endif // BUILDFLAG(ENABLE_BASE_TRACING)
25 class ApplicationStatusListenerImpl;
27 struct LeakyLazyObserverListTraits
28 : base::internal::LeakyLazyInstanceTraits<
29 ObserverListThreadSafe<ApplicationStatusListenerImpl>> {
30 static ObserverListThreadSafe<ApplicationStatusListenerImpl>* New(
32 ObserverListThreadSafe<ApplicationStatusListenerImpl>* ret =
33 base::internal::LeakyLazyInstanceTraits<ObserverListThreadSafe<
34 ApplicationStatusListenerImpl>>::New(instance);
41 LazyInstance<ObserverListThreadSafe<ApplicationStatusListenerImpl>,
42 LeakyLazyObserverListTraits>
43 g_observers = LAZY_INSTANCE_INITIALIZER;
45 class ApplicationStatusListenerImpl : public ApplicationStatusListener {
47 ApplicationStatusListenerImpl(
48 const ApplicationStateChangeCallback& callback) {
49 SetCallback(callback);
50 g_observers.Get().AddObserver(this);
52 Java_ApplicationStatus_registerThreadSafeNativeApplicationStateListener(
53 AttachCurrentThread());
56 ~ApplicationStatusListenerImpl() override {
57 g_observers.Get().RemoveObserver(this);
60 void SetCallback(const ApplicationStateChangeCallback& callback) override {
66 void Notify(ApplicationState state) override {
72 ApplicationStateChangeCallback callback_;
77 ApplicationStatusListener::ApplicationStatusListener() = default;
78 ApplicationStatusListener::~ApplicationStatusListener() = default;
81 std::unique_ptr<ApplicationStatusListener> ApplicationStatusListener::New(
82 const ApplicationStateChangeCallback& callback) {
83 return std::make_unique<ApplicationStatusListenerImpl>(callback);
87 void ApplicationStatusListener::NotifyApplicationStateChange(
88 ApplicationState state) {
89 TRACE_APPLICATION_STATE(state);
91 case APPLICATION_STATE_UNKNOWN:
92 case APPLICATION_STATE_HAS_DESTROYED_ACTIVITIES:
94 case APPLICATION_STATE_HAS_RUNNING_ACTIVITIES:
95 RecordAction(UserMetricsAction("Android.LifeCycle.HasRunningActivities"));
97 case APPLICATION_STATE_HAS_PAUSED_ACTIVITIES:
98 RecordAction(UserMetricsAction("Android.LifeCycle.HasPausedActivities"));
100 case APPLICATION_STATE_HAS_STOPPED_ACTIVITIES:
101 RecordAction(UserMetricsAction("Android.LifeCycle.HasStoppedActivities"));
104 g_observers.Get().Notify(FROM_HERE, &ApplicationStatusListenerImpl::Notify,
109 ApplicationState ApplicationStatusListener::GetState() {
110 return static_cast<ApplicationState>(
111 Java_ApplicationStatus_getStateForApplication(AttachCurrentThread()));
114 static void JNI_ApplicationStatus_OnApplicationStateChange(
117 ApplicationState application_state = static_cast<ApplicationState>(new_state);
118 ApplicationStatusListener::NotifyApplicationStateChange(application_state);
122 bool ApplicationStatusListener::HasVisibleActivities() {
123 return Java_ApplicationStatus_hasVisibleActivities(AttachCurrentThread());
126 } // namespace android