blob: 146c81663f6632c257167320c5fec1db797b264f [file] [log] [blame]
// 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_AUTOFILL_ASSISTANT_CLIENT_ANDROID_H_
#define CHROME_BROWSER_ANDROID_AUTOFILL_ASSISTANT_CLIENT_ANDROID_H_
#include <memory>
#include <string>
#include "base/android/scoped_java_ref.h"
#include "base/memory/raw_ptr.h"
#include "base/memory/weak_ptr.h"
#include "chrome/browser/android/autofill_assistant/dependencies.h"
#include "chrome/browser/android/autofill_assistant/ui_controller_android.h"
#include "components/autofill_assistant/browser/client.h"
#include "components/autofill_assistant/browser/controller.h"
#include "components/autofill_assistant/browser/device_context.h"
#include "components/autofill_assistant/browser/service.pb.h"
#include "components/autofill_assistant/browser/service/access_token_fetcher.h"
#include "components/autofill_assistant/browser/service/service.h"
#include "components/autofill_assistant/browser/website_login_manager.h"
#include "content/public/browser/web_contents.h"
#include "content/public/browser/web_contents_user_data.h"
#include "third_party/abseil-cpp/absl/types/optional.h"
#include "url/gurl.h"
namespace password_manager {
class PasswordChangeSuccessTracker;
}
namespace autofill_assistant {
// Creates a Autofill Assistant client associated with a WebContents.
//
// To obtain an instance of this class from the C++ side, call
// ClientAndroid::FromWebContents(web_contents). To make sure an instance
// exists, call ClientAndroid::CreateForWebContents first.
//
// From the Java side, call AutofillAssistantClient.fromWebContents.
//
// This class is accessible from the Java side through AutofillAssistantClient.
class ClientAndroid : public Client,
public AccessTokenFetcher,
public content::WebContentsUserData<ClientAndroid> {
public:
ClientAndroid(const ClientAndroid&) = delete;
ClientAndroid& operator=(const ClientAndroid&) = delete;
~ClientAndroid() override;
base::WeakPtr<ClientAndroid> GetWeakPtr();
// Returns the corresponding Java AutofillAssistantClient.
base::android::ScopedJavaLocalRef<jobject> GetJavaObject();
// Returns whether a flow is currently running.
bool IsRunning() const;
// Returns whether UI is currently being displayed to the user.
bool IsVisible() const;
bool Start(const GURL& url,
std::unique_ptr<TriggerContext> trigger_context,
std::unique_ptr<Service> test_service_to_inject,
const base::android::JavaRef<jobject>& joverlay_coordinator,
const absl::optional<TriggerScriptProto>& trigger_script);
void OnJavaDestroyUI(JNIEnv* env,
const base::android::JavaParamRef<jobject>& jcaller);
void TransferUITo(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& jcaller,
const base::android::JavaParamRef<jobject>& jother_web_contents);
base::android::ScopedJavaLocalRef<jstring> GetPrimaryAccountName(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& jcaller);
void OnAccessToken(JNIEnv* env,
const base::android::JavaParamRef<jobject>& jcaller,
jboolean success,
const base::android::JavaParamRef<jstring>& access_token);
void OnPaymentsClientToken(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& jcaller,
const base::android::JavaParamRef<jbyteArray>& jclient_token);
void FetchWebsiteActions(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& jcaller,
const base::android::JavaParamRef<jstring>& jexperiment_ids,
const base::android::JavaParamRef<jobjectArray>& jargument_names,
const base::android::JavaParamRef<jobjectArray>& jargument_values,
const base::android::JavaParamRef<jobject>& jcallback);
bool HasRunFirstCheck(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& jcaller) const;
base::android::ScopedJavaLocalRef<jobjectArray> GetDirectActions(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& jcaller);
bool PerformDirectAction(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& jcaller,
const base::android::JavaParamRef<jstring>& jaction_id,
const base::android::JavaParamRef<jstring>& jexperiment_ids,
const base::android::JavaParamRef<jobjectArray>& jargument_names,
const base::android::JavaParamRef<jobjectArray>& jargument_values,
const base::android::JavaParamRef<jobject>& joverlay_coordinator);
void ShowFatalError(JNIEnv* env,
const base::android::JavaParamRef<jobject>& jcaller);
void OnSpokenFeedbackAccessibilityServiceChanged(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& jcaller,
jboolean enabled);
base::android::ScopedJavaGlobalRef<jobject> GetDependencies(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& jcaller);
std::string GetDebugContext();
// Overrides Client
void AttachUI() override;
void DestroyUI() override;
version_info::Channel GetChannel() const override;
std::string GetEmailAddressForAccessTokenAccount() const override;
std::string GetChromeSignedInEmailAddress() const override;
absl::optional<std::pair<int, int>> GetWindowSize() const override;
ClientContextProto::ScreenOrientation GetScreenOrientation() const override;
void FetchPaymentsClientToken(
base::OnceCallback<void(const std::string&)> callback) override;
AccessTokenFetcher* GetAccessTokenFetcher() override;
autofill::PersonalDataManager* GetPersonalDataManager() const override;
WebsiteLoginManager* GetWebsiteLoginManager() const override;
password_manager::PasswordChangeSuccessTracker*
GetPasswordChangeSuccessTracker() const override;
std::string GetLocale() const override;
std::string GetCountryCode() const override;
DeviceContext GetDeviceContext() const override;
bool IsAccessibilityEnabled() const override;
bool IsSpokenFeedbackAccessibilityServiceEnabled() const override;
content::WebContents* GetWebContents() const override;
void Shutdown(Metrics::DropOutReason reason) override;
void RecordDropOut(Metrics::DropOutReason reason) override;
bool HasHadUI() const override;
ScriptExecutorUiDelegate* GetScriptExecutorUiDelegate() override;
// Overrides AccessTokenFetcher
void FetchAccessToken(
base::OnceCallback<void(bool, const std::string&)>) override;
void InvalidateAccessToken(const std::string& access_token) override;
private:
friend class content::WebContentsUserData<ClientAndroid>;
explicit ClientAndroid(
content::WebContents* web_contents,
const base::android::ScopedJavaGlobalRef<jobject>& jdependencies);
void CreateController(
std::unique_ptr<Service> service,
const absl::optional<TriggerScriptProto>& trigger_script);
void DestroyController();
void AttachUI(const base::android::JavaRef<jobject>& joverlay_coordinator);
bool NeedsUI();
void OnFetchWebsiteActions(const base::android::JavaRef<jobject>& jcallback);
void SafeDestroyControllerAndUI(Metrics::DropOutReason reason);
base::android::ScopedJavaLocalRef<jobjectArray>
GetDirectActionsAsJavaArrayOfStrings(JNIEnv* env) const;
base::android::ScopedJavaLocalRef<jobject>
ToJavaAutofillAssistantDirectAction(JNIEnv* env,
const DirectAction& direct_action) const;
// Returns the index of a direct action with that name, to pass to
// UiDelegate::PerformUserAction() or -1 if not found.
int FindDirectAction(const std::string& action_name);
WEB_CONTENTS_USER_DATA_KEY_DECL();
// Contains AssistantStaticDependencies which do not change.
const std::unique_ptr<const Dependencies> dependencies_;
// Can change based on activity attachment.
const base::android::ScopedJavaGlobalRef<jobject> jdependencies_;
base::android::ScopedJavaGlobalRef<jobject> java_object_;
std::unique_ptr<Controller> controller_;
std::unique_ptr<UiController> ui_controller_;
mutable std::unique_ptr<WebsiteLoginManager> website_login_manager_;
// True if Start() was called. This turns on the tracking of dropouts.
bool started_ = false;
// Intent parameter used for tracking dropouts per intent.
// TODO(b/182164683) Do not store intent paramenter in |ClientAndroid|.
std::string intent_;
// True if the UI was ever attached.
bool has_had_ui_ = false;
std::unique_ptr<UiControllerAndroid> ui_controller_android_;
base::OnceCallback<void(bool, const std::string&)>
fetch_access_token_callback_;
base::OnceCallback<void(const std::string&)>
fetch_payments_client_token_callback_;
base::WeakPtrFactory<ClientAndroid> weak_ptr_factory_{this};
};
} // namespace autofill_assistant.
#endif // CHROME_BROWSER_ANDROID_AUTOFILL_ASSISTANT_CLIENT_ANDROID_H_