// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "base/android/application_status_listener.h"

#include <jni.h>

#include "base/lazy_instance.h"
#include "base/observer_list_threadsafe.h"
#include "jni/ApplicationStatus_jni.h"

namespace base {
namespace android {

namespace {

struct LeakyLazyObserverListTraits :
    base::internal::LeakyLazyInstanceTraits<
        ObserverListThreadSafe<ApplicationStatusListener> > {
  static ObserverListThreadSafe<ApplicationStatusListener>*
      New(void* instance) {
    ObserverListThreadSafe<ApplicationStatusListener>* ret =
        base::internal::LeakyLazyInstanceTraits<ObserverListThreadSafe<
            ApplicationStatusListener>>::New(instance);
    // Leaky.
    ret->AddRef();
    return ret;
  }
};

LazyInstance<ObserverListThreadSafe<ApplicationStatusListener>,
             LeakyLazyObserverListTraits> g_observers =
    LAZY_INSTANCE_INITIALIZER;

}  // namespace

ApplicationStatusListener::ApplicationStatusListener(
    const ApplicationStatusListener::ApplicationStateChangeCallback& callback)
    : callback_(callback) {
  DCHECK(!callback_.is_null());
  g_observers.Get().AddObserver(this);

  Java_ApplicationStatus_registerThreadSafeNativeApplicationStateListener(
      AttachCurrentThread());
}

ApplicationStatusListener::~ApplicationStatusListener() {
  g_observers.Get().RemoveObserver(this);
}

void ApplicationStatusListener::Notify(ApplicationState state) {
  callback_.Run(state);
}

// static
void ApplicationStatusListener::NotifyApplicationStateChange(
    ApplicationState state) {
  TRACE_COUNTER1("browser", "ApplicationState", static_cast<int>(state));
  g_observers.Get().Notify(FROM_HERE, &ApplicationStatusListener::Notify,
                           state);
}

// static
ApplicationState ApplicationStatusListener::GetState() {
  return static_cast<ApplicationState>(
      Java_ApplicationStatus_getStateForApplication(AttachCurrentThread()));
}

static void JNI_ApplicationStatus_OnApplicationStateChange(
    JNIEnv* env,
    const JavaParamRef<jclass>& clazz,
    jint new_state) {
  ApplicationState application_state = static_cast<ApplicationState>(new_state);
  ApplicationStatusListener::NotifyApplicationStateChange(application_state);
}

}  // namespace android
}  // namespace base
