|  | /* | 
|  | * Copyright (C) 2015 The Android Open Source Project | 
|  | * | 
|  | * Licensed under the Apache License, Version 2.0 (the "License"); | 
|  | * you may not use this file except in compliance with the License. | 
|  | * You may obtain a copy of the License at | 
|  | * | 
|  | *      http://www.apache.org/licenses/LICENSE-2.0 | 
|  | * | 
|  | * Unless required by applicable law or agreed to in writing, software | 
|  | * distributed under the License is distributed on an "AS IS" BASIS, | 
|  | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
|  | * See the License for the specific language governing permissions and | 
|  | * limitations under the License. | 
|  | */ | 
|  | package android.databinding; | 
|  |  | 
|  | import android.view.View; | 
|  | import android.view.ViewStub; | 
|  | import android.view.ViewStub.OnInflateListener; | 
|  |  | 
|  | /** | 
|  | * This class represents a ViewStub before and after inflation. Before inflation, | 
|  | * the ViewStub is accessible. After inflation, the root View of the inflated layout | 
|  | * will be available. If the inflated layout has data binding, the ViewDataBinding for the inflated | 
|  | * View is accessible. | 
|  | */ | 
|  | public class ViewStubProxy { | 
|  | private ViewStub mViewStub; | 
|  | private ViewDataBinding mViewDataBinding; | 
|  | private View mRoot; | 
|  | private OnInflateListener mOnInflateListener; | 
|  | private ViewDataBinding mContainingBinding; | 
|  |  | 
|  | private OnInflateListener mProxyListener = new OnInflateListener() { | 
|  | @Override | 
|  | public void onInflate(ViewStub stub, View inflated) { | 
|  | mRoot = inflated; | 
|  | mViewDataBinding = DataBindingUtil.bind(mContainingBinding.mBindingComponent, | 
|  | inflated, stub.getLayoutResource()); | 
|  | mViewStub = null; | 
|  |  | 
|  | if (mOnInflateListener != null) { | 
|  | mOnInflateListener.onInflate(stub, inflated); | 
|  | mOnInflateListener = null; | 
|  | } | 
|  | mContainingBinding.invalidateAll(); | 
|  | mContainingBinding.forceExecuteBindings(); | 
|  | } | 
|  | }; | 
|  |  | 
|  | public ViewStubProxy(ViewStub viewStub) { | 
|  | mViewStub = viewStub; | 
|  | mViewStub.setOnInflateListener(mProxyListener); | 
|  | } | 
|  |  | 
|  | public void setContainingBinding(ViewDataBinding containingBinding) { | 
|  | mContainingBinding = containingBinding; | 
|  | } | 
|  |  | 
|  | /** | 
|  | * Returns <code>true</code> if the ViewStub has replaced itself with the inflated layout | 
|  | * or <code>false</code> if not. | 
|  | * | 
|  | * @return <code>true</code> if the ViewStub has replaced itself with the inflated layout | 
|  | * or <code>false</code> if not | 
|  | */ | 
|  | public boolean isInflated() { | 
|  | return mRoot != null; | 
|  | } | 
|  |  | 
|  | /** | 
|  | * Returns the root View of the layout replacing the ViewStub once it has been inflated. | 
|  | * <code>null</code> is returned prior to inflation. | 
|  | * | 
|  | * @return the root View of the layout replacing the ViewStub once it has been inflated. | 
|  | * <code>null</code> is returned prior to inflation | 
|  | */ | 
|  | public View getRoot() { | 
|  | return mRoot; | 
|  | } | 
|  |  | 
|  | /** | 
|  | * Returns the data binding associated with the inflated layout once it has been inflated. | 
|  | * <code>null</code> prior to inflation or if there is no binding associated with the layout. | 
|  | * | 
|  | * @return the data binding associated with the inflated layout once it has been inflated. | 
|  | * <code>null</code> prior to inflation or if there is no binding associated with the layout | 
|  | */ | 
|  | public ViewDataBinding getBinding() { | 
|  | return mViewDataBinding; | 
|  | } | 
|  |  | 
|  | /** | 
|  | * Returns the ViewStub in the layout or <code>null</code> if the ViewStub has been inflated. | 
|  | * | 
|  | * @return the ViewStub in the layout or <code>null</code> if the ViewStub has been inflated. | 
|  | */ | 
|  | public ViewStub getViewStub() { | 
|  | return mViewStub; | 
|  | } | 
|  |  | 
|  | /** | 
|  | * Sets the {@link OnInflateListener} to be called when the ViewStub inflates. The proxy must | 
|  | * have an OnInflateListener, so <code>listener</code> will be called immediately after | 
|  | * the proxy's listener is called. | 
|  | * | 
|  | * @param listener The OnInflateListener to notify of successful inflation | 
|  | */ | 
|  | public void setOnInflateListener(OnInflateListener listener) { | 
|  | if (mViewStub != null) { | 
|  | mOnInflateListener = listener; | 
|  | } | 
|  | } | 
|  | } |