Commit 441931f2 authored by Sky Malice's avatar Sky Malice Committed by Commit Bot

[Feed] Create FeedNetworkBridge implementing NetworkClient.

Bug: 838609
Change-Id: I990017ba66d3be60d86204b7e216999caaf2c25b
Reviewed-on: https://chromium-review.googlesource.com/1041071
Commit-Queue: Sky Malice <skym@chromium.org>
Reviewed-by: default avatarTheresa <twellington@chromium.org>
Reviewed-by: default avatarPatrick Noland <pnoland@chromium.org>
Cr-Commit-Position: refs/heads/master@{#555865}
parent 1f7bb9fa
// 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.
package org.chromium.chrome.browser.feed;
import com.google.android.libraries.feed.common.functional.Consumer;
import com.google.android.libraries.feed.host.network.HttpRequest;
import com.google.android.libraries.feed.host.network.HttpResponse;
import com.google.android.libraries.feed.host.network.NetworkClient;
import org.chromium.base.Callback;
import org.chromium.base.annotations.CalledByNative;
import org.chromium.base.annotations.JNINamespace;
import org.chromium.chrome.browser.profiles.Profile;
/**
* Provides access to native implementations of NetworkClient.
*/
@JNINamespace("feed")
public class FeedNetworkBridge implements NetworkClient {
private long mNativeBridge;
/**
* Creates a FeedNetworkBridge for accessing native network implementation for the current
* user.
*
* @param profile Profile of the user we are rendering the Feed for.
*/
public FeedNetworkBridge(Profile profile) {
mNativeBridge = nativeInit(profile);
}
/*
* Cleans up native half of this bridge.
*/
public void destroy() {
assert mNativeBridge != 0;
nativeDestroy(mNativeBridge);
mNativeBridge = 0;
}
@Override
public void send(HttpRequest request, Consumer<HttpResponse> responseConsumer) {
assert mNativeBridge != 0;
nativeSendNetworkRequest(mNativeBridge, request.getUri().toString(), request.getMethod(),
request.getBody(), result -> responseConsumer.accept(result));
}
@Override
public void close() {}
@CalledByNative
private static HttpResponse createHttpResponse(int code, byte[] body) {
return new HttpResponse(code, body);
}
private native long nativeInit(Profile profile);
private native void nativeDestroy(long nativeFeedNetworkBridge);
private native void nativeSendNetworkRequest(long nativeFeedNetworkBridge, String url,
String requestType, byte[] body, Callback<HttpResponse> resultCallback);
}
......@@ -9,6 +9,7 @@ if (enable_feed_in_chrome) {
feed_deps = [ "//third_party/feed:feed_lib_java" ]
feed_java_sources = [
"//chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedNetworkBridge.java",
"//chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedNewTabPage.java",
"//chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/action/FeedActionHandler.java",
]
......
......@@ -4197,6 +4197,8 @@ jumbo_split_static_library("browser") {
sources += [
"android/feed/feed_host_service_factory.cc",
"android/feed/feed_host_service_factory.h",
"android/feed/feed_network_bridge.cc",
"android/feed/feed_network_bridge.h",
]
deps += [ "//components/feed/core:feed_core" ]
}
......@@ -4447,6 +4449,11 @@ if (is_android) {
if (enable_offline_pages_harness) {
sources += [ "../android/java/src/org/chromium/chrome/browser/offlinepages/evaluation/OfflinePageEvaluationBridge.java" ]
}
if (enable_feed_in_chrome) {
sources += [ "../android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedNetworkBridge.java" ]
}
jni_package = "chrome"
}
......
// 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_network_bridge.h"
#include <jni.h>
#include <utility>
#include <vector>
#include "base/android/callback_android.h"
#include "base/android/jni_android.h"
#include "base/android/jni_array.h"
#include "base/android/jni_string.h"
#include "base/bind.h"
#include "base/memory/ptr_util.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/core/feed_host_service.h"
#include "components/feed/core/feed_networking_host.h"
#include "jni/FeedNetworkBridge_jni.h"
using base::android::ConvertJavaStringToUTF8;
using base::android::JavaParamRef;
using base::android::ScopedJavaLocalRef;
using base::android::ScopedJavaGlobalRef;
namespace feed {
namespace {
void OnResult(const ScopedJavaGlobalRef<jobject>& j_callback,
int32_t http_code,
std::vector<uint8_t> response_bytes) {
JNIEnv* env = base::android::AttachCurrentThread();
ScopedJavaLocalRef<jbyteArray> j_response_bytes =
base::android::ToJavaByteArray(env, response_bytes);
ScopedJavaLocalRef<jobject> j_http_response =
Java_FeedNetworkBridge_createHttpResponse(env, http_code,
j_response_bytes);
base::android::RunCallbackAndroid(j_callback, j_http_response);
}
} // namespace
FeedNetworkBridge::FeedNetworkBridge(const JavaParamRef<jobject>& j_profile) {
Profile* profile = ProfileAndroid::FromProfileAndroid(j_profile);
FeedHostService* host_service =
FeedHostServiceFactory::GetForBrowserContext(profile);
networking_host_ = host_service->GetNetworkingHost();
DCHECK(networking_host_);
}
static jlong JNI_FeedNetworkBridge_Init(
JNIEnv* env,
const JavaParamRef<jobject>& j_this,
const JavaParamRef<jobject>& j_profile) {
return reinterpret_cast<intptr_t>(new FeedNetworkBridge(j_profile));
}
void FeedNetworkBridge::Destroy(JNIEnv* env,
const JavaParamRef<jobject>& j_this) {
delete this;
}
void FeedNetworkBridge::SendNetworkRequest(
JNIEnv* env,
const JavaParamRef<jobject>& j_this,
const JavaParamRef<jstring>& j_url,
const JavaParamRef<jstring>& j_request_type,
const JavaParamRef<jbyteArray>& j_body,
const JavaParamRef<jobject>& j_callback) {
auto url = GURL(ConvertJavaStringToUTF8(env, j_url));
FeedNetworkingHost::ResponseCallback callback =
base::BindOnce(&OnResult, ScopedJavaGlobalRef<jobject>(env, j_callback));
std::vector<uint8_t> request_body;
base::android::JavaByteArrayToByteVector(env, j_body.obj(), &request_body);
networking_host_->Send(url, ConvertJavaStringToUTF8(env, j_request_type),
std::move(request_body), std::move(callback));
}
} // namespace feed
// 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.
#ifndef CHROME_BROWSER_ANDROID_FEED_FEED_NETWORK_BRIDGE_H_
#define CHROME_BROWSER_ANDROID_FEED_FEED_NETWORK_BRIDGE_H_
#include "base/android/scoped_java_ref.h"
namespace feed {
class FeedNetworkingHost;
// Native counterpart of FeedNetworkBridge.java. Holds non-owning pointers to
// native implementation, to which operations are delegated. Results are passed
// back by a single argument callback so base::android::RunCallbackAndroid() can
// be used. This bridge is instantiated, owned, and destroyed from Java.
class FeedNetworkBridge {
public:
explicit FeedNetworkBridge(
const base::android::JavaParamRef<jobject>& j_profile);
void Destroy(JNIEnv* env, const base::android::JavaParamRef<jobject>& j_this);
void SendNetworkRequest(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& j_this,
const base::android::JavaParamRef<jstring>& j_url,
const base::android::JavaParamRef<jstring>& j_request_type,
const base::android::JavaParamRef<jbyteArray>& j_body,
const base::android::JavaParamRef<jobject>& j_callback);
private:
FeedNetworkingHost* networking_host_;
DISALLOW_COPY_AND_ASSIGN(FeedNetworkBridge);
};
} // namespace feed
#endif // CHROME_BROWSER_ANDROID_FEED_FEED_NETWORK_BRIDGE_H_
......@@ -16,11 +16,11 @@ FeedHostService::FeedHostService(
FeedHostService::~FeedHostService() = default;
FeedImageManager* FeedHostService::GetFeedImageManager() {
FeedImageManager* FeedHostService::GetImageManager() {
return image_manager_.get();
}
FeedNetworkingHost* FeedHostService::GetFeedNetworkingHost() {
FeedNetworkingHost* FeedHostService::GetNetworkingHost() {
return networking_host_.get();
}
......
......@@ -25,8 +25,8 @@ class FeedHostService : public KeyedService {
std::unique_ptr<FeedNetworkingHost> networking_host);
~FeedHostService() override;
FeedImageManager* GetFeedImageManager();
FeedNetworkingHost* GetFeedNetworkingHost();
FeedImageManager* GetImageManager();
FeedNetworkingHost* GetNetworkingHost();
private:
std::unique_ptr<FeedImageManager> image_manager_;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment