19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.view;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context;
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.TypedArray;
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.Canvas;
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.AttributeSet;
23b27b7a152437d6ebb4f2a2700858b69634c00acdJeff Sharkeyimport android.widget.RemoteViews.RemoteView;
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport com.android.internal.R;
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27b6af533114cfa5a4547990e79e96bd0402c47e72Mihai Predaimport java.lang.ref.WeakReference;
28b6af533114cfa5a4547990e79e96bd0402c47e72Mihai Preda
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * A ViewStub is an invisible, zero-sized View that can be used to lazily inflate
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * layout resources at runtime.
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * When a ViewStub is made visible, or when {@link #inflate()}  is invoked, the layout resource
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is inflated. The ViewStub then replaces itself in its parent with the inflated View or Views.
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Therefore, the ViewStub exists in the view hierarchy until {@link #setVisibility(int)} or
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #inflate()} is invoked.
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The inflated View is added to the ViewStub's parent with the ViewStub's layout
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * parameters. Similarly, you can define/override the inflate View's id by using the
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * ViewStub's inflatedId property. For instance:
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <pre>
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     &lt;ViewStub android:id="@+id/stub"
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *               android:inflatedId="@+id/subTree"
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *               android:layout="@layout/mySubTree"
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *               android:layout_width="120dip"
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *               android:layout_height="40dip" /&gt;
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </pre>
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The ViewStub thus defined can be found using the id "stub." After inflation of
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the layout resource "mySubTree," the ViewStub is removed from its parent. The
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * View created by inflating the layout resource "mySubTree" can be found using the
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * id "subTree," specified by the inflatedId property. The inflated View is finally
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * assigned a width of 120dip and a height of 40dip.
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The preferred way to perform the inflation of the layout resource is the following:
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <pre>
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     ViewStub stub = (ViewStub) findViewById(R.id.stub);
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     View inflated = stub.inflate();
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </pre>
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * When {@link #inflate()} is invoked, the ViewStub is replaced by the inflated View
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and the inflated View is returned. This lets applications get a reference to the
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * inflated View without executing an extra findViewById().
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#ViewStub_inflatedId
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#ViewStub_layout
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
70b27b7a152437d6ebb4f2a2700858b69634c00acdJeff Sharkey@RemoteView
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic final class ViewStub extends View {
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mLayoutResource = 0;
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mInflatedId;
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
75b6af533114cfa5a4547990e79e96bd0402c47e72Mihai Preda    private WeakReference<View> mInflatedViewRef;
76b6af533114cfa5a4547990e79e96bd0402c47e72Mihai Preda
77b27b7a152437d6ebb4f2a2700858b69634c00acdJeff Sharkey    private LayoutInflater mInflater;
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private OnInflateListener mInflateListener;
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public ViewStub(Context context) {
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        initialize(context);
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Creates a new ViewStub with the specified layout resource.
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param context The application's environment.
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param layoutResource The reference to a layout resource that will be inflated.
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public ViewStub(Context context, int layoutResource) {
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mLayoutResource = layoutResource;
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        initialize(context);
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public ViewStub(Context context, AttributeSet attrs) {
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        this(context, attrs, 0);
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @SuppressWarnings({"UnusedDeclaration"})
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public ViewStub(Context context, AttributeSet attrs, int defStyle) {
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TypedArray a = context.obtainStyledAttributes(attrs, com.android.internal.R.styleable.ViewStub,
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                defStyle, 0);
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mInflatedId = a.getResourceId(R.styleable.ViewStub_inflatedId, NO_ID);
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mLayoutResource = a.getResourceId(R.styleable.ViewStub_layout, 0);
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        a.recycle();
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        a = context.obtainStyledAttributes(attrs, com.android.internal.R.styleable.View, defStyle, 0);
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mID = a.getResourceId(R.styleable.View_id, NO_ID);
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        a.recycle();
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        initialize(context);
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void initialize(Context context) {
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mContext = context;
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setVisibility(GONE);
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setWillNotDraw(true);
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the id taken by the inflated view. If the inflated id is
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link View#NO_ID}, the inflated view keeps its original id.
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return A positive integer used to identify the inflated view or
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         {@link #NO_ID} if the inflated view should keep its id.
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setInflatedId(int)
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @attr ref android.R.styleable#ViewStub_inflatedId
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getInflatedId() {
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mInflatedId;
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Defines the id taken by the inflated view. If the inflated id is
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link View#NO_ID}, the inflated view keeps its original id.
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param inflatedId A positive integer used to identify the inflated view or
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                   {@link #NO_ID} if the inflated view should keep its id.
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getInflatedId()
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @attr ref android.R.styleable#ViewStub_inflatedId
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
146b27b7a152437d6ebb4f2a2700858b69634c00acdJeff Sharkey    @android.view.RemotableViewMethod
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setInflatedId(int inflatedId) {
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mInflatedId = inflatedId;
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the layout resource that will be used by {@link #setVisibility(int)} or
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #inflate()} to replace this StubbedView
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * in its parent by another view.
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The layout resource identifier used to inflate the new View.
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setLayoutResource(int)
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setVisibility(int)
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #inflate()
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @attr ref android.R.styleable#ViewStub_layout
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getLayoutResource() {
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mLayoutResource;
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Specifies the layout resource to inflate when this StubbedView becomes visible or invisible
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * or when {@link #inflate()} is invoked. The View created by inflating the layout resource is
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * used to replace this StubbedView in its parent.
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param layoutResource A valid layout resource identifier (different from 0.)
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getLayoutResource()
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setVisibility(int)
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #inflate()
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @attr ref android.R.styleable#ViewStub_layout
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
179b27b7a152437d6ebb4f2a2700858b69634c00acdJeff Sharkey    @android.view.RemotableViewMethod
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setLayoutResource(int layoutResource) {
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mLayoutResource = layoutResource;
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
184b27b7a152437d6ebb4f2a2700858b69634c00acdJeff Sharkey    /**
185b27b7a152437d6ebb4f2a2700858b69634c00acdJeff Sharkey     * Set {@link LayoutInflater} to use in {@link #inflate()}, or {@code null}
186b27b7a152437d6ebb4f2a2700858b69634c00acdJeff Sharkey     * to use the default.
187b27b7a152437d6ebb4f2a2700858b69634c00acdJeff Sharkey     */
188b27b7a152437d6ebb4f2a2700858b69634c00acdJeff Sharkey    public void setLayoutInflater(LayoutInflater inflater) {
189b27b7a152437d6ebb4f2a2700858b69634c00acdJeff Sharkey        mInflater = inflater;
190b27b7a152437d6ebb4f2a2700858b69634c00acdJeff Sharkey    }
191b27b7a152437d6ebb4f2a2700858b69634c00acdJeff Sharkey
192b27b7a152437d6ebb4f2a2700858b69634c00acdJeff Sharkey    /**
193b27b7a152437d6ebb4f2a2700858b69634c00acdJeff Sharkey     * Get current {@link LayoutInflater} used in {@link #inflate()}.
194b27b7a152437d6ebb4f2a2700858b69634c00acdJeff Sharkey     */
195b27b7a152437d6ebb4f2a2700858b69634c00acdJeff Sharkey    public LayoutInflater getLayoutInflater() {
196b27b7a152437d6ebb4f2a2700858b69634c00acdJeff Sharkey        return mInflater;
197b27b7a152437d6ebb4f2a2700858b69634c00acdJeff Sharkey    }
198b27b7a152437d6ebb4f2a2700858b69634c00acdJeff Sharkey
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setMeasuredDimension(0, 0);
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void draw(Canvas canvas) {
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void dispatchDraw(Canvas canvas) {
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * When visibility is set to {@link #VISIBLE} or {@link #INVISIBLE},
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #inflate()} is invoked and this StubbedView is replaced in its parent
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * by the inflated layout resource.
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param visibility One of {@link #VISIBLE}, {@link #INVISIBLE}, or {@link #GONE}.
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #inflate()
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
222b27b7a152437d6ebb4f2a2700858b69634c00acdJeff Sharkey    @android.view.RemotableViewMethod
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setVisibility(int visibility) {
224b6af533114cfa5a4547990e79e96bd0402c47e72Mihai Preda        if (mInflatedViewRef != null) {
225b6af533114cfa5a4547990e79e96bd0402c47e72Mihai Preda            View view = mInflatedViewRef.get();
226b6af533114cfa5a4547990e79e96bd0402c47e72Mihai Preda            if (view != null) {
227b6af533114cfa5a4547990e79e96bd0402c47e72Mihai Preda                view.setVisibility(visibility);
228b6af533114cfa5a4547990e79e96bd0402c47e72Mihai Preda            } else {
229b6af533114cfa5a4547990e79e96bd0402c47e72Mihai Preda                throw new IllegalStateException("setVisibility called on un-referenced view");
230b6af533114cfa5a4547990e79e96bd0402c47e72Mihai Preda            }
23158acbafcf2263232c4805cf7a39196acf03763d9Adam Powell        } else {
232b6af533114cfa5a4547990e79e96bd0402c47e72Mihai Preda            super.setVisibility(visibility);
23358acbafcf2263232c4805cf7a39196acf03763d9Adam Powell            if (visibility == VISIBLE || visibility == INVISIBLE) {
23458acbafcf2263232c4805cf7a39196acf03763d9Adam Powell                inflate();
23558acbafcf2263232c4805cf7a39196acf03763d9Adam Powell            }
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Inflates the layout resource identified by {@link #getLayoutResource()}
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * and replaces this StubbedView in its parent by the inflated layout resource.
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The inflated layout resource.
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public View inflate() {
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final ViewParent viewParent = getParent();
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (viewParent != null && viewParent instanceof ViewGroup) {
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mLayoutResource != 0) {
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final ViewGroup parent = (ViewGroup) viewParent;
252b27b7a152437d6ebb4f2a2700858b69634c00acdJeff Sharkey                final LayoutInflater factory;
253b27b7a152437d6ebb4f2a2700858b69634c00acdJeff Sharkey                if (mInflater != null) {
254b27b7a152437d6ebb4f2a2700858b69634c00acdJeff Sharkey                    factory = mInflater;
255b27b7a152437d6ebb4f2a2700858b69634c00acdJeff Sharkey                } else {
256b27b7a152437d6ebb4f2a2700858b69634c00acdJeff Sharkey                    factory = LayoutInflater.from(mContext);
257b27b7a152437d6ebb4f2a2700858b69634c00acdJeff Sharkey                }
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final View view = factory.inflate(mLayoutResource, parent,
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        false);
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mInflatedId != NO_ID) {
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    view.setId(mInflatedId);
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final int index = parent.indexOfChild(this);
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                parent.removeViewInLayout(this);
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final ViewGroup.LayoutParams layoutParams = getLayoutParams();
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (layoutParams != null) {
2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    parent.addView(view, index, layoutParams);
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    parent.addView(view, index);
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27558acbafcf2263232c4805cf7a39196acf03763d9Adam Powell                mInflatedViewRef = new WeakReference<View>(view);
276b6af533114cfa5a4547990e79e96bd0402c47e72Mihai Preda
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mInflateListener != null) {
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mInflateListener.onInflate(this, view);
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return view;
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new IllegalArgumentException("ViewStub must have a valid layoutResource");
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new IllegalStateException("ViewStub must have a non-null ViewGroup viewParent");
2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Specifies the inflate listener to be notified after this ViewStub successfully
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * inflated its layout resource.
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param inflateListener The OnInflateListener to notify of successful inflation.
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see android.view.ViewStub.OnInflateListener
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setOnInflateListener(OnInflateListener inflateListener) {
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mInflateListener = inflateListener;
3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Listener used to receive a notification after a ViewStub has successfully
3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * inflated its layout resource.
3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see android.view.ViewStub#setOnInflateListener(android.view.ViewStub.OnInflateListener)
3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static interface OnInflateListener {
3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Invoked after a ViewStub successfully inflated its layout resource.
3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * This method is invoked after the inflated view was added to the
3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * hierarchy but before the layout pass.
3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param stub The ViewStub that initiated the inflation.
3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param inflated The inflated View.
3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void onInflate(ViewStub stub, View inflated);
3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
320