Skip to content

Commit 501ef8e

Browse files
ianhanniballakeveganafro
authored andcommitted
[NavigationRailView] Update inset handling for Navigation Rail & Bottom Nav
Resolves #2253 GIT_ORIGIN_REV_ID=b6c2270b8855e38231c29cbfd48949afd785258c PiperOrigin-RevId: 383632982
1 parent 4044183 commit 501ef8e

File tree

3 files changed

+68
-34
lines changed

3 files changed

+68
-34
lines changed

lib/java/com/google/android/material/bottomnavigation/BottomNavigationView.java

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@
2323

2424
import android.content.Context;
2525
import android.os.Build.VERSION;
26+
import androidx.core.view.ViewCompat;
27+
import androidx.core.view.WindowInsetsCompat;
2628
import androidx.appcompat.widget.TintTypedArray;
2729
import android.util.AttributeSet;
2830
import android.view.View;
@@ -35,6 +37,8 @@
3537
import androidx.core.content.ContextCompat;
3638
import com.google.android.material.behavior.HideBottomViewOnScrollBehavior;
3739
import com.google.android.material.internal.ThemeEnforcement;
40+
import com.google.android.material.internal.ViewUtils;
41+
import com.google.android.material.internal.ViewUtils.RelativePadding;
3842
import com.google.android.material.navigation.NavigationBarMenuView;
3943
import com.google.android.material.navigation.NavigationBarView;
4044
import com.google.android.material.shape.MaterialShapeDrawable;
@@ -125,6 +129,33 @@ public BottomNavigationView(
125129
if (shouldDrawCompatibilityTopDivider()) {
126130
addCompatibilityTopDivider(context);
127131
}
132+
133+
applyWindowInsets();
134+
}
135+
136+
private void applyWindowInsets() {
137+
ViewUtils.doOnApplyWindowInsets(
138+
this,
139+
new ViewUtils.OnApplyWindowInsetsListener() {
140+
@NonNull
141+
@Override
142+
public WindowInsetsCompat onApplyWindowInsets(
143+
View view,
144+
@NonNull WindowInsetsCompat insets,
145+
@NonNull RelativePadding initialPadding) {
146+
// Apply the bottom, start, and end padding for a BottomNavigationView
147+
// to dodge the system navigation bar
148+
initialPadding.bottom += insets.getSystemWindowInsetBottom();
149+
150+
boolean isRtl = ViewCompat.getLayoutDirection(view) == ViewCompat.LAYOUT_DIRECTION_RTL;
151+
int systemWindowInsetLeft = insets.getSystemWindowInsetLeft();
152+
int systemWindowInsetRight = insets.getSystemWindowInsetRight();
153+
initialPadding.start += isRtl ? systemWindowInsetRight : systemWindowInsetLeft;
154+
initialPadding.end += isRtl ? systemWindowInsetLeft : systemWindowInsetRight;
155+
initialPadding.applyToView(view);
156+
return insets;
157+
}
158+
});
128159
}
129160

130161
@Override

lib/java/com/google/android/material/navigation/NavigationBarView.java

Lines changed: 3 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,6 @@
4444
import android.view.Menu;
4545
import android.view.MenuInflater;
4646
import android.view.MenuItem;
47-
import android.view.View;
4847
import android.widget.FrameLayout;
4948
import androidx.annotation.AttrRes;
5049
import androidx.annotation.DimenRes;
@@ -60,8 +59,6 @@
6059
import androidx.customview.view.AbsSavedState;
6160
import com.google.android.material.badge.BadgeDrawable;
6261
import com.google.android.material.internal.ThemeEnforcement;
63-
import com.google.android.material.internal.ViewUtils;
64-
import com.google.android.material.internal.ViewUtils.RelativePadding;
6562
import com.google.android.material.resources.MaterialResources;
6663
import com.google.android.material.ripple.RippleUtils;
6764
import com.google.android.material.shape.MaterialShapeDrawable;
@@ -242,7 +239,8 @@ public NavigationBarView(
242239
if (activeIndicatorStyleResId != 0) {
243240
setItemActiveIndicatorEnabled(true);
244241

245-
@SuppressLint("CustomViewStyleable") TypedArray activeIndicatorAttributes =
242+
@SuppressLint("CustomViewStyleable")
243+
TypedArray activeIndicatorAttributes =
246244
context.obtainStyledAttributes(
247245
activeIndicatorStyleResId, R.styleable.NavigationBarActiveIndicator);
248246

@@ -300,32 +298,6 @@ public boolean onMenuItemSelected(MenuBuilder menu, @NonNull MenuItem item) {
300298
@Override
301299
public void onMenuModeChange(MenuBuilder menu) {}
302300
});
303-
304-
applyWindowInsets();
305-
}
306-
307-
private void applyWindowInsets() {
308-
ViewUtils.doOnApplyWindowInsets(
309-
this,
310-
new ViewUtils.OnApplyWindowInsetsListener() {
311-
@NonNull
312-
@Override
313-
public androidx.core.view.WindowInsetsCompat onApplyWindowInsets(
314-
View view,
315-
@NonNull androidx.core.view.WindowInsetsCompat insets,
316-
@NonNull RelativePadding initialPadding) {
317-
// Window insets may add additional padding, e.g., to dodge the system navigation bar
318-
initialPadding.bottom += insets.getSystemWindowInsetBottom();
319-
320-
boolean isRtl = ViewCompat.getLayoutDirection(view) == ViewCompat.LAYOUT_DIRECTION_RTL;
321-
int systemWindowInsetLeft = insets.getSystemWindowInsetLeft();
322-
int systemWindowInsetRight = insets.getSystemWindowInsetRight();
323-
initialPadding.start += isRtl ? systemWindowInsetRight : systemWindowInsetLeft;
324-
initialPadding.end += isRtl ? systemWindowInsetLeft : systemWindowInsetRight;
325-
initialPadding.applyToView(view);
326-
return insets;
327-
}
328-
});
329301
}
330302

