| 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 |