summaryrefslogtreecommitdiffstats
path: root/base/android/activity_status.cc
blob: 4d0be32ef93202a34b636916cf1e9fda640cdd8b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
// Copyright 2013 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/activity_status.h"

#include <jni.h>

#include "base/memory/singleton.h"
#include "jni/ActivityStatus_jni.h"

namespace base {
namespace android {

ActivityStatus::Listener::Listener(
    const ActivityStatus::StateChangeCallback& callback)
    : callback_(callback) {
  ActivityStatus::GetInstance()->RegisterListener(this);
}

ActivityStatus::Listener::~Listener() {
  ActivityStatus::GetInstance()->UnregisterListener(this);
}

void ActivityStatus::Listener::Notify(ActivityState state) {
  callback_.Run(state);
}

// static
ActivityStatus* ActivityStatus::GetInstance() {
  return Singleton<ActivityStatus,
                   LeakySingletonTraits<ActivityStatus> >::get();
}

static void OnActivityStateChange(JNIEnv* env, jclass clazz, int new_state) {
  ActivityStatus* activity_status = ActivityStatus::GetInstance();
  ActivityState activity_state = static_cast<ActivityState>(new_state);
  activity_status->OnActivityStateChange(activity_state);
}

bool ActivityStatus::RegisterBindings(JNIEnv* env) {
  return RegisterNativesImpl(env);
}

ActivityStatus::ActivityStatus()
    : observers_(new ObserverListThreadSafe<Listener>()) {
  Java_ActivityStatus_registerThreadSafeNativeStateListener(
      base::android::AttachCurrentThread());
}

ActivityStatus::~ActivityStatus() {}

void ActivityStatus::RegisterListener(Listener* listener) {
  observers_->AddObserver(listener);
}

void ActivityStatus::UnregisterListener(Listener* listener) {
  observers_->RemoveObserver(listener);
}

void ActivityStatus::OnActivityStateChange(ActivityState new_state) {
  observers_->Notify(&ActivityStatus::Listener::Notify, new_state);
}

}  // namespace android
}  // namespace base