package com.kaichunlin.transition.util;
import android.app.Activity;
import android.os.Build;
import android.support.annotation.IdRes;
import android.support.annotation.NonNull;
import android.support.v7.view.menu.ActionMenuItemView;
import android.support.v7.widget.ActionMenuView;
import android.support.v7.widget.Toolbar;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewTreeObserver;
import java.util.ArrayList;
import java.util.List;
/**
* Support utility methods.
*/
public class TransitionUtil {
/**
* Get the list of visible MenuItems
*
* @param toolbar
* @return the list of visible MenuItems
*/
public static List<MenuItem> getVisibleMenuItemList(@NonNull Toolbar toolbar) {
List<MenuItem> list = new ArrayList<>();
for (int i = 0; i < toolbar.getChildCount(); i++) {
final View v = toolbar.getChildAt(i);
if (v instanceof ActionMenuView) {
int childCount = ((ActionMenuView) v).getChildCount();
for (int j = 0; j < childCount; j++) {
final View innerView = ((ActionMenuView) v).getChildAt(j);
if (innerView instanceof ActionMenuItemView) {
list.add(((ActionMenuItemView) innerView).getItemData());
}
}
}
}
return list;
}
/**
* Search for a particular menu
*
* @param toolbar
* @param menuId
* @return the corresponding MenuItem, or null if not found
*/
public static MenuItem getMenuItem(@NonNull Toolbar toolbar, @IdRes int menuId) {
View v;
int childCount;
View innerView;
MenuItem menuItem;
for (int i = 0; i < toolbar.getChildCount(); i++) {
v = toolbar.getChildAt(i);
if (v instanceof ActionMenuView) {
childCount = ((ActionMenuView) v).getChildCount();
for (int j = 0; j < childCount; j++) {
innerView = ((ActionMenuView) v).getChildAt(j);
if (innerView instanceof ActionMenuItemView) {
menuItem = ((ActionMenuItemView) innerView).getItemData();
if (menuItem.getItemId() == menuId) {
return menuItem;
}
}
}
}
}
return null;
}
/**
* Helper that removes the drudgery of using ViewTreeObserver
*
* @param view
* @param listener
*/
public static void executeOnGlobalLayout(@NonNull final View view, @NonNull final ViewTreeObserver.OnGlobalLayoutListener listener) {
ViewTreeObserver vto = view.getViewTreeObserver();
vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {
view.getViewTreeObserver()
.removeGlobalOnLayoutListener(this);
} else {
view.getViewTreeObserver()
.removeOnGlobalLayoutListener(this);
}
listener.onGlobalLayout();
}
});
}
/**
* Helper that removes the drudgery of using ViewTreeObserver
*
* @param activity used to retrieve a View that can be
* @param listener
*/
public static void executeOnGlobalLayout(@NonNull final Activity activity, @NonNull final ViewTreeObserver.OnGlobalLayoutListener listener) {
executeOnGlobalLayout(activity.getWindow().getDecorView().findViewById(android.R.id.content), listener);
}
}