Commit a4e8c1c1 authored by sandromaggi's avatar sandromaggi Committed by Commit Bot

Reland of crrev/c/2165526

Original failure:
https://ci.chromium.org/p/chromium/builders/ci/Lollipop%20Phone%20Tester/25109

Fixed test such that it's more robust towards smaller screens.

[Autofill Assistant] Fixate bottomsheet in Talkback mode

This CL fixates the height of the bottomsheet when Talkback is enabled.
It also forces VisualViewport resizing.

This is done, such that no element is highlighted under the bottomsheet.

Bug: b/143944870
Change-Id: Ib2906b2c7955b7e57874084f2be325c761804798
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2167436Reviewed-by: default avatarClemens Arbesser <arbesser@google.com>
Reviewed-by: default avatarColin Blundell <blundell@chromium.org>
Commit-Queue: Sandro Maggi <sandromaggi@google.com>
Cr-Commit-Position: refs/heads/master@{#762757}
parent eb95adf5
......@@ -233,6 +233,7 @@ android_library("test_java") {
sources = [
"javatests/src/org/chromium/chrome/browser/autofill_assistant/AssistantOnboardingCoordinatorTest.java",
"javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantAccessibilityIntegrationTest.java",
"javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantActionsCarouselUiTest.java",
"javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantAutostartTest.java",
"javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantBottomsheetTest.java",
......
......@@ -18,6 +18,7 @@ import android.widget.ScrollView;
import androidx.annotation.Nullable;
import org.chromium.base.supplier.ObservableSupplierImpl;
import org.chromium.base.task.PostTask;
import org.chromium.chrome.autofill_assistant.R;
import org.chromium.chrome.browser.autofill_assistant.carousel.AssistantActionsCarouselCoordinator;
import org.chromium.chrome.browser.autofill_assistant.carousel.AssistantCarouselModel;
......@@ -32,9 +33,11 @@ import org.chromium.chrome.browser.autofill_assistant.infobox.AssistantInfoBoxCo
import org.chromium.chrome.browser.autofill_assistant.user_data.AssistantCollectUserDataCoordinator;
import org.chromium.chrome.browser.autofill_assistant.user_data.AssistantCollectUserDataModel;
import org.chromium.chrome.browser.ui.TabObscuringHandler;
import org.chromium.chrome.browser.util.AccessibilityUtil;
import org.chromium.chrome.browser.widget.bottomsheet.BottomSheetContent;
import org.chromium.chrome.browser.widget.bottomsheet.BottomSheetController;
import org.chromium.chrome.browser.widget.bottomsheet.EmptyBottomSheetObserver;
import org.chromium.content_public.browser.UiThreadTaskTraits;
import org.chromium.content_public.browser.WebContents;
import org.chromium.ui.base.ApplicationViewportInsetSupplier;
......@@ -54,6 +57,7 @@ class AssistantBottomBarCoordinator implements AssistantPeekHeightCoordinator.De
@Nullable
private WebContents mWebContents;
private ApplicationViewportInsetSupplier mWindowApplicationInsetSupplier;
private final AccessibilityUtil.Observer mAccessibilityObserver;
// Child coordinators.
private final AssistantHeaderCoordinator mHeaderCoordinator;
......@@ -77,6 +81,12 @@ class AssistantBottomBarCoordinator implements AssistantPeekHeightCoordinator.De
@AssistantViewportMode
private int mViewportMode = AssistantViewportMode.NO_RESIZE;
// Stores the viewport mode for cases where talkback is enabled. During that time, the viewport
// is forced to RESIZE_VISUAL_VIEWPORT. If talkback gets disabled, the last mode stored in this
// field will be applied.
@AssistantViewportMode
private int mTargetViewportMode = AssistantViewportMode.NO_RESIZE;
AssistantBottomBarCoordinator(Activity activity, AssistantModel model,
BottomSheetController controller,
ApplicationViewportInsetSupplier applicationViewportInsetSupplier,
......@@ -200,6 +210,10 @@ class AssistantBottomBarCoordinator implements AssistantPeekHeightCoordinator.De
}
} else if (AssistantModel.WEB_CONTENTS == propertyKey) {
mWebContents = model.get(AssistantModel.WEB_CONTENTS);
} else if (AssistantModel.TALKBACK_SHEET_SIZE_FRACTION == propertyKey) {
mRootViewContainer.setTalkbackViewSizeFraction(
model.get(AssistantModel.TALKBACK_SHEET_SIZE_FRACTION));
updateVisualViewportHeight();
}
});
......@@ -215,6 +229,13 @@ class AssistantBottomBarCoordinator implements AssistantPeekHeightCoordinator.De
mScrollableContent.setClipChildren(canScroll);
mRootViewContainer.setClipChildren(canScroll);
});
mAccessibilityObserver = (talkbackEnabled) -> {
setViewportMode(talkbackEnabled ? AssistantViewportMode.RESIZE_VISUAL_VIEWPORT
: mTargetViewportMode);
PostTask.runOrPostTask(UiThreadTaskTraits.DEFAULT, mRootViewContainer::requestLayout);
};
AccessibilityUtil.addObserver(mAccessibilityObserver);
}
AssistantActionsCarouselCoordinator getActionsCarouselCoordinator() {
......@@ -275,6 +296,7 @@ class AssistantBottomBarCoordinator implements AssistantPeekHeightCoordinator.De
public void destroy() {
resetVisualViewportHeight();
mWindowApplicationInsetSupplier.removeSupplier(mInsetSupplier);
AccessibilityUtil.removeObserver(mAccessibilityObserver);
mInfoBoxCoordinator.destroy();
mInfoBoxCoordinator = null;
......@@ -297,8 +319,14 @@ class AssistantBottomBarCoordinator implements AssistantPeekHeightCoordinator.De
void setViewportMode(@AssistantViewportMode int mode) {
if (mode == mViewportMode) return;
if (AccessibilityUtil.isAccessibilityEnabled()
&& mode != AssistantViewportMode.RESIZE_VISUAL_VIEWPORT) {
mTargetViewportMode = mode;
return;
}
mViewportMode = mode;
mTargetViewportMode = mode;
updateVisualViewportHeight();
}
......@@ -391,13 +419,4 @@ class AssistantBottomBarCoordinator implements AssistantPeekHeightCoordinator.De
mInsetSupplier.set(resizing);
}
/** @return The peeking height of the bottom sheet if our content is showing, otherwise 0. */
private int getHeight() {
if (mBottomSheetController.getCurrentSheetContent() == mContent) {
return mPeekHeightCoordinator.getPeekHeight();
}
return 0;
}
}
......@@ -24,6 +24,8 @@ import org.chromium.ui.modelutil.PropertyModel;
class AssistantModel extends PropertyModel {
static final WritableBooleanPropertyKey ALLOW_TALKBACK_ON_WEBSITE =
new WritableBooleanPropertyKey();
static final WritableFloatPropertyKey TALKBACK_SHEET_SIZE_FRACTION =
new WritableFloatPropertyKey();
static final WritableBooleanPropertyKey VISIBLE = new WritableBooleanPropertyKey();
/** The web contents the Autofill Assistant is associated with. */
......@@ -45,7 +47,7 @@ class AssistantModel extends PropertyModel {
}
AssistantModel(AssistantOverlayModel overlayModel) {
super(VISIBLE, WEB_CONTENTS, ALLOW_TALKBACK_ON_WEBSITE);
super(VISIBLE, WEB_CONTENTS, ALLOW_TALKBACK_ON_WEBSITE, TALKBACK_SHEET_SIZE_FRACTION);
mOverlayModel = overlayModel;
}
......@@ -93,6 +95,11 @@ class AssistantModel extends PropertyModel {
set(ALLOW_TALKBACK_ON_WEBSITE, allowed);
}
@CalledByNative
private void setTalkbackSheetSizeFraction(float fraction) {
set(TALKBACK_SHEET_SIZE_FRACTION, fraction);
}
@CalledByNative
void setVisible(boolean visible) {
set(VISIBLE, visible);
......
......@@ -13,6 +13,7 @@ import androidx.annotation.Nullable;
import org.chromium.chrome.browser.ChromeActivity;
import org.chromium.chrome.browser.fullscreen.ChromeFullscreenManager;
import org.chromium.chrome.browser.util.AccessibilityUtil;
/**
* A special linear layout that limits its maximum size to always stay below the Chrome navigation
......@@ -23,13 +24,18 @@ public class AssistantRootViewContainer
private final ChromeActivity mActivity;
private final ChromeFullscreenManager mFullscreenManager;
private Rect mVisibleViewportRect = new Rect();
private float mTalkbackSheetSizeFraction;
public AssistantRootViewContainer(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
assert context instanceof ChromeActivity;
mActivity = (ChromeActivity) context;
mFullscreenManager = mActivity.getFullscreenManager();
mActivity.getFullscreenManager().addListener(this);
mFullscreenManager.addListener(this);
}
public void setTalkbackViewSizeFraction(float fraction) {
mTalkbackSheetSizeFraction = fraction;
}
@Override
......@@ -56,13 +62,20 @@ public class AssistantRootViewContainer
@Override
public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
mActivity.getWindow().getDecorView().getWindowVisibleDisplayFrame(mVisibleViewportRect);
super.onMeasure(widthMeasureSpec,
MeasureSpec.makeMeasureSpec(
Math.min(MeasureSpec.getSize(heightMeasureSpec),
mVisibleViewportRect.height()
- mFullscreenManager.getContentOffset()
- mFullscreenManager.getBottomControlsHeight()
- mFullscreenManager.getBottomControlOffset()),
MeasureSpec.AT_MOST));
int availableHeight = mVisibleViewportRect.height() - mFullscreenManager.getContentOffset()
- mFullscreenManager.getBottomControlsHeight()
- mFullscreenManager.getBottomControlOffset();
int targetHeight;
int mode;
if (AccessibilityUtil.isAccessibilityEnabled()) {
// TODO(b/143944870): Make this more stable with landscape mode.
targetHeight = (int) (availableHeight * mTalkbackSheetSizeFraction);
mode = MeasureSpec.EXACTLY;
} else {
targetHeight = Math.min(MeasureSpec.getSize(heightMeasureSpec), availableHeight);
mode = MeasureSpec.AT_MOST;
}
super.onMeasure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(targetHeight, mode));
}
}
......@@ -309,6 +309,27 @@ class AutofillAssistantUiTestUtil {
};
}
static Matcher<View> fullyCovers(Rect rect) {
return new TypeSafeMatcher<View>() {
@Override
protected boolean matchesSafely(View view) {
Rect viewRect = new Rect();
if (!view.getGlobalVisibleRect(viewRect)) {
throw new AssertionError("Expected view to be visible.");
}
return rect.left >= viewRect.left && rect.right <= viewRect.right
&& rect.top >= viewRect.top && rect.bottom <= viewRect.bottom;
}
@Override
public void describeTo(Description description) {
description.appendText("fully covering [" + rect.left + ", " + rect.top + ", "
+ rect.right + ", " + rect.bottom + "]");
}
};
}
static ViewAction openTextLink(String textLink) {
return new ViewAction() {
@Override
......
......@@ -1462,10 +1462,11 @@ void UiControllerAndroid::OnClientSettingsChanged(
Java_AssistantOverlayModel_setTapTracking(
env, GetOverlayModel(), settings.tap_count,
settings.tap_tracking_duration.InMilliseconds());
if (settings.overlay_image.has_value()) {
const auto& image = *(settings.overlay_image);
auto jcontext =
Java_AutofillAssistantUiController_getContext(env, java_object_);
const auto& image = *(settings.overlay_image);
int image_size = ui_controller_android_utils::GetPixelSizeOrDefault(
env, jcontext, image.image_size(), 0);
int top_margin = ui_controller_android_utils::GetPixelSizeOrDefault(
......@@ -1494,6 +1495,8 @@ void UiControllerAndroid::OnClientSettingsChanged(
settings.integration_test_settings
->disable_carousel_change_animations());
}
Java_AssistantModel_setTalkbackSheetSizeFraction(
env, GetModel(), settings.talkback_sheet_size_fraction);
}
void UiControllerAndroid::OnGenericUserInterfaceChanged(
......
......@@ -22,6 +22,8 @@ import org.chromium.base.ApplicationStatus.ActivityStateListener;
import org.chromium.base.ContextUtils;
import org.chromium.base.ObserverList;
import org.chromium.base.TraceEvent;
import org.chromium.base.task.PostTask;
import org.chromium.content_public.browser.UiThreadTaskTraits;
import java.util.List;
......@@ -217,5 +219,6 @@ public class AccessibilityUtil {
@VisibleForTesting
public static void setAccessibilityEnabledForTesting(@Nullable Boolean isEnabled) {
sIsAccessibilityEnabled = isEnabled;
PostTask.runOrPostTask(UiThreadTaskTraits.DEFAULT, AccessibilityUtil::notifyModeChange);
}
}
......@@ -89,6 +89,9 @@ void ClientSettings::UpdateFromProto(const ClientSettingsProto& proto) {
} else {
integration_test_settings.reset();
}
if (proto.has_talkback_sheet_size_fraction()) {
talkback_sheet_size_fraction = proto.talkback_sheet_size_fraction();
}
}
} // namespace autofill_assistant
......@@ -87,6 +87,8 @@ struct ClientSettings {
void UpdateFromProto(const ClientSettingsProto& proto);
float talkback_sheet_size_fraction = 0.5f;
private:
DISALLOW_COPY_AND_ASSIGN(ClientSettings);
};
......
......@@ -190,6 +190,12 @@ message ClientSettingsProto {
// Optional settings intended for integration tests.
optional IntegrationTestSettings integration_test_settings = 17;
// Optional setting defining the size of the bottom sheet when Talkback is
// enabled as a fraction of the available height. When set, the bottomsheet
// will stop resizing automatically in talkback mode. It will always have the
// specified size instead.
optional float talkback_sheet_size_fraction = 18;
}
message ScriptTimeoutError {
......@@ -1635,7 +1641,9 @@ message ShowInfoBoxProto {
}
// Allow scripts to configure the peek height of the sheet and whether we should
// resize the viewport by this peek height.
// resize the viewport by this peek height. If talkback is enabled, the mode is
// set to RESIZE_VISUAL_VIEWPORT. Changes to the mode are only applied after
// talkback is disabled.
message ConfigureBottomSheetProto {
enum ViewportResizing {
// Don't change resizing configuration.
......
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