| 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);
|
| +}
|
|
|