|  | // 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 |