 Chromium Code Reviews
 Chromium Code Reviews Issue 1334233003:
  Add the JNI code in order to let Java use the InterestsFetcher.  (Closed) 
  Base URL: https://chromium.googlesource.com/chromium/src.git@ntp-interests-retriever
    
  
    Issue 1334233003:
  Add the JNI code in order to let Java use the InterestsFetcher.  (Closed) 
  Base URL: https://chromium.googlesource.com/chromium/src.git@ntp-interests-retriever| Index: chrome/browser/android/interests_service.cc | 
| diff --git a/chrome/browser/android/interests_service.cc b/chrome/browser/android/interests_service.cc | 
| new file mode 100644 | 
| index 0000000000000000000000000000000000000000..00cb94f15af3833f7420c283a655ba47e52feef0 | 
| --- /dev/null | 
| +++ b/chrome/browser/android/interests_service.cc | 
| @@ -0,0 +1,126 @@ | 
| +// Copyright 2015 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/interests_service.h" | 
| + | 
| +#include "base/android/jni_android.h" | 
| +#include "base/android/jni_array.h" | 
| +#include "base/android/jni_string.h" | 
| +#include "base/android/scoped_java_ref.h" | 
| +#include "base/callback.h" | 
| +#include "base/command_line.h" | 
| 
Marc Treib
2015/09/11 14:54:25
Not needed, also the next three (and probably some
 
tache
2015/09/11 15:45:09
Done.
 | 
| +#include "base/compiler_specific.h" | 
| +#include "base/metrics/histogram.h" | 
| +#include "base/metrics/sparse_histogram.h" | 
| +#include "base/strings/string_number_conversions.h" | 
| +#include "base/strings/stringprintf.h" | 
| +#include "base/strings/utf_string_conversions.h" | 
| +#include "base/time/time.h" | 
| +#include "chrome/browser/interests/interests_fetcher.h" | 
| +#include "chrome/browser/profiles/profile.h" | 
| +#include "chrome/browser/profiles/profile_android.h" | 
| +#include "content/public/browser/browser_thread.h" | 
| +#include "content/public/browser/url_data_source.h" | 
| +#include "jni/InterestsService_jni.h" | 
| +#include "url/gurl.h" | 
| + | 
| +using base::android::AttachCurrentThread; | 
| +using base::android::ConvertJavaStringToUTF8; | 
| +using base::android::ScopedJavaGlobalRef; | 
| +using base::android::ScopedJavaLocalRef; | 
| +using base::android::ToJavaArrayOfStrings; | 
| + | 
| +namespace { | 
| + | 
| +const char kInterestJavaClass[] = | 
| + "org/chromium/chrome/browser/ntp/InterestsService$Interest"; | 
| + | 
| +} // end namespace | 
| + | 
| + | 
| +InterestsService::InterestsService(Profile *profile): | 
| + profile_(profile), weak_ptr_factory_(this) { | 
| +} | 
| + | 
| +InterestsService::~InterestsService() { | 
| +} | 
| + | 
| +void InterestsService::Destroy(JNIEnv* env, jobject obj) { | 
| + delete this; | 
| +} | 
| + | 
| + | 
| + | 
| +void InterestsService::GetInterests(JNIEnv* env, | 
| + jobject obj, | 
| + jstring j_token, | 
| + jobject j_callback_obj) { | 
| + scoped_ptr<ScopedJavaGlobalRef<jobject>> j_callback( | 
| + new ScopedJavaGlobalRef<jobject>()); | 
| + | 
| + j_callback->Reset(env, j_callback_obj); | 
| + std::string token = ConvertJavaStringToUTF8(env, j_token); | 
| + | 
| + InterestsFetcher* fetcher = | 
| + new InterestsFetcher(profile_->GetRequestContext(), | 
| + token); | 
| + | 
| + InterestsFetcher::InterestsCallback callback = | 
| + base::Bind(&InterestsService::OnObtainedInterests, | 
| + weak_ptr_factory_.GetWeakPtr(), | 
| + fetcher, | 
| 
Marc Treib
2015/09/11 14:54:25
Can you use base::Owned here? Then |fetcher| shoul
 
tache
2015/09/11 15:45:09
Done.
 | 
| + base::Passed(&j_callback)); | 
| + | 
| + fetcher->Start(callback); | 
| +} | 
| + | 
| +// static | 
| +bool InterestsService::Register(JNIEnv* env) { | 
| + return RegisterNativesImpl(env); | 
| +} | 
| + | 
| + | 
| +jobjectArray InterestsService::ConvertInterestsToJava( | 
| + const std::vector<InterestsFetcher::Interest>& interests) { | 
| + JNIEnv* env = AttachCurrentThread(); | 
| + jclass interest_class = env->FindClass(kInterestJavaClass); | 
| + | 
| + jobjectArray j_interests = | 
| + env->NewObjectArray(interests.size(), interest_class, 0); | 
| + | 
| + for (uint i = 0; i != interests.size(); i++) { | 
| 
Marc Treib
2015/09/11 14:54:25
nit: size_t
 
tache
2015/09/11 15:45:09
Done.
 | 
| + ScopedJavaLocalRef<jobject> j_interest = | 
| + Java_InterestsService_createInterest(env, | 
| + env->NewStringUTF(interests[i].name.c_str()), | 
| + env->NewStringUTF(interests[i].image_url.c_str()), | 
| + interests[i].relevance); | 
| + | 
| + env->SetObjectArrayElement(j_interests, i, j_interest.obj()); | 
| + } | 
| + | 
| + return j_interests; | 
| +} | 
| + | 
| +void InterestsService::OnObtainedInterests( | 
| + InterestsFetcher* fetcher, | 
| + scoped_ptr<ScopedJavaGlobalRef<jobject>> j_callback, | 
| + const std::vector<InterestsFetcher::Interest>& interests) { | 
| + JNIEnv* env = AttachCurrentThread(); | 
| + | 
| + jobjectArray j_interests = | 
| + InterestsService::ConvertInterestsToJava(interests); | 
| + | 
| + Java_GetInterestsCallback_onInterestsCallback( | 
| + env, j_callback->obj(), j_interests); | 
| + | 
| + base::MessageLoop::current()->DeleteSoon(FROM_HERE, fetcher); | 
| +} | 
| + | 
| +static jlong Init(JNIEnv* env, | 
| + const JavaParamRef<jobject>& jobj, | 
| + const JavaParamRef<jobject>& jprofile) { | 
| + InterestsService *interests_service = new InterestsService( | 
| + ProfileAndroid::FromProfileAndroid(jprofile)); | 
| + return reinterpret_cast<intptr_t>(interests_service); | 
| +} |