98 lines
3.3 KiB
Java

/*
* Copyright (C) 2020 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.google.android.material.navigation;
import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
import android.content.Context;
import androidx.appcompat.view.menu.MenuBuilder;
import androidx.appcompat.view.menu.MenuItemImpl;
import androidx.appcompat.view.menu.SubMenuBuilder;
import android.view.MenuItem;
import android.view.SubMenu;
import androidx.annotation.NonNull;
import androidx.annotation.RestrictTo;
/**
* Provides a {@link MenuBuilder} that can be used to build a menu that can be placed inside
* navigation bar view such as the bottom navigation menu or the navigation rail view. This
* implementation of the menu builder prevents the addition of submenus to the primary destinations.
*
* @hide
*/
@RestrictTo(LIBRARY_GROUP)
public final class NavigationBarMenu extends MenuBuilder {
@NonNull private final Class<?> viewClass;
private final int maxItemCount;
/** Constant to indicate there is no limit to the number of Navigation Bar items */
public static final int NO_MAX_ITEM_LIMIT = Integer.MAX_VALUE;
private final boolean subMenuSupported;
public NavigationBarMenu(
@NonNull Context context,
@NonNull Class<?> viewClass,
int maxItemCount,
boolean subMenuSupported) {
super(context);
this.viewClass = viewClass;
this.maxItemCount = maxItemCount;
this.subMenuSupported = subMenuSupported;
}
/** Returns the maximum number of items that can be shown in NavigationBarMenu. */
public int getMaxItemCount() {
return maxItemCount;
}
@NonNull
@Override
public SubMenu addSubMenu(int group, int id, int categoryOrder, @NonNull CharSequence title) {
if (!subMenuSupported) {
throw new UnsupportedOperationException(
viewClass.getSimpleName() + " does not support submenus");
}
final MenuItemImpl item = (MenuItemImpl) addInternal(group, id, categoryOrder, title);
final SubMenuBuilder subMenu = new NavigationBarSubMenu(getContext(), this, item);
item.setSubMenu(subMenu);
return subMenu;
}
@Override
@NonNull
protected MenuItem addInternal(
int group, int id, int categoryOrder, @NonNull CharSequence title) {
if (size() + 1 > maxItemCount) {
String viewClassName = viewClass.getSimpleName();
throw new IllegalArgumentException(
"Maximum number of items supported by "
+ viewClassName
+ " is "
+ maxItemCount
+ ". Limit can be checked with "
+ viewClassName
+ "#getMaxItemCount()");
}
stopDispatchingItemsChanged();
final MenuItem item = super.addInternal(group, id, categoryOrder, title);
startDispatchingItemsChanged();
return item;
}
}