Fix emulator build error
[platform/framework/web/chromium-efl.git] / base / android / application_status_listener.cc
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.
4
5 #include "base/android/application_status_listener.h"
6
7 #include <jni.h>
8
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"
15
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)
19
20 namespace base {
21 namespace android {
22
23 namespace {
24
25 class ApplicationStatusListenerImpl;
26
27 struct LeakyLazyObserverListTraits
28     : base::internal::LeakyLazyInstanceTraits<
29           ObserverListThreadSafe<ApplicationStatusListenerImpl>> {
30   static ObserverListThreadSafe<ApplicationStatusListenerImpl>* New(
31       void* instance) {
32     ObserverListThreadSafe<ApplicationStatusListenerImpl>* ret =
33         base::internal::LeakyLazyInstanceTraits<ObserverListThreadSafe<
34             ApplicationStatusListenerImpl>>::New(instance);
35     // Leaky.
36     ret->AddRef();
37     return ret;
38   }
39 };
40
41 LazyInstance<ObserverListThreadSafe<ApplicationStatusListenerImpl>,
42              LeakyLazyObserverListTraits>
43     g_observers = LAZY_INSTANCE_INITIALIZER;
44
45 class ApplicationStatusListenerImpl : public ApplicationStatusListener {
46  public:
47   ApplicationStatusListenerImpl(
48       const ApplicationStateChangeCallback& callback) {
49     SetCallback(callback);
50     g_observers.Get().AddObserver(this);
51
52     Java_ApplicationStatus_registerThreadSafeNativeApplicationStateListener(
53         AttachCurrentThread());
54   }
55
56   ~ApplicationStatusListenerImpl() override {
57     g_observers.Get().RemoveObserver(this);
58   }
59
60   void SetCallback(const ApplicationStateChangeCallback& callback) override {
61     DCHECK(!callback_);
62     DCHECK(callback);
63     callback_ = callback;
64   }
65
66   void Notify(ApplicationState state) override {
67     if (callback_)
68       callback_.Run(state);
69   }
70
71  private:
72   ApplicationStateChangeCallback callback_;
73 };
74
75 }  // namespace
76
77 ApplicationStatusListener::ApplicationStatusListener() = default;
78 ApplicationStatusListener::~ApplicationStatusListener() = default;
79
80 // static
81 std::unique_ptr<ApplicationStatusListener> ApplicationStatusListener::New(
82     const ApplicationStateChangeCallback& callback) {
83   return std::make_unique<ApplicationStatusListenerImpl>(callback);
84 }
85
86 // static
87 void ApplicationStatusListener::NotifyApplicationStateChange(
88     ApplicationState state) {
89   TRACE_APPLICATION_STATE(state);
90   switch (state) {
91     case APPLICATION_STATE_UNKNOWN:
92     case APPLICATION_STATE_HAS_DESTROYED_ACTIVITIES:
93       break;
94     case APPLICATION_STATE_HAS_RUNNING_ACTIVITIES:
95       RecordAction(UserMetricsAction("Android.LifeCycle.HasRunningActivities"));
96       break;
97     case APPLICATION_STATE_HAS_PAUSED_ACTIVITIES:
98       RecordAction(UserMetricsAction("Android.LifeCycle.HasPausedActivities"));
99       break;
100     case APPLICATION_STATE_HAS_STOPPED_ACTIVITIES:
101       RecordAction(UserMetricsAction("Android.LifeCycle.HasStoppedActivities"));
102       break;
103   }
104   g_observers.Get().Notify(FROM_HERE, &ApplicationStatusListenerImpl::Notify,
105                            state);
106 }
107
108 // static
109 ApplicationState ApplicationStatusListener::GetState() {
110   return static_cast<ApplicationState>(
111       Java_ApplicationStatus_getStateForApplication(AttachCurrentThread()));
112 }
113
114 static void JNI_ApplicationStatus_OnApplicationStateChange(
115     JNIEnv* env,
116     jint new_state) {
117   ApplicationState application_state = static_cast<ApplicationState>(new_state);
118   ApplicationStatusListener::NotifyApplicationStateChange(application_state);
119 }
120
121 // static
122 bool ApplicationStatusListener::HasVisibleActivities() {
123   return Java_ApplicationStatus_hasVisibleActivities(AttachCurrentThread());
124 }
125
126 }  // namespace android
127 }  // namespace base