14bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes/*
24bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes * Copyright (C) 2014 The Android Open Source Project
34bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes *
44bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes * Licensed under the Apache License, Version 2.0 (the "License");
54bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes * you may not use this file except in compliance with the License.
64bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes * You may obtain a copy of the License at
74bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes *
84bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes *      http://www.apache.org/licenses/LICENSE-2.0
94bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes *
104bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes * Unless required by applicable law or agreed to in writing, software
114bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes * distributed under the License is distributed on an "AS IS" BASIS,
124bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
134bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes * See the License for the specific language governing permissions and
144bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes * limitations under the License.
154bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes */
164bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes
174bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banespackage android.support.v7.internal.widget;
184bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes
194bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banesimport android.content.Context;
204bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banesimport android.content.res.TypedArray;
214bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banesimport android.graphics.Canvas;
224bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banesimport android.support.v7.appcompat.R;
234bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banesimport android.util.AttributeSet;
244bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banesimport android.view.LayoutInflater;
254bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banesimport android.view.View;
264bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banesimport android.view.ViewGroup;
274bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banesimport android.view.ViewParent;
284bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes
294bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes
304bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banesimport java.lang.ref.WeakReference;
314bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes
324bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes/**
334bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes * Backport of {@link android.view.ViewStub} so that we can set the
344bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes * {@link android.view.LayoutInflater} on devices before Jelly Bean.
354bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes *
364bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes * @hide
374bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes */
384bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banespublic final class ViewStubCompat extends View {
394bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes    private int mLayoutResource = 0;
404bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes    private int mInflatedId;
414bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes
424bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes    private WeakReference<View> mInflatedViewRef;
434bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes
444bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes    private LayoutInflater mInflater;
454bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes    private OnInflateListener mInflateListener;
464bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes
474bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes    public ViewStubCompat(Context context, AttributeSet attrs) {
484bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes        this(context, attrs, 0);
494bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes    }
504bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes
514bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes    public ViewStubCompat(Context context, AttributeSet attrs, int defStyle) {
524bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes        super(context, attrs, defStyle);
534bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes
544bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes        TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.ViewStubCompat,
554bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes                defStyle, 0);
564bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes
574bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes        mInflatedId = a.getResourceId(R.styleable.ViewStubCompat_android_inflatedId, NO_ID);
584bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes        mLayoutResource = a.getResourceId(R.styleable.ViewStubCompat_android_layout, 0);
594bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes
604bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes        setId(a.getResourceId(R.styleable.ViewStubCompat_android_id, NO_ID));
614bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes        a.recycle();
624bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes
634bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes        setVisibility(GONE);
644bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes        setWillNotDraw(true);
654bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes    }
664bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes
674bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes    /**
684bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes     * Returns the id taken by the inflated view. If the inflated id is
694bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes     * {@link View#NO_ID}, the inflated view keeps its original id.
704bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes     *
714bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes     * @return A positive integer used to identify the inflated view or
724bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes     *         {@link #NO_ID} if the inflated view should keep its id.
734bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes     *
744bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes     * @see #setInflatedId(int)
754bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes     * @attr ref android.R.styleable#ViewStub_inflatedId
764bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes     */
774bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes    public int getInflatedId() {
784bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes        return mInflatedId;
794bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes    }
804bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes
814bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes    /**
824bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes     * Defines the id taken by the inflated view. If the inflated id is
834bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes     * {@link View#NO_ID}, the inflated view keeps its original id.
844bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes     *
854bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes     * @param inflatedId A positive integer used to identify the inflated view or
864bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes     *                   {@link #NO_ID} if the inflated view should keep its id.
874bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes     *
884bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes     * @see #getInflatedId()
894bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes     * @attr ref android.R.styleable#ViewStub_inflatedId
904bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes     */
914bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes    public void setInflatedId(int inflatedId) {
924bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes        mInflatedId = inflatedId;
934bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes    }
944bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes
954bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes    /**
964bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes     * Returns the layout resource that will be used by {@link #setVisibility(int)} or
974bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes     * {@link #inflate()} to replace this StubbedView
984bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes     * in its parent by another view.
994bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes     *
1004bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes     * @return The layout resource identifier used to inflate the new View.
1014bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes     *
1024bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes     * @see #setLayoutResource(int)
1034bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes     * @see #setVisibility(int)
1044bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes     * @see #inflate()
1054bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes     * @attr ref android.R.styleable#ViewStub_layout
1064bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes     */
1074bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes    public int getLayoutResource() {
1084bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes        return mLayoutResource;
1094bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes    }
1104bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes
1114bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes    /**
1124bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes     * Specifies the layout resource to inflate when this StubbedView becomes visible or invisible
1134bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes     * or when {@link #inflate()} is invoked. The View created by inflating the layout resource is
1144bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes     * used to replace this StubbedView in its parent.
1154bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes     *
1164bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes     * @param layoutResource A valid layout resource identifier (different from 0.)
1174bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes     *
1184bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes     * @see #getLayoutResource()
1194bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes     * @see #setVisibility(int)
1204bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes     * @see #inflate()
1214bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes     * @attr ref android.R.styleable#ViewStub_layout
1224bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes     */
1234bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes    public void setLayoutResource(int layoutResource) {
1244bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes        mLayoutResource = layoutResource;
1254bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes    }
1264bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes
1274bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes    /**
1284bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes     * Set {@link LayoutInflater} to use in {@link #inflate()}, or {@code null}
1294bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes     * to use the default.
1304bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes     */
1314bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes    public void setLayoutInflater(LayoutInflater inflater) {
1324bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes        mInflater = inflater;
1334bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes    }
1344bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes
1354bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes    /**
1364bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes     * Get current {@link LayoutInflater} used in {@link #inflate()}.
1374bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes     */
1384bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes    public LayoutInflater getLayoutInflater() {
1394bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes        return mInflater;
1404bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes    }
1414bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes
1424bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes    @Override
1434bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
1444bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes        setMeasuredDimension(0, 0);
1454bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes    }
1464bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes
1474bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes    @Override
1484bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes    public void draw(Canvas canvas) {
1494bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes    }
1504bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes
1514bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes    @Override
1524bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes    protected void dispatchDraw(Canvas canvas) {
1534bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes    }
1544bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes
1554bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes    /**
1564bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes     * When visibility is set to {@link #VISIBLE} or {@link #INVISIBLE},
1574bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes     * {@link #inflate()} is invoked and this StubbedView is replaced in its parent
1584bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes     * by the inflated layout resource. After that calls to this function are passed
1594bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes     * through to the inflated view.
1604bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes     *
1614bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes     * @param visibility One of {@link #VISIBLE}, {@link #INVISIBLE}, or {@link #GONE}.
1624bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes     *
1634bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes     * @see #inflate()
1644bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes     */
1654bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes    @Override
1664bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes    public void setVisibility(int visibility) {
1674bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes        if (mInflatedViewRef != null) {
1684bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes            View view = mInflatedViewRef.get();
1694bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes            if (view != null) {
1704bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes                view.setVisibility(visibility);
1714bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes            } else {
1724bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes                throw new IllegalStateException("setVisibility called on un-referenced view");
1734bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes            }
1744bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes        } else {
1754bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes            super.setVisibility(visibility);
1764bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes            if (visibility == VISIBLE || visibility == INVISIBLE) {
1774bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes                inflate();
1784bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes            }
1794bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes        }
1804bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes    }
1814bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes
1824bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes    /**
1834bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes     * Inflates the layout resource identified by {@link #getLayoutResource()}
1844bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes     * and replaces this StubbedView in its parent by the inflated layout resource.
1854bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes     *
1864bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes     * @return The inflated layout resource.
1874bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes     *
1884bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes     */
1894bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes    public View inflate() {
1904bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes        final ViewParent viewParent = getParent();
1914bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes
1924bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes        if (viewParent != null && viewParent instanceof ViewGroup) {
1934bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes            if (mLayoutResource != 0) {
1944bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes                final ViewGroup parent = (ViewGroup) viewParent;
1954bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes                final LayoutInflater factory;
1964bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes                if (mInflater != null) {
1974bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes                    factory = mInflater;
1984bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes                } else {
1994bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes                    factory = LayoutInflater.from(getContext());
2004bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes                }
2014bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes                final View view = factory.inflate(mLayoutResource, parent,
2024bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes                        false);
2034bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes
2044bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes                if (mInflatedId != NO_ID) {
2054bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes                    view.setId(mInflatedId);
2064bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes                }
2074bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes
2084bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes                final int index = parent.indexOfChild(this);
2094bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes                parent.removeViewInLayout(this);
2104bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes
2114bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes                final ViewGroup.LayoutParams layoutParams = getLayoutParams();
2124bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes                if (layoutParams != null) {
2134bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes                    parent.addView(view, index, layoutParams);
2144bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes                } else {
2154bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes                    parent.addView(view, index);
2164bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes                }
2174bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes
2184bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes                mInflatedViewRef = new WeakReference<View>(view);
2194bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes
2204bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes                if (mInflateListener != null) {
2214bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes                    mInflateListener.onInflate(this, view);
2224bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes                }
2234bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes
2244bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes                return view;
2254bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes            } else {
2264bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes                throw new IllegalArgumentException("ViewStub must have a valid layoutResource");
2274bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes            }
2284bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes        } else {
2294bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes            throw new IllegalStateException("ViewStub must have a non-null ViewGroup viewParent");
2304bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes        }
2314bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes    }
2324bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes
2334bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes    /**
2344bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes     * Specifies the inflate listener to be notified after this ViewStub successfully
2354bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes     * inflated its layout resource.
2364bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes     *
2374bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes     * @param inflateListener The OnInflateListener to notify of successful inflation.
2384bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes     *
2394bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes     * @see android.view.ViewStub.OnInflateListener
2404bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes     */
2414bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes    public void setOnInflateListener(OnInflateListener inflateListener) {
2424bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes        mInflateListener = inflateListener;
2434bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes    }
2444bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes
2454bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes    /**
2464bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes     * Listener used to receive a notification after a ViewStub has successfully
2474bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes     * inflated its layout resource.
2484bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes     *
2494bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes     * @see android.view.ViewStub#setOnInflateListener(android.view.ViewStub.OnInflateListener)
2504bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes     */
2514bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes    public static interface OnInflateListener {
2524bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes        /**
2534bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes         * Invoked after a ViewStub successfully inflated its layout resource.
2544bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes         * This method is invoked after the inflated view was added to the
2554bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes         * hierarchy but before the layout pass.
2564bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes         *
2574bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes         * @param stub The ViewStub that initiated the inflation.
2584bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes         * @param inflated The inflated View.
2594bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes         */
2604bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes        void onInflate(ViewStubCompat stub, View inflated);
2614bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes    }
2624bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes}