OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "components/gcm_driver/gcm_driver_android.h" | 5 #include "components/gcm_driver/gcm_driver_android.h" |
6 | 6 |
7 #include <stdint.h> | 7 #include <stdint.h> |
8 | 8 |
9 #include "base/android/context_utils.h" | 9 #include "base/android/context_utils.h" |
10 #include "base/android/jni_android.h" | 10 #include "base/android/jni_android.h" |
11 #include "base/android/jni_array.h" | 11 #include "base/android/jni_array.h" |
12 #include "base/android/jni_string.h" | 12 #include "base/android/jni_string.h" |
13 #include "base/compiler_specific.h" | 13 #include "base/compiler_specific.h" |
14 #include "base/logging.h" | 14 #include "base/logging.h" |
15 #include "jni/GCMDriver_jni.h" | 15 #include "jni/GCMDriver_jni.h" |
16 | 16 |
17 using base::android::AppendJavaStringArrayToStringVector; | 17 using base::android::AppendJavaStringArrayToStringVector; |
18 using base::android::AttachCurrentThread; | 18 using base::android::AttachCurrentThread; |
19 using base::android::ConvertJavaStringToUTF8; | 19 using base::android::ConvertJavaStringToUTF8; |
20 using base::android::ConvertUTF8ToJavaString; | 20 using base::android::ConvertUTF8ToJavaString; |
21 using base::android::JavaByteArrayToByteVector; | 21 using base::android::JavaByteArrayToByteVector; |
22 | 22 |
23 namespace gcm { | 23 namespace gcm { |
24 | 24 |
25 GCMDriverAndroid::GCMDriverAndroid( | 25 GCMDriverAndroid::GCMDriverAndroid( |
26 const base::FilePath& store_path, | 26 const base::FilePath& store_path, |
27 const scoped_refptr<base::SequencedTaskRunner>& blocking_task_runner) | 27 const scoped_refptr<base::SequencedTaskRunner>& blocking_task_runner) |
28 : GCMDriver(store_path, blocking_task_runner) { | 28 : GCMDriver(store_path, blocking_task_runner), |
| 29 recorder_(this) { |
29 JNIEnv* env = AttachCurrentThread(); | 30 JNIEnv* env = AttachCurrentThread(); |
30 java_ref_.Reset( | 31 java_ref_.Reset( |
31 Java_GCMDriver_create(env, | 32 Java_GCMDriver_create(env, |
32 reinterpret_cast<intptr_t>(this), | 33 reinterpret_cast<intptr_t>(this), |
33 base::android::GetApplicationContext())); | 34 base::android::GetApplicationContext())); |
34 } | 35 } |
35 | 36 |
36 GCMDriverAndroid::~GCMDriverAndroid() { | 37 GCMDriverAndroid::~GCMDriverAndroid() { |
37 JNIEnv* env = AttachCurrentThread(); | 38 JNIEnv* env = AttachCurrentThread(); |
38 Java_GCMDriver_destroy(env, java_ref_.obj()); | 39 Java_GCMDriver_destroy(env, java_ref_.obj()); |
39 } | 40 } |
40 | 41 |
41 void GCMDriverAndroid::OnRegisterFinished( | 42 void GCMDriverAndroid::OnRegisterFinished( |
42 JNIEnv* env, | 43 JNIEnv* env, |
43 const JavaParamRef<jobject>& obj, | 44 const JavaParamRef<jobject>& obj, |
44 const JavaParamRef<jstring>& j_app_id, | 45 const JavaParamRef<jstring>& j_app_id, |
45 const JavaParamRef<jstring>& j_registration_id, | 46 const JavaParamRef<jstring>& j_registration_id, |
46 jboolean success) { | 47 jboolean success) { |
47 std::string app_id = ConvertJavaStringToUTF8(env, j_app_id); | 48 std::string app_id = ConvertJavaStringToUTF8(env, j_app_id); |
48 std::string registration_id = ConvertJavaStringToUTF8(env, j_registration_id); | 49 std::string registration_id = ConvertJavaStringToUTF8(env, j_registration_id); |
49 GCMClient::Result result = success ? GCMClient::SUCCESS | 50 GCMClient::Result result = success ? GCMClient::SUCCESS |
50 : GCMClient::UNKNOWN_ERROR; | 51 : GCMClient::UNKNOWN_ERROR; |
51 | 52 |
| 53 recorder_.RecordRegistrationResponse(app_id, success); |
| 54 |
52 RegisterFinished(app_id, registration_id, result); | 55 RegisterFinished(app_id, registration_id, result); |
53 } | 56 } |
54 | 57 |
55 void GCMDriverAndroid::OnUnregisterFinished( | 58 void GCMDriverAndroid::OnUnregisterFinished( |
56 JNIEnv* env, | 59 JNIEnv* env, |
57 const JavaParamRef<jobject>& obj, | 60 const JavaParamRef<jobject>& obj, |
58 const JavaParamRef<jstring>& j_app_id, | 61 const JavaParamRef<jstring>& j_app_id, |
59 jboolean success) { | 62 jboolean success) { |
60 std::string app_id = ConvertJavaStringToUTF8(env, j_app_id); | 63 std::string app_id = ConvertJavaStringToUTF8(env, j_app_id); |
61 GCMClient::Result result = success ? GCMClient::SUCCESS | 64 GCMClient::Result result = success ? GCMClient::SUCCESS |
62 : GCMClient::UNKNOWN_ERROR; | 65 : GCMClient::UNKNOWN_ERROR; |
63 | 66 |
| 67 recorder_.RecordUnregistrationResponse(app_id, success); |
| 68 |
64 UnregisterFinished(app_id, result); | 69 UnregisterFinished(app_id, result); |
65 } | 70 } |
66 | 71 |
67 void GCMDriverAndroid::OnMessageReceived( | 72 void GCMDriverAndroid::OnMessageReceived( |
68 JNIEnv* env, | 73 JNIEnv* env, |
69 const JavaParamRef<jobject>& obj, | 74 const JavaParamRef<jobject>& obj, |
70 const JavaParamRef<jstring>& j_app_id, | 75 const JavaParamRef<jstring>& j_app_id, |
71 const JavaParamRef<jstring>& j_sender_id, | 76 const JavaParamRef<jstring>& j_sender_id, |
72 const JavaParamRef<jstring>& j_collapse_key, | 77 const JavaParamRef<jstring>& j_collapse_key, |
73 const JavaParamRef<jbyteArray>& j_raw_data, | 78 const JavaParamRef<jbyteArray>& j_raw_data, |
74 const JavaParamRef<jobjectArray>& j_data_keys_and_values) { | 79 const JavaParamRef<jobjectArray>& j_data_keys_and_values) { |
75 std::string app_id = ConvertJavaStringToUTF8(env, j_app_id); | 80 std::string app_id = ConvertJavaStringToUTF8(env, j_app_id); |
76 | 81 |
| 82 int message_byte_size = 0; |
| 83 |
77 IncomingMessage message; | 84 IncomingMessage message; |
78 message.sender_id = ConvertJavaStringToUTF8(env, j_sender_id); | 85 message.sender_id = ConvertJavaStringToUTF8(env, j_sender_id); |
79 message.collapse_key = ConvertJavaStringToUTF8(env, j_collapse_key); | 86 message.collapse_key = ConvertJavaStringToUTF8(env, j_collapse_key); |
80 // Expand j_data_keys_and_values from array to map. | 87 // Expand j_data_keys_and_values from array to map. |
81 std::vector<std::string> data_keys_and_values; | 88 std::vector<std::string> data_keys_and_values; |
82 AppendJavaStringArrayToStringVector(env, | 89 AppendJavaStringArrayToStringVector(env, |
83 j_data_keys_and_values, | 90 j_data_keys_and_values, |
84 &data_keys_and_values); | 91 &data_keys_and_values); |
85 for (size_t i = 0; i + 1 < data_keys_and_values.size(); i += 2) { | 92 for (size_t i = 0; i + 1 < data_keys_and_values.size(); i += 2) { |
86 message.data[data_keys_and_values[i]] = data_keys_and_values[i+1]; | 93 message.data[data_keys_and_values[i]] = data_keys_and_values[i+1]; |
| 94 message_byte_size += data_keys_and_values[i+1].size(); |
87 } | 95 } |
88 // Convert j_raw_data from byte[] to binary std::string. | 96 // Convert j_raw_data from byte[] to binary std::string. |
89 if (j_raw_data) { | 97 if (j_raw_data) { |
90 std::vector<uint8_t> raw_data; | 98 std::vector<uint8_t> raw_data; |
91 JavaByteArrayToByteVector(env, j_raw_data, &raw_data); | 99 JavaByteArrayToByteVector(env, j_raw_data, &raw_data); |
92 message.raw_data.assign(raw_data.begin(), raw_data.end()); | 100 message.raw_data.assign(raw_data.begin(), raw_data.end()); |
| 101 |
| 102 message_byte_size += message.raw_data.size(); |
93 } | 103 } |
94 | 104 |
| 105 recorder_.RecordDataMessageReceived(app_id, message_byte_size); |
| 106 |
95 DispatchMessage(app_id, message); | 107 DispatchMessage(app_id, message); |
96 } | 108 } |
97 | 109 |
98 void GCMDriverAndroid::OnMessagesDeleted( | 110 void GCMDriverAndroid::OnMessagesDeleted( |
99 JNIEnv* env, | 111 JNIEnv* env, |
100 const JavaParamRef<jobject>& obj, | 112 const JavaParamRef<jobject>& obj, |
101 const JavaParamRef<jstring>& j_app_id) { | 113 const JavaParamRef<jstring>& j_app_id) { |
102 std::string app_id = ConvertJavaStringToUTF8(env, j_app_id); | 114 std::string app_id = ConvertJavaStringToUTF8(env, j_app_id); |
103 | 115 |
104 GetAppHandler(app_id)->OnMessagesDeleted(app_id); | 116 GetAppHandler(app_id)->OnMessagesDeleted(app_id); |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
137 return true; | 149 return true; |
138 } | 150 } |
139 | 151 |
140 bool GCMDriverAndroid::IsConnected() const { | 152 bool GCMDriverAndroid::IsConnected() const { |
141 // TODO(gcm): hook up to GCM connected status | 153 // TODO(gcm): hook up to GCM connected status |
142 return true; | 154 return true; |
143 } | 155 } |
144 | 156 |
145 void GCMDriverAndroid::GetGCMStatistics( | 157 void GCMDriverAndroid::GetGCMStatistics( |
146 const GetGCMStatisticsCallback& callback, | 158 const GetGCMStatisticsCallback& callback, |
147 bool clear_logs) { | 159 ClearActivityLogs clear_logs) { |
148 NOTIMPLEMENTED(); | 160 DCHECK(!callback.is_null()); |
| 161 |
| 162 get_gcm_statistics_callback_ = callback; |
| 163 |
| 164 if (clear_logs == CLEAR_LOGS) |
| 165 recorder_.Clear(); |
| 166 |
| 167 GCMClient::GCMStatistics stats; |
| 168 stats.is_recording = recorder_.is_recording(); |
| 169 |
| 170 recorder_.CollectActivities(&stats.recorded_activities); |
| 171 |
| 172 callback.Run(stats); |
149 } | 173 } |
150 | 174 |
151 void GCMDriverAndroid::SetGCMRecording(const GetGCMStatisticsCallback& callback, | 175 void GCMDriverAndroid::SetGCMRecording(const GetGCMStatisticsCallback& callback, |
152 bool recording) { | 176 bool recording) { |
153 NOTIMPLEMENTED(); | 177 DCHECK(!callback.is_null()); |
| 178 |
| 179 recorder_.set_is_recording(recording); |
| 180 |
| 181 GetGCMStatistics(callback, recording ? KEEP_LOGS : CLEAR_LOGS); |
154 } | 182 } |
155 | 183 |
156 void GCMDriverAndroid::SetAccountTokens( | 184 void GCMDriverAndroid::SetAccountTokens( |
157 const std::vector<GCMClient::AccountTokenInfo>& account_tokens) { | 185 const std::vector<GCMClient::AccountTokenInfo>& account_tokens) { |
158 NOTIMPLEMENTED(); | 186 NOTIMPLEMENTED(); |
159 } | 187 } |
160 | 188 |
161 void GCMDriverAndroid::UpdateAccountMapping( | 189 void GCMDriverAndroid::UpdateAccountMapping( |
162 const AccountMapping& account_mapping) { | 190 const AccountMapping& account_mapping) { |
163 NOTIMPLEMENTED(); | 191 NOTIMPLEMENTED(); |
(...skipping 20 matching lines...) Expand all Loading... |
184 return NULL; | 212 return NULL; |
185 } | 213 } |
186 | 214 |
187 void GCMDriverAndroid::AddHeartbeatInterval(const std::string& scope, | 215 void GCMDriverAndroid::AddHeartbeatInterval(const std::string& scope, |
188 int interval_ms) { | 216 int interval_ms) { |
189 } | 217 } |
190 | 218 |
191 void GCMDriverAndroid::RemoveHeartbeatInterval(const std::string& scope) { | 219 void GCMDriverAndroid::RemoveHeartbeatInterval(const std::string& scope) { |
192 } | 220 } |
193 | 221 |
| 222 void GCMDriverAndroid::OnActivityRecorded() { |
| 223 DCHECK(!get_gcm_statistics_callback_.is_null()); |
| 224 |
| 225 GetGCMStatistics(get_gcm_statistics_callback_, KEEP_LOGS); |
| 226 } |
| 227 |
194 GCMClient::Result GCMDriverAndroid::EnsureStarted( | 228 GCMClient::Result GCMDriverAndroid::EnsureStarted( |
195 GCMClient::StartMode start_mode) { | 229 GCMClient::StartMode start_mode) { |
196 // TODO(johnme): Maybe we should check if GMS is available? | 230 // TODO(johnme): Maybe we should check if GMS is available? |
197 return GCMClient::SUCCESS; | 231 return GCMClient::SUCCESS; |
198 } | 232 } |
199 | 233 |
200 void GCMDriverAndroid::RegisterImpl( | 234 void GCMDriverAndroid::RegisterImpl( |
201 const std::string& app_id, const std::vector<std::string>& sender_ids) { | 235 const std::string& app_id, const std::vector<std::string>& sender_ids) { |
202 DCHECK_EQ(1u, sender_ids.size()); | 236 DCHECK_EQ(1u, sender_ids.size()); |
203 JNIEnv* env = AttachCurrentThread(); | 237 JNIEnv* env = AttachCurrentThread(); |
| 238 |
| 239 recorder_.RecordRegistrationSent(app_id); |
| 240 |
204 Java_GCMDriver_register(env, java_ref_.obj(), | 241 Java_GCMDriver_register(env, java_ref_.obj(), |
205 ConvertUTF8ToJavaString(env, app_id).obj(), | 242 ConvertUTF8ToJavaString(env, app_id).obj(), |
206 ConvertUTF8ToJavaString(env, sender_ids[0]).obj()); | 243 ConvertUTF8ToJavaString(env, sender_ids[0]).obj()); |
207 } | 244 } |
208 | 245 |
209 void GCMDriverAndroid::UnregisterImpl(const std::string& app_id) { | 246 void GCMDriverAndroid::UnregisterImpl(const std::string& app_id) { |
210 NOTREACHED(); | 247 NOTREACHED(); |
211 } | 248 } |
212 | 249 |
213 void GCMDriverAndroid::UnregisterWithSenderIdImpl( | 250 void GCMDriverAndroid::UnregisterWithSenderIdImpl( |
214 const std::string& app_id, const std::string& sender_id) { | 251 const std::string& app_id, const std::string& sender_id) { |
215 JNIEnv* env = AttachCurrentThread(); | 252 JNIEnv* env = AttachCurrentThread(); |
| 253 |
| 254 recorder_.RecordUnregistrationSent(app_id); |
| 255 |
216 Java_GCMDriver_unregister(env, java_ref_.obj(), | 256 Java_GCMDriver_unregister(env, java_ref_.obj(), |
217 ConvertUTF8ToJavaString(env, app_id).obj(), | 257 ConvertUTF8ToJavaString(env, app_id).obj(), |
218 ConvertUTF8ToJavaString(env, sender_id).obj()); | 258 ConvertUTF8ToJavaString(env, sender_id).obj()); |
219 } | 259 } |
220 | 260 |
221 void GCMDriverAndroid::SendImpl(const std::string& app_id, | 261 void GCMDriverAndroid::SendImpl(const std::string& app_id, |
222 const std::string& receiver_id, | 262 const std::string& receiver_id, |
223 const OutgoingMessage& message) { | 263 const OutgoingMessage& message) { |
224 NOTIMPLEMENTED(); | 264 NOTIMPLEMENTED(); |
225 } | 265 } |
226 | 266 |
227 } // namespace gcm | 267 } // namespace gcm |
OLD | NEW |