Commit 1ee97f3a authored by gogerald's avatar gogerald Committed by Commit Bot

[Autofill Assistant] Introduce Autofill Assistant in src/chrome

Bug: 806868
Change-Id: I9290cc5830308134e14b23be0d87eb5b11dd0d6e
Reviewed-on: https://chromium-review.googlesource.com/1156480
Commit-Queue: Ganggui Tang <gogerald@chromium.org>
Reviewed-by: default avatarTed Choc <tedchoc@chromium.org>
Reviewed-by: default avatarBenoit L <lizeb@chromium.org>
Cr-Commit-Position: refs/heads/master@{#581010}
parent dd32a2ee
......@@ -153,6 +153,7 @@ public abstract class ChromeFeatureList {
public static final String ANDROID_PAY_INTEGRATION_V2 = "AndroidPayIntegrationV2";
public static final String ANDROID_PAYMENT_APPS = "AndroidPaymentApps";
public static final String APP_NOTIFICATION_STATUS_MESSAGING = "AppNotificationStatusMessaging";
public static final String AUTOFILL_ASSISTANT = "AutofillAssistant";
public static final String AUTOFILL_KEYBOARD_ACCESSORY = "AutofillKeyboardAccessory";
public static final String AUTOFILL_SCAN_CARDHOLDER_NAME = "AutofillScanCardholderName";
public static final String CAF_MEDIA_ROUTER_IMPL = "CafMediaRouterImpl";
......
// 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.
package org.chromium.chrome.browser.autofill_assistant;
import org.chromium.base.annotations.CalledByNative;
import org.chromium.base.annotations.JNINamespace;
import org.chromium.chrome.browser.customtabs.CustomTabActivity;
import org.chromium.chrome.browser.tab.EmptyTabObserver;
import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.browser.tabmodel.EmptyTabModelObserver;
import org.chromium.chrome.browser.tabmodel.TabModel;
import org.chromium.chrome.browser.tabmodel.TabModel.TabSelectionType;
import org.chromium.content_public.browser.WebContents;
/**
* Bridge to native side AssistantUiControllerAndroid. It allows native side to control Autofill
* Assistant related UIs and forward UI events to native side.
*/
@JNINamespace("autofill_assistant")
public class AssistantUiController {
private final long mAssistantUiControllerAndroid;
/**
* Construct Autofill Assistant UI controller.
*
* @param activity The CustomTabActivity of the controller associated with.
*/
public AssistantUiController(CustomTabActivity activity) {
// TODO(crbug.com/806868): Implement corresponding UI.
Tab activityTab = activity.getActivityTab();
mAssistantUiControllerAndroid = nativeInit(activityTab.getWebContents());
// Stop Autofill Assistant when the tab is detached from the activity.
activityTab.addObserver(new EmptyTabObserver() {
@Override
public void onActivityAttachmentChanged(Tab tab, boolean isAttached) {
if (!isAttached) {
activityTab.removeObserver(this);
nativeDestroy(mAssistantUiControllerAndroid);
}
}
});
// Stop Autofill Assistant when the selected tab (foreground tab) is changed.
TabModel currentTabModel = activity.getTabModelSelector().getCurrentModel();
currentTabModel.addObserver(new EmptyTabModelObserver() {
@Override
public void didSelectTab(Tab tab, @TabSelectionType int type, int lastId) {
currentTabModel.removeObserver(this);
// Assume newly selected tab is always different from the last one.
nativeDestroy(mAssistantUiControllerAndroid);
// TODO(crbug.com/806868): May start a new Autofill Assistant instance for the newly
// selected Tab.
}
});
}
@CalledByNative
private void onShowStatusMessage(String message) {
// TODO(crbug.com/806868): Implement corresponding UI.
}
@CalledByNative
private void onShowOverlay() {
// TODO(crbug.com/806868): Implement corresponding UI.
}
@CalledByNative
private void onHideOverlay() {
// TODO(crbug.com/806868): Implement corresponding UI.
}
// native methods.
private native long nativeInit(WebContents webContents);
private native void nativeDestroy(long nativeAssistantUiControllerAndroid);
}
\ No newline at end of file
file://components/autofill_assistant/OWNERS
\ No newline at end of file
......@@ -54,6 +54,7 @@ import org.chromium.chrome.browser.UrlConstants;
import org.chromium.chrome.browser.WarmupManager;
import org.chromium.chrome.browser.WebContentsFactory;
import org.chromium.chrome.browser.appmenu.AppMenuPropertiesDelegate;
import org.chromium.chrome.browser.autofill_assistant.AssistantUiController;
import org.chromium.chrome.browser.browserservices.BrowserSessionContentHandler;
import org.chromium.chrome.browser.browserservices.BrowserSessionContentUtils;
import org.chromium.chrome.browser.compositor.layouts.LayoutManager;
......@@ -171,6 +172,8 @@ public class CustomTabActivity extends ChromeActivity {
private WebappCustomTabTimeSpentLogger mWebappTimeSpentLogger;
private AssistantUiController mAutofillAssistantUiController;
@Nullable
private ModuleEntryPoint mModuleEntryPoint;
@Nullable
......@@ -597,6 +600,14 @@ public class CustomTabActivity extends ChromeActivity {
getIntent().getIntExtra(ServiceTabLauncher.LAUNCH_REQUEST_ID_EXTRA, 0),
getActivityTab().getWebContents());
}
// TODO(crbug.com/806868): Only enable Autofill Assistant when the flag is enabled in the
// intent.
if (mAutofillAssistantUiController == null
&& ChromeFeatureList.isEnabled(ChromeFeatureList.AUTOFILL_ASSISTANT)) {
mAutofillAssistantUiController = new AssistantUiController(this);
}
super.finishNativeInitialization();
}
......
......@@ -117,6 +117,7 @@ chrome_java_sources = [
"java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/PasswordAccessoryBridge.java",
"java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/PasswordAccessorySheetCoordinator.java",
"java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/PasswordAccessorySheetViewBinder.java",
"java/src/org/chromium/chrome/browser/autofill_assistant/AssistantUiController.java",
"java/src/org/chromium/chrome/browser/background_task_scheduler/NativeBackgroundTask.java",
"java/src/org/chromium/chrome/browser/banners/AppBannerManager.java",
"java/src/org/chromium/chrome/browser/banners/AppBannerUiDelegateAndroid.java",
......
......@@ -1940,6 +1940,8 @@ jumbo_split_static_library("browser") {
"android/android_theme_resources.h",
"android/app_hooks.cc",
"android/app_hooks.h",
"android/autofill_assistant/assistant_ui_controller_android.cc",
"android/autofill_assistant/assistant_ui_controller_android.h",
"android/background_sync_launcher_android.cc",
"android/background_sync_launcher_android.h",
"android/background_tab_manager.cc",
......@@ -4398,6 +4400,7 @@ if (is_android) {
"../android/java/src/org/chromium/chrome/browser/autofill/PersonalDataManager.java",
"../android/java/src/org/chromium/chrome/browser/autofill/PhoneNumberUtil.java",
"../android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/PasswordAccessoryBridge.java",
"../android/java/src/org/chromium/chrome/browser/autofill_assistant/AssistantUiController.java",
"../android/java/src/org/chromium/chrome/browser/banners/AppBannerManager.java",
"../android/java/src/org/chromium/chrome/browser/banners/AppBannerUiDelegateAndroid.java",
"../android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkBridge.java",
......
file://components/autofill_assistant/OWNERS
\ No newline at end of file
// 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.
#include "chrome/browser/android/autofill_assistant/assistant_ui_controller_android.h"
#include "base/android/jni_android.h"
#include "base/android/jni_string.h"
#include "components/autofill_assistant/browser/assistant_controller.h"
#include "content/public/browser/web_contents.h"
#include "jni/AssistantUiController_jni.h"
using base::android::AttachCurrentThread;
using base::android::JavaParamRef;
namespace autofill_assistant {
AssistantUiControllerAndroid::AssistantUiControllerAndroid(
JNIEnv* env,
jobject jcaller,
const JavaParamRef<jobject>& webContents)
: ui_delegate_(nullptr) {
java_assistant_ui_controller_.Reset(env, jcaller);
content::WebContents* web_contents =
content::WebContents::FromJavaWebContents(webContents);
DCHECK(web_contents);
AssistantController::CreateAndStartForWebContents(
web_contents, std::unique_ptr<AssistantUiController>(this));
DCHECK(ui_delegate_);
}
AssistantUiControllerAndroid::~AssistantUiControllerAndroid() {}
void AssistantUiControllerAndroid::SetUiDelegate(
AssistantUiDelegate* ui_delegate) {
ui_delegate_ = ui_delegate;
}
void AssistantUiControllerAndroid::ShowStatusMessage(
const std::string& message) {
JNIEnv* env = AttachCurrentThread();
Java_AssistantUiController_onShowStatusMessage(
env, java_assistant_ui_controller_,
base::android::ConvertUTF8ToJavaString(env, message));
}
void AssistantUiControllerAndroid::ShowOverlay() {
Java_AssistantUiController_onShowOverlay(AttachCurrentThread(),
java_assistant_ui_controller_);
}
void AssistantUiControllerAndroid::HideOverlay() {
Java_AssistantUiController_onHideOverlay(AttachCurrentThread(),
java_assistant_ui_controller_);
}
void AssistantUiControllerAndroid::Destroy(JNIEnv* env,
const JavaParamRef<jobject>& obj) {
ui_delegate_->OnDestroy();
}
static jlong JNI_AssistantUiController_Init(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& jcaller,
const base::android::JavaParamRef<jobject>& webContents) {
auto* assistant_ui_controller_android =
new autofill_assistant::AssistantUiControllerAndroid(env, jcaller,
webContents);
return reinterpret_cast<intptr_t>(assistant_ui_controller_android);
}
} // namespace autofill_assistant.
// 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_ASSISTANT_UI_CONTROLLER_ANDROID_H_
#define CHROME_BROWSER_ANDROID_AUTOFILL_ASSISTANT_ASSISTANT_UI_CONTROLLER_ANDROID_H_
#include "components/autofill_assistant/browser/assistant_ui_controller.h"
#include <string>
#include "base/android/scoped_java_ref.h"
#include "base/macros.h"
namespace autofill_assistant {
// Class implements AssistantUiController and starts AssistantController.
class AssistantUiControllerAndroid : public AssistantUiController {
public:
AssistantUiControllerAndroid(
JNIEnv* env,
jobject jcaller,
const base::android::JavaParamRef<jobject>& webContents);
~AssistantUiControllerAndroid() override;
// Overrides AssistantUiController:
void SetUiDelegate(AssistantUiDelegate* ui_delegate) override;
void ShowStatusMessage(const std::string& message) override;
void ShowOverlay() override;
void HideOverlay() override;
// Called by Java.
void Destroy(JNIEnv* env, const base::android::JavaParamRef<jobject>& obj);
private:
// Java-side AssistantUiController object.
base::android::ScopedJavaGlobalRef<jobject> java_assistant_ui_controller_;
AssistantUiDelegate* ui_delegate_;
DISALLOW_COPY_AND_ASSIGN(AssistantUiControllerAndroid);
};
} // namespace autofill_assistant.
#endif // CHROME_BROWSER_ANDROID_AUTOFILL_ASSISTANT_ASSISTANT_UI_CONTROLLER_ANDROID_H_
\ No newline at end of file
......@@ -73,6 +73,7 @@ const base::Feature* kFeaturesExposedToJava[] = {
&kAndroidPayIntegrationV1,
&kAndroidPayIntegrationV2,
&kAndroidPaymentApps,
&kAutofillAssistant,
&kCCTBackgroundTab,
&kCCTExternalLinkHandling,
&kCCTModule,
......@@ -197,6 +198,9 @@ const base::Feature kAndroidPayIntegrationV2{"AndroidPayIntegrationV2",
const base::Feature kAndroidPaymentApps{"AndroidPaymentApps",
base::FEATURE_ENABLED_BY_DEFAULT};
const base::Feature kAutofillAssistant{"AutofillAssistant",
base::FEATURE_DISABLED_BY_DEFAULT};
const base::Feature kBackgroundTaskComponentUpdate{
"BackgroundTaskComponentUpdate", base::FEATURE_DISABLED_BY_DEFAULT};
......
......@@ -17,6 +17,7 @@ extern const base::Feature kAllowReaderForAccessibility;
extern const base::Feature kAndroidPayIntegrationV1;
extern const base::Feature kAndroidPayIntegrationV2;
extern const base::Feature kAndroidPaymentApps;
extern const base::Feature kAutofillAssistant;
extern const base::Feature kBackgroundTaskComponentUpdate;
extern const base::Feature kCCTBackgroundTab;
extern const base::Feature kCCTExternalLinkHandling;
......
......@@ -72,6 +72,10 @@ void AssistantController::OnClickOverlay() {
// TODO(crbug.com/806868): Stop executing scripts.
}
void AssistantController::OnDestroy() {
delete this;
}
void AssistantController::DidFinishLoad(
content::RenderFrameHost* render_frame_host,
const GURL& validated_url) {
......@@ -81,7 +85,7 @@ void AssistantController::DidFinishLoad(
}
void AssistantController::WebContentsDestroyed() {
delete this;
OnDestroy();
}
} // namespace autofill_assistant
\ No newline at end of file
......@@ -45,6 +45,7 @@ class AssistantController : public AssistantScriptExecutorDelegate,
// Overrides content::AssistantUiDelegate:
void OnClickOverlay() override;
void OnDestroy() override;
// Overrides content::WebContentsObserver:
void DidFinishLoad(content::RenderFrameHost* render_frame_host,
......
......@@ -7,6 +7,8 @@
#include "components/autofill_assistant/browser/assistant_ui_delegate.h"
#include <string>
namespace autofill_assistant {
// Controller to control autofill assistant UI.
class AssistantUiController {
......
......@@ -14,6 +14,10 @@ class AssistantUiDelegate {
// Called when the overlay has been clicked by user.
virtual void OnClickOverlay() = 0;
// Called when the Autofill Assistant should be destroyed, e.g. the tab
// detached from the associated activity.
virtual void OnDestroy() = 0;
protected:
AssistantUiDelegate() = default;
};
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment