public
interface
Observable<LISTENER> {
void
registerListener(LISTENER listener);
void
unregisterListener(LISTENER listener);
}
public
abstract
class
BaseObservable<LISTENER>
implements
Observable<LISTENER> {
protected
Set<LISTENER> listeners =
new
HashSet<>();
@Override
public
void
registerListener(LISTENER listener) {
listeners.add(listener);
}
@Override
public
void
unregisterListener(LISTENER listener) {
listeners.remove(listener);
}
}
public
enum
BottomMenuItem {
HOME,
DASHBOARD,
NOTIFICATION
}
public
class
BottomNavigationViewMvc
extends
BaseObservable<BottomNavigationViewMvc.Listener>
implements
OnNavigationItemSelectedListener {
public
interface
Listener {
void
onBottomMenuClicked(BottomMenuItem menuItem);
}
private
LayoutBottomNavigationBinding binding;
public
BottomNavigationViewMvc(LayoutInflater layoutInflater) {
inflateLayout();
initBottomNavigation(layoutInflater);
}
private
void
inflateLayout() {
binding = LayoutBottomNavigationBinding.inflate(layoutInflater,
null
,
false
);
}
private
void
initBottomNavigation(LayoutInflater layoutInflater)) {
binding.navView.setOnNavigationItemSelectedListener(
this
);
}
@Override
public
boolean
onNavigationItemSelected(
@NonNull
MenuItem item) {
BottomMenuItem bottomMenuItem;
switch
(item.getItemId()) {
case
R.id.navigation_home:
bottomMenuItem = BottomMenuItem.HOME;
break
;
case
R.id.navigation_dashboard:
bottomMenuItem = BottomMenuItem.DASHBOARD;
break
;
case
R.id.navigation_notifications:
bottomMenuItem = BottomMenuItem.NOTIFICATION;
break
;
default
:
throw
new
RuntimeException(
"Unexpected bottom menu: "
+ item.getItemId());
}
notifyBottomMenuClicked(bottomMenuItem);
return
true
;
}
private
void
notifyBottomMenuClicked(BottomMenuItem bottomMenuItem) {
for
(Listener listener : listeners) {
listener.onBottomMenuClicked(bottomMenuItem);
}
}
public
View getRoot() {
return
binding.getRoot();
}
}