chromium/components/data_sharing/internal/android/java/src/org/chromium/components/data_sharing/DataSharingNetworkLoaderImpl.java

// Copyright 2024 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.components.data_sharing;

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

import org.chromium.base.Callback;
import org.chromium.base.ThreadUtils;
import org.chromium.net.NetworkTrafficAnnotationTag;
import org.chromium.url.GURL;

/**
 * Java side of the JNI bridge between DataSharingNetworkLoaderImpl in Java and C++. All method
 * calls are delegated to the native C++ class.
 */
@JNINamespace("data_sharing")
public class DataSharingNetworkLoaderImpl implements DataSharingNetworkLoader {
    private long mNativePtr;


    @CalledByNative
    private static DataSharingNetworkLoaderImpl create(long nativePtr) {
        return new DataSharingNetworkLoaderImpl(nativePtr);
    }

    DataSharingNetworkLoaderImpl(long nativePtr) {
        mNativePtr = nativePtr;
    }

    @CalledByNative
    private void clearNativePtr() {
        mNativePtr = 0;
    }

    @Override
    public void loadUrl(
            GURL url,
            String[] scopes,
            byte[] postData,
            @DataSharingRequestType int requestType,
            Callback<DataSharingNetworkResult> callback) {
        ThreadUtils.postOnUiThread(
                () -> {
                    loadUrlOnUiThread(
                            url,
                            scopes,
                            postData,
                            DataSharingNetworkUtils.getNetworkTrafficAnnotationTag(requestType),
                            callback);
                });
    }

    private void loadUrlOnUiThread(
            GURL url,
            String[] scopes,
            byte[] postData,
            NetworkTrafficAnnotationTag networkAnnotationTag,
            Callback<DataSharingNetworkResult> callback) {
        if (mNativePtr != 0) {
            DataSharingNetworkLoaderImplJni.get()
                    .loadUrl(
                            mNativePtr,
                            url,
                            scopes,
                            postData,
                            networkAnnotationTag.getHashCode(),
                            callback);
        }
    }

    @NativeMethods
    interface Natives {
        void loadUrl(
                long nativeDataSharingNetworkLoaderAndroid,
                GURL url,
                String[] scopes,
                byte[] postData,
                int annotationHashCode,
                Callback<DataSharingNetworkResult> callback);
    }
}