Commit 409dab09 authored by Friedrich Horschig's avatar Friedrich Horschig Committed by Commit Bot

[Android] Fix Infobar ignoring hiding keyboard accessory

This CL ensures Infobars are listening to the keyboard when updating
their visibility. Before this CL, they were only listening to layout
changes (which is the indirect, less reliable way to achieve the same).

Bug: 907062
Change-Id: Ide81fd0c1712b8f22f4de0b4e5a3f2a4203d90af
Reviewed-on: https://chromium-review.googlesource.com/c/1346129
Commit-Queue: Friedrich Horschig [CET] <fhorschig@chromium.org>
Reviewed-by: default avatarMatthew Jones <mdjones@chromium.org>
Cr-Commit-Position: refs/heads/master@{#610378}
parent 0e26cf6d
...@@ -31,7 +31,6 @@ import org.chromium.chrome.browser.widget.bottomsheet.BottomSheet; ...@@ -31,7 +31,6 @@ import org.chromium.chrome.browser.widget.bottomsheet.BottomSheet;
import org.chromium.chrome.browser.widget.bottomsheet.BottomSheetObserver; import org.chromium.chrome.browser.widget.bottomsheet.BottomSheetObserver;
import org.chromium.chrome.browser.widget.bottomsheet.EmptyBottomSheetObserver; import org.chromium.chrome.browser.widget.bottomsheet.EmptyBottomSheetObserver;
import org.chromium.content_public.browser.WebContents; import org.chromium.content_public.browser.WebContents;
import org.chromium.ui.KeyboardVisibilityDelegate;
import org.chromium.ui.base.WindowAndroid; import org.chromium.ui.base.WindowAndroid;
import org.chromium.ui.display.DisplayAndroid; import org.chromium.ui.display.DisplayAndroid;
import org.chromium.ui.display.DisplayUtil; import org.chromium.ui.display.DisplayUtil;
...@@ -251,6 +250,9 @@ public class InfoBarContainer extends SwipableOverlayView implements UserData { ...@@ -251,6 +250,9 @@ public class InfoBarContainer extends SwipableOverlayView implements UserData {
mLayout.addAnimationListener(mIPHSupport); mLayout.addAnimationListener(mIPHSupport);
addObserver(mIPHSupport); addObserver(mIPHSupport);
mTab.getWindowAndroid().getKeyboardDelegate().addKeyboardVisibilityListener(
this::updateVisibilityForKeyboard);
// Chromium's InfoBarContainer may add an InfoBar immediately during this initialization // Chromium's InfoBarContainer may add an InfoBar immediately during this initialization
// call, so make sure everything in the InfoBarContainer is completely ready beforehand. // call, so make sure everything in the InfoBarContainer is completely ready beforehand.
mNativeInfoBarContainer = nativeInit(); mNativeInfoBarContainer = nativeInit();
...@@ -517,15 +519,10 @@ public class InfoBarContainer extends SwipableOverlayView implements UserData { ...@@ -517,15 +519,10 @@ public class InfoBarContainer extends SwipableOverlayView implements UserData {
} }
} }
@Override private void updateVisibilityForKeyboard(boolean isKeyboardShowing) {
protected void onLayout(boolean changed, int l, int t, int r, int b) {
// Hide the View when the keyboard is showing.
boolean isShowing = (getVisibility() == View.VISIBLE); boolean isShowing = (getVisibility() == View.VISIBLE);
if (KeyboardVisibilityDelegate.getInstance().isKeyboardShowing( if (isKeyboardShowing) {
getContext(), InfoBarContainer.this)) {
if (isShowing) { if (isShowing) {
// Set to invisible (instead of gone) so that onLayout() will be called when the
// keyboard is dismissed.
setVisibility(View.INVISIBLE); setVisibility(View.INVISIBLE);
} }
} else { } else {
...@@ -533,8 +530,6 @@ public class InfoBarContainer extends SwipableOverlayView implements UserData { ...@@ -533,8 +530,6 @@ public class InfoBarContainer extends SwipableOverlayView implements UserData {
setVisibility(View.VISIBLE); setVisibility(View.VISIBLE);
} }
} }
super.onLayout(changed, l, t, r, b);
} }
@Override @Override
......
...@@ -50,10 +50,10 @@ public class FakeKeyboard extends ChromeKeyboardVisibilityDelegate { ...@@ -50,10 +50,10 @@ public class FakeKeyboard extends ChromeKeyboardVisibilityDelegate {
@Override @Override
public void showKeyboard(View view) { public void showKeyboard(View view) {
boolean keyboardWasVisible = isKeyboardShowing(getActivity(), view); boolean keyboardWasVisible = mIsShowing;
mIsShowing = true; mIsShowing = true;
runOnUiThreadBlocking(() -> { runOnUiThreadBlocking(() -> {
if (!keyboardWasVisible) notifyListeners(mIsShowing); if (!keyboardWasVisible) notifyListeners(isKeyboardShowing(getActivity(), view));
// Pretend a layout change for components listening to the activity directly: // Pretend a layout change for components listening to the activity directly:
View contentView = getActivity().findViewById(android.R.id.content); View contentView = getActivity().findViewById(android.R.id.content);
ViewGroup.LayoutParams p = contentView.getLayoutParams(); ViewGroup.LayoutParams p = contentView.getLayoutParams();
...@@ -64,10 +64,10 @@ public class FakeKeyboard extends ChromeKeyboardVisibilityDelegate { ...@@ -64,10 +64,10 @@ public class FakeKeyboard extends ChromeKeyboardVisibilityDelegate {
@Override @Override
protected boolean hideAndroidSoftKeyboard(View view) { protected boolean hideAndroidSoftKeyboard(View view) {
boolean keyboardWasVisible = isKeyboardShowing(getActivity(), view); boolean keyboardWasVisible = mIsShowing;
mIsShowing = false; mIsShowing = false;
runOnUiThreadBlocking(() -> { runOnUiThreadBlocking(() -> {
if (keyboardWasVisible) notifyListeners(mIsShowing); if (keyboardWasVisible) notifyListeners(isKeyboardShowing(getActivity(), view));
// Pretend a layout change for components listening to the activity directly: // Pretend a layout change for components listening to the activity directly:
View contentView = getActivity().findViewById(android.R.id.content); View contentView = getActivity().findViewById(android.R.id.content);
ViewGroup.LayoutParams p = contentView.getLayoutParams(); ViewGroup.LayoutParams p = contentView.getLayoutParams();
......
...@@ -465,4 +465,39 @@ public class ManualFillingIntegrationTest { ...@@ -465,4 +465,39 @@ public class ManualFillingIntegrationTest {
mHelper.waitToBeHidden(withId(R.id.keyboard_accessory)); mHelper.waitToBeHidden(withId(R.id.keyboard_accessory));
onView(withText(kSnackbarText)).check(matches(isCompletelyDisplayed())); onView(withText(kSnackbarText)).check(matches(isCompletelyDisplayed()));
} }
@Test
@SmallTest
public void testInfobarReopensOnPressingBack()
throws InterruptedException, TimeoutException, ExecutionException {
mHelper.loadTestPage(false);
InfoBarTestAnimationListener listener = new InfoBarTestAnimationListener();
mActivityTestRule.getInfoBarContainer().addAnimationListener(listener);
final String kInfoBarText = "SomeInfoBar";
ThreadUtils.runOnUiThread(() -> {
SimpleConfirmInfoBarBuilder.create(mActivityTestRule.getActivity().getActivityTab(),
InfoBarIdentifier.DUPLICATE_DOWNLOAD_INFOBAR_DELEGATE_ANDROID, kInfoBarText,
false);
});
listener.addInfoBarAnimationFinished("InfoBar not added.");
mHelper.createTestTab();
assertThat(mActivityTestRule.getInfoBarContainer().getVisibility(), is(View.VISIBLE));
// Focus the field to bring up the accessory.
mHelper.clickPasswordField();
whenDisplayed(withId(R.id.tabs)).perform(selectTabAtPosition(0));
mHelper.waitForKeyboardToDisappear();
whenDisplayed(withChild(withId(R.id.keyboard_accessory_sheet)));
assertThat(mActivityTestRule.getInfoBarContainer().getVisibility(), is(not(View.VISIBLE)));
// Close the accessory using the back button. The Infobar should reappear.
Espresso.pressBack();
mHelper.waitToBeHidden(withChild(withId(R.id.keyboard_accessory_sheet)));
mHelper.waitToBeHidden(withId(R.id.keyboard_accessory));
whenDisplayed(withText(kInfoBarText));
}
} }
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