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 { ...@@ -33,7 +33,8 @@ public class AssistantViewFactory {
@CalledByNative @CalledByNative
public static void setViewAttributes(View view, Context context, int paddingStart, public static void setViewAttributes(View view, Context context, int paddingStart,
int paddingTop, int paddingEnd, int paddingBottom, 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), view.setPaddingRelative(AssistantDimension.getPixelSizeDp(context, paddingStart),
AssistantDimension.getPixelSizeDp(context, paddingTop), AssistantDimension.getPixelSizeDp(context, paddingTop),
AssistantDimension.getPixelSizeDp(context, paddingEnd), AssistantDimension.getPixelSizeDp(context, paddingEnd),
...@@ -46,6 +47,7 @@ public class AssistantViewFactory { ...@@ -46,6 +47,7 @@ public class AssistantViewFactory {
}); });
} }
setAccessibility(view, contentDescription); setAccessibility(view, contentDescription);
view.setVisibility(visible ? View.VISIBLE : View.GONE);
} }
/** /**
......
...@@ -104,4 +104,11 @@ public class AssistantViewInteractions { ...@@ -104,4 +104,11 @@ public class AssistantViewInteractions {
((TextView) view).setText(text); ((TextView) view).setText(text);
return true; 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; ...@@ -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.SetModelValueProto;
import org.chromium.chrome.browser.autofill_assistant.proto.SetTextProto; 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.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.ShapeDrawableProto;
import org.chromium.chrome.browser.autofill_assistant.proto.ShowCalendarPopupProto; import org.chromium.chrome.browser.autofill_assistant.proto.ShowCalendarPopupProto;
import org.chromium.chrome.browser.autofill_assistant.proto.ShowGenericUiProto; import org.chromium.chrome.browser.autofill_assistant.proto.ShowGenericUiProto;
...@@ -1392,4 +1393,93 @@ public class AutofillAssistantGenericUiTest { ...@@ -1392,4 +1393,93 @@ public class AutofillAssistantGenericUiTest {
onView(withText("Click me three+ times")).perform(click()); onView(withText("Click me three+ times")).perform(click());
onView(withText("Info popup title")).check(matches(isDisplayed())); 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( ...@@ -164,7 +164,8 @@ base::android::ScopedJavaGlobalRef<jobject> CreateJavaView(
proto.attributes().has_content_description() proto.attributes().has_content_description()
? base::android::ConvertUTF8ToJavaString( ? base::android::ConvertUTF8ToJavaString(
env, proto.attributes().content_description()) env, proto.attributes().content_description())
: nullptr); : nullptr,
proto.attributes().visible());
} }
if (proto.has_layout_params()) { if (proto.has_layout_params()) {
Java_AssistantViewFactory_setViewLayoutParams( Java_AssistantViewFactory_setViewLayoutParams(
......
...@@ -258,6 +258,36 @@ void SetTextViewText( ...@@ -258,6 +258,36 @@ void SetTextViewText(
base::android::ConvertUTF8ToJavaString(env, text->strings().values(0))); 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( base::Optional<EventHandler::EventKey> CreateEventKeyFromProto(
const EventProto& proto, const EventProto& proto,
JNIEnv* env, JNIEnv* env,
...@@ -380,7 +410,6 @@ CreateInteractionCallbackFromProto( ...@@ -380,7 +410,6 @@ CreateInteractionCallbackFromProto(
return base::Optional<InteractionHandlerAndroid::InteractionCallback>( return base::Optional<InteractionHandlerAndroid::InteractionCallback>(
base::BindRepeating(&SetTextViewText, user_model->GetWeakPtr(), base::BindRepeating(&SetTextViewText, user_model->GetWeakPtr(),
proto.set_text(), views)); proto.set_text(), views));
break;
case CallbackProto::kToggleUserAction: case CallbackProto::kToggleUserAction:
if (proto.toggle_user_action().user_actions_model_identifier().empty()) { if (proto.toggle_user_action().user_actions_model_identifier().empty()) {
VLOG(1) << "Error creating ToggleUserAction interaction: " VLOG(1) << "Error creating ToggleUserAction interaction: "
...@@ -401,6 +430,20 @@ CreateInteractionCallbackFromProto( ...@@ -401,6 +430,20 @@ CreateInteractionCallbackFromProto(
base::BindRepeating(&TryToggleUserAction, base::BindRepeating(&TryToggleUserAction,
basic_interactions->GetWeakPtr(), basic_interactions->GetWeakPtr(),
proto.toggle_user_action())); 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: case CallbackProto::KIND_NOT_SET:
VLOG(1) << "Error creating interaction: kind not set"; VLOG(1) << "Error creating interaction: kind not set";
return base::nullopt; return base::nullopt;
......
...@@ -37,6 +37,7 @@ message CallbackProto { ...@@ -37,6 +37,7 @@ message CallbackProto {
ShowCalendarPopupProto show_calendar_popup = 7; ShowCalendarPopupProto show_calendar_popup = 7;
SetTextProto set_text = 8; SetTextProto set_text = 8;
ToggleUserActionProto toggle_user_action = 9; ToggleUserActionProto toggle_user_action = 9;
SetViewVisibilityProto set_view_visibility = 11;
} }
// Optional model identifier pointing to a single boolean. If set, the // Optional model identifier pointing to a single boolean. If set, the
// callback will only be invoked if the condition is true. // callback will only be invoked if the condition is true.
...@@ -244,3 +245,13 @@ message SetTextProto { ...@@ -244,3 +245,13 @@ message SetTextProto {
// The text view to modify. Must point to a text view. // The text view to modify. Must point to a text view.
optional string view_identifier = 2; 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 { ...@@ -92,6 +92,8 @@ message ViewAttributesProto {
// - set to non-empty string: the view will have the specified content // - set to non-empty string: the view will have the specified content
// description. // description.
optional string content_description = 6; 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. // 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