OLD | NEW |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/android/ntp/ntp_snippets_bridge.h" | 5 #include "chrome/browser/android/ntp/ntp_snippets_bridge.h" |
6 | 6 |
7 #include <jni.h> | 7 #include <jni.h> |
8 | 8 |
9 #include "base/android/jni_android.h" | 9 #include "base/android/jni_android.h" |
10 #include "base/android/jni_array.h" | 10 #include "base/android/jni_array.h" |
11 #include "base/android/jni_string.h" | 11 #include "base/android/jni_string.h" |
12 #include "base/android/scoped_java_ref.h" | 12 #include "base/android/scoped_java_ref.h" |
13 #include "chrome/browser/ntp_snippets/ntp_snippets_service_factory.h" | 13 #include "chrome/browser/ntp_snippets/ntp_snippets_service_factory.h" |
14 #include "chrome/browser/profiles/profile.h" | 14 #include "chrome/browser/profiles/profile.h" |
15 #include "chrome/browser/profiles/profile_android.h" | 15 #include "chrome/browser/profiles/profile_android.h" |
16 #include "components/ntp_snippets/ntp_snippet.h" | 16 #include "components/ntp_snippets/ntp_snippet.h" |
17 #include "components/ntp_snippets/ntp_snippets_service.h" | 17 #include "components/ntp_snippets/ntp_snippets_service.h" |
18 #include "jni/SnippetsBridge_jni.h" | 18 #include "jni/SnippetsBridge_jni.h" |
19 | 19 |
20 using base::android::ConvertJavaStringToUTF8; | 20 using base::android::ConvertJavaStringToUTF8; |
21 using base::android::JavaParamRef; | 21 using base::android::JavaParamRef; |
22 using base::android::ToJavaArrayOfStrings; | 22 using base::android::ToJavaArrayOfStrings; |
23 using base::android::ToJavaLongArray; | 23 using base::android::ToJavaLongArray; |
24 using ntp_snippets::NTPSnippetsService; | |
25 using ntp_snippets::NTPSnippetsServiceObserver; | |
26 | 24 |
27 static jlong Init(JNIEnv* env, | 25 static jlong Init(JNIEnv* env, |
28 const JavaParamRef<jobject>& obj, | 26 const JavaParamRef<jobject>& obj, |
29 const JavaParamRef<jobject>& j_profile) { | 27 const JavaParamRef<jobject>& j_profile) { |
30 NTPSnippetsBridge* snippets_bridge = new NTPSnippetsBridge(env, j_profile); | 28 NTPSnippetsBridge* snippets_bridge = new NTPSnippetsBridge(env, j_profile); |
31 return reinterpret_cast<intptr_t>(snippets_bridge); | 29 return reinterpret_cast<intptr_t>(snippets_bridge); |
32 } | 30 } |
33 | 31 |
34 NTPSnippetsBridge::NTPSnippetsBridge(JNIEnv* env, | 32 NTPSnippetsBridge::NTPSnippetsBridge(JNIEnv* env, |
35 const JavaParamRef<jobject>& j_profile) | 33 const JavaParamRef<jobject>& j_profile) |
36 : snippet_service_observer_(this) { | 34 : snippet_service_observer_(this) { |
37 Profile* profile = ProfileAndroid::FromProfileAndroid(j_profile); | 35 Profile* profile = ProfileAndroid::FromProfileAndroid(j_profile); |
38 ntp_snippets_service_ = NTPSnippetsServiceFactory::GetForProfile(profile); | 36 ntp_snippets_service_ = NTPSnippetsServiceFactory::GetForProfile(profile); |
39 snippet_service_observer_.Add(ntp_snippets_service_); | |
40 } | 37 } |
41 | 38 |
42 void NTPSnippetsBridge::SetObserver(JNIEnv* env, | 39 void NTPSnippetsBridge::SetObserver(JNIEnv* env, |
43 const JavaParamRef<jobject>& obj, | 40 const JavaParamRef<jobject>& obj, |
44 const JavaParamRef<jobject>& j_observer) { | 41 const JavaParamRef<jobject>& j_observer) { |
45 observer_.Reset(env, j_observer); | 42 observer_.Reset(env, j_observer); |
46 NTPSnippetsServiceLoaded(ntp_snippets_service_); | 43 // This will call NTPSnippetsServiceLoaded. |
| 44 snippet_service_observer_.Add(ntp_snippets_service_); |
47 } | 45 } |
48 | 46 |
49 NTPSnippetsBridge::~NTPSnippetsBridge() {} | 47 NTPSnippetsBridge::~NTPSnippetsBridge() {} |
50 | 48 |
51 void NTPSnippetsBridge::Destroy(JNIEnv* env, const JavaParamRef<jobject>& obj) { | 49 void NTPSnippetsBridge::Destroy(JNIEnv* env, const JavaParamRef<jobject>& obj) { |
52 delete this; | 50 delete this; |
53 } | 51 } |
54 | 52 |
55 void NTPSnippetsBridge::DiscardSnippet(JNIEnv* env, | 53 void NTPSnippetsBridge::DiscardSnippet(JNIEnv* env, |
56 const JavaParamRef<jobject>& obj, | 54 const JavaParamRef<jobject>& obj, |
57 const JavaParamRef<jstring>& url) { | 55 const JavaParamRef<jstring>& url) { |
58 ntp_snippets_service_->DiscardSnippet( | 56 ntp_snippets_service_->DiscardSnippet( |
59 GURL(ConvertJavaStringToUTF8(env, url))); | 57 GURL(ConvertJavaStringToUTF8(env, url))); |
60 } | 58 } |
61 | 59 |
62 void NTPSnippetsBridge::NTPSnippetsServiceLoaded(NTPSnippetsService* service) { | 60 void NTPSnippetsBridge::NTPSnippetsServiceLoaded() { |
63 if (observer_.is_null()) | 61 DCHECK(!observer_.is_null()); |
64 return; | |
65 | 62 |
66 std::vector<std::string> titles; | 63 std::vector<std::string> titles; |
67 std::vector<std::string> urls; | 64 std::vector<std::string> urls; |
68 std::vector<std::string> thumbnail_urls; | 65 std::vector<std::string> thumbnail_urls; |
69 std::vector<std::string> snippets; | 66 std::vector<std::string> snippets; |
70 std::vector<int64_t> timestamps; | 67 std::vector<int64_t> timestamps; |
71 for (const ntp_snippets::NTPSnippet& snippet : *service) { | 68 for (const ntp_snippets::NTPSnippet& snippet : *ntp_snippets_service_) { |
72 titles.push_back(snippet.title()); | 69 titles.push_back(snippet.title()); |
73 urls.push_back(snippet.url().spec()); | 70 urls.push_back(snippet.url().spec()); |
74 thumbnail_urls.push_back(snippet.salient_image_url().spec()); | 71 thumbnail_urls.push_back(snippet.salient_image_url().spec()); |
75 snippets.push_back(snippet.snippet()); | 72 snippets.push_back(snippet.snippet()); |
76 timestamps.push_back(snippet.publish_date().ToJavaTime()); | 73 timestamps.push_back(snippet.publish_date().ToJavaTime()); |
77 } | 74 } |
78 | 75 |
79 JNIEnv* env = base::android::AttachCurrentThread(); | 76 JNIEnv* env = base::android::AttachCurrentThread(); |
80 Java_SnippetsBridge_onSnippetsAvailable( | 77 Java_SnippetsBridge_onSnippetsAvailable( |
81 env, observer_.obj(), ToJavaArrayOfStrings(env, titles).obj(), | 78 env, observer_.obj(), ToJavaArrayOfStrings(env, titles).obj(), |
82 ToJavaArrayOfStrings(env, urls).obj(), | 79 ToJavaArrayOfStrings(env, urls).obj(), |
83 ToJavaArrayOfStrings(env, thumbnail_urls).obj(), | 80 ToJavaArrayOfStrings(env, thumbnail_urls).obj(), |
84 ToJavaArrayOfStrings(env, snippets).obj(), | 81 ToJavaArrayOfStrings(env, snippets).obj(), |
85 ToJavaLongArray(env, timestamps).obj()); | 82 ToJavaLongArray(env, timestamps).obj()); |
86 } | 83 } |
87 | 84 |
88 void NTPSnippetsBridge::NTPSnippetsServiceShutdown( | 85 void NTPSnippetsBridge::NTPSnippetsServiceShutdown() { |
89 NTPSnippetsService* service) { | |
90 observer_.Reset(); | 86 observer_.Reset(); |
91 snippet_service_observer_.Remove(ntp_snippets_service_); | 87 snippet_service_observer_.Remove(ntp_snippets_service_); |
92 } | 88 } |
93 | 89 |
94 // static | 90 // static |
95 bool NTPSnippetsBridge::Register(JNIEnv* env) { | 91 bool NTPSnippetsBridge::Register(JNIEnv* env) { |
96 return RegisterNativesImpl(env); | 92 return RegisterNativesImpl(env); |
97 } | 93 } |
OLD | NEW |