1 /*
2  * Copyright (C) 2015 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package android.databinding;
17 
18 import android.view.View;
19 import android.view.ViewStub;
20 import android.view.ViewStub.OnInflateListener;
21 
22 /**
23  * This class represents a ViewStub before and after inflation. Before inflation,
24  * the ViewStub is accessible. After inflation, the root View of the inflated layout
25  * will be available. If the inflated layout has data binding, the ViewDataBinding for the inflated
26  * View is accessible.
27  */
28 public class ViewStubProxy {
29     private ViewStub mViewStub;
30     private ViewDataBinding mViewDataBinding;
31     private View mRoot;
32     private OnInflateListener mOnInflateListener;
33     private ViewDataBinding mContainingBinding;
34 
35     private OnInflateListener mProxyListener = new OnInflateListener() {
36         @Override
37         public void onInflate(ViewStub stub, View inflated) {
38             mRoot = inflated;
39             mViewDataBinding = DataBindingUtil.bind(mContainingBinding.mBindingComponent,
40                     inflated, stub.getLayoutResource());
41             mViewStub = null;
42 
43             if (mOnInflateListener != null) {
44                 mOnInflateListener.onInflate(stub, inflated);
45                 mOnInflateListener = null;
46             }
47             mContainingBinding.invalidateAll();
48             mContainingBinding.forceExecuteBindings();
49         }
50     };
51 
ViewStubProxy(ViewStub viewStub)52     public ViewStubProxy(ViewStub viewStub) {
53         mViewStub = viewStub;
54         mViewStub.setOnInflateListener(mProxyListener);
55     }
56 
setContainingBinding(ViewDataBinding containingBinding)57     public void setContainingBinding(ViewDataBinding containingBinding) {
58         mContainingBinding = containingBinding;
59     }
60 
61     /**
62      * Returns <code>true</code> if the ViewStub has replaced itself with the inflated layout
63      * or <code>false</code> if not.
64      *
65      * @return <code>true</code> if the ViewStub has replaced itself with the inflated layout
66      * or <code>false</code> if not
67      */
isInflated()68     public boolean isInflated() {
69         return mRoot != null;
70     }
71 
72     /**
73      * Returns the root View of the layout replacing the ViewStub once it has been inflated.
74      * <code>null</code> is returned prior to inflation.
75      *
76      * @return the root View of the layout replacing the ViewStub once it has been inflated.
77      * <code>null</code> is returned prior to inflation
78      */
getRoot()79     public View getRoot() {
80         return mRoot;
81     }
82 
83     /**
84      * Returns the data binding associated with the inflated layout once it has been inflated.
85      * <code>null</code> prior to inflation or if there is no binding associated with the layout.
86      *
87      * @return the data binding associated with the inflated layout once it has been inflated.
88      * <code>null</code> prior to inflation or if there is no binding associated with the layout
89      */
getBinding()90     public ViewDataBinding getBinding() {
91         return mViewDataBinding;
92     }
93 
94     /**
95      * Returns the ViewStub in the layout or <code>null</code> if the ViewStub has been inflated.
96      *
97      * @return the ViewStub in the layout or <code>null</code> if the ViewStub has been inflated.
98      */
getViewStub()99     public ViewStub getViewStub() {
100         return mViewStub;
101     }
102 
103     /**
104      * Sets the {@link OnInflateListener} to be called when the ViewStub inflates. The proxy must
105      * have an OnInflateListener, so <code>listener</code> will be called immediately after
106      * the proxy's listener is called.
107      *
108      * @param listener The OnInflateListener to notify of successful inflation
109      */
setOnInflateListener(OnInflateListener listener)110     public void setOnInflateListener(OnInflateListener listener) {
111         if (mViewStub != null) {
112             mOnInflateListener = listener;
113         }
114     }
115 }
116