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; ...@@ -30,6 +30,7 @@ import org.chromium.chrome.browser.signin.UnifiedConsentServiceBridge;
import org.chromium.components.browser_ui.bottomsheet.BottomSheetController; import org.chromium.components.browser_ui.bottomsheet.BottomSheetController;
import org.chromium.content_public.browser.WebContents; import org.chromium.content_public.browser.WebContents;
import org.chromium.ui.base.ActivityKeyboardVisibilityDelegate; import org.chromium.ui.base.ActivityKeyboardVisibilityDelegate;
import org.chromium.ui.base.ApplicationViewportInsetSupplier;
import java.util.Map; import java.util.Map;
...@@ -43,7 +44,8 @@ public class AutofillAssistantModuleEntryImpl implements AutofillAssistantModule ...@@ -43,7 +44,8 @@ public class AutofillAssistantModuleEntryImpl implements AutofillAssistantModule
public void start(BottomSheetController bottomSheetController, public void start(BottomSheetController bottomSheetController,
BrowserControlsStateProvider browserControls, CompositorViewHolder compositorViewHolder, BrowserControlsStateProvider browserControls, CompositorViewHolder compositorViewHolder,
Context context, @NonNull WebContents webContents, Context context, @NonNull WebContents webContents,
ActivityKeyboardVisibilityDelegate keyboardVisibilityDelegate, boolean skipOnboarding, ActivityKeyboardVisibilityDelegate keyboardVisibilityDelegate,
ApplicationViewportInsetSupplier bottomInsetProvider, boolean skipOnboarding,
boolean isChromeCustomTab, @NonNull String initialUrl, Map<String, String> parameters, boolean isChromeCustomTab, @NonNull String initialUrl, Map<String, String> parameters,
String experimentIds, @Nullable String callerAccount, @Nullable String userName) { String experimentIds, @Nullable String callerAccount, @Nullable String userName) {
if (shouldStartTriggerScript(parameters)) { if (shouldStartTriggerScript(parameters)) {
...@@ -64,8 +66,8 @@ public class AutofillAssistantModuleEntryImpl implements AutofillAssistantModule ...@@ -64,8 +66,8 @@ public class AutofillAssistantModuleEntryImpl implements AutofillAssistantModule
AssistantTriggerScriptBridge triggerScriptBridge = AssistantTriggerScriptBridge triggerScriptBridge =
new AssistantTriggerScriptBridge(); new AssistantTriggerScriptBridge();
triggerScriptBridge.start(bottomSheetController, context, triggerScriptBridge.start(bottomSheetController, context,
keyboardVisibilityDelegate, webContents, initialUrl, parameters, keyboardVisibilityDelegate, bottomInsetProvider, webContents, initialUrl,
experimentIds, new AssistantTriggerScriptBridge.Delegate() { parameters, experimentIds, new AssistantTriggerScriptBridge.Delegate() {
@Override @Override
public void onTriggerScriptFinished( public void onTriggerScriptFinished(
@LiteScriptFinishedState int finishedState) { @LiteScriptFinishedState int finishedState) {
......
...@@ -14,6 +14,7 @@ import android.widget.Space; ...@@ -14,6 +14,7 @@ import android.widget.Space;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.annotation.VisibleForTesting; import androidx.annotation.VisibleForTesting;
import org.chromium.base.supplier.ObservableSupplierImpl;
import org.chromium.chrome.autofill_assistant.R; import org.chromium.chrome.autofill_assistant.R;
import org.chromium.chrome.browser.autofill_assistant.AssistantBottomBarDelegate; import org.chromium.chrome.browser.autofill_assistant.AssistantBottomBarDelegate;
import org.chromium.chrome.browser.autofill_assistant.AssistantBottomSheetContent; import org.chromium.chrome.browser.autofill_assistant.AssistantBottomSheetContent;
...@@ -24,10 +25,13 @@ import org.chromium.chrome.browser.autofill_assistant.carousel.AssistantChipView ...@@ -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.generic_ui.AssistantDimension;
import org.chromium.chrome.browser.autofill_assistant.header.AssistantHeaderCoordinator; import org.chromium.chrome.browser.autofill_assistant.header.AssistantHeaderCoordinator;
import org.chromium.chrome.browser.autofill_assistant.header.AssistantHeaderModel; 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;
import org.chromium.components.browser_ui.bottomsheet.BottomSheetController.StateChangeReason; import org.chromium.components.browser_ui.bottomsheet.BottomSheetController.StateChangeReason;
import org.chromium.components.browser_ui.bottomsheet.BottomSheetObserver; import org.chromium.components.browser_ui.bottomsheet.BottomSheetObserver;
import org.chromium.components.browser_ui.bottomsheet.EmptyBottomSheetObserver; 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.ArrayList;
import java.util.List; import java.util.List;
...@@ -48,13 +52,20 @@ public class AssistantTriggerScript { ...@@ -48,13 +52,20 @@ public class AssistantTriggerScript {
private AssistantBottomSheetContent mContent; private AssistantBottomSheetContent mContent;
private final Context mContext; private final Context mContext;
private final Delegate mDelegate; private final Delegate mDelegate;
private final WebContents mWebContents;
private final BottomSheetController mBottomSheetController; private final BottomSheetController mBottomSheetController;
private final BottomSheetObserver mBottomSheetObserver; private final BottomSheetObserver mBottomSheetObserver;
private final ObservableSupplierImpl<Integer> mInsetSupplier = new ObservableSupplierImpl<>();
private final ApplicationViewportInsetSupplier mApplicationViewportInsetSupplier;
private AssistantHeaderCoordinator mHeaderCoordinator; private AssistantHeaderCoordinator mHeaderCoordinator;
private final AssistantHeaderModel mHeaderModel = new AssistantHeaderModel(); private final AssistantHeaderModel mHeaderModel = new AssistantHeaderModel();
private LinearLayout mChipsContainer; private LinearLayout mChipsContainer;
private final int mInnerChipSpacing; 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> mLeftAlignedChips = new ArrayList<>();
private final List<AssistantChip> mRightAlignedChips = new ArrayList<>(); private final List<AssistantChip> mRightAlignedChips = new ArrayList<>();
...@@ -64,12 +75,16 @@ public class AssistantTriggerScript { ...@@ -64,12 +75,16 @@ public class AssistantTriggerScript {
private boolean mAnimateBottomSheet = true; private boolean mAnimateBottomSheet = true;
public AssistantTriggerScript( public AssistantTriggerScript(Context context, Delegate delegate, WebContents webContents,
Context context, Delegate delegate, BottomSheetController controller) { BottomSheetController controller,
ApplicationViewportInsetSupplier applicationViewportInsetSupplier) {
assert delegate != null; assert delegate != null;
mContext = context; mContext = context;
mDelegate = delegate; mDelegate = delegate;
mWebContents = webContents;
mBottomSheetController = controller; mBottomSheetController = controller;
mApplicationViewportInsetSupplier = applicationViewportInsetSupplier;
mApplicationViewportInsetSupplier.addSupplier(mInsetSupplier);
mBottomSheetObserver = new EmptyBottomSheetObserver() { mBottomSheetObserver = new EmptyBottomSheetObserver() {
@Override @Override
public void onSheetClosed(@StateChangeReason int reason) { public void onSheetClosed(@StateChangeReason int reason) {
...@@ -77,9 +92,23 @@ public class AssistantTriggerScript { ...@@ -77,9 +92,23 @@ public class AssistantTriggerScript {
mDelegate.onBottomSheetClosedWithSwipe(); 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( mInnerChipSpacing = mContext.getResources().getDimensionPixelSize(
R.dimen.autofill_assistant_actions_spacing); R.dimen.autofill_assistant_actions_spacing);
mShadowHeight = mContext.getResources().getDimensionPixelSize(
R.dimen.bottom_sheet_toolbar_shadow_height);
mHeaderModel.set( mHeaderModel.set(
AssistantHeaderModel.FEEDBACK_BUTTON_CALLBACK, mDelegate::onFeedbackButtonClicked); AssistantHeaderModel.FEEDBACK_BUTTON_CALLBACK, mDelegate::onFeedbackButtonClicked);
} }
...@@ -130,6 +159,7 @@ public class AssistantTriggerScript { ...@@ -130,6 +159,7 @@ public class AssistantTriggerScript {
public void destroy() { public void destroy() {
mBottomSheetController.removeObserver(mBottomSheetObserver); mBottomSheetController.removeObserver(mBottomSheetObserver);
mHeaderCoordinator.destroy(); mHeaderCoordinator.destroy();
mApplicationViewportInsetSupplier.removeSupplier(mInsetSupplier);
} }
@VisibleForTesting @VisibleForTesting
...@@ -216,7 +246,8 @@ public class AssistantTriggerScript { ...@@ -216,7 +246,8 @@ public class AssistantTriggerScript {
addChipsToContainer(mChipsContainer, mRightAlignedChips); addChipsToContainer(mChipsContainer, mRightAlignedChips);
} }
public void show() { public void show(boolean resizeVisualViewport) {
mResizeVisualViewport = resizeVisualViewport;
createBottomSheetContents(); createBottomSheetContents();
update(); update();
mBottomSheetController.removeObserver(mBottomSheetObserver); mBottomSheetController.removeObserver(mBottomSheetObserver);
...@@ -228,5 +259,33 @@ public class AssistantTriggerScript { ...@@ -228,5 +259,33 @@ public class AssistantTriggerScript {
public void hide() { public void hide() {
mBottomSheetController.removeObserver(mBottomSheetObserver); mBottomSheetController.removeObserver(mBottomSheetObserver);
mBottomSheetController.hideContent(mContent, /* animate = */ mAnimateBottomSheet); 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; ...@@ -24,6 +24,7 @@ import org.chromium.components.browser_ui.bottomsheet.BottomSheetController;
import org.chromium.content_public.browser.WebContents; import org.chromium.content_public.browser.WebContents;
import org.chromium.ui.KeyboardVisibilityDelegate; import org.chromium.ui.KeyboardVisibilityDelegate;
import org.chromium.ui.base.ActivityKeyboardVisibilityDelegate; import org.chromium.ui.base.ActivityKeyboardVisibilityDelegate;
import org.chromium.ui.base.ApplicationViewportInsetSupplier;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
...@@ -53,8 +54,9 @@ public class AssistantTriggerScriptBridge { ...@@ -53,8 +54,9 @@ public class AssistantTriggerScriptBridge {
*/ */
public void start(BottomSheetController bottomSheetController, Context context, public void start(BottomSheetController bottomSheetController, Context context,
ActivityKeyboardVisibilityDelegate keyboardVisibilityDelegate, ActivityKeyboardVisibilityDelegate keyboardVisibilityDelegate,
@NonNull WebContents webContents, @NonNull String initialUrl, ApplicationViewportInsetSupplier bottomInsetProvider, @NonNull WebContents webContents,
Map<String, String> scriptParameters, String experimentIds, Delegate delegate) { @NonNull String initialUrl, Map<String, String> scriptParameters, String experimentIds,
Delegate delegate) {
mDelegate = delegate; mDelegate = delegate;
mContext = context; mContext = context;
mKeyboardVisibilityDelegate = keyboardVisibilityDelegate; mKeyboardVisibilityDelegate = keyboardVisibilityDelegate;
...@@ -82,7 +84,7 @@ public class AssistantTriggerScriptBridge { ...@@ -82,7 +84,7 @@ public class AssistantTriggerScriptBridge {
webContents.getVisibleUrl().getSpec(), webContents.getVisibleUrl().getSpec(),
AssistantCoordinator.FEEDBACK_CATEGORY_TAG); AssistantCoordinator.FEEDBACK_CATEGORY_TAG);
} }
}, bottomSheetController); }, webContents, bottomSheetController, bottomInsetProvider);
if (mKeyboardVisibilityListener != null) { if (mKeyboardVisibilityListener != null) {
mKeyboardVisibilityDelegate.removeKeyboardVisibilityListener( mKeyboardVisibilityDelegate.removeKeyboardVisibilityListener(
...@@ -113,12 +115,13 @@ public class AssistantTriggerScriptBridge { ...@@ -113,12 +115,13 @@ public class AssistantTriggerScriptBridge {
@CalledByNative @CalledByNative
private void showTriggerScript(String[] cancelPopupMenuItems, int[] cancelPopupMenuActions, private void showTriggerScript(String[] cancelPopupMenuItems, int[] cancelPopupMenuActions,
List<AssistantChip> leftAlignedChips, int[] leftAlignedChipsActions, 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. // NOTE: the cancel popup menu must be set before the chips are bound.
mTriggerScript.setCancelPopupMenu(cancelPopupMenuItems, cancelPopupMenuActions); mTriggerScript.setCancelPopupMenu(cancelPopupMenuItems, cancelPopupMenuActions);
mTriggerScript.setLeftAlignedChips(leftAlignedChips, leftAlignedChipsActions); mTriggerScript.setLeftAlignedChips(leftAlignedChips, leftAlignedChipsActions);
mTriggerScript.setRightAlignedChips(rightAlignedChips, rightAlignedChipsActions); mTriggerScript.setRightAlignedChips(rightAlignedChips, rightAlignedChipsActions);
mTriggerScript.show(); mTriggerScript.show(resizeVisualViewport);
// A trigger script was displayed, users are no longer considered first-time users. // A trigger script was displayed, users are no longer considered first-time users.
AutofillAssistantPreferencesUtil.setAutofillAssistantReturningLiteScriptUser(); AutofillAssistantPreferencesUtil.setAutofillAssistantReturningLiteScriptUser();
......
...@@ -17,6 +17,7 @@ import org.chromium.chrome.browser.tab.Tab; ...@@ -17,6 +17,7 @@ import org.chromium.chrome.browser.tab.Tab;
import org.chromium.components.browser_ui.bottomsheet.BottomSheetController; import org.chromium.components.browser_ui.bottomsheet.BottomSheetController;
import org.chromium.content_public.browser.WebContents; import org.chromium.content_public.browser.WebContents;
import org.chromium.ui.base.ActivityKeyboardVisibilityDelegate; import org.chromium.ui.base.ActivityKeyboardVisibilityDelegate;
import org.chromium.ui.base.ApplicationViewportInsetSupplier;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
...@@ -68,7 +69,8 @@ class TestingAutofillAssistantModuleEntryProvider extends AutofillAssistantModul ...@@ -68,7 +69,8 @@ class TestingAutofillAssistantModuleEntryProvider extends AutofillAssistantModul
CompositorViewHolder compositorViewHolder, Context context, CompositorViewHolder compositorViewHolder, Context context,
@NonNull WebContents webContents, @NonNull WebContents webContents,
ActivityKeyboardVisibilityDelegate keyboardVisibilityDelegate, ActivityKeyboardVisibilityDelegate keyboardVisibilityDelegate,
boolean skipOnboarding, boolean isChromeCustomTab, @NonNull String initialUrl, ApplicationViewportInsetSupplier bottomInsetProvider, boolean skipOnboarding,
boolean isChromeCustomTab, @NonNull String initialUrl,
Map<String, String> parameters, String experimentIds, Map<String, String> parameters, String experimentIds,
@Nullable String callerAccount, @Nullable String userName) {} @Nullable String callerAccount, @Nullable String userName) {}
......
...@@ -162,6 +162,7 @@ public class AutofillAssistantFacade { ...@@ -162,6 +162,7 @@ public class AutofillAssistantFacade {
activity.getBrowserControlsManager(), activity.getBrowserControlsManager(),
activity.getCompositorViewHolder(), activity, tab.getWebContents(), activity.getCompositorViewHolder(), activity, tab.getWebContents(),
activity.getWindowAndroid().getKeyboardDelegate(), activity.getWindowAndroid().getKeyboardDelegate(),
activity.getWindowAndroid().getApplicationBottomInsetProvider(),
!AutofillAssistantPreferencesUtil.getShowOnboarding(), !AutofillAssistantPreferencesUtil.getShowOnboarding(),
activity instanceof CustomTabActivity, arguments.getInitialUrl(), activity instanceof CustomTabActivity, arguments.getInitialUrl(),
arguments.getParameters(), arguments.getExperimentIds(), arguments.getParameters(), arguments.getExperimentIds(),
......
...@@ -16,6 +16,7 @@ import org.chromium.components.browser_ui.bottomsheet.BottomSheetController; ...@@ -16,6 +16,7 @@ import org.chromium.components.browser_ui.bottomsheet.BottomSheetController;
import org.chromium.components.module_installer.builder.ModuleInterface; import org.chromium.components.module_installer.builder.ModuleInterface;
import org.chromium.content_public.browser.WebContents; import org.chromium.content_public.browser.WebContents;
import org.chromium.ui.base.ActivityKeyboardVisibilityDelegate; import org.chromium.ui.base.ActivityKeyboardVisibilityDelegate;
import org.chromium.ui.base.ApplicationViewportInsetSupplier;
import java.util.Map; import java.util.Map;
...@@ -35,7 +36,8 @@ interface AutofillAssistantModuleEntry { ...@@ -35,7 +36,8 @@ interface AutofillAssistantModuleEntry {
void start(BottomSheetController bottomSheetController, void start(BottomSheetController bottomSheetController,
BrowserControlsStateProvider browserControls, CompositorViewHolder compositorViewHolder, BrowserControlsStateProvider browserControls, CompositorViewHolder compositorViewHolder,
Context context, @NonNull WebContents webContents, Context context, @NonNull WebContents webContents,
ActivityKeyboardVisibilityDelegate keyboardVisibilityDelegate, boolean skipOnboarding, ActivityKeyboardVisibilityDelegate keyboardVisibilityDelegate,
ApplicationViewportInsetSupplier bottomInsetProvider, boolean skipOnboarding,
boolean isChromeCustomTab, @NonNull String initialUrl, Map<String, String> parameters, boolean isChromeCustomTab, @NonNull String initialUrl, Map<String, String> parameters,
String experimentIds, @Nullable String callerAccount, @Nullable String userName); String experimentIds, @Nullable String callerAccount, @Nullable String userName);
/** /**
......
...@@ -176,7 +176,8 @@ void TriggerScriptBridgeAndroid::OnTriggerScriptShown( ...@@ -176,7 +176,8 @@ void TriggerScriptBridgeAndroid::OnTriggerScriptShown(
env, java_object_, ToJavaArrayOfStrings(env, cancel_popup_items), env, java_object_, ToJavaArrayOfStrings(env, cancel_popup_items),
ToJavaIntArray(env, cancel_popup_actions), jleft_aligned_chips, ToJavaIntArray(env, cancel_popup_actions), jleft_aligned_chips,
ToJavaIntArray(env, left_aligned_chip_actions), jright_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() { void TriggerScriptBridgeAndroid::OnTriggerScriptHidden() {
......
...@@ -571,6 +571,9 @@ message TriggerScriptUIProto { ...@@ -571,6 +571,9 @@ message TriggerScriptUIProto {
// The status message to display when transitioning from this trigger script // The status message to display when transitioning from this trigger script
// to the regular script. // to the regular script.
optional string regular_script_loading_status_message = 7; 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 { 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