Skip to content

Commit 53616ad

Browse files
committed
[SearchBar] Add cutout insets to SearchView toolbar
PiperOrigin-RevId: 745270784
1 parent 1eaf483 commit 53616ad

File tree

2 files changed

+53
-24
lines changed

2 files changed

+53
-24
lines changed

lib/java/com/google/android/material/search/SearchView.java

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@
6161
import androidx.annotation.StyleRes;
6262
import androidx.annotation.VisibleForTesting;
6363
import androidx.coordinatorlayout.widget.CoordinatorLayout;
64+
import androidx.core.graphics.Insets;
6465
import androidx.core.graphics.drawable.DrawableCompat;
6566
import androidx.core.view.ViewCompat;
6667
import androidx.core.view.WindowInsetsCompat;
@@ -511,9 +512,13 @@ private void setUpToolbarInsetListener() {
511512
boolean isRtl = ViewUtils.isLayoutRtl(toolbar);
512513
int paddingLeft = isRtl ? initialPadding.end : initialPadding.start;
513514
int paddingRight = isRtl ? initialPadding.start : initialPadding.end;
514-
toolbar.setPadding(
515-
paddingLeft + insets.getSystemWindowInsetLeft(), initialPadding.top,
516-
paddingRight + insets.getSystemWindowInsetRight(), initialPadding.bottom);
515+
Insets systemBarCutoutInsets =
516+
insets.getInsets(
517+
WindowInsetsCompat.Type.systemBars() | WindowInsetsCompat.Type.displayCutout());
518+
paddingLeft += systemBarCutoutInsets.left;
519+
paddingRight += systemBarCutoutInsets.right;
520+
521+
toolbar.setPadding(paddingLeft, initialPadding.top, paddingRight, initialPadding.bottom);
517522
return insets;
518523
});
519524
}
@@ -526,7 +531,11 @@ private void setUpStatusBarSpacerInsetListener() {
526531
ViewCompat.setOnApplyWindowInsetsListener(
527532
statusBarSpacer,
528533
(v, insets) -> {
529-
int systemWindowInsetTop = insets.getSystemWindowInsetTop();
534+
int systemWindowInsetTop =
535+
insets.getInsets(
536+
WindowInsetsCompat.Type.systemBars()
537+
| WindowInsetsCompat.Type.displayCutout())
538+
.top;
530539
setUpStatusBarSpacer(systemWindowInsetTop);
531540
if (!statusBarSpacerEnabledOverride) {
532541
setStatusBarSpacerEnabledInternal(systemWindowInsetTop > 0);
@@ -542,8 +551,11 @@ private void setUpDividerInsetListener() {
542551
ViewCompat.setOnApplyWindowInsetsListener(
543552
divider,
544553
(v, insets) -> {
545-
layoutParams.leftMargin = leftMargin + insets.getSystemWindowInsetLeft();
546-
layoutParams.rightMargin = rightMargin + insets.getSystemWindowInsetRight();
554+
Insets systemBarCutoutInsets =
555+
insets.getInsets(
556+
WindowInsetsCompat.Type.systemBars() | WindowInsetsCompat.Type.displayCutout());
557+
layoutParams.leftMargin = leftMargin + systemBarCutoutInsets.left;
558+
layoutParams.rightMargin = rightMargin + systemBarCutoutInsets.right;
547559
return insets;
548560
});
549561
}

lib/java/com/google/android/material/search/SearchViewAnimationHelper.java

Lines changed: 35 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -434,17 +434,19 @@ private AnimatorSet getButtonsTranslationAnimator(boolean show) {
434434
}
435435

436436
private void addBackButtonTranslationAnimatorIfNeeded(AnimatorSet animatorSet) {
437-
ImageButton backButton = ToolbarUtils.getNavigationIconButton(toolbar);
438-
if (backButton == null) {
437+
ImageButton searchViewBackButton = ToolbarUtils.getNavigationIconButton(toolbar);
438+
if (searchViewBackButton == null) {
439439
return;
440440
}
441+
ImageButton searchBarBackButton = ToolbarUtils.getNavigationIconButton(searchBar);
441442

442443
ValueAnimator backButtonAnimatorX =
443-
ValueAnimator.ofFloat(getFromTranslationXStart(backButton), 0);
444-
backButtonAnimatorX.addUpdateListener(MultiViewUpdateListener.translationXListener(backButton));
444+
ValueAnimator.ofFloat(
445+
getTranslationXBetweenViews(searchBarBackButton, searchViewBackButton), 0);
446+
backButtonAnimatorX.addUpdateListener(MultiViewUpdateListener.translationXListener(searchViewBackButton));
445447

446448
ValueAnimator backButtonAnimatorY = ValueAnimator.ofFloat(getFromTranslationY(), 0);
447-
backButtonAnimatorY.addUpdateListener(MultiViewUpdateListener.translationYListener(backButton));
449+
backButtonAnimatorY.addUpdateListener(MultiViewUpdateListener.translationYListener(searchViewBackButton));
448450

449451
animatorSet.playTogether(backButtonAnimatorX, backButtonAnimatorY);
450452
}
@@ -508,19 +510,21 @@ private void setFullDrawableProgressIfNeeded(Drawable drawable) {
508510
}
509511

510512
private void addActionMenuViewAnimatorIfNeeded(AnimatorSet animatorSet) {
511-
ActionMenuView actionMenuView = ToolbarUtils.getActionMenuView(toolbar);
512-
if (actionMenuView == null) {
513+
ActionMenuView searchViewActionMenuView = ToolbarUtils.getActionMenuView(toolbar);
514+
if (searchViewActionMenuView == null) {
513515
return;
514516
}
517+
ActionMenuView searchBarActionMenuView = ToolbarUtils.getActionMenuView(searchBar);
515518

516519
ValueAnimator actionMenuViewAnimatorX =
517-
ValueAnimator.ofFloat(getFromTranslationXEnd(actionMenuView), 0);
520+
ValueAnimator.ofFloat(
521+
getTranslationXBetweenViews(searchBarActionMenuView, searchViewActionMenuView), 0);
518522
actionMenuViewAnimatorX.addUpdateListener(
519-
MultiViewUpdateListener.translationXListener(actionMenuView));
523+
MultiViewUpdateListener.translationXListener(searchViewActionMenuView));
520524

521525
ValueAnimator actionMenuViewAnimatorY = ValueAnimator.ofFloat(getFromTranslationY(), 0);
522526
actionMenuViewAnimatorY.addUpdateListener(
523-
MultiViewUpdateListener.translationYListener(actionMenuView));
527+
MultiViewUpdateListener.translationYListener(searchViewActionMenuView));
524528

525529
animatorSet.playTogether(actionMenuViewAnimatorX, actionMenuViewAnimatorY);
526530
}
@@ -663,19 +667,32 @@ private Animator getTranslationAnimator(boolean show, View view, int startX, int
663667
return animatorSet;
664668
}
665669

666-
private int getFromTranslationXStart(View view) {
667-
int marginStart = ((MarginLayoutParams) view.getLayoutParams()).getMarginStart();
668-
int paddingStart = searchBar.getPaddingStart();
669-
return ViewUtils.isLayoutRtl(searchBar)
670-
? searchBar.getWidth() - searchBar.getRight() + marginStart - paddingStart
671-
: searchBar.getLeft() - marginStart + paddingStart;
670+
private int getTranslationXBetweenViews(
671+
@Nullable View searchBarSubView, @NonNull View searchViewSubView) {
672+
// If there is no equivalent for the SearchView subview in the SearchBar, we return the
673+
// translation between the SearchBar and the start of the SearchView subview
674+
if (searchBarSubView == null) {
675+
int marginStart = ((MarginLayoutParams) searchViewSubView.getLayoutParams()).getMarginStart();
676+
int paddingStart = searchBar.getPaddingStart();
677+
int searchBarLeft = getViewLeftFromSearchViewParent(searchBar);
678+
return ViewUtils.isLayoutRtl(searchBar)
679+
? searchBarLeft
680+
+ searchBar.getWidth()
681+
+ marginStart
682+
- paddingStart
683+
- searchView.getRight()
684+
: (searchBarLeft - marginStart + paddingStart);
685+
}
686+
return getViewLeftFromSearchViewParent(searchBarSubView)
687+
- getViewLeftFromSearchViewParent(searchViewSubView);
672688
}
673689

674690
private int getFromTranslationXEnd(View view) {
675691
int marginEnd = ((MarginLayoutParams) view.getLayoutParams()).getMarginEnd();
692+
int viewLeft = getViewLeftFromSearchViewParent(searchBar);
676693
return ViewUtils.isLayoutRtl(searchBar)
677-
? searchBar.getLeft() - marginEnd
678-
: searchBar.getRight() - searchView.getWidth() + marginEnd;
694+
? viewLeft - marginEnd
695+
: viewLeft + searchBar.getWidth() + marginEnd - searchView.getWidth();
679696
}
680697

681698
private int getFromTranslationY() {

0 commit comments

Comments
 (0)