chromium/components/data_sharing/internal/android/java/src/org/chromium/components/data_sharing/DataSharingServiceImpl.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.UserDataHost;
import org.chromium.url.GURL;

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

    private final UserDataHost mUserDataHost = new UserDataHost();
    private final ObserverBridge mObserverBridge = new ObserverBridge();

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

    private DataSharingServiceImpl(long nativePtr) {
        mNativePtr = nativePtr;
    }

    @CalledByNative
    private ObserverBridge getObserverBridge() {
        return mObserverBridge;
    }

    @Override
    public void addObserver(Observer observer) {
        mObserverBridge.addObserver(observer);
    }

    @Override
    public void removeObserver(Observer observer) {
        mObserverBridge.removeObserver(observer);
    }

    @Override
    public void readAllGroups(Callback<GroupsDataSetOrFailureOutcome> callback) {
        DataSharingServiceImplJni.get().readAllGroups(mNativePtr, callback);
    }

    @Override
    public void readGroup(String groupId, Callback<GroupDataOrFailureOutcome> callback) {
        DataSharingServiceImplJni.get().readGroup(mNativePtr, groupId, callback);
    }

    @Override
    public void createGroup(String groupName, Callback<GroupDataOrFailureOutcome> callback) {
        DataSharingServiceImplJni.get().createGroup(mNativePtr, groupName, callback);
    }

    @Override
    public void deleteGroup(String groupId, Callback<Integer> callback) {
        DataSharingServiceImplJni.get().deleteGroup(mNativePtr, groupId, callback);
    }

    @Override
    public void inviteMember(String groupId, String inviteeEmail, Callback<Integer> callback) {
        DataSharingServiceImplJni.get().inviteMember(mNativePtr, groupId, inviteeEmail, callback);
    }

    @Override
    public void addMember(String groupId, String accessToken, Callback<Integer> callback) {
        DataSharingServiceImplJni.get().addMember(mNativePtr, groupId, accessToken, callback);
    }

    @Override
    public void removeMember(String groupId, String memberEmail, Callback<Integer> callback) {
        DataSharingServiceImplJni.get().removeMember(mNativePtr, groupId, memberEmail, callback);
    }

    @Override
    public boolean isEmptyService() {
        return DataSharingServiceImplJni.get().isEmptyService(mNativePtr, this);
    }

    @Override
    public DataSharingNetworkLoader getNetworkLoader() {
        return DataSharingServiceImplJni.get().getNetworkLoader(mNativePtr);
    }

    @Override
    public UserDataHost getUserDataHost() {
        return mUserDataHost;
    }

    @Override
    public GURL getDataSharingURL(GroupData groupData) {
        return DataSharingServiceImplJni.get()
                .getDataSharingURL(
                        mNativePtr, groupData.groupToken.groupId, groupData.groupToken.accessToken);
    }

    @Override
    public DataSharingService.ParseURLResult parseDataSharingURL(GURL url) {
        return DataSharingServiceImplJni.get().parseDataSharingURL(mNativePtr, url);
    }

    @Override
    public void ensureGroupVisibility(
            String groupId, Callback<GroupDataOrFailureOutcome> callback) {
        DataSharingServiceImplJni.get().ensureGroupVisibility(mNativePtr, groupId, callback);
    }

    @Override
    public void getSharedEntitiesPreview(
            GroupToken groupToken, Callback<SharedDataPreviewOrFailureOutcome> callback) {
        DataSharingServiceImplJni.get()
                .getSharedEntitiesPreview(
                        mNativePtr, groupToken.groupId, groupToken.accessToken, callback);
    }

    @Override
    public DataSharingUIDelegate getUIDelegate() {
        return DataSharingServiceImplJni.get().getUIDelegate(mNativePtr);
    }

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

    @NativeMethods
    interface Natives {
        void readAllGroups(
                long nativeDataSharingServiceAndroid,
                Callback<GroupsDataSetOrFailureOutcome> callback);

        void readGroup(
                long nativeDataSharingServiceAndroid,
                String groupId,
                Callback<GroupDataOrFailureOutcome> callback);

        void createGroup(
                long nativeDataSharingServiceAndroid,
                String groupName,
                Callback<GroupDataOrFailureOutcome> callback);

        void deleteGroup(
                long nativeDataSharingServiceAndroid, String groupId, Callback<Integer> callback);

        void inviteMember(
                long nativeDataSharingServiceAndroid,
                String groupId,
                String inviteeEmail,
                Callback<Integer> callback);

        void addMember(
                long nativeDataSharingServiceAndroid,
                String groupId,
                String accessToken,
                Callback<Integer> callback);

        void removeMember(
                long nativeDataSharingServiceAndroid,
                String groupId,
                String memberEmail,
                Callback<Integer> callback);

        boolean isEmptyService(long nativeDataSharingServiceAndroid, DataSharingServiceImpl caller);

        DataSharingNetworkLoader getNetworkLoader(long nativeDataSharingServiceAndroid);

        GURL getDataSharingURL(
                long nativeDataSharingServiceAndroid, String groupId, String accessToken);

        DataSharingService.ParseURLResult parseDataSharingURL(
                long nativeDataSharingServiceAndroid, GURL url);

        void ensureGroupVisibility(
                long nativeDataSharingServiceAndroid,
                String groupId,
                Callback<GroupDataOrFailureOutcome> callback);

        void getSharedEntitiesPreview(
                long nativeDataSharingServiceAndroid,
                String groupId,
                String accessToken,
                Callback<SharedDataPreviewOrFailureOutcome> callback);

        DataSharingUIDelegate getUIDelegate(long nativeDataSharingServiceAndroid);
    }
}