Commit a3e88858 authored by Clemens Arbesser's avatar Clemens Arbesser Committed by Commit Bot

[Autofill Assistant] Allow viewport resizing while triggerscript shown.

Bug: b/173128917
Change-Id: I6cea12bab4af38e9610c74406b35823bb3095986
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2536463
Commit-Queue: Clemens Arbesser <arbesser@google.com>
Reviewed-by: default avatarMathias Carlen <mcarlen@chromium.org>
Cr-Commit-Position: refs/heads/master@{#827312}
parent e9696c24
......@@ -30,6 +30,7 @@ import org.chromium.chrome.browser.signin.UnifiedConsentServiceBridge;
import org.chromium.components.browser_ui.bottomsheet.BottomSheetController;
import org.chromium.content_public.browser.WebContents;
import org.chromium.ui.base.ActivityKeyboardVisibilityDelegate;
import org.chromium.ui.base.ApplicationViewportInsetSupplier;
import java.util.Map;
......@@ -43,7 +44,8 @@ public class AutofillAssistantModuleEntryImpl implements AutofillAssistantModule
public void start(BottomSheetController bottomSheetController,
BrowserControlsStateProvider browserControls, CompositorViewHolder compositorViewHolder,
Context context, @NonNull WebContents webContents,
ActivityKeyboardVisibilityDelegate keyboardVisibilityDelegate, boolean skipOnboarding,
ActivityKeyboardVisibilityDelegate keyboardVisibilityDelegate,
ApplicationViewportInsetSupplier bottomInsetProvider, boolean skipOnboarding,
boolean isChromeCustomTab, @NonNull String initialUrl, Map<String, String> parameters,
String experimentIds, @Nullable String callerAccount, @Nullable String userName) {
if (shouldStartTriggerScript(parameters)) {
......@@ -64,8 +66,8 @@ public class AutofillAssistantModuleEntryImpl implements AutofillAssistantModule
AssistantTriggerScriptBridge triggerScriptBridge =
new AssistantTriggerScriptBridge();
triggerScriptBridge.start(bottomSheetController, context,
keyboardVisibilityDelegate, webContents, initialUrl, parameters,
experimentIds, new AssistantTriggerScriptBridge.Delegate() {
keyboardVisibilityDelegate, bottomInsetProvider, webContents, initialUrl,
parameters, experimentIds, new AssistantTriggerScriptBridge.Delegate() {
@Override
public void onTriggerScriptFinished(
@LiteScriptFinishedState int finishedState) {
......
......@@ -14,6 +14,7 @@ import android.widget.Space;
import androidx.annotation.Nullable;
import androidx.annotation.VisibleForTesting;
import org.chromium.base.supplier.ObservableSupplierImpl;
import org.chromium.chrome.autofill_assistant.R;
import org.chromium.chrome.browser.autofill_assistant.AssistantBottomBarDelegate;
import org.chromium.chrome.browser.autofill_assistant.AssistantBottomSheetContent;
......@@ -24,10 +25,13 @@ import org.chromium.chrome.browser.autofill_assistant.carousel.AssistantChipView
import org.chromium.chrome.browser.autofill_assistant.generic_ui.AssistantDimension;
import org.chromium.chrome.browser.autofill_assistant.header.AssistantHeaderCoordinator;
import org.chromium.chrome.browser.autofill_assistant.header.AssistantHeaderModel;
import org.chromium.components.browser_ui.bottomsheet.BottomSheetContent;
import org.chromium.components.browser_ui.bottomsheet.BottomSheetController;
import org.chromium.components.browser_ui.bottomsheet.BottomSheetController.StateChangeReason;
import org.chromium.components.browser_ui.bottomsheet.BottomSheetObserver;
import org.chromium.components.browser_ui.bottomsheet.EmptyBottomSheetObserver;
import org.chromium.content_public.browser.WebContents;
import org.chromium.ui.base.ApplicationViewportInsetSupplier;
import java.util.ArrayList;
import java.util.List;
......@@ -48,13 +52,20 @@ public class AssistantTriggerScript {
private AssistantBottomSheetContent mContent;
private final Context mContext;
private final Delegate mDelegate;
private final WebContents mWebContents;
private final BottomSheetController mBottomSheetController;
private final BottomSheetObserver mBottomSheetObserver;
private final ObservableSupplierImpl<Integer> mInsetSupplier = new ObservableSupplierImpl<>();
private final ApplicationViewportInsetSupplier mApplicationViewportInsetSupplier;
private AssistantHeaderCoordinator mHeaderCoordinator;
private final AssistantHeaderModel mHeaderModel = new AssistantHeaderModel();
private LinearLayout mChipsContainer;
private final int mInnerChipSpacing;
/** Height of the bottom sheet's shadow, used to compute the viewport resize offset. */
private final int mShadowHeight;
/** Whether the visual viewport should be resized while the trigger script is shown. */
private boolean mResizeVisualViewport;
private final List<AssistantChip> mLeftAlignedChips = new ArrayList<>();
private final List<AssistantChip> mRightAlignedChips = new ArrayList<>();
......@@ -64,12 +75,16 @@ public class AssistantTriggerScript {
private boolean mAnimateBottomSheet = true;
public AssistantTriggerScript(
Context context, Delegate delegate, BottomSheetController controller) {
public AssistantTriggerScript(Context context, Delegate delegate, WebContents webContents,
BottomSheetController controller,
ApplicationViewportInsetSupplier applicationViewportInsetSupplier) {
assert delegate != null;
mContext = context;
mDelegate = delegate;
mWebContents = webContents;
mBottomSheetController = controller;
mApplicationViewportInsetSupplier = applicationViewportInsetSupplier;
mApplicationViewportInsetSupplier.addSupplier(mInsetSupplier);
mBottomSheetObserver = new EmptyBottomSheetObserver() {
@Override
public void onSheetClosed(@StateChangeReason int reason) {
......@@ -77,9 +92,23 @@ public class AssistantTriggerScript {
mDelegate.onBottomSheetClosedWithSwipe();
}
}
@Override
public void onSheetContentChanged(@Nullable BottomSheetContent newContent) {
// TODO(crbug.com/806868): Make sure this works and does not interfere with Duet
// once we are in ChromeTabbedActivity.
updateVisualViewportHeight();
}
@Override
public void onSheetOffsetChanged(float heightFraction, float offsetPx) {
updateVisualViewportHeight();
}
};
mInnerChipSpacing = mContext.getResources().getDimensionPixelSize(
R.dimen.autofill_assistant_actions_spacing);
mShadowHeight = mContext.getResources().getDimensionPixelSize(
R.dimen.bottom_sheet_toolbar_shadow_height);
mHeaderModel.set(
AssistantHeaderModel.FEEDBACK_BUTTON_CALLBACK, mDelegate::onFeedbackButtonClicked);
}
......@@ -130,6 +159,7 @@ public class AssistantTriggerScript {
public void destroy() {
mBottomSheetController.removeObserver(mBottomSheetObserver);
mHeaderCoordinator.destroy();
mApplicationViewportInsetSupplier.removeSupplier(mInsetSupplier);
}
@VisibleForTesting
......@@ -216,7 +246,8 @@ public class AssistantTriggerScript {
addChipsToContainer(mChipsContainer, mRightAlignedChips);
}
public void show() {
public void show(boolean resizeVisualViewport) {
mResizeVisualViewport = resizeVisualViewport;
createBottomSheetContents();
update();
mBottomSheetController.removeObserver(mBottomSheetObserver);
......@@ -228,5 +259,33 @@ public class AssistantTriggerScript {
public void hide() {
mBottomSheetController.removeObserver(mBottomSheetObserver);
mBottomSheetController.hideContent(mContent, /* animate = */ mAnimateBottomSheet);
mResizeVisualViewport = false;
updateVisualViewportHeight();
}
private void updateVisualViewportHeight() {
if (!mResizeVisualViewport || mBottomSheetController.getCurrentSheetContent() != mContent) {
setVisualViewportResizing(0);
return;
}
// In order to align the bottom of a website with the top of the bottom sheet, we need to
// remove the shadow height from the sheet's current offset. Note that mShadowHeight is
// different from the sheet controller's getTopShadowHeight().
setVisualViewportResizing(mBottomSheetController.getCurrentOffset() - mShadowHeight);
}
/**
* Shrink the visual viewport by {@code resizing} pixels. 0 will restore original size.
*
* Fork of {@code AssistantBottomBarCoordinator}. TODO(arbesser): refactor, share code.
*/
private void setVisualViewportResizing(int resizing) {
int currentInset = mInsetSupplier.get() != null ? mInsetSupplier.get() : 0;
if (resizing == currentInset || mWebContents == null
|| mWebContents.getRenderWidgetHostView() == null) {
return;
}
mInsetSupplier.set(resizing);
}
}
......@@ -24,6 +24,7 @@ import org.chromium.components.browser_ui.bottomsheet.BottomSheetController;
import org.chromium.content_public.browser.WebContents;
import org.chromium.ui.KeyboardVisibilityDelegate;
import org.chromium.ui.base.ActivityKeyboardVisibilityDelegate;
import org.chromium.ui.base.ApplicationViewportInsetSupplier;
import java.util.List;
import java.util.Map;
......@@ -53,8 +54,9 @@ public class AssistantTriggerScriptBridge {
*/
public void start(BottomSheetController bottomSheetController, Context context,
ActivityKeyboardVisibilityDelegate keyboardVisibilityDelegate,
@NonNull WebContents webContents, @NonNull String initialUrl,
Map<String, String> scriptParameters, String experimentIds, Delegate delegate) {
ApplicationViewportInsetSupplier bottomInsetProvider, @NonNull WebContents webContents,
@NonNull String initialUrl, Map<String, String> scriptParameters, String experimentIds,
Delegate delegate) {
mDelegate = delegate;
mContext = context;
mKeyboardVisibilityDelegate = keyboardVisibilityDelegate;
......@@ -82,7 +84,7 @@ public class AssistantTriggerScriptBridge {
webContents.getVisibleUrl().getSpec(),
AssistantCoordinator.FEEDBACK_CATEGORY_TAG);
}
}, bottomSheetController);
}, webContents, bottomSheetController, bottomInsetProvider);
if (mKeyboardVisibilityListener != null) {
mKeyboardVisibilityDelegate.removeKeyboardVisibilityListener(
......@@ -113,12 +115,13 @@ public class AssistantTriggerScriptBridge {
@CalledByNative
private void showTriggerScript(String[] cancelPopupMenuItems, int[] cancelPopupMenuActions,
List<AssistantChip> leftAlignedChips, int[] leftAlignedChipsActions,
List<AssistantChip> rightAlignedChips, int[] rightAlignedChipsActions) {
List<AssistantChip> rightAlignedChips, int[] rightAlignedChipsActions,
boolean resizeVisualViewport) {
// NOTE: the cancel popup menu must be set before the chips are bound.
mTriggerScript.setCancelPopupMenu(cancelPopupMenuItems, cancelPopupMenuActions);
mTriggerScript.setLeftAlignedChips(leftAlignedChips, leftAlignedChipsActions);
mTriggerScript.setRightAlignedChips(rightAlignedChips, rightAlignedChipsActions);
mTriggerScript.show();
mTriggerScript.show(resizeVisualViewport);
// A trigger script was displayed, users are no longer considered first-time users.
AutofillAssistantPreferencesUtil.setAutofillAssistantReturningLiteScriptUser();
......
......@@ -17,6 +17,7 @@ import org.chromium.chrome.browser.tab.Tab;
import org.chromium.components.browser_ui.bottomsheet.BottomSheetController;
import org.chromium.content_public.browser.WebContents;
import org.chromium.ui.base.ActivityKeyboardVisibilityDelegate;
import org.chromium.ui.base.ApplicationViewportInsetSupplier;
import java.util.ArrayList;
import java.util.Arrays;
......@@ -68,7 +69,8 @@ class TestingAutofillAssistantModuleEntryProvider extends AutofillAssistantModul
CompositorViewHolder compositorViewHolder, Context context,
@NonNull WebContents webContents,
ActivityKeyboardVisibilityDelegate keyboardVisibilityDelegate,
boolean skipOnboarding, boolean isChromeCustomTab, @NonNull String initialUrl,
ApplicationViewportInsetSupplier bottomInsetProvider, boolean skipOnboarding,
boolean isChromeCustomTab, @NonNull String initialUrl,
Map<String, String> parameters, String experimentIds,
@Nullable String callerAccount, @Nullable String userName) {}
......
......@@ -162,6 +162,7 @@ public class AutofillAssistantFacade {
activity.getBrowserControlsManager(),
activity.getCompositorViewHolder(), activity, tab.getWebContents(),
activity.getWindowAndroid().getKeyboardDelegate(),
activity.getWindowAndroid().getApplicationBottomInsetProvider(),
!AutofillAssistantPreferencesUtil.getShowOnboarding(),
activity instanceof CustomTabActivity, arguments.getInitialUrl(),
arguments.getParameters(), arguments.getExperimentIds(),
......
......@@ -16,6 +16,7 @@ import org.chromium.components.browser_ui.bottomsheet.BottomSheetController;
import org.chromium.components.module_installer.builder.ModuleInterface;
import org.chromium.content_public.browser.WebContents;
import org.chromium.ui.base.ActivityKeyboardVisibilityDelegate;
import org.chromium.ui.base.ApplicationViewportInsetSupplier;
import java.util.Map;
......@@ -35,7 +36,8 @@ interface AutofillAssistantModuleEntry {
void start(BottomSheetController bottomSheetController,
BrowserControlsStateProvider browserControls, CompositorViewHolder compositorViewHolder,
Context context, @NonNull WebContents webContents,
ActivityKeyboardVisibilityDelegate keyboardVisibilityDelegate, boolean skipOnboarding,
ActivityKeyboardVisibilityDelegate keyboardVisibilityDelegate,
ApplicationViewportInsetSupplier bottomInsetProvider, boolean skipOnboarding,
boolean isChromeCustomTab, @NonNull String initialUrl, Map<String, String> parameters,
String experimentIds, @Nullable String callerAccount, @Nullable String userName);
/**
......
......@@ -176,7 +176,8 @@ void TriggerScriptBridgeAndroid::OnTriggerScriptShown(
env, java_object_, ToJavaArrayOfStrings(env, cancel_popup_items),
ToJavaIntArray(env, cancel_popup_actions), jleft_aligned_chips,
ToJavaIntArray(env, left_aligned_chip_actions), jright_aligned_chips,
ToJavaIntArray(env, right_aligned_chip_actions));
ToJavaIntArray(env, right_aligned_chip_actions),
proto.resize_visual_viewport());
}
void TriggerScriptBridgeAndroid::OnTriggerScriptHidden() {
......
......@@ -571,6 +571,9 @@ message TriggerScriptUIProto {
// The status message to display when transitioning from this trigger script
// to the regular script.
optional string regular_script_loading_status_message = 7;
// Whether the visual viewport should be resized to allow scrolling to the
// bottom of the page while the trigger script is being displayed.
optional bool resize_visual_viewport = 8;
}
enum KeyboardValueFillStrategy {
......
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