chromium/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/FeedResourceFetcher.java

// Copyright 2023 The Chromium Authors
// 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 androidx.annotation.Nullable;

import org.jni_zero.CalledByNative;
import org.jni_zero.JNINamespace;

import org.chromium.base.task.PostTask;
import org.chromium.base.task.TaskTraits;
import org.chromium.chrome.browser.feed.FeedSurfaceScopeDependencyProviderImpl.NetworkResponse;
import org.chromium.chrome.browser.xsurface.feed.ResourceFetcher;
import org.chromium.chrome.browser.xsurface.feed.ResourceFetcher.Header;
import org.chromium.chrome.browser.xsurface.feed.ResourceFetcher.Request;
import org.chromium.chrome.browser.xsurface.feed.ResourceFetcher.Response;
import org.chromium.chrome.browser.xsurface.feed.ResourceFetcher.ResponseCallback;
import org.chromium.url.GURL;

import java.util.ArrayList;
import java.util.List;

/** Implementation of ResourceFetcher methods. */
public class FeedResourceFetcher implements ResourceFetcher {
    @JNINamespace("feed::android")
    public static class FeedResponse implements Response {
        private final @Nullable byte[] mRawData;
        private final boolean mSuccess;
        private final int mStatusCode;
        private final List<Header> mHeaders;

        public FeedResponse(
                boolean success, int statusCode, List<Header> headers, @Nullable byte[] rawData) {
            mSuccess = success;
            mStatusCode = statusCode;
            mHeaders = headers;
            mRawData = rawData;
        }

        @Override
        public boolean getSuccess() {
            return mSuccess;
        }

        @Override
        public int getStatusCode() {
            return mStatusCode;
        }

        @Override
        public List<Header> getHeaders() {
            return mHeaders;
        }

        @Override
        public @Nullable byte[] getRawData() {
            return mRawData;
        }

        @CalledByNative
        static FeedResponse create(
                boolean success, int statusCode, List<Header> headers, @Nullable byte[] rawData) {
            return new FeedResponse(success, statusCode, headers, rawData);
        }
    }

    public FeedResourceFetcher() {}

    @Override
    public void fetch(Request request, ResponseCallback responseCallback) {
        PostTask.postTask(
                TaskTraits.UI_DEFAULT,
                () -> {
                    List<String> headerNamesAndValues =
                            new ArrayList<String>(request.headers.size() * 2);
                    for (Header header : request.headers) {
                        headerNamesAndValues.add(header.name);
                        headerNamesAndValues.add(header.value);
                    }
                    FeedSurfaceScopeDependencyProviderImplJni.get()
                            .fetchResource(
                                    new GURL(request.uri),
                                    request.method,
                                    headerNamesAndValues.toArray(
                                            new String[headerNamesAndValues.size()]),
                                    request.postData,
                                    (NetworkResponse response) -> {
                                        responseCallback.onResponse(
                                                new FeedResponse(
                                                        response.success,
                                                        response.statusCode,
                                                        null,
                                                        response.rawData));
                                    });
                });
    }
}