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 3 // found in the LICENSE file. 4 5 #include "components/gcm_driver/gcm_driver_android.h" 6 7 #include "base/android/jni_android.h" 8 #include "base/android/jni_array.h" 9 #include "base/android/jni_string.h" 10 #include "base/compiler_specific.h" 11 #include "base/logging.h" 12 #include "jni/GCMDriver_jni.h" 13 14 using base::android::AppendJavaStringArrayToStringVector; 15 using base::android::AttachCurrentThread; 16 using base::android::ConvertJavaStringToUTF8; 17 using base::android::ConvertUTF8ToJavaString; 18 using base::android::ToJavaArrayOfStrings; 19 20 namespace gcm { 21 22 GCMDriverAndroid::GCMDriverAndroid() { 23 JNIEnv* env = AttachCurrentThread(); 24 java_ref_.Reset( 25 Java_GCMDriver_create(env, 26 reinterpret_cast<intptr_t>(this), 27 base::android::GetApplicationContext())); 28 } 29 30 GCMDriverAndroid::~GCMDriverAndroid() { 31 JNIEnv* env = AttachCurrentThread(); 32 Java_GCMDriver_destroy(env, java_ref_.obj()); 33 } 34 35 void GCMDriverAndroid::OnRegisterFinished(JNIEnv* env, 36 jobject obj, 37 jstring j_app_id, 38 jstring j_registration_id, 39 jboolean success) { 40 std::string app_id = ConvertJavaStringToUTF8(env, j_app_id); 41 std::string registration_id = ConvertJavaStringToUTF8(env, j_registration_id); 42 GCMClient::Result result = success ? GCMClient::SUCCESS 43 : GCMClient::UNKNOWN_ERROR; 44 45 RegisterFinished(app_id, registration_id, result); 46 } 47 48 void GCMDriverAndroid::OnUnregisterFinished(JNIEnv* env, 49 jobject obj, 50 jstring j_app_id, 51 jboolean success) { 52 std::string app_id = ConvertJavaStringToUTF8(env, j_app_id); 53 GCMClient::Result result = success ? GCMClient::SUCCESS 54 : GCMClient::UNKNOWN_ERROR; 55 56 UnregisterFinished(app_id, result); 57 } 58 59 void GCMDriverAndroid::OnMessageReceived(JNIEnv* env, 60 jobject obj, 61 jstring j_app_id, 62 jstring j_sender_id, 63 jstring j_collapse_key, 64 jobjectArray j_data_keys_and_values) { 65 std::string app_id = ConvertJavaStringToUTF8(env, j_app_id); 66 67 GCMClient::IncomingMessage message; 68 message.sender_id = ConvertJavaStringToUTF8(env, j_sender_id); 69 message.collapse_key = ConvertJavaStringToUTF8(env, j_collapse_key); 70 // Expand j_data_keys_and_values from array to map. 71 std::vector<std::string> data_keys_and_values; 72 AppendJavaStringArrayToStringVector(env, 73 j_data_keys_and_values, 74 &data_keys_and_values); 75 for (size_t i = 0; i + 1 < data_keys_and_values.size(); i += 2) { 76 message.data[data_keys_and_values[i]] = data_keys_and_values[i+1]; 77 } 78 79 GetAppHandler(app_id)->OnMessage(app_id, message); 80 } 81 82 void GCMDriverAndroid::OnMessagesDeleted(JNIEnv* env, 83 jobject obj, 84 jstring j_app_id) { 85 std::string app_id = ConvertJavaStringToUTF8(env, j_app_id); 86 87 GetAppHandler(app_id)->OnMessagesDeleted(app_id); 88 } 89 90 // static 91 bool GCMDriverAndroid::RegisterBindings(JNIEnv* env) { 92 return RegisterNativesImpl(env); 93 } 94 95 void GCMDriverAndroid::OnSignedIn() { 96 } 97 98 void GCMDriverAndroid::OnSignedOut() { 99 } 100 101 void GCMDriverAndroid::Purge() { 102 } 103 104 void GCMDriverAndroid::AddConnectionObserver(GCMConnectionObserver* observer) { 105 } 106 107 void GCMDriverAndroid::RemoveConnectionObserver( 108 GCMConnectionObserver* observer) { 109 } 110 111 void GCMDriverAndroid::Enable() { 112 } 113 114 void GCMDriverAndroid::Disable() { 115 } 116 117 GCMClient* GCMDriverAndroid::GetGCMClientForTesting() const { 118 NOTIMPLEMENTED(); 119 return NULL; 120 } 121 122 bool GCMDriverAndroid::IsStarted() const { 123 return true; 124 } 125 126 bool GCMDriverAndroid::IsConnected() const { 127 // TODO(gcm): hook up to GCM connected status 128 return true; 129 } 130 131 void GCMDriverAndroid::GetGCMStatistics( 132 const GetGCMStatisticsCallback& callback, 133 bool clear_logs) { 134 NOTIMPLEMENTED(); 135 } 136 137 void GCMDriverAndroid::SetGCMRecording(const GetGCMStatisticsCallback& callback, 138 bool recording) { 139 NOTIMPLEMENTED(); 140 } 141 142 void GCMDriverAndroid::UpdateAccountMapping( 143 const AccountMapping& account_mapping) { 144 } 145 146 void GCMDriverAndroid::RemoveAccountMapping(const std::string& account_id) { 147 } 148 149 GCMClient::Result GCMDriverAndroid::EnsureStarted() { 150 // TODO(johnme): Maybe we should check if GMS is available? 151 return GCMClient::SUCCESS; 152 } 153 154 void GCMDriverAndroid::RegisterImpl( 155 const std::string& app_id, 156 const std::vector<std::string>& sender_ids) { 157 JNIEnv* env = AttachCurrentThread(); 158 Java_GCMDriver_register( 159 env, java_ref_.obj(), 160 ConvertUTF8ToJavaString(env, app_id).Release(), 161 ToJavaArrayOfStrings(env, sender_ids).obj()); 162 } 163 164 void GCMDriverAndroid::UnregisterImpl(const std::string& app_id) { 165 JNIEnv* env = AttachCurrentThread(); 166 Java_GCMDriver_unregister( 167 env, java_ref_.obj(), 168 ConvertUTF8ToJavaString(env, app_id).Release()); 169 } 170 171 void GCMDriverAndroid::SendImpl(const std::string& app_id, 172 const std::string& receiver_id, 173 const GCMClient::OutgoingMessage& message) { 174 NOTIMPLEMENTED(); 175 } 176 177 } // namespace gcm 178