application_status_listener.cc 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  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. #include "base/android/application_status_listener.h"
  5. #include <jni.h>
  6. #include "base/base_jni_headers/ApplicationStatus_jni.h"
  7. #include "base/callback.h"
  8. #include "base/lazy_instance.h"
  9. #include "base/metrics/user_metrics.h"
  10. #include "base/observer_list_threadsafe.h"
  11. #include "base/trace_event/base_tracing.h"
  12. #if BUILDFLAG(ENABLE_BASE_TRACING)
  13. #include "base/trace_event/application_state_proto_android.h" // no-presubmit-check
  14. #endif // BUILDFLAG(ENABLE_BASE_TRACING)
  15. namespace base {
  16. namespace android {
  17. namespace {
  18. class ApplicationStatusListenerImpl;
  19. struct LeakyLazyObserverListTraits
  20. : base::internal::LeakyLazyInstanceTraits<
  21. ObserverListThreadSafe<ApplicationStatusListenerImpl>> {
  22. static ObserverListThreadSafe<ApplicationStatusListenerImpl>* New(
  23. void* instance) {
  24. ObserverListThreadSafe<ApplicationStatusListenerImpl>* ret =
  25. base::internal::LeakyLazyInstanceTraits<ObserverListThreadSafe<
  26. ApplicationStatusListenerImpl>>::New(instance);
  27. // Leaky.
  28. ret->AddRef();
  29. return ret;
  30. }
  31. };
  32. LazyInstance<ObserverListThreadSafe<ApplicationStatusListenerImpl>,
  33. LeakyLazyObserverListTraits>
  34. g_observers = LAZY_INSTANCE_INITIALIZER;
  35. class ApplicationStatusListenerImpl : public ApplicationStatusListener {
  36. public:
  37. ApplicationStatusListenerImpl(
  38. const ApplicationStateChangeCallback& callback) {
  39. SetCallback(callback);
  40. g_observers.Get().AddObserver(this);
  41. Java_ApplicationStatus_registerThreadSafeNativeApplicationStateListener(
  42. AttachCurrentThread());
  43. }
  44. ~ApplicationStatusListenerImpl() override {
  45. g_observers.Get().RemoveObserver(this);
  46. }
  47. void SetCallback(const ApplicationStateChangeCallback& callback) override {
  48. DCHECK(!callback_);
  49. DCHECK(callback);
  50. callback_ = callback;
  51. }
  52. void Notify(ApplicationState state) override {
  53. if (callback_)
  54. callback_.Run(state);
  55. }
  56. private:
  57. ApplicationStateChangeCallback callback_;
  58. };
  59. } // namespace
  60. ApplicationStatusListener::ApplicationStatusListener() = default;
  61. ApplicationStatusListener::~ApplicationStatusListener() = default;
  62. // static
  63. std::unique_ptr<ApplicationStatusListener> ApplicationStatusListener::New(
  64. const ApplicationStateChangeCallback& callback) {
  65. return std::make_unique<ApplicationStatusListenerImpl>(callback);
  66. }
  67. // static
  68. void ApplicationStatusListener::NotifyApplicationStateChange(
  69. ApplicationState state) {
  70. TRACE_APPLICATION_STATE(state);
  71. switch (state) {
  72. case APPLICATION_STATE_UNKNOWN:
  73. case APPLICATION_STATE_HAS_DESTROYED_ACTIVITIES:
  74. break;
  75. case APPLICATION_STATE_HAS_RUNNING_ACTIVITIES:
  76. RecordAction(UserMetricsAction("Android.LifeCycle.HasRunningActivities"));
  77. break;
  78. case APPLICATION_STATE_HAS_PAUSED_ACTIVITIES:
  79. RecordAction(UserMetricsAction("Android.LifeCycle.HasPausedActivities"));
  80. break;
  81. case APPLICATION_STATE_HAS_STOPPED_ACTIVITIES:
  82. RecordAction(UserMetricsAction("Android.LifeCycle.HasStoppedActivities"));
  83. break;
  84. }
  85. g_observers.Get().Notify(FROM_HERE, &ApplicationStatusListenerImpl::Notify,
  86. state);
  87. }
  88. // static
  89. ApplicationState ApplicationStatusListener::GetState() {
  90. return static_cast<ApplicationState>(
  91. Java_ApplicationStatus_getStateForApplication(AttachCurrentThread()));
  92. }
  93. static void JNI_ApplicationStatus_OnApplicationStateChange(
  94. JNIEnv* env,
  95. jint new_state) {
  96. ApplicationState application_state = static_cast<ApplicationState>(new_state);
  97. ApplicationStatusListener::NotifyApplicationStateChange(application_state);
  98. }
  99. // static
  100. bool ApplicationStatusListener::HasVisibleActivities() {
  101. return Java_ApplicationStatus_hasVisibleActivities(AttachCurrentThread());
  102. }
  103. } // namespace android
  104. } // namespace base