Commit 35e4455d authored by Marian Fechete's avatar Marian Fechete Committed by Commit Bot

[Autofill Assistant] Introduce informational text per intent in the onboarding screen.

This CL introduces the option to customize the informational text shown
on the onboarding screen based on the incoming intent. The existing
text is kept as a default, and overrides can be set up based on intent
strings.

Bug: b/150927780
Change-Id: Id49b0adc4210ea621287b32bad45dacc00a63a25
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2094299Reviewed-by: default avatarMathias Carlen <mcarlen@chromium.org>
Commit-Queue: Marian Fechete <marianfe@google.com>
Cr-Commit-Position: refs/heads/master@{#748249}
parent 3ef3b9eb
......@@ -8,7 +8,6 @@ import android.content.Context;
import android.text.SpannableString;
import android.text.method.LinkMovementMethod;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ScrollView;
import android.widget.TextView;
......@@ -29,16 +28,18 @@ import org.chromium.chrome.browser.widget.bottomsheet.BottomSheetController;
import org.chromium.ui.text.NoUnderlineClickableSpan;
import org.chromium.ui.text.SpanApplier;
import java.util.Arrays;
import java.util.Map;
/**
* Coordinator responsible for showing the onboarding screen when the user is using the Autofill
* Assistant for the first time.
*/
class AssistantOnboardingCoordinator {
private static final String SMALL_ONBOARDING_EXPERIMENT_ID = "4257013";
private static final String INTENT_IDENTFIER = "INTENT";
private static final String RENT_CAR_INTENT = "RENT_CAR";
private final String mExperimentIds;
private final Map<String, String> mParameters;
private final Context mContext;
private final BottomSheetController mController;
@Nullable
......@@ -53,9 +54,10 @@ class AssistantOnboardingCoordinator {
private boolean mOnboardingShown;
AssistantOnboardingCoordinator(String experimentIds, Context context,
BottomSheetController controller, @Nullable Tab tab) {
AssistantOnboardingCoordinator(String experimentIds, Map<String, String> parameters,
Context context, BottomSheetController controller, @Nullable Tab tab) {
mExperimentIds = experimentIds;
mParameters = parameters;
mContext = context;
mController = controller;
mTab = tab;
......@@ -170,19 +172,11 @@ class AssistantOnboardingCoordinator {
initView.findViewById(R.id.button_init_not_ok)
.setOnClickListener(unusedView -> onClicked(false, callback));
// Hide views that should not be displayed when showing the small onboarding.
if (Arrays.asList(mExperimentIds.split(",")).contains(SMALL_ONBOARDING_EXPERIMENT_ID)) {
hide(initView, R.id.onboarding_subtitle);
hide(initView, R.id.onboarding_separator);
}
updateViewBasedOnIntent(initView);
mContent.setContent(initView, initView);
}
private static void hide(View root, int resId) {
root.findViewById(resId).setVisibility(View.GONE);
}
private void onClicked(boolean accept, Callback<Boolean> callback) {
AutofillAssistantPreferencesUtil.setInitialPreferences(accept);
AutofillAssistantMetrics.recordOnBoarding(
......@@ -194,4 +188,17 @@ class AssistantOnboardingCoordinator {
callback.onResult(accept);
hide();
}
private void updateViewBasedOnIntent(ScrollView initView) {
if (!mParameters.containsKey(INTENT_IDENTFIER)) {
return;
}
TextView termsTextView = initView.findViewById(R.id.onboarding_subtitle);
switch (mParameters.get(INTENT_IDENTFIER)) {
case RENT_CAR_INTENT:
termsTextView.setText(R.string.autofill_assistant_init_message_rent_car);
break;
}
}
}
......@@ -71,9 +71,11 @@ class AutofillAssistantActionHandlerImpl implements AutofillAssistantActionHandl
}
@Override
public void performOnboarding(String experimentIds, Callback<Boolean> callback) {
public void performOnboarding(
String experimentIds, Bundle arguments, Callback<Boolean> callback) {
Map<String, String> parameters = toArgumentMap(arguments);
AssistantOnboardingCoordinator coordinator = new AssistantOnboardingCoordinator(
experimentIds, mContext, mBottomSheetController, mGetCurrentTab.get());
experimentIds, parameters, mContext, mBottomSheetController, mGetCurrentTab.get());
coordinator.show(accepted -> {
coordinator.hide();
callback.onResult(accepted);
......@@ -89,15 +91,16 @@ class AutofillAssistantActionHandlerImpl implements AutofillAssistantActionHandl
return;
}
Map<String, String> argumentMap = toArgumentMap(arguments);
Callback<AssistantOnboardingCoordinator> afterOnboarding = (onboardingCoordinator) -> {
Map<String, String> argumentMap = toArgumentMap(arguments);
callback.onResult(client.performDirectAction(
name, experimentIds, argumentMap, onboardingCoordinator));
};
if (!AutofillAssistantPreferencesUtil.isAutofillOnboardingAccepted()) {
AssistantOnboardingCoordinator coordinator = new AssistantOnboardingCoordinator(
experimentIds, mContext, mBottomSheetController, mGetCurrentTab.get());
AssistantOnboardingCoordinator coordinator =
new AssistantOnboardingCoordinator(experimentIds, argumentMap, mContext,
mBottomSheetController, mGetCurrentTab.get());
coordinator.show(accepted -> {
if (!accepted) {
coordinator.hide();
......
......@@ -39,7 +39,7 @@ public class AutofillAssistantModuleEntryImpl implements AutofillAssistantModule
ChromeActivity activity = ((TabImpl) tab).getActivity();
AssistantOnboardingCoordinator onboardingCoordinator = new AssistantOnboardingCoordinator(
experimentIds, activity, activity.getBottomSheetController(), tab);
experimentIds, parameters, activity, activity.getBottomSheetController(), tab);
onboardingCoordinator.show(accepted -> {
if (!accepted) return;
......
......@@ -172,6 +172,9 @@
<message name="IDS_AUTOFILL_ASSISTANT_INIT_TITLE" desc="The title of the onboarding screen.">
Try \n Google Assistant \n in Chrome
</message>
<message name="IDS_AUTOFILL_ASSISTANT_INIT_MESSAGE_RENT_CAR" desc="Onboarding message describing autofill assistant's capability for car rentals.">
Quickly complete the car rental flow with just a few taps.
</message>
<message name="IDS_AUTOFILL_ASSISTANT_INIT_MESSAGE" desc="Onboarding message describing autofill assistant's capability.">
Google Assistant saves you time by helping you complete actions on the web, like search and checkout.
</message>
......
......@@ -23,6 +23,7 @@ import static org.mockito.Mockito.verify;
import static org.chromium.chrome.browser.autofill_assistant.AutofillAssistantUiTestUtil.waitUntilViewMatchesCondition;
import android.support.test.filters.MediumTest;
import android.widget.TextView;
import androidx.annotation.IdRes;
......@@ -51,6 +52,7 @@ import org.chromium.content_public.browser.test.util.TestThreadUtils;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
/**
......@@ -82,15 +84,15 @@ public class AssistantOnboardingCoordinatorTest {
}
private AssistantOnboardingCoordinator createCoordinator(Tab tab) {
AssistantOnboardingCoordinator coordinator =
new AssistantOnboardingCoordinator("", mActivity, mBottomSheetController, mTab);
AssistantOnboardingCoordinator coordinator = new AssistantOnboardingCoordinator(
"", new HashMap<String, String>(), mActivity, mBottomSheetController, mTab);
coordinator.disableAnimationForTesting();
return coordinator;
}
@Test
@MediumTest
@DisableIf.Build(sdk_is_greater_than = 22) // TODO(crbug/990118): re-enable
@DisableIf.Build(sdk_is_greater_than = 22) // TODO(crbug/991938): re-enable
public void testAcceptOnboarding() throws Exception {
testOnboarding(R.id.button_init_ok, true);
}
......@@ -168,6 +170,42 @@ public class AssistantOnboardingCoordinatorTest {
assertTrue(coordinator.getOnboardingShown());
}
@Test
@MediumTest
public void testShowDifferentInformationalText() throws Exception {
AutofillAssistantPreferencesUtil.setInitialPreferences(true);
HashMap<String, String> parameters = new HashMap();
parameters.put("INTENT", "RENT_CAR");
AssistantOnboardingCoordinator coordinator = new AssistantOnboardingCoordinator(
"", parameters, mActivity, mBottomSheetController, mTab);
coordinator.disableAnimationForTesting();
showOnboardingAndWait(coordinator, mCallback);
TextView view = mBottomSheetController.getBottomSheetViewForTesting().findViewById(
R.id.onboarding_subtitle);
assertEquals(
mActivity.getResources().getText(R.string.autofill_assistant_init_message_rent_car),
view.getText());
}
@Test
@MediumTest
public void testShowStandardInformationalText() throws Exception {
AutofillAssistantPreferencesUtil.setInitialPreferences(true);
HashMap<String, String> parameters = new HashMap();
AssistantOnboardingCoordinator coordinator = new AssistantOnboardingCoordinator(
"", parameters, mActivity, mBottomSheetController, mTab);
coordinator.disableAnimationForTesting();
showOnboardingAndWait(coordinator, mCallback);
TextView view = mBottomSheetController.getBottomSheetViewForTesting().findViewById(
R.id.onboarding_subtitle);
assertEquals(mActivity.getResources().getText(R.string.autofill_assistant_init_message),
view.getText());
}
/** Trigger onboarding and wait until it is fully displayed. */
private void showOnboardingAndWait(
AssistantOnboardingCoordinator coordinator, Callback<Boolean> callback) {
......
......@@ -53,7 +53,7 @@ public interface AutofillAssistantActionHandler {
List<AutofillAssistantDirectAction> getActions();
/** Performs onboarding and returns the result to the callback. */
void performOnboarding(String experimentIds, Callback<Boolean> callback);
void performOnboarding(String experimentIds, Bundle arguments, Callback<Boolean> callback);
/**
* Performs an AA action.
......
......@@ -171,7 +171,7 @@ public class AutofillAssistantDirectActionHandler implements DirectActionHandler
return;
}
if (ONBOARDING_ACTION.equals(actionId)) {
delegate.performOnboarding(experimentIds, booleanCallback);
delegate.performOnboarding(experimentIds, arguments, booleanCallback);
return;
}
......
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