/*
* 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;
}
}
}