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