blob: c8ed0d5fde9526ce2fc01ea0b3836febdfd5d1f5 [file] [log] [blame]
// Copyright 2018 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/feed/feed_image_loader_bridge.h"
#include <jni.h>
#include <string>
#include <utility>
#include "base/android/callback_android.h"
#include "base/android/jni_string.h"
#include "base/bind.h"
#include "chrome/browser/android/feed/feed_host_service_factory.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/profiles/profile_android.h"
#include "components/feed/content/feed_host_service.h"
#include "components/feed/core/feed_image_manager.h"
#include "jni/FeedImageLoaderBridge_jni.h"
#include "ui/gfx/android/java_bitmap.h"
#include "ui/gfx/image/image.h"
using base::android::JavaParamRef;
using base::android::JavaRef;
using base::android::ScopedJavaGlobalRef;
using base::android::ScopedJavaLocalRef;
namespace feed {
static jlong JNI_FeedImageLoaderBridge_Init(
JNIEnv* env,
const JavaParamRef<jobject>& j_this,
const JavaParamRef<jobject>& j_profile) {
Profile* profile = ProfileAndroid::FromProfileAndroid(j_profile);
FeedHostService* host_service =
FeedHostServiceFactory::GetForBrowserContext(profile);
FeedImageManager* feed_image_manager = host_service->GetImageManager();
DCHECK(feed_image_manager);
FeedImageLoaderBridge* native_image_loader_bridge =
new FeedImageLoaderBridge(feed_image_manager);
return reinterpret_cast<intptr_t>(native_image_loader_bridge);
}
FeedImageLoaderBridge::FeedImageLoaderBridge(
FeedImageManager* feed_image_manager)
: feed_image_manager_(feed_image_manager), weak_ptr_factory_(this) {}
FeedImageLoaderBridge::~FeedImageLoaderBridge() = default;
void FeedImageLoaderBridge::Destroy(JNIEnv* env,
const JavaRef<jobject>& j_this) {
delete this;
}
void FeedImageLoaderBridge::FetchImage(JNIEnv* j_env,
const JavaRef<jobject>& j_this,
const JavaRef<jstring>& j_url,
const JavaRef<jobject>& j_callback) {
ScopedJavaGlobalRef<jobject> callback(j_callback);
std::string url = base::android::ConvertJavaStringToUTF8(j_url);
feed_image_manager_->FetchImage(
{std::move(url)},
base::BindOnce(&FeedImageLoaderBridge::OnImageFetched,
weak_ptr_factory_.GetWeakPtr(), callback));
}
void FeedImageLoaderBridge::OnImageFetched(
ScopedJavaGlobalRef<jobject> callback,
const gfx::Image& image,
size_t ignored) {
ScopedJavaLocalRef<jobject> j_bitmap;
if (!image.IsEmpty()) {
j_bitmap = gfx::ConvertToJavaBitmap(image.ToSkBitmap());
}
RunObjectCallbackAndroid(callback, j_bitmap);
}
} // namespace feed