private void cycleFocusLevel(boolean next) {
        if (next) {
            // Next View to focus should be the first child View of the currently focused View. If there is no such View, the currently focused View should be clicked on.
            List<View> focusableViews = getNextFocusableViews(next);
            if (focusableViews.isEmpty()) {
                // No focusable Views were found down the tree, so the user is clicking on the currently focused View
                ClickListener clickListener = focusedView.getClickListener();
                if (clickListener != null) {
                    clickListener.onClick(focusedView);
                }
            } else {
                for (View view : focusableViews) {
                    View focusableViewParent = view.getParent();
                    if (focusableViewParent != null && focusableViewParent.equals(focusedView)) {
                        setFocus(view, true);
                    }
                }
            }
        } else {
            // Next View to focus should be the currently focused View's parent. If that View isn't focusable, find the next focusable View at the previous level.
            View view = focusedView.getParent();
            if (view != null) {
                if (view.isFocusable()) {
                    setFocus(view, true);
                } else {
                    // Find first focusable View at level before current level
                    List<View> focusableViews = getNextFocusableViews(next);
                    if (!focusableViews.isEmpty()) {
                        setFocus(focusableViews.get(0), true);
                    }
                }
            }
        }
    }