blob: 545767b0438b1696365a2f875042746a8f8b76a8 [file]
// Copyright 2025 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_WEBID_IDENTITY_PROVIDER_SERVICE_H_
#define CHROME_BROWSER_WEBID_IDENTITY_PROVIDER_SERVICE_H_
#include <string>
#include "base/android/scoped_java_ref.h"
#include "base/functional/callback.h"
namespace content::webid {
// A C++ class to connect to Android apps through bound services.
// https://developer.android.com/develop/background-work/services/bound-services
//
// BoundServices are used to connect to an Identity Provider (IdP) app
// installed on the device to fetch identity information for FedCM.
//
// The browser uses an intent filter signature to discover the bound service
// exposed by the IdP app.
//
// https://developer.android.com/training/package-visibility/declaring#intent-filter-signature
//
// The IdP app is required to implement a bound service that responds to
// the "org.w3.FedCM" action in an intent filter and expose the service in
// their AndroidManifest.xml.
//
// For example:
//
// <service android:name=".FedCMService" android:exported="true">
// <intent-filter>
// <action android:name="org.w3.FedCM" />
// </intent-filter>
// </service>
//
class IdentityProviderService {
public:
IdentityProviderService();
~IdentityProviderService();
IdentityProviderService(const IdentityProviderService&) = delete;
IdentityProviderService& operator=(const IdentityProviderService&) = delete;
// Fetches data asynchronously. `callback` is called when the data is fetched.
void Fetch(
base::OnceCallback<void(const std::optional<std::string>&)> callback);
// Connects to the service asynchronously. `callback` is called when the
// service is connected.
void Connect(const std::string& package_name,
const std::string& service_name,
base::OnceCallback<void(bool)> callback);
// Disconnects from the service. `callback` is called when the service is
// disconnected.
void Disconnect(base::OnceCallback<void()> callback);
// These callbacks need to be public as they are called from Java through JNI.
void OnDataFetched(JNIEnv* env, std::optional<std::string> data);
void OnConnected(JNIEnv* env, bool success);
void OnDisconnected(JNIEnv* env);
private:
base::android::ScopedJavaGlobalRef<jobject> java_obj_;
base::OnceCallback<void(const std::optional<std::string>&)> callback_;
base::OnceCallback<void(bool)> connect_callback_;
base::OnceCallback<void()> disconnect_callback_;
};
} // namespace content::webid
#endif // CHROME_BROWSER_WEBID_IDENTITY_PROVIDER_SERVICE_H_