Index: google_apis/gcm/gcm_client_impl_android.cc |
diff --git a/google_apis/gcm/gcm_client_impl_android.cc b/google_apis/gcm/gcm_client_impl_android.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..1ac11d0e1ffc40290de3519381bc4749709e9bd2 |
--- /dev/null |
+++ b/google_apis/gcm/gcm_client_impl_android.cc |
@@ -0,0 +1,174 @@ |
+// 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 "google_apis/gcm/gcm_client_impl_android.h" |
+ |
+#include "base/memory/scoped_ptr.h" |
+ |
+namespace gcm { |
+ |
+namespace { |
+ |
+GCMClientImplAndroid::GCMClientImplAndroid() |
+ : state_(UNINITIALIZED), |
+ delegate_(NULL) { |
+} |
+ |
+GCMClientImplAndroid::~GCMClientImplAndroid() { |
+} |
+ |
+void GCMClientImplAndroid::Initialize( |
+ const checkin_proto::ChromeBuildProto& unused, |
+ const base::FilePath& unused, |
+ const std::vector<std::string>& unused, |
+ const scoped_refptr<base::SequencedTaskRunner>& unused, |
+ const scoped_refptr<net::URLRequestContextGetter>& unused, |
+ Delegate* delegate) { |
+ DCHECK_EQ(UNINITIALIZED, state_); |
+ DCHECK(delegate); |
+ |
+ // TODO(johnme): Initialize JNI counterpart. |
+ |
+ delegate_ = delegate; |
+ state_ = INITIALIZED; |
+} |
+ |
+void GCMClientImplAndroid::Load() { |
+ DCHECK_EQ(INITIALIZED, state_); |
+ |
+ // Do nothing. Android GCM API doesn't require loading in advance. |
+ |
+ state_ = READY; |
+} |
+ |
+void GCMClientImplAndroid::Stop() { |
+ // Do nothing? |
+ |
+ if (state_ == READY) |
+ state_ = INITIALIZED; |
+} |
+ |
+void GCMClientImplAndroid::CheckOut() { |
+ Stop(); |
+ // TODO(johnme): What would this map to on Android? Is it even possible? |
+ NOTIMPLEMENTED(); |
+} |
+ |
+void GCMClientImplAndroid::Register(const std::string& app_id, |
+ const std::vector<std::string>& sender_ids) { |
+ DCHECK_EQ(INITIALIZED, state_); |
+ |
+ // TODO(johnme): Tell JNI counterpart to register. |
+} |
+ |
+void GCMClientImplAndroid::OnRegisterCompleted(JNIEnv* env, |
+ jobject obj, |
+ jstring j_app_id, |
+ jboolean success, |
+ jstring j_registration_id) { |
+ DCHECK(delegate_); |
+ |
+ std::string app_id = ConvertJavaStringToUTF8(env, j_app_id); |
+ Result result = success ? SUCCESS : UNKNOWN_ERROR; |
+ std::string registration_id = ConvertJavaStringToUTF8(env, j_registration_id); |
+ |
+ delegate_->OnRegisterFinished( |
+ app_id, result == SUCCESS ? registration_id : std::string(), result); |
+} |
+ |
+void GCMClientImplAndroid::Unregister(const std::string& app_id) { |
+ DCHECK_EQ(INITIALIZED, state_); |
+ |
+ // TODO(johnme): Tell JNI counterpart to unregister. |
+} |
+ |
+void GCMClientImplAndroid::OnUnregisterCompleted(JNIEnv* env, |
+ jobject obj, |
+ jstring j_app_id, |
+ jboolean success) { |
+ DCHECK(delegate_); |
+ std::string app_id = ConvertJavaStringToUTF8(env, j_app_id); |
+ DVLOG(1) << "Unregister completed for app: " << app_id |
+ << " with " << (success ? "success." : "failure."); |
+ delegate_->OnUnregisterFinished(app_id, success ? SUCCESS : SERVER_ERROR); |
+} |
+ |
+ |
+ |
+ void OnRegisterCompleted(JNIEnv* env, |
+ jobject obj, |
+ jstring app_id, |
+ jobjectArray sender_ids, |
+ jboolean success, |
+ jstring registration_id); |
+ void OnUnregisterCompleted(JNIEnv* env, |
+ jobject obj, |
+ jstring app_id, |
+ jboolean success); |
+ |
+ |
+ |
+void GCMClientImplAndroid::Send(const std::string& app_id, |
+ const std::string& receiver_id, |
+ const OutgoingMessage& message) { |
+ DCHECK(initialized_); |
+ |
+ NOTIMPLEMENTED() << "Send is not currently implemented on Android, as it is " |
+ << "only used by Chrome Apps & Extensions." |
+} |
+ |
+std::string GCMClientImplAndroid::GetStateString() const { |
+ switch(state_) { |
+ case GCMClientImpl::INITIALIZED: |
+ return "INITIALIZED"; |
+ case GCMClientImpl::UNINITIALIZED: |
+ return "UNINITIALIZED"; |
+ case GCMClientImpl::READY: |
+ return "READY"; |
+ default: |
+ NOTREACHED(); |
+ return std::string(); |
+ } |
+} |
+ |
+GCMClient::GCMStatistics GCMClientImplAndroid::GetStatistics() const { |
+ GCMClient::GCMStatistics stats; |
+ stats.gcm_client_state = GCMClientImplAndroid::GetStateString(); |
+ return stats; |
+} |
+ |
+void GCMClientImplAndroid::OnMessageReceived(JNIEnv* env, |
+ jobject obj, |
+ jstring j_sender_id, |
+ jstring j_app_id, |
+ jstring j_collapse_key, |
+ jobjectArray j_data) { |
+ DCHECK(delegate_); |
+ |
+ std::string sender_id = ConvertJavaStringToUTF8(env, j_sender_id); |
+ std::string app_id = ConvertJavaStringToUTF8(env, j_app_id); |
+ std::string collapse_key = ConvertJavaStringToUTF8(env, j_collapse_key); |
+ MessageData message_data; // TODO(johnme): Convert j_data from JNI format. |
+ |
+ // TODO(johnme): Drop the message when the app is not registered for the |
+ // sender of the message? |
+ |
+ IncomingMessage incoming_message; |
+ incoming_message.sender_id = sender_id; |
+ incoming_message.collapse_key = collapse_key; |
+ incoming_message.data = message_data; |
+ delegate_->OnMessageReceived(app_id, incoming_message); |
+} |
+ |
+void GCMClientImplAndroid::OnMessagesDeletedByServer(JNIEnv* env, |
+ jobject obj, |
+ jstring j_app_id) { |
+ DCHECK(delegate_); |
+ |
+ std::string app_id = ConvertJavaStringToUTF8(env, j_app_id); |
+ |
+ delegate_->OnMessagesDeleted(app_id); |
+} |
+ |
+} // namespace gcm |