package android.support.design.widget {

  public class AppBarLayout extends android.widget.LinearLayout {
    ctor public AppBarLayout(android.content.Context);
    ctor public AppBarLayout(android.content.Context, android.util.AttributeSet);
    method public void addOnOffsetChangedListener(android.support.design.widget.AppBarLayout.OnOffsetChangedListener);
    method public float getTargetElevation();
    method public final int getTotalScrollRange();
    method public void removeOnOffsetChangedListener(android.support.design.widget.AppBarLayout.OnOffsetChangedListener);
    method public void setExpanded(boolean);
    method public void setExpanded(boolean, boolean);
    method public void setTargetElevation(float);
  }

  public static class AppBarLayout.Behavior extends android.support.design.widget.HeaderBehavior {
    ctor public AppBarLayout.Behavior();
    ctor public AppBarLayout.Behavior(android.content.Context, android.util.AttributeSet);
    method public boolean onLayoutChild(android.support.design.widget.CoordinatorLayout, android.support.design.widget.AppBarLayout, int);
    method public boolean onNestedFling(android.support.design.widget.CoordinatorLayout, android.support.design.widget.AppBarLayout, android.view.View, float, float, boolean);
    method public void onNestedPreScroll(android.support.design.widget.CoordinatorLayout, android.support.design.widget.AppBarLayout, android.view.View, int, int, int[]);
    method public void onNestedScroll(android.support.design.widget.CoordinatorLayout, android.support.design.widget.AppBarLayout, android.view.View, int, int, int, int);
    method public void onRestoreInstanceState(android.support.design.widget.CoordinatorLayout, android.support.design.widget.AppBarLayout, android.os.Parcelable);
    method public android.os.Parcelable onSaveInstanceState(android.support.design.widget.CoordinatorLayout, android.support.design.widget.AppBarLayout);
    method public boolean onStartNestedScroll(android.support.design.widget.CoordinatorLayout, android.support.design.widget.AppBarLayout, android.view.View, android.view.View, int);
    method public void onStopNestedScroll(android.support.design.widget.CoordinatorLayout, android.support.design.widget.AppBarLayout, android.view.View);
    method public void setDragCallback(android.support.design.widget.AppBarLayout.Behavior.DragCallback);
  }

  public static abstract class AppBarLayout.Behavior.DragCallback {
    ctor public AppBarLayout.Behavior.DragCallback();
    method public abstract boolean canDrag(android.support.design.widget.AppBarLayout);
  }

  protected static class AppBarLayout.Behavior.SavedState extends android.view.View.BaseSavedState {
    ctor public AppBarLayout.Behavior.SavedState(android.os.Parcel, java.lang.ClassLoader);
    ctor public AppBarLayout.Behavior.SavedState(android.os.Parcelable);
    field public static final android.os.Parcelable.Creator<android.support.design.widget.AppBarLayout.Behavior.SavedState> CREATOR;
  }

  public static class AppBarLayout.LayoutParams extends android.widget.LinearLayout.LayoutParams {
    ctor public AppBarLayout.LayoutParams(android.content.Context, android.util.AttributeSet);
    ctor public AppBarLayout.LayoutParams(int, int);
    ctor public AppBarLayout.LayoutParams(int, int, float);
    ctor public AppBarLayout.LayoutParams(android.view.ViewGroup.LayoutParams);
    ctor public AppBarLayout.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
    ctor public AppBarLayout.LayoutParams(android.widget.LinearLayout.LayoutParams);
    ctor public AppBarLayout.LayoutParams(android.support.design.widget.AppBarLayout.LayoutParams);
    method public int getScrollFlags();
    method public android.view.animation.Interpolator getScrollInterpolator();
    method public void setScrollFlags(int);
    method public void setScrollInterpolator(android.view.animation.Interpolator);
    field public static final int SCROLL_FLAG_ENTER_ALWAYS = 4; // 0x4
    field public static final int SCROLL_FLAG_ENTER_ALWAYS_COLLAPSED = 8; // 0x8
    field public static final int SCROLL_FLAG_EXIT_UNTIL_COLLAPSED = 2; // 0x2
    field public static final int SCROLL_FLAG_SCROLL = 1; // 0x1
    field public static final int SCROLL_FLAG_SNAP = 16; // 0x10
  }

  public static abstract interface AppBarLayout.OnOffsetChangedListener {
    method public abstract void onOffsetChanged(android.support.design.widget.AppBarLayout, int);
  }

  public static class AppBarLayout.ScrollingViewBehavior extends android.support.design.widget.HeaderScrollingViewBehavior {
    ctor public AppBarLayout.ScrollingViewBehavior();
    ctor public AppBarLayout.ScrollingViewBehavior(android.content.Context, android.util.AttributeSet);
    method public int getOverlayTop();
    method public boolean layoutDependsOn(android.support.design.widget.CoordinatorLayout, android.view.View, android.view.View);
    method public boolean onDependentViewChanged(android.support.design.widget.CoordinatorLayout, android.view.View, android.view.View);
    method public boolean onLayoutChild(android.support.design.widget.CoordinatorLayout, android.view.View, int);
    method public void setOverlayTop(int);
  }

  public class BottomSheetBehavior extends android.support.design.widget.CoordinatorLayout.Behavior {
    ctor public BottomSheetBehavior();
    ctor public BottomSheetBehavior(android.content.Context, android.util.AttributeSet);
    method public static android.support.design.widget.BottomSheetBehavior<V> from(V);
    method public final int getPeekHeight();
    method public final int getState();
    method public final void setPeekHeight(int);
    method public final void setState(int);
    field public static final int STATE_COLLAPSED = 4; // 0x4
    field public static final int STATE_DRAGGING = 1; // 0x1
    field public static final int STATE_EXPANDED = 3; // 0x3
    field public static final int STATE_SETTLING = 2; // 0x2
  }

  protected static class BottomSheetBehavior.SavedState extends android.view.View.BaseSavedState {
    ctor public BottomSheetBehavior.SavedState(android.os.Parcel);
    ctor public BottomSheetBehavior.SavedState(android.os.Parcelable, int);
    field public static final android.os.Parcelable.Creator<android.support.design.widget.BottomSheetBehavior.SavedState> CREATOR;
  }

  public class CollapsingToolbarLayout extends android.widget.FrameLayout {
    ctor public CollapsingToolbarLayout(android.content.Context);
    ctor public CollapsingToolbarLayout(android.content.Context, android.util.AttributeSet);
    ctor public CollapsingToolbarLayout(android.content.Context, android.util.AttributeSet, int);
    method public int getCollapsedTitleGravity();
    method public android.graphics.Typeface getCollapsedTitleTypeface();
    method public android.graphics.drawable.Drawable getContentScrim();
    method public int getExpandedTitleGravity();
    method public int getExpandedTitleMarginBottom();
    method public int getExpandedTitleMarginEnd();
    method public int getExpandedTitleMarginStart();
    method public int getExpandedTitleMarginTop();
    method public android.graphics.Typeface getExpandedTitleTypeface();
    method public android.graphics.drawable.Drawable getStatusBarScrim();
    method public java.lang.CharSequence getTitle();
    method public boolean isTitleEnabled();
    method public void setCollapsedTitleGravity(int);
    method public void setCollapsedTitleTextAppearance(int);
    method public void setCollapsedTitleTextColor(int);
    method public void setCollapsedTitleTypeface(android.graphics.Typeface);
    method public void setContentScrim(android.graphics.drawable.Drawable);
    method public void setContentScrimColor(int);
    method public void setContentScrimResource(int);
    method public void setExpandedTitleColor(int);
    method public void setExpandedTitleGravity(int);
    method public void setExpandedTitleMargin(int, int, int, int);
    method public void setExpandedTitleMarginBottom(int);
    method public void setExpandedTitleMarginEnd(int);
    method public void setExpandedTitleMarginStart(int);
    method public void setExpandedTitleMarginTop(int);
    method public void setExpandedTitleTextAppearance(int);
    method public void setExpandedTitleTypeface(android.graphics.Typeface);
    method public void setScrimsShown(boolean);
    method public void setScrimsShown(boolean, boolean);
    method public void setStatusBarScrim(android.graphics.drawable.Drawable);
    method public void setStatusBarScrimColor(int);
    method public void setStatusBarScrimResource(int);
    method public void setTitle(java.lang.CharSequence);
    method public void setTitleEnabled(boolean);
  }

  public static class CollapsingToolbarLayout.LayoutParams extends android.widget.FrameLayout.LayoutParams {
    ctor public CollapsingToolbarLayout.LayoutParams(android.content.Context, android.util.AttributeSet);
    ctor public CollapsingToolbarLayout.LayoutParams(int, int);
    ctor public CollapsingToolbarLayout.LayoutParams(int, int, int);
    ctor public CollapsingToolbarLayout.LayoutParams(android.view.ViewGroup.LayoutParams);
    ctor public CollapsingToolbarLayout.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
    ctor public CollapsingToolbarLayout.LayoutParams(android.widget.FrameLayout.LayoutParams);
    method public int getCollapseMode();
    method public float getParallaxMultiplier();
    method public void setCollapseMode(int);
    method public void setParallaxMultiplier(float);
    field public static final int COLLAPSE_MODE_OFF = 0; // 0x0
    field public static final int COLLAPSE_MODE_PARALLAX = 2; // 0x2
    field public static final int COLLAPSE_MODE_PIN = 1; // 0x1
  }

  public class CoordinatorLayout extends android.view.ViewGroup {
    ctor public CoordinatorLayout(android.content.Context);
    ctor public CoordinatorLayout(android.content.Context, android.util.AttributeSet);
    ctor public CoordinatorLayout(android.content.Context, android.util.AttributeSet, int);
    method public void dispatchDependentViewsChanged(android.view.View);
    method public boolean doViewsOverlap(android.view.View, android.view.View);
    method public java.util.List<android.view.View> getDependencies(android.view.View);
    method public android.graphics.drawable.Drawable getStatusBarBackground();
    method public boolean isPointInChildBounds(android.view.View, int, int);
    method public void onAttachedToWindow();
    method public void onDetachedFromWindow();
    method public void onDraw(android.graphics.Canvas);
    method protected void onLayout(boolean, int, int, int, int);
    method public void onLayoutChild(android.view.View, int);
    method public void onMeasureChild(android.view.View, int, int, int, int);
    method public void setStatusBarBackground(android.graphics.drawable.Drawable);
    method public void setStatusBarBackgroundColor(int);
    method public void setStatusBarBackgroundResource(int);
  }

  public static abstract class CoordinatorLayout.Behavior {
    ctor public CoordinatorLayout.Behavior();
    ctor public CoordinatorLayout.Behavior(android.content.Context, android.util.AttributeSet);
    method public boolean blocksInteractionBelow(android.support.design.widget.CoordinatorLayout, V);
    method public final int getScrimColor(android.support.design.widget.CoordinatorLayout, V);
    method public final float getScrimOpacity(android.support.design.widget.CoordinatorLayout, V);
    method public static java.lang.Object getTag(android.view.View);
    method public boolean isDirty(android.support.design.widget.CoordinatorLayout, V);
    method public boolean layoutDependsOn(android.support.design.widget.CoordinatorLayout, V, android.view.View);
    method public android.support.v4.view.WindowInsetsCompat onApplyWindowInsets(android.support.design.widget.CoordinatorLayout, V, android.support.v4.view.WindowInsetsCompat);
    method public boolean onDependentViewChanged(android.support.design.widget.CoordinatorLayout, V, android.view.View);
    method public void onDependentViewRemoved(android.support.design.widget.CoordinatorLayout, V, android.view.View);
    method public boolean onInterceptTouchEvent(android.support.design.widget.CoordinatorLayout, V, android.view.MotionEvent);
    method public boolean onLayoutChild(android.support.design.widget.CoordinatorLayout, V, int);
    method public boolean onMeasureChild(android.support.design.widget.CoordinatorLayout, V, int, int, int, int);
    method public boolean onNestedFling(android.support.design.widget.CoordinatorLayout, V, android.view.View, float, float, boolean);
    method public boolean onNestedPreFling(android.support.design.widget.CoordinatorLayout, V, android.view.View, float, float);
    method public void onNestedPreScroll(android.support.design.widget.CoordinatorLayout, V, android.view.View, int, int, int[]);
    method public void onNestedScroll(android.support.design.widget.CoordinatorLayout, V, android.view.View, int, int, int, int);
    method public void onNestedScrollAccepted(android.support.design.widget.CoordinatorLayout, V, android.view.View, android.view.View, int);
    method public void onRestoreInstanceState(android.support.design.widget.CoordinatorLayout, V, android.os.Parcelable);
    method public android.os.Parcelable onSaveInstanceState(android.support.design.widget.CoordinatorLayout, V);
    method public boolean onStartNestedScroll(android.support.design.widget.CoordinatorLayout, V, android.view.View, android.view.View, int);
    method public void onStopNestedScroll(android.support.design.widget.CoordinatorLayout, V, android.view.View);
    method public boolean onTouchEvent(android.support.design.widget.CoordinatorLayout, V, android.view.MotionEvent);
    method public static void setTag(android.view.View, java.lang.Object);
  }

  public static abstract class CoordinatorLayout.DefaultBehavior implements java.lang.annotation.Annotation {
  }

  public static class CoordinatorLayout.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
    ctor public CoordinatorLayout.LayoutParams(int, int);
    ctor public CoordinatorLayout.LayoutParams(android.support.design.widget.CoordinatorLayout.LayoutParams);
    ctor public CoordinatorLayout.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
    ctor public CoordinatorLayout.LayoutParams(android.view.ViewGroup.LayoutParams);
    method public int getAnchorId();
    method public android.support.design.widget.CoordinatorLayout.Behavior getBehavior();
    method public void setAnchorId(int);
    method public void setBehavior(android.support.design.widget.CoordinatorLayout.Behavior);
    field public int anchorGravity;
    field public int gravity;
    field public int keyline;
  }

  protected static class CoordinatorLayout.SavedState extends android.view.View.BaseSavedState {
    ctor public CoordinatorLayout.SavedState(android.os.Parcel, java.lang.ClassLoader);
    ctor public CoordinatorLayout.SavedState(android.os.Parcelable);
    field public static final android.os.Parcelable.Creator<android.support.design.widget.CoordinatorLayout.SavedState> CREATOR;
  }

  public class FloatingActionButton extends android.support.design.widget.VisibilityAwareImageButton {
    ctor public FloatingActionButton(android.content.Context);
    ctor public FloatingActionButton(android.content.Context, android.util.AttributeSet);
    ctor public FloatingActionButton(android.content.Context, android.util.AttributeSet, int);
    method public boolean getContentRect(android.graphics.Rect);
    method public void hide();
    method public void hide(android.support.design.widget.FloatingActionButton.OnVisibilityChangedListener);
    method public void setRippleColor(int);
    method public void show();
    method public void show(android.support.design.widget.FloatingActionButton.OnVisibilityChangedListener);
  }

  public static class FloatingActionButton.Behavior extends android.support.design.widget.CoordinatorLayout.Behavior {
    ctor public FloatingActionButton.Behavior();
    method public boolean layoutDependsOn(android.support.design.widget.CoordinatorLayout, android.support.design.widget.FloatingActionButton, android.view.View);
    method public boolean onDependentViewChanged(android.support.design.widget.CoordinatorLayout, android.support.design.widget.FloatingActionButton, android.view.View);
    method public boolean onLayoutChild(android.support.design.widget.CoordinatorLayout, android.support.design.widget.FloatingActionButton, int);
  }

  public static abstract class FloatingActionButton.OnVisibilityChangedListener {
    ctor public FloatingActionButton.OnVisibilityChangedListener();
    method public void onHidden(android.support.design.widget.FloatingActionButton);
    method public void onShown(android.support.design.widget.FloatingActionButton);
  }

   abstract class HeaderBehavior extends android.support.design.widget.ViewOffsetBehavior {
    ctor public HeaderBehavior();
    ctor public HeaderBehavior(android.content.Context, android.util.AttributeSet);
  }

   abstract class HeaderScrollingViewBehavior extends android.support.design.widget.ViewOffsetBehavior {
    ctor public HeaderScrollingViewBehavior();
    ctor public HeaderScrollingViewBehavior(android.content.Context, android.util.AttributeSet);
    method public boolean onMeasureChild(android.support.design.widget.CoordinatorLayout, android.view.View, int, int, int, int);
  }

  public class NavigationView extends android.widget.FrameLayout {
    ctor public NavigationView(android.content.Context);
    ctor public NavigationView(android.content.Context, android.util.AttributeSet);
    ctor public NavigationView(android.content.Context, android.util.AttributeSet, int);
    method public void addHeaderView(android.view.View);
    method public int getHeaderCount();
    method public android.view.View getHeaderView(int);
    method public android.graphics.drawable.Drawable getItemBackground();
    method public android.content.res.ColorStateList getItemIconTintList();
    method public android.content.res.ColorStateList getItemTextColor();
    method public android.view.Menu getMenu();
    method public android.view.View inflateHeaderView(int);
    method public void inflateMenu(int);
    method public void removeHeaderView(android.view.View);
    method public void setCheckedItem(int);
    method public void setItemBackground(android.graphics.drawable.Drawable);
    method public void setItemBackgroundResource(int);
    method public void setItemIconTintList(android.content.res.ColorStateList);
    method public void setItemTextAppearance(int);
    method public void setItemTextColor(android.content.res.ColorStateList);
    method public void setNavigationItemSelectedListener(android.support.design.widget.NavigationView.OnNavigationItemSelectedListener);
  }

  public static abstract interface NavigationView.OnNavigationItemSelectedListener {
    method public abstract boolean onNavigationItemSelected(android.view.MenuItem);
  }

  public static class NavigationView.SavedState extends android.view.View.BaseSavedState {
    ctor public NavigationView.SavedState(android.os.Parcel, java.lang.ClassLoader);
    ctor public NavigationView.SavedState(android.os.Parcelable);
    field public static final android.os.Parcelable.Creator<android.support.design.widget.NavigationView.SavedState> CREATOR;
    field public android.os.Bundle menuState;
  }

  public final class Snackbar {
    method public void dismiss();
    method public int getDuration();
    method public android.view.View getView();
    method public boolean isShown();
    method public boolean isShownOrQueued();
    method public static android.support.design.widget.Snackbar make(android.view.View, java.lang.CharSequence, int);
    method public static android.support.design.widget.Snackbar make(android.view.View, int, int);
    method public android.support.design.widget.Snackbar setAction(int, android.view.View.OnClickListener);
    method public android.support.design.widget.Snackbar setAction(java.lang.CharSequence, android.view.View.OnClickListener);
    method public android.support.design.widget.Snackbar setActionTextColor(android.content.res.ColorStateList);
    method public android.support.design.widget.Snackbar setActionTextColor(int);
    method public android.support.design.widget.Snackbar setCallback(android.support.design.widget.Snackbar.Callback);
    method public android.support.design.widget.Snackbar setDuration(int);
    method public android.support.design.widget.Snackbar setText(java.lang.CharSequence);
    method public android.support.design.widget.Snackbar setText(int);
    method public void show();
    field public static final int LENGTH_INDEFINITE = -2; // 0xfffffffe
    field public static final int LENGTH_LONG = 0; // 0x0
    field public static final int LENGTH_SHORT = -1; // 0xffffffff
  }

  public static abstract class Snackbar.Callback {
    ctor public Snackbar.Callback();
    method public void onDismissed(android.support.design.widget.Snackbar, int);
    method public void onShown(android.support.design.widget.Snackbar);
    field public static final int DISMISS_EVENT_ACTION = 1; // 0x1
    field public static final int DISMISS_EVENT_CONSECUTIVE = 4; // 0x4
    field public static final int DISMISS_EVENT_MANUAL = 3; // 0x3
    field public static final int DISMISS_EVENT_SWIPE = 0; // 0x0
    field public static final int DISMISS_EVENT_TIMEOUT = 2; // 0x2
  }

  public class SwipeDismissBehavior extends android.support.design.widget.CoordinatorLayout.Behavior {
    ctor public SwipeDismissBehavior();
    method public boolean canSwipeDismissView(android.view.View);
    method public int getDragState();
    method public void setDragDismissDistance(float);
    method public void setEndAlphaSwipeDistance(float);
    method public void setListener(android.support.design.widget.SwipeDismissBehavior.OnDismissListener);
    method public void setSensitivity(float);
    method public void setStartAlphaSwipeDistance(float);
    method public void setSwipeDirection(int);
    field public static final int STATE_DRAGGING = 1; // 0x1
    field public static final int STATE_IDLE = 0; // 0x0
    field public static final int STATE_SETTLING = 2; // 0x2
    field public static final int SWIPE_DIRECTION_ANY = 2; // 0x2
    field public static final int SWIPE_DIRECTION_END_TO_START = 1; // 0x1
    field public static final int SWIPE_DIRECTION_START_TO_END = 0; // 0x0
  }

  public static abstract interface SwipeDismissBehavior.OnDismissListener {
    method public abstract void onDismiss(android.view.View);
    method public abstract void onDragStateChanged(int);
  }

  public class TabLayout extends android.widget.HorizontalScrollView {
    ctor public TabLayout(android.content.Context);
    ctor public TabLayout(android.content.Context, android.util.AttributeSet);
    ctor public TabLayout(android.content.Context, android.util.AttributeSet, int);
    method public void addTab(android.support.design.widget.TabLayout.Tab);
    method public void addTab(android.support.design.widget.TabLayout.Tab, int);
    method public void addTab(android.support.design.widget.TabLayout.Tab, boolean);
    method public void addTab(android.support.design.widget.TabLayout.Tab, int, boolean);
    method public int getSelectedTabPosition();
    method public android.support.design.widget.TabLayout.Tab getTabAt(int);
    method public int getTabCount();
    method public int getTabGravity();
    method public int getTabMode();
    method public android.content.res.ColorStateList getTabTextColors();
    method public android.support.design.widget.TabLayout.Tab newTab();
    method public void removeAllTabs();
    method public void removeTab(android.support.design.widget.TabLayout.Tab);
    method public void removeTabAt(int);
    method public void setOnTabSelectedListener(android.support.design.widget.TabLayout.OnTabSelectedListener);
    method public void setScrollPosition(int, float, boolean);
    method public void setSelectedTabIndicatorColor(int);
    method public void setSelectedTabIndicatorHeight(int);
    method public void setTabGravity(int);
    method public void setTabMode(int);
    method public void setTabTextColors(android.content.res.ColorStateList);
    method public void setTabTextColors(int, int);
    method public void setTabsFromPagerAdapter(android.support.v4.view.PagerAdapter);
    method public void setupWithViewPager(android.support.v4.view.ViewPager);
    field public static final int GRAVITY_CENTER = 1; // 0x1
    field public static final int GRAVITY_FILL = 0; // 0x0
    field public static final int MODE_FIXED = 1; // 0x1
    field public static final int MODE_SCROLLABLE = 0; // 0x0
  }

  public static abstract interface TabLayout.OnTabSelectedListener {
    method public abstract void onTabReselected(android.support.design.widget.TabLayout.Tab);
    method public abstract void onTabSelected(android.support.design.widget.TabLayout.Tab);
    method public abstract void onTabUnselected(android.support.design.widget.TabLayout.Tab);
  }

  public static final class TabLayout.Tab {
    method public java.lang.CharSequence getContentDescription();
    method public android.view.View getCustomView();
    method public android.graphics.drawable.Drawable getIcon();
    method public int getPosition();
    method public java.lang.Object getTag();
    method public java.lang.CharSequence getText();
    method public boolean isSelected();
    method public void select();
    method public android.support.design.widget.TabLayout.Tab setContentDescription(int);
    method public android.support.design.widget.TabLayout.Tab setContentDescription(java.lang.CharSequence);
    method public android.support.design.widget.TabLayout.Tab setCustomView(android.view.View);
    method public android.support.design.widget.TabLayout.Tab setCustomView(int);
    method public android.support.design.widget.TabLayout.Tab setIcon(android.graphics.drawable.Drawable);
    method public android.support.design.widget.TabLayout.Tab setIcon(int);
    method public android.support.design.widget.TabLayout.Tab setTag(java.lang.Object);
    method public android.support.design.widget.TabLayout.Tab setText(java.lang.CharSequence);
    method public android.support.design.widget.TabLayout.Tab setText(int);
    field public static final int INVALID_POSITION = -1; // 0xffffffff
  }

  public static class TabLayout.TabLayoutOnPageChangeListener implements android.support.v4.view.ViewPager.OnPageChangeListener {
    ctor public TabLayout.TabLayoutOnPageChangeListener(android.support.design.widget.TabLayout);
    method public void onPageScrollStateChanged(int);
    method public void onPageScrolled(int, float, int);
    method public void onPageSelected(int);
  }

  public static class TabLayout.ViewPagerOnTabSelectedListener implements android.support.design.widget.TabLayout.OnTabSelectedListener {
    ctor public TabLayout.ViewPagerOnTabSelectedListener(android.support.v4.view.ViewPager);
    method public void onTabReselected(android.support.design.widget.TabLayout.Tab);
    method public void onTabSelected(android.support.design.widget.TabLayout.Tab);
    method public void onTabUnselected(android.support.design.widget.TabLayout.Tab);
  }

  public class TextInputLayout extends android.widget.LinearLayout {
    ctor public TextInputLayout(android.content.Context);
    ctor public TextInputLayout(android.content.Context, android.util.AttributeSet);
    ctor public TextInputLayout(android.content.Context, android.util.AttributeSet, int);
    method public int getCounterMaxLength();
    method public android.widget.EditText getEditText();
    method public java.lang.CharSequence getError();
    method public java.lang.CharSequence getHint();
    method public android.graphics.Typeface getTypeface();
    method public boolean isCounterEnabled();
    method public boolean isErrorEnabled();
    method public boolean isHintAnimationEnabled();
    method public void setCounterEnabled(boolean);
    method public void setCounterMaxLength(int);
    method public void setError(java.lang.CharSequence);
    method public void setErrorEnabled(boolean);
    method public void setHint(java.lang.CharSequence);
    method public void setHintAnimationEnabled(boolean);
    method public void setHintTextAppearance(int);
    method public void setTypeface(android.graphics.Typeface);
  }

   class ViewOffsetBehavior extends android.support.design.widget.CoordinatorLayout.Behavior {
    ctor public ViewOffsetBehavior();
    ctor public ViewOffsetBehavior(android.content.Context, android.util.AttributeSet);
    method public int getLeftAndRightOffset();
    method public int getTopAndBottomOffset();
    method public boolean setLeftAndRightOffset(int);
    method public boolean setTopAndBottomOffset(int);
  }

   class VisibilityAwareImageButton extends android.widget.ImageButton {
    ctor public VisibilityAwareImageButton(android.content.Context);
    ctor public VisibilityAwareImageButton(android.content.Context, android.util.AttributeSet);
    ctor public VisibilityAwareImageButton(android.content.Context, android.util.AttributeSet, int);
  }

}

