Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(269)

Unified Diff: components/invalidation/invalidation_service_android.cc

Issue 459513002: Massive refactor of the Android invalidation code. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase. Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: components/invalidation/invalidation_service_android.cc
diff --git a/components/invalidation/invalidation_service_android.cc b/components/invalidation/invalidation_service_android.cc
new file mode 100644
index 0000000000000000000000000000000000000000..ed0fbc21b42100cdc9266bb74b1fadf9679564eb
--- /dev/null
+++ b/components/invalidation/invalidation_service_android.cc
@@ -0,0 +1,175 @@
+// Copyright (c) 2013 The Chromium Authors. All rights reserved.
nyquist 2014/09/04 09:01:56 2014 and no (c) now, since the move detection did
maxbogue 2014/09/05 16:42:46 Done.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "components/invalidation/invalidation_service_android.h"
+
+#include "base/android/jni_android.h"
+#include "base/android/jni_array.h"
+#include "base/android/jni_string.h"
+#include "base/callback.h"
+#include "components/invalidation/object_id_invalidation_map.h"
+#include "google/cacheinvalidation/types.pb.h"
+#include "jni/InvalidationService_jni.h"
+
+using base::android::ConvertJavaStringToUTF8;
+using base::android::ConvertUTF8ToJavaString;
+
+namespace invalidation {
+
+InvalidationServiceAndroid::InvalidationServiceAndroid(jobject context)
+ : invalidator_state_(syncer::INVALIDATIONS_ENABLED),
+ logger_() {
+ DCHECK(CalledOnValidThread());
+ JNIEnv* env = base::android::AttachCurrentThread();
+ base::android::ScopedJavaLocalRef<jobject> local_java_ref =
+ Java_InvalidationService_create(env,
+ context,
+ reinterpret_cast<intptr_t>(this));
+ java_ref_.Reset(env, local_java_ref.obj());
+}
+
+InvalidationServiceAndroid::~InvalidationServiceAndroid() { }
+
+void InvalidationServiceAndroid::RegisterInvalidationHandler(
+ syncer::InvalidationHandler* handler) {
+ DCHECK(CalledOnValidThread());
+ invalidator_registrar_.RegisterHandler(handler);
+ logger_.OnRegistration(handler->GetOwnerName());
+}
+
+void InvalidationServiceAndroid::UpdateRegisteredInvalidationIds(
+ syncer::InvalidationHandler* handler,
+ const syncer::ObjectIdSet& ids) {
+ DCHECK(CalledOnValidThread());
+ JNIEnv* env = base::android::AttachCurrentThread();
+ DCHECK(env);
+
+ invalidator_registrar_.UpdateRegisteredIds(handler, ids);
+ const syncer::ObjectIdSet& registered_ids =
+ invalidator_registrar_.GetAllRegisteredIds();
+
+ // To call the corresponding method on the Java invalidation service, split
+ // the object ids into object source and object name arrays.
+ std::vector<int> sources;
+ std::vector<std::string> names;
+ syncer::ObjectIdSet::const_iterator id;
+ for (id = registered_ids.begin(); id != registered_ids.end(); ++id) {
+ sources.push_back(id->source());
+ names.push_back(id->name());
+ }
+
+ Java_InvalidationService_setRegisteredObjectIds(
+ env,
+ java_ref_.obj(),
+ base::android::ToJavaIntArray(env, sources).obj(),
+ base::android::ToJavaArrayOfStrings(env, names).obj());
+
+ logger_.OnUpdateIds(invalidator_registrar_.GetSanitizedHandlersIdsMap());
+}
+
+void InvalidationServiceAndroid::UnregisterInvalidationHandler(
+ syncer::InvalidationHandler* handler) {
+ DCHECK(CalledOnValidThread());
+ invalidator_registrar_.UnregisterHandler(handler);
+ logger_.OnUnregistration(handler->GetOwnerName());
+}
+
+syncer::InvalidatorState
+InvalidationServiceAndroid::GetInvalidatorState() const {
+ DCHECK(CalledOnValidThread());
+ return invalidator_state_;
+}
+
+std::string InvalidationServiceAndroid::GetInvalidatorClientId() const {
+ DCHECK(CalledOnValidThread());
+ JNIEnv* env = base::android::AttachCurrentThread();
+ DCHECK(env);
+
+ // Ask the Java code to for the invalidator ID it's currently using.
+ base::android::ScopedJavaLocalRef<_jbyteArray*> id_bytes_java =
+ Java_InvalidationService_getInvalidatorClientId(env, java_ref_.obj());
+
+ // Convert it into a more convenient format for C++.
+ std::vector<uint8_t> id_bytes;
+ base::android::JavaByteArrayToByteVector(env, id_bytes_java.obj(), &id_bytes);
+ std::string id(id_bytes.begin(), id_bytes.end());
+
+ return id;
+}
+
+InvalidationLogger* InvalidationServiceAndroid::GetInvalidationLogger() {
+ return &logger_;
+}
+
+void InvalidationServiceAndroid::RequestDetailedStatus(
+ base::Callback<void(const base::DictionaryValue&)> return_callback) const {
+}
+
+IdentityProvider* InvalidationServiceAndroid::GetIdentityProvider() {
+ return NULL;
+}
+void InvalidationServiceAndroid::TriggerStateChangeForTest(
nyquist 2014/09/04 09:01:56 Missing newline before this function.
maxbogue 2014/09/05 16:42:46 Done.
+ syncer::InvalidatorState state) {
+ DCHECK(CalledOnValidThread());
+ invalidator_state_ = state;
+ invalidator_registrar_.UpdateInvalidatorState(invalidator_state_);
+}
+
+void InvalidationServiceAndroid::RequestSync(JNIEnv* env,
+ jobject obj,
+ jint object_source,
+ jstring java_object_id,
+ jlong version,
+ jstring java_state) {
+ invalidation::ObjectId object_id(object_source,
+ ConvertJavaStringToUTF8(env, java_object_id));
+
+ syncer::ObjectIdInvalidationMap object_ids_with_states;
+
+ if (version == ipc::invalidation::Constants::UNKNOWN) {
+ object_ids_with_states.Insert(
+ syncer::Invalidation::InitUnknownVersion(object_id));
+ } else {
+ ObjectIdVersionMap::iterator it =
+ max_invalidation_versions_.find(object_id);
+ if ((it != max_invalidation_versions_.end()) &&
+ (version <= it->second)) {
+ DVLOG(1) << "Dropping redundant invalidation with version " << version;
+ return;
+ }
+ max_invalidation_versions_[object_id] = version;
+ object_ids_with_states.Insert(
+ syncer::Invalidation::Init(object_id, version,
+ ConvertJavaStringToUTF8(env, java_state)));
+ }
+
+ DispatchInvalidations(object_ids_with_states);
+}
+
+void InvalidationServiceAndroid::RequestSyncForAllTypes(JNIEnv* env,
+ jobject obj) {
+ syncer::ObjectIdInvalidationMap object_ids_with_states;
+ DispatchInvalidations(object_ids_with_states);
+}
+
+void InvalidationServiceAndroid::DispatchInvalidations(
+ syncer::ObjectIdInvalidationMap& object_invalidation_map) {
+ // An empty map implies that we should invalidate all.
+ const syncer::ObjectIdInvalidationMap& effective_invalidation_map =
+ object_invalidation_map.Empty() ?
+ syncer::ObjectIdInvalidationMap::InvalidateAll(
+ invalidator_registrar_.GetAllRegisteredIds()) :
+ object_invalidation_map;
+
+ invalidator_registrar_.DispatchInvalidationsToHandlers(
+ effective_invalidation_map);
+ logger_.OnInvalidation(effective_invalidation_map);
+}
+
+// static
+bool InvalidationServiceAndroid::RegisterJni(JNIEnv* env) {
+ return RegisterNativesImpl(env);
+}
+
+} // namespace invalidation
nyquist 2014/09/04 09:01:56 extra space before //, not after.
maxbogue 2014/09/05 16:42:46 Done.

Powered by Google App Engine
This is Rietveld 408576698