[Suggestions] Bring the Suggestions Service to the Android NTP.

BUG=348098

Review URL: https://codereview.chromium.org/182683003

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@254834 0039d316-1c4b-4281-b951-d872f2087c98
diff --git a/chrome/browser/android/most_visited_sites.cc b/chrome/browser/android/most_visited_sites.cc
index 5016cb4..cf20d4b 100644
--- a/chrome/browser/android/most_visited_sites.cc
+++ b/chrome/browser/android/most_visited_sites.cc
@@ -8,11 +8,15 @@
 #include "base/android/jni_array.h"
 #include "base/android/jni_string.h"
 #include "base/android/scoped_java_ref.h"
+#include "base/strings/utf_string_conversions.h"
 #include "chrome/browser/chrome_notification_types.h"
 #include "chrome/browser/history/history_types.h"
 #include "chrome/browser/history/top_sites.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/profiles/profile_android.h"
+#include "chrome/browser/search/suggestions/proto/suggestions.pb.h"
+#include "chrome/browser/search/suggestions/suggestions_service.h"
+#include "chrome/browser/search/suggestions/suggestions_service_factory.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/notification_source.h"
 #include "jni/MostVisitedSites_jni.h"
@@ -28,6 +32,10 @@
 using base::android::CheckException;
 using content::BrowserThread;
 using history::TopSites;
+using suggestions::ChromeSuggestion;
+using suggestions::SuggestionsProfile;
+using suggestions::SuggestionsService;
+using suggestions::SuggestionsServiceFactory;
 
 namespace {
 
@@ -115,7 +123,7 @@
 }  // namespace
 
 MostVisitedSites::MostVisitedSites(Profile* profile)
-    : profile_(profile), num_sites_(0) {
+    : profile_(profile), num_sites_(0), weak_ptr_factory_(this) {
 }
 
 MostVisitedSites::~MostVisitedSites() {
@@ -191,6 +199,23 @@
 }
 
 void MostVisitedSites::QueryMostVisitedURLs() {
+  SuggestionsServiceFactory* suggestions_service_factory =
+      SuggestionsServiceFactory::GetInstance();
+  SuggestionsService* suggestions_service =
+      suggestions_service_factory->GetForProfile(profile_);
+  if (suggestions_service) {
+    // Suggestions service is enabled, initiate a query.
+    suggestions_service->FetchSuggestionsData(
+        base::Bind(
+          &MostVisitedSites::OnSuggestionsProfileAvailable,
+          weak_ptr_factory_.GetWeakPtr(),
+          base::Owned(new ScopedJavaGlobalRef<jobject>(observer_))));
+  } else {
+    InitiateTopSitesQuery();
+  }
+}
+
+void MostVisitedSites::InitiateTopSitesQuery() {
   TopSites* top_sites = profile_->GetTopSites();
   if (!top_sites)
     return;
@@ -203,6 +228,32 @@
       false);
 }
 
+void MostVisitedSites::OnSuggestionsProfileAvailable(
+    ScopedJavaGlobalRef<jobject>* j_observer,
+    const SuggestionsProfile& suggestions_profile) {
+  size_t size = suggestions_profile.suggestions_size();
+  if (size == 0) {
+    // No suggestions data available, initiate Top Sites query.
+    InitiateTopSitesQuery();
+    return;
+  }
+
+  std::vector<base::string16> titles;
+  std::vector<std::string> urls;
+  for (size_t i = 0; i < size; ++i) {
+    const ChromeSuggestion& suggestion = suggestions_profile.suggestions(i);
+    titles.push_back(base::UTF8ToUTF16(suggestion.title()));
+    urls.push_back(suggestion.url());
+  }
+
+  JNIEnv* env = AttachCurrentThread();
+  Java_MostVisitedURLsObserver_onMostVisitedURLsAvailable(
+      env,
+      j_observer->obj(),
+      ToJavaArrayOfStrings(env, titles).obj(),
+      ToJavaArrayOfStrings(env, urls).obj());
+}
+
 static jlong Init(JNIEnv* env, jobject obj, jobject jprofile) {
   MostVisitedSites* most_visited_sites =
       new MostVisitedSites(ProfileAndroid::FromProfileAndroid(jprofile));