Commit 8b16e3f0 authored by Clemens Arbesser's avatar Clemens Arbesser Committed by Commit Bot

[Autofill Assistant] Added SetViewVisibility interaction to framework.

Bug: b/145043394
Change-Id: Ifff1c6be5d2cdcfa59d998c2fdf17961345d4ebd
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2111291
Commit-Queue: Clemens Arbesser <arbesser@google.com>
Reviewed-by: default avatarSandro Maggi <sandromaggi@google.com>
Cr-Commit-Position: refs/heads/master@{#752408}
parent 903f5b28
......@@ -33,7 +33,8 @@ public class AssistantViewFactory {
@CalledByNative
public static void setViewAttributes(View view, Context context, int paddingStart,
int paddingTop, int paddingEnd, int paddingBottom,
@Nullable AssistantDrawable background, @Nullable String contentDescription) {
@Nullable AssistantDrawable background, @Nullable String contentDescription,
boolean visible) {
view.setPaddingRelative(AssistantDimension.getPixelSizeDp(context, paddingStart),
AssistantDimension.getPixelSizeDp(context, paddingTop),
AssistantDimension.getPixelSizeDp(context, paddingEnd),
......@@ -46,6 +47,7 @@ public class AssistantViewFactory {
});
}
setAccessibility(view, contentDescription);
view.setVisibility(visible ? View.VISIBLE : View.GONE);
}
/**
......
......@@ -104,4 +104,11 @@ public class AssistantViewInteractions {
((TextView) view).setText(text);
return true;
}
@CalledByNative
private static void setViewVisibility(View view, AssistantValue visible) {
if (visible.getBooleans() != null && visible.getBooleans().length == 1) {
view.setVisibility(visible.getBooleans()[0] ? View.VISIBLE : View.GONE);
}
}
}
......@@ -83,6 +83,7 @@ import org.chromium.chrome.browser.autofill_assistant.proto.PromptProto;
import org.chromium.chrome.browser.autofill_assistant.proto.SetModelValueProto;
import org.chromium.chrome.browser.autofill_assistant.proto.SetTextProto;
import org.chromium.chrome.browser.autofill_assistant.proto.SetUserActionsProto;
import org.chromium.chrome.browser.autofill_assistant.proto.SetViewVisibilityProto;
import org.chromium.chrome.browser.autofill_assistant.proto.ShapeDrawableProto;
import org.chromium.chrome.browser.autofill_assistant.proto.ShowCalendarPopupProto;
import org.chromium.chrome.browser.autofill_assistant.proto.ShowGenericUiProto;
......@@ -1392,4 +1393,93 @@ public class AutofillAssistantGenericUiTest {
onView(withText("Click me three+ times")).perform(click());
onView(withText("Info popup title")).check(matches(isDisplayed()));
}
/**
* Shows two textviews. Clicking the first one will show/hide the other one.
*/
@Test
@MediumTest
public void testViewVisibility() {
List<InteractionProto> interactions = new ArrayList<>();
interactions.add(
(InteractionProto) InteractionProto.newBuilder()
.setTriggerEvent(EventProto.newBuilder().setOnViewClicked(
OnViewClickedEventProto.newBuilder().setViewIdentifier(
"toggle_view")))
.addCallbacks(CallbackProto.newBuilder().setComputeValue(
ComputeValueProto.newBuilder()
.setResultModelIdentifier("visible")
.setBooleanNot(
BooleanNotProto.newBuilder().setModelIdentifier(
"visible"))))
.build());
interactions.add(
(InteractionProto) InteractionProto.newBuilder()
.setTriggerEvent(EventProto.newBuilder().setOnValueChanged(
OnModelValueChangedEventProto.newBuilder().setModelIdentifier(
"visible")))
.addCallbacks(CallbackProto.newBuilder().setSetViewVisibility(
SetViewVisibilityProto.newBuilder()
.setViewIdentifier("text_view")
.setModelIdentifier("visible")))
.build());
// Set visibility initially to false for text_view.
List<ModelProto.ModelValue> modelValues = new ArrayList<>();
modelValues.add((ModelProto.ModelValue) ModelProto.ModelValue.newBuilder()
.setIdentifier("visible")
.setValue(ValueProto.newBuilder().setBooleans(
BooleanList.newBuilder().addValues(false)))
.build());
GenericUserInterfaceProto genericUserInterface =
(GenericUserInterfaceProto) GenericUserInterfaceProto.newBuilder()
.setRootView(ViewProto.newBuilder().setViewContainer(
ViewContainerProto.newBuilder()
.setLinearLayout(
LinearLayoutProto.newBuilder().setOrientation(
LinearLayoutProto.Orientation.VERTICAL))
.addViews(
ViewProto.newBuilder()
.setIdentifier("toggle_view")
.setTextView(
TextViewProto.newBuilder().setText(
"toggle view")))
.addViews(
ViewProto.newBuilder()
.setIdentifier("text_view")
.setTextView(
TextViewProto.newBuilder().setText(
"text view")))))
.setInteractions(
InteractionsProto.newBuilder().addAllInteractions(interactions))
.setModel(ModelProto.newBuilder().addAllValues(modelValues))
.build();
ArrayList<ActionProto> list = new ArrayList<>();
list.add((ActionProto) ActionProto.newBuilder()
.setShowGenericUi(ShowGenericUiProto.newBuilder().setGenericUserInterface(
genericUserInterface))
.build());
AutofillAssistantTestScript script = new AutofillAssistantTestScript(
(SupportedScriptProto) SupportedScriptProto.newBuilder()
.setPath("form_target_website.html")
.setPresentation(PresentationProto.newBuilder().setAutostart(true).setChip(
ChipProto.newBuilder().setText("Autostart")))
.build(),
list);
AutofillAssistantTestService testService =
new AutofillAssistantTestService(Collections.singletonList(script));
startAutofillAssistant(mTestRule.getActivity(), testService);
waitUntilViewMatchesCondition(withText("toggle view"), isCompletelyDisplayed());
onView(withText("text view")).check(matches(not(isDisplayed())));
onView(withText("toggle view")).perform(click());
onView(withText("text view")).check(matches(isDisplayed()));
onView(withText("toggle view")).perform(click());
onView(withText("text view")).check(matches(not(isDisplayed())));
}
}
......@@ -164,7 +164,8 @@ base::android::ScopedJavaGlobalRef<jobject> CreateJavaView(
proto.attributes().has_content_description()
? base::android::ConvertUTF8ToJavaString(
env, proto.attributes().content_description())
: nullptr);
: nullptr,
proto.attributes().visible());
}
if (proto.has_layout_params()) {
Java_AssistantViewFactory_setViewLayoutParams(
......
......@@ -258,6 +258,36 @@ void SetTextViewText(
base::android::ConvertUTF8ToJavaString(env, text->strings().values(0)));
}
void SetViewVisibility(
base::WeakPtr<UserModel> user_model,
const SetViewVisibilityProto& proto,
std::map<std::string, base::android::ScopedJavaGlobalRef<jobject>>* views) {
if (!user_model) {
return;
}
auto jview = views->find(proto.view_identifier());
if (jview == views->end()) {
DVLOG(2) << "Failed to set view visibility for " << proto.view_identifier()
<< ": view not found";
return;
}
auto visible_value = user_model->GetValue(proto.model_identifier());
if (!visible_value.has_value() ||
visible_value->booleans().values_size() != 1) {
DVLOG(2) << "Failed to set view visibility for " << proto.view_identifier()
<< ": " << proto.model_identifier()
<< " did not contain single boolean";
return;
}
JNIEnv* env = base::android::AttachCurrentThread();
Java_AssistantViewInteractions_setViewVisibility(
env, jview->second,
ui_controller_android_utils::ToJavaValue(env, *visible_value));
}
base::Optional<EventHandler::EventKey> CreateEventKeyFromProto(
const EventProto& proto,
JNIEnv* env,
......@@ -380,7 +410,6 @@ CreateInteractionCallbackFromProto(
return base::Optional<InteractionHandlerAndroid::InteractionCallback>(
base::BindRepeating(&SetTextViewText, user_model->GetWeakPtr(),
proto.set_text(), views));
break;
case CallbackProto::kToggleUserAction:
if (proto.toggle_user_action().user_actions_model_identifier().empty()) {
VLOG(1) << "Error creating ToggleUserAction interaction: "
......@@ -401,6 +430,20 @@ CreateInteractionCallbackFromProto(
base::BindRepeating(&TryToggleUserAction,
basic_interactions->GetWeakPtr(),
proto.toggle_user_action()));
case CallbackProto::kSetViewVisibility:
if (proto.set_view_visibility().view_identifier().empty()) {
VLOG(1) << "Error creating SetViewVisibility interaction: "
"view_identifier not set";
return base::nullopt;
}
if (proto.set_view_visibility().model_identifier().empty()) {
VLOG(1) << "Error creating SetViewVisibility interaction: "
"model_identifier not set";
return base::nullopt;
}
return base::Optional<InteractionHandlerAndroid::InteractionCallback>(
base::BindRepeating(&SetViewVisibility, user_model->GetWeakPtr(),
proto.set_view_visibility(), views));
case CallbackProto::KIND_NOT_SET:
VLOG(1) << "Error creating interaction: kind not set";
return base::nullopt;
......
......@@ -37,6 +37,7 @@ message CallbackProto {
ShowCalendarPopupProto show_calendar_popup = 7;
SetTextProto set_text = 8;
ToggleUserActionProto toggle_user_action = 9;
SetViewVisibilityProto set_view_visibility = 11;
}
// Optional model identifier pointing to a single boolean. If set, the
// callback will only be invoked if the condition is true.
......@@ -244,3 +245,13 @@ message SetTextProto {
// The text view to modify. Must point to a text view.
optional string view_identifier = 2;
}
// Modifies a view's visibiliy.
message SetViewVisibilityProto {
// The view to modify.
optional string view_identifier = 1;
// The model identifier containing the visibility flag. Must point to a single
// bool.
optional string model_identifier = 2;
}
......@@ -92,6 +92,8 @@ message ViewAttributesProto {
// - set to non-empty string: the view will have the specified content
// description.
optional string content_description = 6;
// Whether the view is initially visible or not.
optional bool visible = 7 [default = true];
}
// Parameters configuring how views attach to their parents.
......
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