331303
@NonNull
@@ -701,7 +673,7 @@ public int getItemActiveIndicatorMarginHorizontal() {
701673
*
702674
* @param horizontalMargin The horizontal margin, in pixels.
703675
*/
704-
public void setItemActiveIndicatorMarginHorizontal(@Px int horizontalMargin) {
676+
public void setItemActiveIndicatorMarginHorizontal(@Px int horizontalMargin) {
705677
menuView.setItemActiveIndicatorMarginHorizontal(horizontalMargin);
706678
}
707679

lib/java/com/google/android/material/navigationrail/NavigationRailView.java

Lines changed: 34 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@
2424

2525
import android.content.Context;
2626
import android.content.res.Resources;
27+
import androidx.core.view.ViewCompat;
28+
import androidx.core.view.WindowInsetsCompat;
2729
import androidx.appcompat.widget.TintTypedArray;
2830
import android.util.AttributeSet;
2931
import android.view.Gravity;
@@ -35,6 +37,8 @@
3537
import androidx.annotation.Nullable;
3638
import androidx.annotation.RestrictTo;
3739
import com.google.android.material.internal.ThemeEnforcement;
40+
import com.google.android.material.internal.ViewUtils;
41+
import com.google.android.material.internal.ViewUtils.RelativePadding;
3842
import com.google.android.material.navigation.NavigationBarView;
3943

4044
/**
@@ -50,9 +54,9 @@
5054
* be used for programmatically selecting which destination is currently active. It can be done
5155
* using {@code MenuItem#setChecked(true)}.
5256
*
53-
* <p>A header view (such as a
54-
* {@link com.google.android.material.floatingactionbutton.FloatingActionButton}, logo, etc.) can be
55-
* added with the {@code app:headerLayout} attribute or by using {@link #addHeaderView}.
57+
* <p>A header view (such as a {@link
58+
* com.google.android.material.floatingactionbutton.FloatingActionButton}, logo, etc.) can be added
59+
* with the {@code app:headerLayout} attribute or by using {@link #addHeaderView}.
5660
*
5761
* <pre>
5862
* layout resource file:
@@ -134,6 +138,33 @@ public NavigationRailView(
134138
setMenuGravity(
135139
attributes.getInt(R.styleable.NavigationRailView_menuGravity, DEFAULT_MENU_GRAVITY));
136140
attributes.recycle();
141+
142+
applyWindowInsets();
143+
}
144+
145+
private void applyWindowInsets() {
146+
ViewUtils.doOnApplyWindowInsets(
147+
this,
148+
new ViewUtils.OnApplyWindowInsetsListener() {
149+
@NonNull
150+
@Override
151+
public WindowInsetsCompat onApplyWindowInsets(
152+
View view,
153+
@NonNull WindowInsetsCompat insets,
154+
@NonNull RelativePadding initialPadding) {
155+
// Apply the top, bottom, and start padding for a start edge aligned
156+
// NavigationRailView to dodge the system status and navigation bars
157+
initialPadding.top += insets.getSystemWindowInsetTop();
158+
initialPadding.bottom += insets.getSystemWindowInsetBottom();
159+
160+
boolean isRtl = ViewCompat.getLayoutDirection(view) == ViewCompat.LAYOUT_DIRECTION_RTL;
161+
int systemWindowInsetLeft = insets.getSystemWindowInsetLeft();
162+
int systemWindowInsetRight = insets.getSystemWindowInsetRight();
163+
initialPadding.start += isRtl ? systemWindowInsetRight : systemWindowInsetLeft;
164+
initialPadding.applyToView(view);
165+
return insets;
166+
}
167+
});
137168
}
138169

139170
@Override

0 commit comments

Comments
 (0)