| // Copyright 2020 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include <memory> |
| |
| #include "base/android/callback_android.h" |
| #include "base/android/jni_android.h" |
| #include "base/android/jni_array.h" |
| #include "chrome/browser/feed/feed_service_factory.h" |
| #include "chrome/browser/profiles/profile.h" |
| #include "chrome/browser/profiles/profile_manager.h" |
| #include "components/feed/core/v2/public/feed_api.h" |
| #include "components/feed/core/v2/public/feed_service.h" |
| #include "components/feed/core/v2/public/persistent_key_value_store.h" |
| |
| // Must come after all headers that specialize FromJniType() / ToJniType(). |
| #include "chrome/browser/feed/android/jni_headers/FeedPersistentKeyValueCache_jni.h" |
| |
| namespace feed { |
| namespace { |
| using base::android::JavaParamRef; |
| |
| std::string JavaByteArrayToString( |
| JNIEnv* env, |
| const base::android::JavaRef<jbyteArray>& byte_array) { |
| std::string result; |
| base::android::JavaByteArrayToString(env, byte_array, &result); |
| return result; |
| } |
| |
| void OnLookupFinished(JNIEnv* env, |
| base::android::ScopedJavaGlobalRef<jobject> callback, |
| PersistentKeyValueStore::Result result) { |
| base::android::ScopedJavaLocalRef<jbyteArray> j_result; |
| if (result.get_result) { |
| j_result = base::android::ToJavaByteArray(env, *result.get_result); |
| } |
| base::android::RunObjectCallbackAndroid(callback, j_result); |
| } |
| |
| void CallRunnable(base::android::ScopedJavaGlobalRef<jobject> runnable, |
| PersistentKeyValueStore::Result result) { |
| if (runnable) |
| base::android::RunRunnableAndroid(runnable); |
| } |
| |
| PersistentKeyValueStore* GetStore() { |
| Profile* profile = ProfileManager::GetLastUsedProfile(); |
| if (!profile) |
| return nullptr; |
| |
| FeedService* feed_service = FeedServiceFactory::GetForBrowserContext(profile); |
| if (!feed_service) |
| return nullptr; |
| |
| return &feed_service->GetStream()->GetPersistentKeyValueStore(); |
| } |
| |
| } // namespace |
| |
| void JNI_FeedPersistentKeyValueCache_Lookup( |
| JNIEnv* env, |
| const JavaParamRef<jbyteArray>& j_key, |
| const JavaParamRef<jobject>& j_response_callback) { |
| base::android::ScopedJavaGlobalRef<jobject> callback(j_response_callback); |
| |
| PersistentKeyValueStore* store = GetStore(); |
| if (!store) { |
| OnLookupFinished(env, std::move(callback), {}); |
| return; |
| } |
| return store->Get( |
| JavaByteArrayToString(env, j_key), |
| base::BindOnce(&OnLookupFinished, env, std::move(callback))); |
| } |
| |
| void JNI_FeedPersistentKeyValueCache_Put( |
| JNIEnv* env, |
| const JavaParamRef<jbyteArray>& j_key, |
| const JavaParamRef<jbyteArray>& j_value, |
| const JavaParamRef<jobject>& j_runnable) { |
| base::android::ScopedJavaGlobalRef<jobject> callback(j_runnable); |
| |
| PersistentKeyValueStore* store = GetStore(); |
| if (!store) { |
| base::android::RunRunnableAndroid(j_runnable); |
| return; |
| } |
| return store->Put( |
| JavaByteArrayToString(env, j_key), JavaByteArrayToString(env, j_value), |
| base::BindOnce(&CallRunnable, |
| base::android::ScopedJavaGlobalRef<jobject>(j_runnable))); |
| } |
| |
| void JNI_FeedPersistentKeyValueCache_Evict( |
| JNIEnv* env, |
| const JavaParamRef<jbyteArray>& j_key, |
| const JavaParamRef<jobject>& j_runnable) { |
| base::android::ScopedJavaGlobalRef<jobject> callback(j_runnable); |
| |
| PersistentKeyValueStore* store = GetStore(); |
| if (!store) { |
| base::android::RunRunnableAndroid(j_runnable); |
| return; |
| } |
| return store->Delete( |
| JavaByteArrayToString(env, j_key), |
| base::BindOnce(&CallRunnable, |
| base::android::ScopedJavaGlobalRef<jobject>(j_runnable))); |
| } |
| |
| } // namespace feed |