Index: chrome/browser/android/gcm_android.cc |
diff --git a/chrome/browser/android/gcm_android.cc b/chrome/browser/android/gcm_android.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..e44b81025c29a22d62c3485545463fd2350edb23 |
--- /dev/null |
+++ b/chrome/browser/android/gcm_android.cc |
@@ -0,0 +1,96 @@ |
+// Copyright (c) 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 "chrome/browser/android/gcm_android.h" |
+ |
+#include "base/android/jni_array.h" |
+#include "base/android/jni_string.h" |
+#include "base/strings/utf_string_conversions.h" |
+#include "content/browser/push_messaging_message_filter.h" |
+#include "content/public/browser/browser_thread.h" |
+#include "content/public/common/push_messaging_status.h" |
+#include "jni/GcmPlatformImpl_jni.h" |
+ |
+using base::android::AttachCurrentThread; |
+using base::android::ConvertJavaStringToUTF8; |
+using base::android::ConvertUTF8ToJavaString; |
+using base::android::ToJavaArrayOfStrings; |
+using content::BrowserThread; |
+using content::PushMessagingMessageFilter; |
+using content::PushMessagingStatus; |
+ |
+GcmPlatformImplAndroid::GcmPlatformImplAndroid() |
+ : observer_(NULL) { |
+ JNIEnv* env = AttachCurrentThread(); |
+ java_ref_.Reset( |
+ Java_GcmPlatformImpl_create(env, |
+ reinterpret_cast<intptr_t>(this), |
+ base::android::GetApplicationContext())); |
+} |
+ |
+GcmPlatformImplAndroid::~GcmPlatformImplAndroid() { |
+ CHECK(false); |
+ JNIEnv* env = AttachCurrentThread(); |
+ Java_GcmPlatformImpl_destroy(env, java_ref_.obj()); |
+} |
+ |
+void GcmPlatformImplAndroid::Register( |
+ const std::string& app_unique_id_currently_ignored, |
+ const std::vector<std::string>& sender_ids, |
+ const content::PushMessagingService::RegisterCallback& callback) { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
+ register_cb_ = callback; |
+ |
+ JNIEnv* env = AttachCurrentThread(); |
+ Java_GcmPlatformImpl_registerApp( |
+ env, java_ref_.obj(), |
+ ConvertUTF8ToJavaString(env, app_unique_id_currently_ignored).Release(), |
+ ToJavaArrayOfStrings(env, sender_ids).obj()); |
+} |
+ |
+void GcmPlatformImplAndroid::SetObserver(PushMessagingMessageFilter* observer) { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
+ observer_ = observer; |
+} |
+ |
+void GcmPlatformImplAndroid::OnRegistrationFinished(JNIEnv* env, jobject obj, |
+ jstring registration_id) { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
+ if (!register_cb_.is_null()) { |
+ std::string reg_id = ConvertJavaStringToUTF8(env, registration_id); |
+ PushMessagingStatus status = reg_id.empty() |
+ ? content::PUSH_MESSAGING_STATUS_UNKNOWN_ERROR |
+ : content::PUSH_MESSAGING_STATUS_OK; |
+ register_cb_.Run(reg_id, status); |
+ } |
+} |
+ |
+void GcmPlatformImplAndroid::OnMessageReceived(JNIEnv* env, jobject obj, |
+ jstring data) { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
+ if (observer_) { |
+ std::string data_string = ConvertJavaStringToUTF8(env, data); // TODO: can I avoid this? |
+ observer_->MessageReceived(data_string); |
+ } |
+} |
+ |
+void GcmPlatformImplAndroid::OnMessagesDeletedByServer(JNIEnv* env, |
+ jobject obj) { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
+ if (observer_) { |
+ std::string data_string("MESSAGES DELETED"); // HACK |
+ observer_->MessageReceived(data_string); |
+ } |
+} |
+ |
+// static |
+GcmPlatformImplAndroid* GcmPlatformImplAndroid::GetInstance() { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
+ return Singleton<GcmPlatformImplAndroid>::get(); |
+} |
+ |
+// static |
+bool GcmPlatformImplAndroid::RegisterGcmPlatformImplAndroid(JNIEnv* env) { |
+ return RegisterNativesImpl(env); |
+} |