gcm_driver_android.cc revision f8ee788a64d60abd8f2d742a5fdedde054ecd910
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
5#include "components/gcm_driver/gcm_driver_android.h"
6
7#include "base/android/jni_android.h"
8#include "base/android/jni_array.h"
9#include "base/android/jni_string.h"
10#include "base/compiler_specific.h"
11#include "base/logging.h"
12#include "jni/GCMDriver_jni.h"
13
14using base::android::AppendJavaStringArrayToStringVector;
15using base::android::AttachCurrentThread;
16using base::android::ConvertJavaStringToUTF8;
17using base::android::ConvertUTF8ToJavaString;
18using base::android::ToJavaArrayOfStrings;
19
20namespace gcm {
21
22 GCMDriverAndroid::GCMDriverAndroid() {
23  JNIEnv* env = AttachCurrentThread();
24  java_ref_.Reset(
25      Java_GCMDriver_create(env,
26                            reinterpret_cast<intptr_t>(this),
27                            base::android::GetApplicationContext()));
28}
29
30GCMDriverAndroid::~GCMDriverAndroid() {
31  JNIEnv* env = AttachCurrentThread();
32  Java_GCMDriver_destroy(env, java_ref_.obj());
33}
34
35void GCMDriverAndroid::OnRegisterFinished(JNIEnv* env,
36                                          jobject obj,
37                                          jstring j_app_id,
38                                          jstring j_registration_id,
39                                          jboolean success) {
40  std::string app_id = ConvertJavaStringToUTF8(env, j_app_id);
41  std::string registration_id = ConvertJavaStringToUTF8(env, j_registration_id);
42  GCMClient::Result result = success ? GCMClient::SUCCESS
43                                     : GCMClient::UNKNOWN_ERROR;
44
45  RegisterFinished(app_id, registration_id, result);
46}
47
48void GCMDriverAndroid::OnUnregisterFinished(JNIEnv* env,
49                                            jobject obj,
50                                            jstring j_app_id,
51                                            jboolean success) {
52  std::string app_id = ConvertJavaStringToUTF8(env, j_app_id);
53  GCMClient::Result result = success ? GCMClient::SUCCESS
54                                     : GCMClient::UNKNOWN_ERROR;
55
56  UnregisterFinished(app_id, result);
57}
58
59void GCMDriverAndroid::OnMessageReceived(JNIEnv* env,
60                                         jobject obj,
61                                         jstring j_app_id,
62                                         jstring j_sender_id,
63                                         jstring j_collapse_key,
64                                         jobjectArray j_data_keys_and_values) {
65  std::string app_id = ConvertJavaStringToUTF8(env, j_app_id);
66
67  GCMClient::IncomingMessage message;
68  message.sender_id = ConvertJavaStringToUTF8(env, j_sender_id);
69  message.collapse_key = ConvertJavaStringToUTF8(env, j_collapse_key);
70  // Expand j_data_keys_and_values from array to map.
71  std::vector<std::string> data_keys_and_values;
72  AppendJavaStringArrayToStringVector(env,
73                                      j_data_keys_and_values,
74                                      &data_keys_and_values);
75  for (size_t i = 0; i + 1 < data_keys_and_values.size(); i += 2) {
76    message.data[data_keys_and_values[i]] = data_keys_and_values[i+1];
77  }
78
79  GetAppHandler(app_id)->OnMessage(app_id, message);
80}
81
82void GCMDriverAndroid::OnMessagesDeleted(JNIEnv* env,
83                                         jobject obj,
84                                         jstring j_app_id) {
85  std::string app_id = ConvertJavaStringToUTF8(env, j_app_id);
86
87  GetAppHandler(app_id)->OnMessagesDeleted(app_id);
88}
89
90// static
91bool GCMDriverAndroid::RegisterBindings(JNIEnv* env) {
92  return RegisterNativesImpl(env);
93}
94
95void GCMDriverAndroid::OnSignedIn() {
96}
97
98void GCMDriverAndroid::Purge() {
99}
100
101void GCMDriverAndroid::Enable() {
102}
103
104void GCMDriverAndroid::Disable() {
105}
106
107GCMClient* GCMDriverAndroid::GetGCMClientForTesting() const {
108  NOTIMPLEMENTED();
109  return NULL;
110}
111
112bool GCMDriverAndroid::IsStarted() const {
113  return true;
114}
115
116bool GCMDriverAndroid::IsGCMClientReady() const {
117  return true;
118}
119
120bool GCMDriverAndroid::IsConnected() const {
121  // TODO(gcm): hook up to GCM connected status
122  return true;
123}
124
125void GCMDriverAndroid::GetGCMStatistics(
126    const GetGCMStatisticsCallback& callback,
127    bool clear_logs) {
128  NOTIMPLEMENTED();
129}
130
131void GCMDriverAndroid::SetGCMRecording(const GetGCMStatisticsCallback& callback,
132                                       bool recording) {
133  NOTIMPLEMENTED();
134}
135
136GCMClient::Result GCMDriverAndroid::EnsureStarted() {
137  // TODO(johnme): Maybe we should check if GMS is available?
138  return GCMClient::SUCCESS;
139}
140
141void GCMDriverAndroid::RegisterImpl(
142    const std::string& app_id,
143    const std::vector<std::string>& sender_ids) {
144  JNIEnv* env = AttachCurrentThread();
145  Java_GCMDriver_register(
146      env, java_ref_.obj(),
147      ConvertUTF8ToJavaString(env, app_id).Release(),
148      ToJavaArrayOfStrings(env, sender_ids).obj());
149}
150
151void GCMDriverAndroid::UnregisterImpl(const std::string& app_id) {
152  JNIEnv* env = AttachCurrentThread();
153  Java_GCMDriver_unregister(
154      env, java_ref_.obj(),
155      ConvertUTF8ToJavaString(env, app_id).Release());
156}
157
158void GCMDriverAndroid::SendImpl(const std::string& app_id,
159                                const std::string& receiver_id,
160                                const GCMClient::OutgoingMessage& message) {
161  NOTIMPLEMENTED();
162}
163
164}  // namespace gcm
165