Skip to content

Commit de444c6

Browse files
wcshileticiarossi
authored andcommitted
Fix bug in bottom navigation badge state restoration that did not set the badges on the menu item views.
Update catalog demo to save and restore states in the bottom navigation demos. PiperOrigin-RevId: 278436621 (cherry picked from commit de00502)
1 parent 4646e20 commit de444c6

File tree

6 files changed

+27
-11
lines changed

6 files changed

+27
-11
lines changed

catalog/java/io/material/catalog/bottomnav/BottomNavigationDemoFragment.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -87,8 +87,9 @@ public View onCreateDemoView(
8787
return false;
8888
};
8989
setBottomNavListeners(navigationItemListener);
90-
91-
setupBadging();
90+
if (bundle == null) {
91+
setupBadging();
92+
}
9293
return view;
9394
}
9495

catalog/java/io/material/catalog/bottomnav/res/layout/cat_bottom_nav.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
<com.google.android.material.bottomnavigation.BottomNavigationView
2020
xmlns:android="http://schemas.android.com/apk/res/android"
2121
xmlns:app="http://schemas.android.com/apk/res-auto"
22+
android:id="@+id/cat_bottom_nav"
2223
android:layout_width="match_parent"
2324
android:layout_height="wrap_content"
2425
android:layout_gravity="bottom"

catalog/java/io/material/catalog/bottomnav/res/layout/cat_bottom_navs.xml

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
<LinearLayout
1919
xmlns:android="http://schemas.android.com/apk/res/android"
20+
xmlns:app="http://schemas.android.com/apk/res-auto"
2021
android:layout_width="match_parent"
2122
android:layout_height="wrap_content"
2223
android:layout_gravity="bottom"
@@ -27,9 +28,8 @@
2728
android:layout_margin="@dimen/cat_bottom_nav_standard_spacing"
2829
android:text="@string/cat_bottom_nav_legacy_title"/>
2930
<com.google.android.material.bottomnavigation.BottomNavigationView
30-
xmlns:android="http://schemas.android.com/apk/res/android"
31-
xmlns:app="http://schemas.android.com/apk/res-auto"
3231
style="@style/Widget.Design.BottomNavigationView"
32+
android:id="@+id/cat_bottom_nav1"
3333
android:layout_width="match_parent"
3434
android:layout_height="wrap_content"
3535
app:menu="@menu/bottom_nav_menu"/>
@@ -42,8 +42,7 @@
4242
android:layout_margin="@dimen/cat_bottom_nav_standard_spacing"
4343
android:text="@string/cat_bottom_nav_title"/>
4444
<com.google.android.material.bottomnavigation.BottomNavigationView
45-
xmlns:android="http://schemas.android.com/apk/res/android"
46-
xmlns:app="http://schemas.android.com/apk/res-auto"
45+
android:id="@+id/cat_bottom_nav2"
4746
android:layout_width="match_parent"
4847
android:layout_height="wrap_content"
4948
app:menu="@menu/bottom_nav_menu"/>

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

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import androidx.annotation.Nullable;
3030
import androidx.annotation.RestrictTo;
3131
import androidx.annotation.StyleRes;
32+
import androidx.annotation.VisibleForTesting;
3233
import androidx.core.util.Pools;
3334
import androidx.core.view.ViewCompat;
3435
import androidx.appcompat.content.res.AppCompatResources;
@@ -619,6 +620,11 @@ SparseArray<BadgeDrawable> getBadgeDrawables() {
619620

620621
void setBadgeDrawables(SparseArray<BadgeDrawable> badgeDrawables) {
621622
this.badgeDrawables = badgeDrawables;
623+
if (buttons != null) {
624+
for (BottomNavigationItemView itemView : buttons) {
625+
itemView.setBadge(badgeDrawables.get(itemView.getId()));
626+
}
627+
}
622628
}
623629

624630
@Nullable
@@ -689,7 +695,8 @@ private void removeUnusedBadges() {
689695
}
690696

691697
@Nullable
692-
private BottomNavigationItemView findItemView(int menuItemId) {
698+
@VisibleForTesting
699+
BottomNavigationItemView findItemView(int menuItemId) {
693700
validateMenuItemId(menuItemId);
694701
if (buttons != null) {
695702
for (BottomNavigationItemView itemView : buttons) {

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
import androidx.annotation.StyleRes;
4343
import com.google.android.material.shape.MaterialShapeDrawable;
4444
import com.google.android.material.shape.MaterialShapeUtils;
45+
import androidx.annotation.VisibleForTesting;
4546
import androidx.core.content.ContextCompat;
4647
import androidx.core.graphics.drawable.DrawableCompat;
4748
import androidx.customview.view.AbsSavedState;
@@ -116,7 +117,7 @@ public class BottomNavigationView extends FrameLayout {
116117
private static final int MENU_PRESENTER_ID = 1;
117118

118119
@NonNull private final MenuBuilder menu;
119-
@NonNull private final BottomNavigationMenuView menuView;
120+
@NonNull @VisibleForTesting final BottomNavigationMenuView menuView;
120121
private final BottomNavigationPresenter presenter = new BottomNavigationPresenter();
121122
@Nullable private ColorStateList itemRippleColor;
122123
private MenuInflater menuInflater;

tests/javatests/com/google/android/material/bottomnavigation/BottomNavigationViewTest.java

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@
4949
import android.os.Parcelable;
5050
import androidx.annotation.ColorInt;
5151
import androidx.core.content.res.ResourcesCompat;
52+
import android.util.SparseArray;
5253
import android.view.Menu;
5354
import android.view.MenuItem;
5455
import android.view.MotionEvent;
@@ -635,16 +636,22 @@ public void testSavedState() throws Throwable {
635636
onView(withId(R.id.bottom_navigation))
636637
.perform(showBadgeNumberForMenuItem(R.id.destination_home, 75));
637638
assertTrue(bottomNavigation.getMenu().findItem(R.id.destination_profile).isChecked());
638-
// Save the state
639-
final Parcelable state = bottomNavigation.onSaveInstanceState();
639+
640+
// Save the current state
641+
SparseArray<Parcelable> container = new SparseArray<>();
642+
bottomNavigation.saveHierarchyState(container);
640643

641644
// Restore the state into a fresh BottomNavigationView
642645
activityTestRule.runOnUiThread(
643646
() -> {
644647
BottomNavigationView testView = new BottomNavigationView(activityTestRule.getActivity());
648+
testView.setId(R.id.bottom_navigation);
645649
testView.inflateMenu(R.menu.bottom_navigation_view_content);
646-
testView.onRestoreInstanceState(state);
650+
testView.restoreHierarchyState(container);
647651
assertTrue(testView.getMenu().findItem(R.id.destination_profile).isChecked());
652+
653+
assertTrue(testView.menuView.findItemView(R.id.destination_home).getBadge().isVisible());
654+
648655
assertTrue(testView.getBadge(R.id.destination_home).isVisible());
649656
assertEquals(75, testView.getBadge(R.id.destination_home).getNumber());
650657
assertEquals(4, testView.getBadge(R.id.destination_home).getMaxCharacterCount());

0 commit comments

Comments
 (0)