diff --git a/tools/data-binding/build.gradle b/tools/data-binding/build.gradle index 83a4a688dee3c..b86af2b198254 100644 --- a/tools/data-binding/build.gradle +++ b/tools/data-binding/build.gradle @@ -1,5 +1,5 @@ Properties databindingProperties = new Properties() -databindingProperties.load(new FileInputStream("databinding.properties")) +databindingProperties.load(new FileInputStream("${projectDir}/databinding.properties")) databindingProperties.mavenRepoDir = "${projectDir}/${databindingProperties.mavenRepoName}" ext.config = databindingProperties diff --git a/tools/data-binding/compiler/src/main/java/com/android/databinding/LayoutBinder.java b/tools/data-binding/compiler/src/main/java/com/android/databinding/LayoutBinder.java index faf60f7a07a49..a285e165a224a 100644 --- a/tools/data-binding/compiler/src/main/java/com/android/databinding/LayoutBinder.java +++ b/tools/data-binding/compiler/src/main/java/com/android/databinding/LayoutBinder.java @@ -19,14 +19,12 @@ package com.android.databinding; import com.google.common.base.Preconditions; import com.android.databinding.expr.Dependency; -import com.android.databinding.store.ResourceBundle; -import com.android.databinding.util.ParserHelper; -import com.android.databinding.writer.LayoutBinderWriter; import com.android.databinding.expr.Expr; import com.android.databinding.expr.ExprModel; import com.android.databinding.expr.IdentifierExpr; -import com.android.databinding.expr.StaticIdentifierExpr; -import com.android.databinding.util.L; +import com.android.databinding.store.ResourceBundle; +import com.android.databinding.util.ParserHelper; +import com.android.databinding.writer.LayoutBinderWriter; import java.util.ArrayList; import java.util.HashMap; @@ -60,7 +58,7 @@ public class LayoutBinder { mBundle = layoutBundle; mProjectPackage = resourceBundle.getAppPackage(); mPackage = mProjectPackage + ".generated"; - mBaseClassName = ParserHelper.INSTANCE$.toClassName(layoutBundle.getFileName()) + "Binder"; + mBaseClassName = ParserHelper.INSTANCE$.toClassName(layoutBundle.getFileName()) + "Binding"; // copy over data. for (Map.Entry variable : mBundle.getVariables().entrySet()) { addVariable(variable.getKey(), variable.getValue()); @@ -144,7 +142,7 @@ public class LayoutBinder { public String writeViewBinderInterface() { ensureWriter(); - return mWriter.writeInterface(); + return mWriter.writeBaseClass(); } diff --git a/tools/data-binding/compiler/src/main/java/com/android/databinding/reflection/ModelAnalyzer.java b/tools/data-binding/compiler/src/main/java/com/android/databinding/reflection/ModelAnalyzer.java index 0397119eea72d..63cbc38b31a23 100644 --- a/tools/data-binding/compiler/src/main/java/com/android/databinding/reflection/ModelAnalyzer.java +++ b/tools/data-binding/compiler/src/main/java/com/android/databinding/reflection/ModelAnalyzer.java @@ -62,8 +62,8 @@ public abstract class ModelAnalyzer { "com.android.databinding.library.ObservableField", }; - public static final String I_VIEW_DATA_BINDER - = "com.android.databinding.library.IViewDataBinder"; + public static final String VIEW_DATA_BINDING = + "com.android.databinding.library.ViewDataBinding"; private static ModelAnalyzer sAnalyzer; diff --git a/tools/data-binding/compiler/src/main/java/com/android/databinding/reflection/annotation/AnnotationAnalyzer.java b/tools/data-binding/compiler/src/main/java/com/android/databinding/reflection/annotation/AnnotationAnalyzer.java index 54938882f10fa..ca40f2e83fbf6 100644 --- a/tools/data-binding/compiler/src/main/java/com/android/databinding/reflection/annotation/AnnotationAnalyzer.java +++ b/tools/data-binding/compiler/src/main/java/com/android/databinding/reflection/annotation/AnnotationAnalyzer.java @@ -48,7 +48,6 @@ import javax.lang.model.type.TypeMirror; import javax.lang.model.util.ElementFilter; import javax.lang.model.util.Elements; import javax.lang.model.util.Types; -import javax.tools.Diagnostic; public class AnnotationAnalyzer extends ModelAnalyzer { @@ -143,7 +142,7 @@ public class AnnotationAnalyzer extends ModelAnalyzer { private AnnotationClass getIViewDataBinderType() { if (mIViewDataBinderType == null) { - mIViewDataBinderType = new AnnotationClass(findType(I_VIEW_DATA_BINDER).asType()); + mIViewDataBinderType = new AnnotationClass(findType(VIEW_DATA_BINDING).asType()); } return mIViewDataBinderType; } diff --git a/tools/data-binding/compiler/src/main/java/com/android/databinding/store/LayoutFileParser.java b/tools/data-binding/compiler/src/main/java/com/android/databinding/store/LayoutFileParser.java index 93c5cd9949eb9..752562ba97d8f 100644 --- a/tools/data-binding/compiler/src/main/java/com/android/databinding/store/LayoutFileParser.java +++ b/tools/data-binding/compiler/src/main/java/com/android/databinding/store/LayoutFileParser.java @@ -128,7 +128,7 @@ public class LayoutFileParser { // generated. String layoutName = includeValue.substring(LAYOUT_PREFIX.length()); className = pkg + ".generated." + - ParserHelper.INSTANCE$.toClassName(layoutName) + "Binder"; + ParserHelper.INSTANCE$.toClassName(layoutName) + "Binding"; includedLayoutName = layoutName; } else { className = getFullViewClassName(nodeName); diff --git a/tools/data-binding/compiler/src/main/java/com/android/databinding/store/ResourceBundle.java b/tools/data-binding/compiler/src/main/java/com/android/databinding/store/ResourceBundle.java index 7422e67271563..767cc34e28f96 100644 --- a/tools/data-binding/compiler/src/main/java/com/android/databinding/store/ResourceBundle.java +++ b/tools/data-binding/compiler/src/main/java/com/android/databinding/store/ResourceBundle.java @@ -150,7 +150,7 @@ public class ResourceBundle implements Serializable { if (target.isBinder()) { L.d("overriding %s as base binder", target.getId()); viewTypes.put(target.mId, - "com.android.databinding.library.IViewDataBinder"); + "com.android.databinding.library.ViewDataBinding"); } else { L.d("overriding %s as base view", target.getId()); viewTypes.put(target.mId, "android.view.View"); diff --git a/tools/data-binding/compiler/src/main/kotlin/com/android/databinding/writer/DataBinderWriter.kt b/tools/data-binding/compiler/src/main/kotlin/com/android/databinding/writer/DataBinderWriter.kt index a3cfa53d211b0..d52a61225bcce 100644 --- a/tools/data-binding/compiler/src/main/kotlin/com/android/databinding/writer/DataBinderWriter.kt +++ b/tools/data-binding/compiler/src/main/kotlin/com/android/databinding/writer/DataBinderWriter.kt @@ -18,11 +18,11 @@ import com.android.databinding.LayoutBinder class DataBinderWriter(val pkg: String, val projectPackage: String, val className: String, val layoutBinders : List ) { fun write() = kcode("") { - tab("package $pkg;") - tab("import $projectPackage.R;") - tab("public class $className implements com.android.databinding.library.DataBinderMapper {") { + nl("package $pkg;") + nl("import $projectPackage.R;") + nl("public class $className implements com.android.databinding.library.DataBinderMapper {") { tab("@Override") - tab("public com.android.databinding.library.ViewDataBinder getDataBinder(android.view.View view, int layoutId) {") { + tab("public com.android.databinding.library.ViewDataBinding getDataBinder(android.view.View view, int layoutId) {") { tab("switch(layoutId) {") { layoutBinders.groupBy{it.getLayoutname()}.forEach { tab("case R.layout.${it.value.first!!.getLayoutname()}:") { @@ -54,6 +54,6 @@ class DataBinderWriter(val pkg: String, val projectPackage: String, val classNam tab("return android.binding.BR.getId(key);") } tab("}") } - tab("}") + nl("}") }.generate() } \ No newline at end of file diff --git a/tools/data-binding/compiler/src/main/kotlin/com/android/databinding/writer/LayoutBinderWriter.kt b/tools/data-binding/compiler/src/main/kotlin/com/android/databinding/writer/LayoutBinderWriter.kt index a83280500a8fb..fec3b46090f2e 100644 --- a/tools/data-binding/compiler/src/main/kotlin/com/android/databinding/writer/LayoutBinderWriter.kt +++ b/tools/data-binding/compiler/src/main/kotlin/com/android/databinding/writer/LayoutBinderWriter.kt @@ -314,7 +314,7 @@ class LayoutBinderWriter(val layoutBinder : LayoutBinder) { dynamics.filter { it is IdentifierExpr } } - val interfaceName = "${layoutBinder.getInterfaceName()}" + val baseClassName = "${layoutBinder.getInterfaceName()}" val includedBinders by Delegates.lazy { layoutBinder.getBindingTargets().filter { it.isBinder() } @@ -333,7 +333,8 @@ class LayoutBinderWriter(val layoutBinder : LayoutBinder) { return kcode("package ${layoutBinder.getPackage()};") { nl("import ${layoutBinder.getProjectPackage()}.R;") nl("import android.view.View;") - nl("public class ${className} extends com.android.databinding.library.ViewDataBinder implements ${interfaceName} {") { + nl("public class ${className} extends ${baseClassName} {") { + tab(declareIncludeViews()) tab(declareViews()) tab(declareVariables()) tab(declareConstructor()) @@ -344,7 +345,7 @@ class LayoutBinderWriter(val layoutBinder : LayoutBinder) { tab(viewGetters()) tab(onFieldChange()) - tab(rebindDirty()) + tab(executePendingBindings()) tab(declareDirtyFlags()) } @@ -353,37 +354,48 @@ class LayoutBinderWriter(val layoutBinder : LayoutBinder) { tab("//end") }.generate() } + fun declareIncludeViews() = kcode("") { + nl("private static final android.util.SparseIntArray sIncludes;") + nl("private static final android.util.SparseIntArray sViewsWithIds;") + nl("static {") { + val hasBinders = layoutBinder.getBindingTargets().firstOrNull{ it.isUsed() && it.isBinder()} != null + if (!hasBinders) { + tab("sIncludes = null;") + } else { + tab("sIncludes = new android.util.SparseIntArray();") + val numTaggedViews = layoutBinder.getBindingTargets(). + filter{it.isUsed() && !it.isBinder()}.count() + layoutBinder.getBindingTargets().filter{ it.isUsed() && it.isBinder()}.withIndex() + .forEach { + tab("sIncludes.put(${it.value.androidId}, ${it.index + numTaggedViews});") + } + } + val hasViewsWithIds = layoutBinder.getBindingTargets().firstOrNull{ it.isUsed() && !it.supportsTag()} != null + if (!hasViewsWithIds) { + tab("sViewsWithIds = null;") + } else { + tab("sViewsWithIds = new android.util.SparseIntArray();") + layoutBinder.getBindingTargets().filter{ it.isUsed() && !it.supportsTag() }. + forEach { + tab("sViewsWithIds.put(${it.androidId}, ${it.getTag()});") + } + } + } + nl("}") + } fun declareConstructor() = kcode("") { nl("public ${className}(View root) {") { tab("super(root, ${model.getObservables().size()});") - val taggedViewCount = layoutBinder.getBindingTargets().filter{ - it.isUsed() && !it.isBinder() && it.getTag() != null - }.count() - val hasViews = layoutBinder.getBindingTargets().firstOrNull{!it.isBinder() && it.supportsTag()} != null - val viewsParam : String; - if (hasViews) { - tab("View[] views = new View[${taggedViewCount}];") - viewsParam = "views" - } else { - viewsParam = "null" - } - val hasBinders = layoutBinder.getBindingTargets().firstOrNull{ it.isBinder() || !it.supportsTag()} != null - val binderParam : String - if (hasBinders) { - tab("android.util.SparseArray idViews = new android.util.SparseArray();") - binderParam = "idViews"; - } else { - binderParam = "null"; - } - tab("mapTaggedChildViews(root, ${viewsParam}, ${binderParam});"); - layoutBinder.getBindingTargets().filter{it.isUsed()}.forEach { - if (it.isBinder()) { - tab("this.${it.fieldName} = com.android.databinding.library.DataBinder.createBinder(idViews.get(${it.androidId}), R.layout.${it.getIncludedLayout()});") - } else if (it.getTag() == null) { + val viewCount = layoutBinder.getBindingTargets().filter{it.isUsed()}.count() + tab("View[] views = new View[${viewCount}];") + tab("mapTaggedChildViews(root, views, sIncludes, sViewsWithIds);"); + val taggedViews = layoutBinder.getBindingTargets().filter{it.isUsed() && !it.isBinder()} + taggedViews.forEach { + if (it.getTag() == null) { tab("this.${it.fieldName} = (${it.getViewClass()}) root;") } else { + tab("this.${it.fieldName} = (${it.getViewClass()}) views[${it.getTag()}];") if (it.supportsTag()) { - tab("this.${it.fieldName} = (${it.getViewClass()}) views[${it.getTag()}];") val originalTag = it.getOriginalTag(); var tagValue = "null" if (originalTag != null) { @@ -399,11 +411,14 @@ class LayoutBinderWriter(val layoutBinder : LayoutBinder) { } } tab("this.${it.fieldName}.setTag(${tagValue});") - } else { - tab("this.${it.fieldName} = (${it.getViewClass()}) idViews.get(${it.androidId});") } } } + val taggedCount = taggedViews.count() + layoutBinder.getBindingTargets().filter{it.isUsed() && it.isBinder()}.withIndex() + .forEach { + tab("this.${it.value.fieldName} = ${it.value.getViewClass()}.bind(views[${it.index + taggedCount}]);") + } tab("invalidateAll();"); } nl("}") @@ -486,8 +501,8 @@ class LayoutBinderWriter(val layoutBinder : LayoutBinder) { fun onFieldChange() = kcode("") { tab("@Override") - tab("protected boolean onFieldChange(int mLocalFieldId, Object object, int fieldId) {") { - tab("switch (mLocalFieldId) {") { + tab("protected boolean onFieldChange(int localFieldId, Object object, int fieldId) {") { + tab("switch (localFieldId) {") { model.getObservables().forEach { tab("case ${it.getId()} :") { tab("return ${it.onChangeName}((${it.getResolvedType().toJavaCode()}) object, fieldId);") @@ -578,9 +593,9 @@ class LayoutBinderWriter(val layoutBinder : LayoutBinder) { nl("flag mapping end*/") } - fun rebindDirty() = kcode("") { + fun executePendingBindings() = kcode("") { nl("@Override") - nl("public void rebindDirty() {") { + nl("public void executePendingBindings() {") { val tmpDirtyFlags = FlagSet(mDirtyFlags.buckets) tmpDirtyFlags.setLocalName("dirtyFlags"); for (i in (0..mDirtyFlags.buckets.size() - 1)) { @@ -624,7 +639,7 @@ class LayoutBinderWriter(val layoutBinder : LayoutBinder) { tab("// api target ${binding.getMinApi()}") val bindingCode = binding.toJavaCode(binding.getTarget().fieldName, binding.getExpr().toCode().generate()) if (binding.getMinApi() > 1) { - tab("if(com.android.databinding.library.DataBinder.getBuildSdkInt() >= ${binding.getMinApi()}) {") { + tab("if(getBuildSdkInt() >= ${binding.getMinApi()}) {") { tab("$bindingCode;") } tab("}") @@ -637,7 +652,7 @@ class LayoutBinderWriter(val layoutBinder : LayoutBinder) { } // includedBinders.filter{it.isUsed()}.forEach { binder -> - tab("${binder.fieldName}.rebindDirty();") + tab("${binder.fieldName}.executePendingBindings();") } } nl("}") @@ -710,22 +725,41 @@ class LayoutBinderWriter(val layoutBinder : LayoutBinder) { tab("}") } - public fun writeInterface() : String = + public fun writeBaseClass() : String = kcode("package ${layoutBinder.getPackage()};") { nl("import android.binding.Bindable;") - nl("import com.android.databinding.library.IViewDataBinder;") - nl("public interface ${interfaceName} extends IViewDataBinder {") + nl("import com.android.databinding.library.DataBindingUtil;") + nl("import com.android.databinding.library.ViewDataBinding;") + nl("public abstract class ${baseClassName} extends ViewDataBinding {") + tab("protected ${baseClassName}(android.view.View root, int localFieldCount) {") { + tab("super(root, localFieldCount);") + } + tab("}") + nl("") variables.forEach { if (it.getUserDefinedType() != null) { tab("@Bindable") //it.getExpandedUserDefinedType(ModelAnalyzer.getInstance()); val type = ModelAnalyzer.getInstance().applyImports(it.getUserDefinedType(), model.getImports()) - tab("public void ${it.setterName}(${type} ${it.readableUniqueName});") + tab("public abstract void ${it.setterName}(${type} ${it.readableUniqueName});") } } layoutBinder.getBindingTargets().filter{ it.getId() != null }.forEach { - tab("public ${it.getInterfaceType()} ${it.getterName}();") + tab("public abstract ${it.getInterfaceType()} ${it.getterName}();") } + nl("") + tab("public static ${baseClassName} inflate(android.view.ViewGroup root) {") { + tab("return DataBindingUtil.<${baseClassName}>inflate(root.getContext(), ${layoutBinder.getProjectPackage()}.R.layout.${layoutBinder.getLayoutname()}, root, true);") + } + tab("}") + tab("public static ${baseClassName} inflate(android.content.Context context) {") { + tab("return DataBindingUtil.<${baseClassName}>inflate(context, ${layoutBinder.getProjectPackage()}.R.layout.${layoutBinder.getLayoutname()}, null, false);") + } + tab("}") + tab("public static ${baseClassName} bind(android.view.View view) {") { + tab("return (${baseClassName})DataBindingUtil.bindTo(view, ${layoutBinder.getProjectPackage()}.R.layout.${layoutBinder.getLayoutname()});") + } + tab("}") nl("}") }.generate() } \ No newline at end of file diff --git a/tools/data-binding/compiler/src/test/java/com/android/databinding/reflection/java/JavaAnalyzer.java b/tools/data-binding/compiler/src/test/java/com/android/databinding/reflection/java/JavaAnalyzer.java index 8e6d7f738cbdd..c6c7cf17dc491 100644 --- a/tools/data-binding/compiler/src/test/java/com/android/databinding/reflection/java/JavaAnalyzer.java +++ b/tools/data-binding/compiler/src/test/java/com/android/databinding/reflection/java/JavaAnalyzer.java @@ -81,7 +81,7 @@ public class JavaAnalyzer extends ModelAnalyzer { mClassLoader = classLoader; mTestMode = testMode; try { - mIViewDataBinder = classLoader.loadClass(I_VIEW_DATA_BINDER); + mIViewDataBinder = classLoader.loadClass(VIEW_DATA_BINDING); mObservable = Observable.class; mObservableList = ObservableList.class; mObservableMap = ObservableMap.class; diff --git a/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/library/DataBinderTrojan.java b/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/library/DataBinderTrojan.java index eeba4f2468bad..be95a0c5bb9f9 100644 --- a/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/library/DataBinderTrojan.java +++ b/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/library/DataBinderTrojan.java @@ -21,6 +21,6 @@ package com.android.databinding.library; */ public class DataBinderTrojan { public static void setBuildSdkInt(int level) { - DataBinder.SDK_INT = level; + ViewDataBinding.SDK_INT = level; } } diff --git a/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/AbsListViewBindingAdapterTest.java b/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/AbsListViewBindingAdapterTest.java index 4c6b0372c7726..1144dbc5294af 100644 --- a/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/AbsListViewBindingAdapterTest.java +++ b/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/AbsListViewBindingAdapterTest.java @@ -15,7 +15,7 @@ */ package com.android.databinding.testapp; -import com.android.databinding.testapp.generated.AbsListViewAdapterTestBinder; +import com.android.databinding.testapp.generated.AbsListViewAdapterTestBinding; import com.android.databinding.testapp.vo.AbsListViewBindingObject; import android.graphics.drawable.ColorDrawable; @@ -24,12 +24,12 @@ import android.os.Debug; import android.widget.ListView; public class AbsListViewBindingAdapterTest - extends BindingAdapterTestBase { + extends BindingAdapterTestBase { ListView mView; public AbsListViewBindingAdapterTest() { - super(AbsListViewAdapterTestBinder.class, AbsListViewBindingObject.class, + super(AbsListViewAdapterTestBinding.class, AbsListViewBindingObject.class, R.layout.abs_list_view_adapter_test); } diff --git a/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/AbsSeekBarBindingAdapterTest.java b/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/AbsSeekBarBindingAdapterTest.java index abf842b87607c..d3b2b9856b6f3 100644 --- a/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/AbsSeekBarBindingAdapterTest.java +++ b/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/AbsSeekBarBindingAdapterTest.java @@ -15,19 +15,19 @@ */ package com.android.databinding.testapp; -import com.android.databinding.testapp.generated.AbsSeekBarAdapterTestBinder; +import com.android.databinding.testapp.generated.AbsSeekBarAdapterTestBinding; import com.android.databinding.testapp.vo.AbsSeekBarBindingObject; import android.os.Build; import android.widget.SeekBar; public class AbsSeekBarBindingAdapterTest - extends BindingAdapterTestBase { + extends BindingAdapterTestBase { SeekBar mView; public AbsSeekBarBindingAdapterTest() { - super(AbsSeekBarAdapterTestBinder.class, AbsSeekBarBindingObject.class, + super(AbsSeekBarAdapterTestBinding.class, AbsSeekBarBindingObject.class, R.layout.abs_seek_bar_adapter_test); } diff --git a/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/AbsSpinnerBindingAdapterTest.java b/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/AbsSpinnerBindingAdapterTest.java index 7478672454bf7..7581794c77540 100644 --- a/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/AbsSpinnerBindingAdapterTest.java +++ b/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/AbsSpinnerBindingAdapterTest.java @@ -15,7 +15,7 @@ */ package com.android.databinding.testapp; -import com.android.databinding.testapp.generated.AbsSpinnerAdapterTestBinder; +import com.android.databinding.testapp.generated.AbsSpinnerAdapterTestBinding; import com.android.databinding.testapp.vo.AbsSpinnerBindingObject; import android.os.Build; @@ -23,12 +23,12 @@ import android.widget.Spinner; import android.widget.SpinnerAdapter; public class AbsSpinnerBindingAdapterTest - extends BindingAdapterTestBase { + extends BindingAdapterTestBase { Spinner mView; public AbsSpinnerBindingAdapterTest() { - super(AbsSpinnerAdapterTestBinder.class, AbsSpinnerBindingObject.class, + super(AbsSpinnerAdapterTestBinding.class, AbsSpinnerBindingObject.class, R.layout.abs_spinner_adapter_test); } diff --git a/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/AutoCompleteTextViewBindingAdapterTest.java b/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/AutoCompleteTextViewBindingAdapterTest.java index ba7b4de5aef0f..a529d98e7c46e 100644 --- a/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/AutoCompleteTextViewBindingAdapterTest.java +++ b/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/AutoCompleteTextViewBindingAdapterTest.java @@ -15,7 +15,7 @@ */ package com.android.databinding.testapp; -import com.android.databinding.testapp.generated.AutoCompleteTextViewAdapterTestBinder; +import com.android.databinding.testapp.generated.AutoCompleteTextViewAdapterTestBinding; import com.android.databinding.testapp.vo.AutoCompleteTextViewBindingObject; import android.graphics.drawable.ColorDrawable; @@ -23,13 +23,13 @@ import android.os.Build; import android.widget.AutoCompleteTextView; public class AutoCompleteTextViewBindingAdapterTest extends - BindingAdapterTestBase { AutoCompleteTextView mView; public AutoCompleteTextViewBindingAdapterTest() { - super(AutoCompleteTextViewAdapterTestBinder.class, AutoCompleteTextViewBindingObject.class, + super(AutoCompleteTextViewAdapterTestBinding.class, AutoCompleteTextViewBindingObject.class, R.layout.auto_complete_text_view_adapter_test); } diff --git a/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/BaseDataBinderTest.java b/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/BaseDataBinderTest.java index 80c2c945ec10f..b70353a54c41d 100644 --- a/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/BaseDataBinderTest.java +++ b/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/BaseDataBinderTest.java @@ -13,28 +13,28 @@ package com.android.databinding.testapp; -import com.android.databinding.library.DataBinder; -import com.android.databinding.library.IViewDataBinder; +import com.android.databinding.library.ViewDataBinding; +import android.content.Context; import android.content.pm.ActivityInfo; import android.os.Looper; import android.test.ActivityInstrumentationTestCase2; -public class BaseDataBinderTest +import java.lang.reflect.Method; + +public class BaseDataBinderTest extends ActivityInstrumentationTestCase2 { protected Class mBinderClass; - private int mLayoutId; private int mOrientation; protected T mBinder; - public BaseDataBinderTest(final Class binderClass, final int layoutId) { - this(binderClass, layoutId, ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); + public BaseDataBinderTest(final Class binderClass) { + this(binderClass, ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); } - public BaseDataBinderTest(final Class binderClass, final int layoutId, final int orientation) { + public BaseDataBinderTest(final Class binderClass, final int orientation) { super(TestActivity.class); mBinderClass = binderClass; - mLayoutId = layoutId; mOrientation = orientation; } @@ -54,8 +54,14 @@ public class BaseDataBinderTest getActivity().runOnUiThread(new Runnable() { @Override public void run() { - mBinder = DataBinder.createBinder(mBinderClass, getActivity(), mLayoutId, null); - getActivity().setContentView(mBinder.getRoot()); + Method method = null; + try { + method = mBinderClass.getMethod("inflate", Context.class); + mBinder = (T) method.invoke(null, getActivity()); + getActivity().setContentView(mBinder.getRoot()); + } catch (Exception e) { + fail("Error creating binder"); + } } }); if (!isMainThread()) { diff --git a/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/BaseLandDataBinderTest.java b/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/BaseLandDataBinderTest.java index 0f983ebaa8d7b..dee1a34ae1d45 100644 --- a/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/BaseLandDataBinderTest.java +++ b/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/BaseLandDataBinderTest.java @@ -13,13 +13,13 @@ package com.android.databinding.testapp; -import com.android.databinding.library.IViewDataBinder; +import com.android.databinding.library.ViewDataBinding; import android.content.pm.ActivityInfo; -public class BaseLandDataBinderTest extends BaseDataBinderTest { +public class BaseLandDataBinderTest extends BaseDataBinderTest { public BaseLandDataBinderTest(Class binderClass, int layoutId) { - super(binderClass, layoutId, ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); + super(binderClass, ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); } } diff --git a/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/BaseObservableTest.java b/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/BaseObservableTest.java index a740551b4386e..dd7acbc5aa625 100644 --- a/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/BaseObservableTest.java +++ b/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/BaseObservableTest.java @@ -16,14 +16,14 @@ package com.android.databinding.testapp; import com.android.databinding.library.BaseObservable; -import com.android.databinding.testapp.generated.BasicBindingBinder; +import com.android.databinding.testapp.generated.BasicBindingBinding; import android.binding.Observable; import android.binding.OnPropertyChangedListener; import java.util.ArrayList; -public class BaseObservableTest extends BaseDataBinderTest { +public class BaseObservableTest extends BaseDataBinderTest { private BaseObservable mObservable; private ArrayList mNotifications = new ArrayList<>(); private OnPropertyChangedListener mListener = new OnPropertyChangedListener() { @@ -35,7 +35,7 @@ public class BaseObservableTest extends BaseDataBinderTest { }; public BaseObservableTest() { - super(BasicBindingBinder.class, R.layout.basic_binding); + super(BasicBindingBinding.class); } @Override diff --git a/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/BasicBindingTest.java b/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/BasicBindingTest.java index a7ba2236e7ac5..d6385d0faa394 100644 --- a/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/BasicBindingTest.java +++ b/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/BasicBindingTest.java @@ -13,13 +13,13 @@ package com.android.databinding.testapp; -import com.android.databinding.testapp.generated.BasicBindingBinder; +import com.android.databinding.testapp.generated.BasicBindingBinding; import android.test.UiThreadTest; -public class BasicBindingTest extends BaseDataBinderTest { +public class BasicBindingTest extends BaseDataBinderTest { public BasicBindingTest() { - super(BasicBindingBinder.class, R.layout.basic_binding); + super(BasicBindingBinding.class); } @UiThreadTest @@ -69,7 +69,7 @@ public class BasicBindingTest extends BaseDataBinderTest { } private void rebindAndAssert(String text) { - mBinder.rebindDirty(); + mBinder.executePendingBindings(); assertEquals(text, mBinder.getTextView().getText().toString()); } } diff --git a/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/BasicDependantBindingTest.java b/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/BasicDependantBindingTest.java index 3a7631b3a7e38..cb96e259cac63 100644 --- a/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/BasicDependantBindingTest.java +++ b/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/BasicDependantBindingTest.java @@ -13,7 +13,7 @@ package com.android.databinding.testapp; -import com.android.databinding.testapp.generated.BasicDependantBindingBinder; +import com.android.databinding.testapp.generated.BasicDependantBindingBinding; import com.android.databinding.testapp.vo.NotBindableVo; import android.test.UiThreadTest; @@ -21,10 +21,10 @@ import android.test.UiThreadTest; import java.util.ArrayList; import java.util.List; -public class BasicDependantBindingTest extends BaseDataBinderTest { +public class BasicDependantBindingTest extends BaseDataBinderTest { public BasicDependantBindingTest() { - super(BasicDependantBindingBinder.class, R.layout.basic_dependant_binding); + super(BasicDependantBindingBinding.class); } public List permutations(String value) { @@ -44,7 +44,7 @@ public class BasicDependantBindingTest extends BaseDataBinderTest{ +public class BindToFinalFieldTest extends BaseDataBinderTest{ public BindToFinalFieldTest() { - super(BindToFinalBinder.class, R.layout.bind_to_final); + super(BindToFinalBinding.class); } @UiThreadTest public void testSimple() { final PublicFinalTestVo vo = new PublicFinalTestVo(R.string.app_name); mBinder.setObj(vo); - mBinder.rebindDirty(); + mBinder.executePendingBindings(); final TextView textView = (TextView) mBinder.getRoot().findViewById(R.id.text_view); assertEquals(getActivity().getResources().getString(R.string.app_name), textView.getText().toString()); } diff --git a/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/BindToFinalObservableFieldTest.java b/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/BindToFinalObservableFieldTest.java index c0aacd012728e..dc45be6839dbe 100644 --- a/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/BindToFinalObservableFieldTest.java +++ b/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/BindToFinalObservableFieldTest.java @@ -13,29 +13,27 @@ package com.android.databinding.testapp; -import com.android.databinding.testapp.generated.BindToFinalBinder; -import com.android.databinding.testapp.generated.BindToFinalObservableBinder; -import com.android.databinding.testapp.vo.PublicFinalTestVo; +import com.android.databinding.testapp.generated.BindToFinalObservableBinding; import com.android.databinding.testapp.vo.PublicFinalWithObservableTestVo; import android.test.UiThreadTest; import android.widget.TextView; -public class BindToFinalObservableFieldTest extends BaseDataBinderTest{ +public class BindToFinalObservableFieldTest extends BaseDataBinderTest{ public BindToFinalObservableFieldTest() { - super(BindToFinalObservableBinder.class, R.layout.bind_to_final_observable); + super(BindToFinalObservableBinding.class); } @UiThreadTest public void testSimple() { final PublicFinalWithObservableTestVo vo = new PublicFinalWithObservableTestVo(R.string.app_name); mBinder.setObj(vo); - mBinder.rebindDirty(); + mBinder.executePendingBindings(); final TextView textView = (TextView) mBinder.getRoot().findViewById(R.id.text_view); assertEquals(getActivity().getResources().getString(R.string.app_name), textView.getText().toString()); vo.myFinalVo.setVal(R.string.rain); - mBinder.rebindDirty(); + mBinder.executePendingBindings(); assertEquals("The field should be observed and its notify event should've invalidated" + " binder flags.", getActivity().getResources().getString(R.string.rain), textView.getText().toString()); diff --git a/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/BindingAdapterTestBase.java b/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/BindingAdapterTestBase.java index bedfc003eeae5..cc8e3e26b9929 100644 --- a/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/BindingAdapterTestBase.java +++ b/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/BindingAdapterTestBase.java @@ -15,13 +15,13 @@ */ package com.android.databinding.testapp; -import com.android.databinding.library.IViewDataBinder; +import com.android.databinding.library.ViewDataBinding; import com.android.databinding.testapp.vo.BindingAdapterBindingObject; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; -public class BindingAdapterTestBase +public class BindingAdapterTestBase extends BaseDataBinderTest { private Class mBindingObjectClass; @@ -30,7 +30,7 @@ public class BindingAdapterTestBase binderClass, Class observableClass, int layoutId) { - super(binderClass, layoutId); + super(binderClass); mBindingObjectClass = observableClass; try { mSetMethod = binderClass.getDeclaredMethod("setObj", observableClass); @@ -49,7 +49,7 @@ public class BindingAdapterTestBase { +public class BracketTest extends BaseDataBinderTest { private String[] mArray = { "Hello World" }; @@ -36,7 +34,7 @@ public class BracketTest extends BaseDataBinderTest { private LongSparseArray mLongSparseArray = new LongSparseArray<>(); public BracketTest() { - super(BracketTestBinder.class, R.layout.bracket_test); + super(BracketTestBinding.class); mSparseArray.put(0, "Hello"); mLongSparseArray.put(0, "World"); mSparseIntArray.put(0, 100); @@ -58,7 +56,7 @@ public class BracketTest extends BaseDataBinderTest { mBinder.setSparseLongArray(mSparseLongArray); mBinder.setLongSparseArray(mLongSparseArray); - mBinder.rebindDirty(); + mBinder.executePendingBindings(); } }); } catch (Throwable throwable) { diff --git a/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/CastTest.java b/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/CastTest.java index 0ea053f1a7f3f..497325ef2ab59 100644 --- a/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/CastTest.java +++ b/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/CastTest.java @@ -15,19 +15,19 @@ */ package com.android.databinding.testapp; -import com.android.databinding.testapp.generated.CastTestBinder; +import com.android.databinding.testapp.generated.CastTestBinding; import android.support.v4.util.ArrayMap; import android.test.UiThreadTest; import java.util.ArrayList; -public class CastTest extends BaseDataBinderTest { +public class CastTest extends BaseDataBinderTest { ArrayList mValues = new ArrayList<>(); ArrayMap mMap = new ArrayMap<>(); public CastTest() { - super(CastTestBinder.class, R.layout.cast_test); + super(CastTestBinding.class); } @Override @@ -46,7 +46,7 @@ public class CastTest extends BaseDataBinderTest { mMap.put("world", "hello"); mBinder.setList(mValues); mBinder.setMap(mMap); - mBinder.rebindDirty(); + mBinder.executePendingBindings(); } }); } catch (Throwable throwable) { diff --git a/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/CheckedTextViewBindingAdapterTest.java b/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/CheckedTextViewBindingAdapterTest.java index ee88e6bea0247..ac4090c19ff3b 100644 --- a/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/CheckedTextViewBindingAdapterTest.java +++ b/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/CheckedTextViewBindingAdapterTest.java @@ -15,7 +15,7 @@ */ package com.android.databinding.testapp; -import com.android.databinding.testapp.generated.CheckedTextViewAdapterTestBinder; +import com.android.databinding.testapp.generated.CheckedTextViewAdapterTestBinding; import com.android.databinding.testapp.vo.CheckedTextViewBindingObject; import android.graphics.drawable.ColorDrawable; @@ -23,12 +23,12 @@ import android.os.Build; import android.widget.CheckedTextView; public class CheckedTextViewBindingAdapterTest extends - BindingAdapterTestBase { + BindingAdapterTestBase { CheckedTextView mView; public CheckedTextViewBindingAdapterTest() { - super(CheckedTextViewAdapterTestBinder.class, CheckedTextViewBindingObject.class, + super(CheckedTextViewAdapterTestBinding.class, CheckedTextViewBindingObject.class, R.layout.checked_text_view_adapter_test); } diff --git a/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/CompoundButtonBindingAdapterTest.java b/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/CompoundButtonBindingAdapterTest.java index 6570f870d09a5..55902ead1b603 100644 --- a/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/CompoundButtonBindingAdapterTest.java +++ b/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/CompoundButtonBindingAdapterTest.java @@ -15,18 +15,18 @@ */ package com.android.databinding.testapp; -import com.android.databinding.testapp.generated.CompoundButtonAdapterTestBinder; +import com.android.databinding.testapp.generated.CompoundButtonAdapterTestBinding; import com.android.databinding.testapp.vo.CompoundButtonBindingObject; import android.widget.CompoundButton; public class CompoundButtonBindingAdapterTest extends - BindingAdapterTestBase { + BindingAdapterTestBase { CompoundButton mView; public CompoundButtonBindingAdapterTest() { - super(CompoundButtonAdapterTestBinder.class, CompoundButtonBindingObject.class, + super(CompoundButtonAdapterTestBinding.class, CompoundButtonBindingObject.class, R.layout.compound_button_adapter_test); } diff --git a/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/ConditionalBindingTest.java b/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/ConditionalBindingTest.java index 4a39680d51c37..2fe21cfdebd46 100644 --- a/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/ConditionalBindingTest.java +++ b/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/ConditionalBindingTest.java @@ -1,14 +1,14 @@ package com.android.databinding.testapp; -import com.android.databinding.testapp.generated.ConditionalBindingBinder; +import com.android.databinding.testapp.generated.ConditionalBindingBinding; import com.android.databinding.testapp.vo.NotBindableVo; import android.test.UiThreadTest; -public class ConditionalBindingTest extends BaseDataBinderTest{ +public class ConditionalBindingTest extends BaseDataBinderTest{ public ConditionalBindingTest() { - super(ConditionalBindingBinder.class, R.layout.conditional_binding); + super(ConditionalBindingBinding.class); } @UiThreadTest @@ -25,7 +25,7 @@ public class ConditionalBindingTest extends BaseDataBinderTest { + extends BindingAdapterTestBase { public FindMethodTest() { - super(FindMethodTestBinder.class, FindMethodBindingObject.class, R.layout.find_method_test); + super(FindMethodTestBinding.class, FindMethodBindingObject.class, R.layout.find_method_test); } public void testNoArg() throws Throwable { @@ -96,7 +96,7 @@ public class FindMethodTest @UiThreadTest public void testImports() throws Throwable { mBinder.setObj2(new FindMethodBindingObject.Bar()); - mBinder.rebindDirty(); + mBinder.executePendingBindings(); TextView textView = mBinder.getTextView15(); assertEquals("hello", textView.getText().toString()); } diff --git a/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/FrameLayoutBindingAdapterTest.java b/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/FrameLayoutBindingAdapterTest.java index 4f1a013345af8..8c463119752ea 100644 --- a/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/FrameLayoutBindingAdapterTest.java +++ b/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/FrameLayoutBindingAdapterTest.java @@ -15,19 +15,19 @@ */ package com.android.databinding.testapp; -import com.android.databinding.testapp.generated.FrameLayoutAdapterTestBinder; +import com.android.databinding.testapp.generated.FrameLayoutAdapterTestBinding; import com.android.databinding.testapp.vo.FrameLayoutBindingObject; import android.os.Build; import android.widget.FrameLayout; public class FrameLayoutBindingAdapterTest - extends BindingAdapterTestBase { + extends BindingAdapterTestBase { FrameLayout mView; public FrameLayoutBindingAdapterTest() { - super(FrameLayoutAdapterTestBinder.class, FrameLayoutBindingObject.class, + super(FrameLayoutAdapterTestBinding.class, FrameLayoutBindingObject.class, R.layout.frame_layout_adapter_test); } diff --git a/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/ImageViewBindingAdapterTest.java b/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/ImageViewBindingAdapterTest.java index 1a23bc6029e2d..8f08ab996b0da 100644 --- a/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/ImageViewBindingAdapterTest.java +++ b/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/ImageViewBindingAdapterTest.java @@ -15,18 +15,18 @@ */ package com.android.databinding.testapp; -import com.android.databinding.testapp.generated.ImageViewAdapterTestBinder; +import com.android.databinding.testapp.generated.ImageViewAdapterTestBinding; import com.android.databinding.testapp.vo.ImageViewBindingObject; import android.widget.ImageView; public class ImageViewBindingAdapterTest - extends BindingAdapterTestBase { + extends BindingAdapterTestBase { ImageView mView; public ImageViewBindingAdapterTest() { - super(ImageViewAdapterTestBinder.class, ImageViewBindingObject.class, + super(ImageViewAdapterTestBinding.class, ImageViewBindingObject.class, R.layout.image_view_adapter_test); } diff --git a/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/IncludeTagTest.java b/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/IncludeTagTest.java index 7cff11fa21d5c..cc2d39307a60f 100644 --- a/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/IncludeTagTest.java +++ b/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/IncludeTagTest.java @@ -13,23 +13,23 @@ package com.android.databinding.testapp; -import com.android.databinding.testapp.generated.LayoutWithIncludeBinder; +import com.android.databinding.testapp.generated.LayoutWithIncludeBinding; import com.android.databinding.testapp.vo.NotBindableVo; import android.test.UiThreadTest; import android.widget.TextView; -public class IncludeTagTest extends BaseDataBinderTest { +public class IncludeTagTest extends BaseDataBinderTest { public IncludeTagTest() { - super(LayoutWithIncludeBinder.class, R.layout.layout_with_include); + super(LayoutWithIncludeBinding.class); } @UiThreadTest public void testIncludeTag() { NotBindableVo vo = new NotBindableVo(3, "a"); mBinder.setOuterObject(vo); - mBinder.rebindDirty(); + mBinder.executePendingBindings(); final TextView outerText = (TextView) mBinder.getRoot().findViewById(R.id.outerTextView); assertEquals("a", outerText.getText()); final TextView innerText = (TextView) mBinder.getRoot().findViewById(R.id.innerTextView); @@ -38,7 +38,7 @@ public class IncludeTagTest extends BaseDataBinderTest vo.setIntValue(5); vo.setStringValue("b"); mBinder.invalidateAll(); - mBinder.rebindDirty(); + mBinder.executePendingBindings(); assertEquals("b", outerText.getText()); assertEquals("modified 5b", innerText.getText().toString()); } diff --git a/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/LinearLayoutBindingAdapterTest.java b/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/LinearLayoutBindingAdapterTest.java index 3b4484195af90..0d95ad5203593 100644 --- a/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/LinearLayoutBindingAdapterTest.java +++ b/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/LinearLayoutBindingAdapterTest.java @@ -15,19 +15,19 @@ */ package com.android.databinding.testapp; -import com.android.databinding.testapp.generated.LinearLayoutAdapterTestBinder; +import com.android.databinding.testapp.generated.LinearLayoutAdapterTestBinding; import com.android.databinding.testapp.vo.LinearLayoutBindingObject; import android.os.Build; import android.widget.LinearLayout; public class LinearLayoutBindingAdapterTest - extends BindingAdapterTestBase { + extends BindingAdapterTestBase { LinearLayout mView; public LinearLayoutBindingAdapterTest() { - super(LinearLayoutAdapterTestBinder.class, LinearLayoutBindingObject.class, + super(LinearLayoutAdapterTestBinding.class, LinearLayoutBindingObject.class, R.layout.linear_layout_adapter_test); } diff --git a/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/ListChangeRegistryTest.java b/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/ListChangeRegistryTest.java index 9a25082f377ce..2a5d0b65a15ae 100644 --- a/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/ListChangeRegistryTest.java +++ b/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/ListChangeRegistryTest.java @@ -16,18 +16,18 @@ package com.android.databinding.testapp; import com.android.databinding.library.ListChangeRegistry; -import com.android.databinding.testapp.generated.BasicBindingBinder; +import com.android.databinding.testapp.generated.BasicBindingBinding; import android.binding.OnListChangedListener; -public class ListChangeRegistryTest extends BaseDataBinderTest { +public class ListChangeRegistryTest extends BaseDataBinderTest { private ListChangeRegistry mListChangeRegistry; private int mCallCount; public ListChangeRegistryTest() { - super(BasicBindingBinder.class, R.layout.basic_binding); + super(BasicBindingBinding.class); } @Override diff --git a/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/MapChangeRegistryTest.java b/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/MapChangeRegistryTest.java index 1db9f51d05a06..b30dc490950aa 100644 --- a/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/MapChangeRegistryTest.java +++ b/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/MapChangeRegistryTest.java @@ -17,17 +17,17 @@ package com.android.databinding.testapp; import com.android.databinding.library.MapChangeRegistry; import com.android.databinding.library.ObservableArrayMap; -import com.android.databinding.testapp.generated.BasicBindingBinder; +import com.android.databinding.testapp.generated.BasicBindingBinding; import android.binding.ObservableMap; import android.binding.OnMapChangedListener; -public class MapChangeRegistryTest extends BaseDataBinderTest { +public class MapChangeRegistryTest extends BaseDataBinderTest { private int notificationCount = 0; public MapChangeRegistryTest() { - super(BasicBindingBinder.class, R.layout.basic_binding); + super(BasicBindingBinding.class); } public void testNotifyAllChanged() { diff --git a/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/NewApiTest.java b/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/NewApiTest.java index 9b28237f41bc8..bbb337ae7ed66 100644 --- a/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/NewApiTest.java +++ b/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/NewApiTest.java @@ -14,21 +14,18 @@ package com.android.databinding.testapp; import com.android.databinding.library.DataBinderTrojan; -import com.android.databinding.testapp.generated.NewApiLayoutBinder; +import com.android.databinding.testapp.generated.NewApiLayoutBinding; -import android.content.Context; import android.os.Build; import android.test.UiThreadTest; -import android.util.AttributeSet; import android.view.View; -import android.view.ViewGroup; import android.widget.TextView; import java.util.ArrayList; -public class NewApiTest extends BaseDataBinderTest { +public class NewApiTest extends BaseDataBinderTest { public NewApiTest() { - super(NewApiLayoutBinder.class, R.layout.new_api_layout); + super(NewApiLayoutBinding.class); } @UiThreadTest @@ -36,7 +33,7 @@ public class NewApiTest extends BaseDataBinderTest { mBinder.setElevation(3); mBinder.setName("foo"); mBinder.setChildren(new ArrayList()); - mBinder.rebindDirty(); + mBinder.executePendingBindings(); assertEquals("foo", mBinder.getTextView().getText().toString()); assertEquals(3f, mBinder.getTextView().getElevation()); } @@ -49,7 +46,7 @@ public class NewApiTest extends BaseDataBinderTest { float originalElevation = textView.getElevation(); mBinder.setElevation(3); mBinder.setName("foo2"); - mBinder.rebindDirty(); + mBinder.executePendingBindings(); assertEquals("foo2", textView.getText().toString()); assertEquals(originalElevation, textView.getElevation()); } finally { @@ -61,7 +58,7 @@ public class NewApiTest extends BaseDataBinderTest { public void testGeneric() { ArrayList views = new ArrayList<>(); mBinder.setChildren(views); - mBinder.rebindDirty(); + mBinder.executePendingBindings(); assertEquals(1, views.size()); assertSame(mBinder.getTextView(), views.get(0)); } @@ -72,7 +69,7 @@ public class NewApiTest extends BaseDataBinderTest { try { ArrayList views = new ArrayList<>(); mBinder.setChildren(views); - mBinder.rebindDirty(); + mBinder.executePendingBindings(); // we should not call the api on older platforms. assertEquals(0, views.size()); } finally { diff --git a/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/NoIdTest.java b/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/NoIdTest.java index 93ed941bdba99..65099245e3db3 100644 --- a/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/NoIdTest.java +++ b/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/NoIdTest.java @@ -13,15 +13,15 @@ package com.android.databinding.testapp; -import com.android.databinding.testapp.generated.NoIdTestBinder; +import com.android.databinding.testapp.generated.NoIdTestBinding; import android.test.UiThreadTest; import android.widget.LinearLayout; import android.widget.TextView; -public class NoIdTest extends BaseDataBinderTest { +public class NoIdTest extends BaseDataBinderTest { public NoIdTest() { - super(NoIdTestBinder.class, R.layout.no_id_test); + super(NoIdTestBinding.class); } @Override @@ -33,7 +33,7 @@ public class NoIdTest extends BaseDataBinderTest { public void run() { mBinder.setName("hello"); mBinder.setOrientation(LinearLayout.VERTICAL); - mBinder.rebindDirty(); + mBinder.executePendingBindings(); } }); } catch (Throwable throwable) { @@ -46,7 +46,7 @@ public class NoIdTest extends BaseDataBinderTest { LinearLayout linearLayout = (LinearLayout) mBinder.getRoot(); assertEquals(LinearLayout.VERTICAL, linearLayout.getOrientation()); mBinder.setOrientation(LinearLayout.HORIZONTAL); - mBinder.rebindDirty(); + mBinder.executePendingBindings(); assertEquals(LinearLayout.HORIZONTAL, linearLayout.getOrientation()); } @@ -57,7 +57,7 @@ public class NoIdTest extends BaseDataBinderTest { assertEquals("hello world", view.getTag()); assertEquals("hello", view.getText().toString()); mBinder.setName("world"); - mBinder.rebindDirty(); + mBinder.executePendingBindings(); assertEquals("world", view.getText().toString()); } diff --git a/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/ObservableArrayListTest.java b/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/ObservableArrayListTest.java index a8d2f0094788e..ef84ff46f3664 100644 --- a/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/ObservableArrayListTest.java +++ b/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/ObservableArrayListTest.java @@ -16,14 +16,14 @@ package com.android.databinding.testapp; import com.android.databinding.library.ObservableArrayList; -import com.android.databinding.testapp.generated.BasicBindingBinder; +import com.android.databinding.testapp.generated.BasicBindingBinding; import android.binding.ObservableList; import android.binding.OnListChangedListener; import java.util.ArrayList; -public class ObservableArrayListTest extends BaseDataBinderTest { +public class ObservableArrayListTest extends BaseDataBinderTest { private static final int ALL = 0; @@ -96,7 +96,7 @@ public class ObservableArrayListTest extends BaseDataBinderTest { +public class ObservableArrayMapTest extends BaseDataBinderTest { private ObservableArrayMap mObservable; @@ -41,7 +41,7 @@ public class ObservableArrayMapTest extends BaseDataBinderTest { +public class ObservableFieldTest extends BaseDataBinderTest { private ObservableFieldBindingObject mObj; public ObservableFieldTest() { - super(ObservableFieldTestBinder.class, R.layout.observable_field_test); + super(ObservableFieldTestBinding.class); } @Override @@ -35,7 +35,7 @@ public class ObservableFieldTest extends BaseDataBinderTest { +public class ObservableWithNotBindableFieldObjectTest extends BaseDataBinderTest { public ObservableWithNotBindableFieldObjectTest() { - super(ObservableWithNotBindableFieldBinder.class, R.layout.observable_with_not_bindable_field); + super(ObservableWithNotBindableFieldBinding.class); } @UiThreadTest public void testSimple() { ObservableWithNotBindableFieldObject obj = new ObservableWithNotBindableFieldObject(); mBinder.setObj(obj); - mBinder.rebindDirty(); + mBinder.executePendingBindings(); assertEquals("", mBinder.getTextView().getText().toString()); obj.update("100"); - mBinder.rebindDirty(); + mBinder.executePendingBindings(); assertEquals("100", mBinder.getTextView().getText().toString()); } } diff --git a/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/ProcessBindableTest.java b/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/ProcessBindableTest.java index e7f430e5be2d7..a092d0de2ff8c 100644 --- a/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/ProcessBindableTest.java +++ b/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/ProcessBindableTest.java @@ -15,19 +15,15 @@ */ package com.android.databinding.testapp; -import com.android.databinding.library.PropertyChangeRegistry; -import com.android.databinding.testapp.generated.BasicBindingBinder; +import com.android.databinding.testapp.generated.BasicBindingBinding; -import android.binding.Observable; -import android.binding.OnPropertyChangedListener; import android.util.ArrayMap; import java.lang.reflect.Field; import java.lang.reflect.Modifier; -import java.util.ArrayList; import java.util.HashSet; -public class ProcessBindableTest extends BaseDataBinderTest { +public class ProcessBindableTest extends BaseDataBinderTest { private static String[] EXPECTED_BINDING_NAMES = { "bindableField1", "bindableField2", @@ -40,7 +36,7 @@ public class ProcessBindableTest extends BaseDataBinderTest }; public ProcessBindableTest() { - super(BasicBindingBinder.class, R.layout.basic_binding); + super(BasicBindingBinding.class); } public void testFieldsGenerated() throws IllegalAccessException { diff --git a/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/ProgressBarBindingAdapterTest.java b/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/ProgressBarBindingAdapterTest.java index 86726b79dd894..88b9b2296071f 100644 --- a/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/ProgressBarBindingAdapterTest.java +++ b/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/ProgressBarBindingAdapterTest.java @@ -15,19 +15,19 @@ */ package com.android.databinding.testapp; -import com.android.databinding.testapp.generated.ProgressBarAdapterTestBinder; +import com.android.databinding.testapp.generated.ProgressBarAdapterTestBinding; import com.android.databinding.testapp.vo.ProgressBarBindingObject; import android.os.Build; import android.widget.ProgressBar; public class ProgressBarBindingAdapterTest - extends BindingAdapterTestBase { + extends BindingAdapterTestBase { ProgressBar mView; public ProgressBarBindingAdapterTest() { - super(ProgressBarAdapterTestBinder.class, ProgressBarBindingObject.class, + super(ProgressBarAdapterTestBinding.class, ProgressBarBindingObject.class, R.layout.progress_bar_adapter_test); } diff --git a/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/PropertyChangeRegistryTest.java b/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/PropertyChangeRegistryTest.java index 7b6197c6df8a8..ee765953b6545 100644 --- a/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/PropertyChangeRegistryTest.java +++ b/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/PropertyChangeRegistryTest.java @@ -16,17 +16,17 @@ package com.android.databinding.testapp; import com.android.databinding.library.PropertyChangeRegistry; -import com.android.databinding.testapp.generated.BasicBindingBinder; +import com.android.databinding.testapp.generated.BasicBindingBinding; import android.binding.Observable; import android.binding.OnPropertyChangedListener; -public class PropertyChangeRegistryTest extends BaseDataBinderTest { +public class PropertyChangeRegistryTest extends BaseDataBinderTest { private int notificationCount = 0; public PropertyChangeRegistryTest() { - super(BasicBindingBinder.class, R.layout.basic_binding); + super(BasicBindingBinding.class); } public void testNotifyChanged() { diff --git a/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/RadioGroupBindingAdapterTest.java b/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/RadioGroupBindingAdapterTest.java index c4bbc4c3d8aff..9fbcc50fa2295 100644 --- a/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/RadioGroupBindingAdapterTest.java +++ b/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/RadioGroupBindingAdapterTest.java @@ -15,18 +15,18 @@ */ package com.android.databinding.testapp; -import com.android.databinding.testapp.generated.RadioGroupAdapterTestBinder; +import com.android.databinding.testapp.generated.RadioGroupAdapterTestBinding; import com.android.databinding.testapp.vo.RadioGroupBindingObject; import android.widget.RadioGroup; public class RadioGroupBindingAdapterTest - extends BindingAdapterTestBase { + extends BindingAdapterTestBase { RadioGroup mView; public RadioGroupBindingAdapterTest() { - super(RadioGroupAdapterTestBinder.class, RadioGroupBindingObject.class, + super(RadioGroupAdapterTestBinding.class, RadioGroupBindingObject.class, R.layout.radio_group_adapter_test); } diff --git a/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/ResourceTest.java b/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/ResourceTest.java index 2770c4613be40..5672086e20a3d 100644 --- a/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/ResourceTest.java +++ b/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/ResourceTest.java @@ -15,15 +15,15 @@ */ package com.android.databinding.testapp; -import com.android.databinding.testapp.generated.ResourceTestBinder; +import com.android.databinding.testapp.generated.ResourceTestBinding; import android.test.UiThreadTest; import android.widget.TextView; -public class ResourceTest extends BaseDataBinderTest { +public class ResourceTest extends BaseDataBinderTest { public ResourceTest() { - super(ResourceTestBinder.class, R.layout.resource_test); + super(ResourceTestBinding.class); } @Override @@ -38,7 +38,7 @@ public class ResourceTest extends BaseDataBinderTest { runTestOnUiThread(new Runnable() { @Override public void run() { - mBinder.rebindDirty(); + mBinder.executePendingBindings(); } }); } catch (Throwable throwable) { @@ -52,7 +52,7 @@ public class ResourceTest extends BaseDataBinderTest { assertEquals("Mrs. Doubtfire", view.getText().toString()); mBinder.setTitle("Mr."); - mBinder.rebindDirty(); + mBinder.executePendingBindings(); assertEquals("Mr. Doubtfire", view.getText().toString()); } @@ -62,7 +62,7 @@ public class ResourceTest extends BaseDataBinderTest { assertEquals("oranges", view.getText().toString()); mBinder.setCount(1); - mBinder.rebindDirty(); + mBinder.executePendingBindings(); assertEquals("orange", view.getText().toString()); } diff --git a/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/SpinnerBindingAdapterTest.java b/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/SpinnerBindingAdapterTest.java index 50727b092d7fd..c1867916c0ba7 100644 --- a/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/SpinnerBindingAdapterTest.java +++ b/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/SpinnerBindingAdapterTest.java @@ -15,7 +15,7 @@ */ package com.android.databinding.testapp; -import com.android.databinding.testapp.generated.SpinnerAdapterTestBinder; +import com.android.databinding.testapp.generated.SpinnerAdapterTestBinding; import com.android.databinding.testapp.vo.SpinnerBindingObject; import android.graphics.drawable.ColorDrawable; @@ -23,12 +23,12 @@ import android.os.Build; import android.widget.Spinner; public class SpinnerBindingAdapterTest - extends BindingAdapterTestBase { + extends BindingAdapterTestBase { Spinner mView; public SpinnerBindingAdapterTest() { - super(SpinnerAdapterTestBinder.class, SpinnerBindingObject.class, + super(SpinnerAdapterTestBinding.class, SpinnerBindingObject.class, R.layout.spinner_adapter_test); } diff --git a/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/SwitchBindingAdapterTest.java b/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/SwitchBindingAdapterTest.java index 2d136a6f0f091..a9debeef8b95f 100644 --- a/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/SwitchBindingAdapterTest.java +++ b/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/SwitchBindingAdapterTest.java @@ -15,7 +15,7 @@ */ package com.android.databinding.testapp; -import com.android.databinding.testapp.generated.SwitchAdapterTestBinder; +import com.android.databinding.testapp.generated.SwitchAdapterTestBinding; import com.android.databinding.testapp.vo.SwitchBindingObject; import android.graphics.drawable.ColorDrawable; @@ -23,12 +23,12 @@ import android.os.Build; import android.widget.Switch; public class SwitchBindingAdapterTest - extends BindingAdapterTestBase { + extends BindingAdapterTestBase { Switch mView; public SwitchBindingAdapterTest() { - super(SwitchAdapterTestBinder.class, SwitchBindingObject.class, + super(SwitchAdapterTestBinding.class, SwitchBindingObject.class, R.layout.switch_adapter_test); } diff --git a/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/TabWidgetBindingAdapterTest.java b/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/TabWidgetBindingAdapterTest.java index af0a74ed36676..c328b38f81892 100644 --- a/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/TabWidgetBindingAdapterTest.java +++ b/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/TabWidgetBindingAdapterTest.java @@ -15,7 +15,7 @@ */ package com.android.databinding.testapp; -import com.android.databinding.testapp.generated.TabWidgetAdapterTestBinder; +import com.android.databinding.testapp.generated.TabWidgetAdapterTestBinding; import com.android.databinding.testapp.vo.TabWidgetBindingObject; import android.graphics.drawable.ColorDrawable; @@ -23,12 +23,12 @@ import android.os.Build; import android.widget.TabWidget; public class TabWidgetBindingAdapterTest - extends BindingAdapterTestBase { + extends BindingAdapterTestBase { TabWidget mView; public TabWidgetBindingAdapterTest() { - super(TabWidgetAdapterTestBinder.class, TabWidgetBindingObject.class, + super(TabWidgetAdapterTestBinding.class, TabWidgetBindingObject.class, R.layout.tab_widget_adapter_test); } diff --git a/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/TableLayoutBindingAdapterTest.java b/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/TableLayoutBindingAdapterTest.java index 06d4d2c346499..e4fb7eaca71a2 100644 --- a/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/TableLayoutBindingAdapterTest.java +++ b/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/TableLayoutBindingAdapterTest.java @@ -15,7 +15,7 @@ */ package com.android.databinding.testapp; -import com.android.databinding.testapp.generated.TableLayoutAdapterTestBinder; +import com.android.databinding.testapp.generated.TableLayoutAdapterTestBinding; import com.android.databinding.testapp.vo.TableLayoutBindingObject; import android.graphics.drawable.ColorDrawable; @@ -23,12 +23,12 @@ import android.os.Build; import android.widget.TableLayout; public class TableLayoutBindingAdapterTest - extends BindingAdapterTestBase { + extends BindingAdapterTestBase { TableLayout mView; public TableLayoutBindingAdapterTest() { - super(TableLayoutAdapterTestBinder.class, TableLayoutBindingObject.class, + super(TableLayoutAdapterTestBinding.class, TableLayoutBindingObject.class, R.layout.table_layout_adapter_test); } diff --git a/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/TextViewBindingAdapterTest.java b/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/TextViewBindingAdapterTest.java index a0269101a3288..f788fde8c59a6 100644 --- a/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/TextViewBindingAdapterTest.java +++ b/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/TextViewBindingAdapterTest.java @@ -15,7 +15,7 @@ */ package com.android.databinding.testapp; -import com.android.databinding.testapp.generated.TextViewAdapterTestBinder; +import com.android.databinding.testapp.generated.TextViewAdapterTestBinding; import com.android.databinding.testapp.vo.TextViewBindingObject; import android.annotation.TargetApi; @@ -33,10 +33,10 @@ import android.text.method.TextKeyListener; import android.widget.TextView; public class TextViewBindingAdapterTest - extends BindingAdapterTestBase { + extends BindingAdapterTestBase { public TextViewBindingAdapterTest() { - super(TextViewAdapterTestBinder.class, TextViewBindingObject.class, + super(TextViewAdapterTestBinding.class, TextViewBindingObject.class, R.layout.text_view_adapter_test); } @@ -161,7 +161,7 @@ public class TextViewBindingAdapterTest @Override public void run() { mBindingObject.setCapitalize(TextKeyListener.Capitalize.CHARACTERS); - mBinder.rebindDirty(); + mBinder.executePendingBindings(); } }); @@ -171,7 +171,7 @@ public class TextViewBindingAdapterTest @Override public void run() { mBindingObject.setCapitalize(TextKeyListener.Capitalize.WORDS); - mBinder.rebindDirty(); + mBinder.executePendingBindings(); } }); diff --git a/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/ViewBindingAdapterTest.java b/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/ViewBindingAdapterTest.java index 4bde05c54c582..fa47ad2201a49 100644 --- a/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/ViewBindingAdapterTest.java +++ b/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/ViewBindingAdapterTest.java @@ -15,7 +15,7 @@ */ package com.android.databinding.testapp; -import com.android.databinding.testapp.generated.ViewAdapterTestBinder; +import com.android.databinding.testapp.generated.ViewAdapterTestBinding; import com.android.databinding.testapp.vo.ViewBindingObject; import android.content.res.ColorStateList; @@ -23,10 +23,10 @@ import android.os.Build; import android.test.UiThreadTest; import android.view.View; -public class ViewBindingAdapterTest extends BindingAdapterTestBase { +public class ViewBindingAdapterTest extends BindingAdapterTestBase { public ViewBindingAdapterTest() { - super(ViewAdapterTestBinder.class, ViewBindingObject.class, R.layout.view_adapter_test); + super(ViewAdapterTestBinding.class, ViewBindingObject.class, R.layout.view_adapter_test); } @Override diff --git a/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/ViewGroupBindingAdapterTest.java b/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/ViewGroupBindingAdapterTest.java index acc7b01dcc164..0eaeaeabfc56e 100644 --- a/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/ViewGroupBindingAdapterTest.java +++ b/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/ViewGroupBindingAdapterTest.java @@ -15,19 +15,19 @@ */ package com.android.databinding.testapp; -import com.android.databinding.testapp.generated.ViewGroupAdapterTestBinder; +import com.android.databinding.testapp.generated.ViewGroupAdapterTestBinding; import com.android.databinding.testapp.vo.ViewGroupBindingObject; import android.os.Build; import android.view.ViewGroup; public class ViewGroupBindingAdapterTest - extends BindingAdapterTestBase { + extends BindingAdapterTestBase { ViewGroup mView; public ViewGroupBindingAdapterTest() { - super(ViewGroupAdapterTestBinder.class, ViewGroupBindingObject.class, + super(ViewGroupAdapterTestBinding.class, ViewGroupBindingObject.class, R.layout.view_group_adapter_test); } diff --git a/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/ViewStubBindingAdapterTest.java b/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/ViewStubBindingAdapterTest.java index c30ec20b49a5d..142a5c12e24c1 100644 --- a/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/ViewStubBindingAdapterTest.java +++ b/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/ViewStubBindingAdapterTest.java @@ -15,18 +15,18 @@ */ package com.android.databinding.testapp; -import com.android.databinding.testapp.generated.ViewStubAdapterTestBinder; +import com.android.databinding.testapp.generated.ViewStubAdapterTestBinding; import com.android.databinding.testapp.vo.ViewStubBindingObject; import android.view.ViewStub; public class ViewStubBindingAdapterTest - extends BindingAdapterTestBase { + extends BindingAdapterTestBase { ViewStub mView; public ViewStubBindingAdapterTest() { - super(ViewStubAdapterTestBinder.class, ViewStubBindingObject.class, + super(ViewStubAdapterTestBinding.class, ViewStubBindingObject.class, R.layout.view_stub_adapter_test); } diff --git a/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/multiconfig/LandscapeConfigTest.java b/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/multiconfig/LandscapeConfigTest.java index f171321e27cc7..ab16c667b033a 100644 --- a/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/multiconfig/LandscapeConfigTest.java +++ b/tools/data-binding/integration-tests/TestApp/app/src/androidTest/java/com/android/databinding/testapp/multiconfig/LandscapeConfigTest.java @@ -13,27 +13,28 @@ package com.android.databinding.testapp.multiconfig; -import com.android.databinding.library.IViewDataBinder; +import com.android.databinding.library.ViewDataBinding; import com.android.databinding.testapp.BaseLandDataBinderTest; import com.android.databinding.testapp.R; -import com.android.databinding.testapp.generated.BasicBindingBinder; -import com.android.databinding.testapp.generated.ConditionalBindingBinder; -import com.android.databinding.testapp.generated.IncludedLayoutBinder; -import com.android.databinding.testapp.generated.MultiResLayoutBinder; +import com.android.databinding.testapp.generated.BasicBindingBinding; +import com.android.databinding.testapp.generated.ConditionalBindingBinding; +import com.android.databinding.testapp.generated.IncludedLayoutBinding; +import com.android.databinding.testapp.generated.MultiResLayoutBinding; import com.android.databinding.testapp.vo.NotBindableVo; +import android.content.pm.ActivityInfo; import android.view.View; import android.widget.TextView; -public class LandscapeConfigTest extends BaseLandDataBinderTest { +public class LandscapeConfigTest extends BaseLandDataBinderTest { public LandscapeConfigTest() { - super(MultiResLayoutBinder.class, R.layout.multi_res_layout); + super(MultiResLayoutBinding.class, ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); } public void testSharedViewIdAndVariableInheritance() throws InterruptedException, NoSuchMethodException, NoSuchFieldException { - assertEquals("MultiResLayoutBinderLandImpl", mBinder.getClass().getSimpleName()); + assertEquals("MultiResLayoutBindingLandImpl", mBinder.getClass().getSimpleName()); assertMethod(TextView.class, "getObjectInLandTextView"); assertMethod(TextView.class, "getObjectInDefaultTextView"); assertMethod(View.class, "getObjectInDefaultTextView2"); @@ -46,14 +47,14 @@ public class LandscapeConfigTest extends BaseLandDataBinderTest { +public class PortraitConfigTest extends BaseDataBinderTest { public PortraitConfigTest() { - super(MultiResLayoutBinder.class, R.layout.multi_res_layout, ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); + super(MultiResLayoutBinding.class, ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); } public void testSharedViewIdAndVariableInheritance() throws InterruptedException, NoSuchMethodException, NoSuchFieldException { - assertEquals("MultiResLayoutBinderImpl", mBinder.getClass().getSimpleName()); - assertEquals("MultiResLayoutBinderImpl", mBinder.getClass().getSimpleName()); + assertEquals("MultiResLayoutBindingImpl", mBinder.getClass().getSimpleName()); + assertEquals("MultiResLayoutBindingImpl", mBinder.getClass().getSimpleName()); assertMethod(TextView.class, "getObjectInLandTextView"); assertMethod(TextView.class, "getObjectInDefaultTextView"); assertMethod(View.class, "getObjectInDefaultTextView2"); @@ -49,14 +48,14 @@ public class PortraitConfigTest extends BaseDataBinderTest // includes - assertMethod(IViewDataBinder.class, "getIncludedLayoutConflict"); - assertMethod(BasicBindingBinder.class, "getIncludedLayoutShared"); - assertMethod(ConditionalBindingBinder.class, "getIncludedLayoutPort"); - assertMethod(ConditionalBindingBinder.class, "getIncludedLayoutLand"); + assertMethod(ViewDataBinding.class, "getIncludedLayoutConflict"); + assertMethod(BasicBindingBinding.class, "getIncludedLayoutShared"); + assertMethod(ConditionalBindingBinding.class, "getIncludedLayoutPort"); + assertMethod(ConditionalBindingBinding.class, "getIncludedLayoutLand"); - assertField(BasicBindingBinder.class, "mIncludedLayoutConflict"); - assertField(BasicBindingBinder.class, "mIncludedLayoutShared"); - assertField(ConditionalBindingBinder.class, "mIncludedLayoutPort"); + assertField(BasicBindingBinding.class, "mIncludedLayoutConflict"); + assertField(BasicBindingBinding.class, "mIncludedLayoutShared"); + assertField(ConditionalBindingBinding.class, "mIncludedLayoutPort"); assertNoField("mIncludedLayoutLand"); } diff --git a/tools/data-binding/library/src/main/java/com/android/databinding/library/DataBinder.java b/tools/data-binding/library/src/main/java/com/android/databinding/library/DataBinder.java deleted file mode 100644 index 4ebecefaee831..0000000000000 --- a/tools/data-binding/library/src/main/java/com/android/databinding/library/DataBinder.java +++ /dev/null @@ -1,134 +0,0 @@ -/* - * Copyright (C) 2014 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 com.android.databinding.library; - -import android.content.Context; -import android.os.Build; -import android.util.Log; -import android.util.SparseArray; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; - -import java.lang.ref.WeakReference; -import java.util.WeakHashMap; - -public class DataBinder { - - static DataBinderMapper sMapper; - - /** - * Instead of directly accessing Build.VERSION.SDK_INT, generated code uses this value so that - * we can test API dependent behavior. - */ - static int SDK_INT = Build.VERSION.SDK_INT; - - private WeakHashMap mDataBinderMap = new WeakHashMap<>(); - - private SparseArray> mDataBinderById = new SparseArray<>(); - - private static DataBinderMapper getMapper() { - if (sMapper != null) { - return sMapper; - } - try { - sMapper = (DataBinderMapper) DataBinder.class.getClassLoader() - .loadClass( - "com.android.databinding.library.GeneratedDataBinderRenderer") - .newInstance(); - } catch (Throwable t) { - throw new RuntimeException(t); - } - return sMapper; - } - - public static int getBuildSdkInt() { - return SDK_INT; - } - - public static int convertToId(String key) { - return getMapper().getId(key); - } - - public View inflate(Context context, int layoutId) { - View view = LayoutInflater.from(context).inflate(layoutId, null); - ViewDataBinder dataBinder = getMapper().getDataBinder(view, layoutId); - if (dataBinder != null) { - mDataBinderMap.put(view, dataBinder); - mDataBinderById.put(layoutId, new WeakReference<>(dataBinder)); - } - return view; - } - - public boolean setVariable(View view, String name, Object variable) { - ViewDataBinder binder = getDataBinder(view); - if (binder == null) { - return false; - } - final int nameId = convertToId(name); - if (nameId == -1) { - return false; - } - return binder.setVariable(nameId, variable); - } - - public boolean setVariable(int layoutId, String name, Object variable) { - ViewDataBinder binder = getDataBinder(layoutId); - if (binder == null) { - return false; - } - final int nameId = convertToId(name); - if (nameId == -1) { - return false; - } - return binder.setVariable(nameId, variable); - } - - public ViewDataBinder getDataBinder(View view) { - return mDataBinderMap.get(view); - } - - public T getDataBinderI(Class klass, View view) { - return (T) getDataBinder(view); - } - - public T getDataBinderI(Class klass, int layoutId) { - return (T) getDataBinder(layoutId); - } - - public static ViewDataBinder createBinder(Context context, int layoutId, ViewGroup parent) { - return getMapper() - .getDataBinder(LayoutInflater.from(context).inflate(layoutId, parent, false), - layoutId); - } - @SuppressWarnings("unchecked") - public static T createBinder(Class klass, Context context, int layoutId, ViewGroup parent) { - return (T) createBinder(context, layoutId, parent); - } - - public static T createBinder(View view, int layoutId) { - return (T) getMapper().getDataBinder(view, layoutId); - } - - public ViewDataBinder getDataBinder(int layoutId) { - WeakReference weakReference = mDataBinderById.get(layoutId); - if (weakReference == null) { - return null; - } - return weakReference.get(); - } -} diff --git a/tools/data-binding/library/src/main/java/com/android/databinding/library/DataBinderMapper.java b/tools/data-binding/library/src/main/java/com/android/databinding/library/DataBinderMapper.java index 0312e026cb90c..6d173567372ee 100644 --- a/tools/data-binding/library/src/main/java/com/android/databinding/library/DataBinderMapper.java +++ b/tools/data-binding/library/src/main/java/com/android/databinding/library/DataBinderMapper.java @@ -19,6 +19,6 @@ package com.android.databinding.library; import android.view.View; public interface DataBinderMapper { - ViewDataBinder getDataBinder(View view, int layoutId); + public ViewDataBinding getDataBinder(View view, int layoutId); public int getId(String key); } diff --git a/tools/data-binding/library/src/main/java/com/android/databinding/library/DataBindingUtil.java b/tools/data-binding/library/src/main/java/com/android/databinding/library/DataBindingUtil.java new file mode 100644 index 0000000000000..e5ba9b6a272d6 --- /dev/null +++ b/tools/data-binding/library/src/main/java/com/android/databinding/library/DataBindingUtil.java @@ -0,0 +1,56 @@ +/* + * 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 com.android.databinding.library; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +/** + * Utility class to create {@link ViewDataBinding} from layouts. + */ +public class DataBindingUtil { + private static DataBinderMapper sMapper; + + private static DataBinderMapper getMapper() { + if (sMapper != null) { + return sMapper; + } + try { + sMapper = (DataBinderMapper) ViewDataBinding.class.getClassLoader() + .loadClass("com.android.databinding.library.GeneratedDataBinderRenderer") + .newInstance(); + } catch (Throwable t) { + throw new RuntimeException(t); + } + return sMapper; + } + + + public static T inflate(Context context, int layoutId, + ViewGroup parent, boolean attachToParent) { + final LayoutInflater inflater = LayoutInflater.from(context); + final View view = inflater.inflate(layoutId, parent, attachToParent); + return bindTo(view, layoutId); + } + + @SuppressWarnings("unchecked") + public static T bindTo(View root, int layoutId) { + return (T) getMapper().getDataBinder(root, layoutId); + } +} diff --git a/tools/data-binding/library/src/main/java/com/android/databinding/library/IViewDataBinder.java b/tools/data-binding/library/src/main/java/com/android/databinding/library/IViewDataBinder.java deleted file mode 100644 index fdea8a5bc6bc1..0000000000000 --- a/tools/data-binding/library/src/main/java/com/android/databinding/library/IViewDataBinder.java +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright (C) 2014 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 com.android.databinding.library; - -import android.view.View; - -public interface IViewDataBinder { - public View getRoot(); - public abstract void rebindDirty(); - public abstract void invalidateAll(); -} diff --git a/tools/data-binding/library/src/main/java/com/android/databinding/library/ViewDataBinder.java b/tools/data-binding/library/src/main/java/com/android/databinding/library/ViewDataBinding.java similarity index 61% rename from tools/data-binding/library/src/main/java/com/android/databinding/library/ViewDataBinder.java rename to tools/data-binding/library/src/main/java/com/android/databinding/library/ViewDataBinding.java index 3fc51fbccb486..e00832972cdce 100644 --- a/tools/data-binding/library/src/main/java/com/android/databinding/library/ViewDataBinder.java +++ b/tools/data-binding/library/src/main/java/com/android/databinding/library/ViewDataBinding.java @@ -22,7 +22,12 @@ import android.binding.ObservableMap; import android.binding.OnListChangedListener; import android.binding.OnMapChangedListener; import android.binding.OnPropertyChangedListener; -import android.util.SparseArray; +import android.content.Context; +import android.os.Build; +import android.os.Build.VERSION; +import android.os.Build.VERSION_CODES; +import android.util.SparseIntArray; +import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -30,54 +35,119 @@ import java.lang.Override; import java.lang.Runnable; import java.lang.ref.WeakReference; -abstract public class ViewDataBinder { +public abstract class ViewDataBinding { + + /** + * Instead of directly accessing Build.VERSION.SDK_INT, generated code uses this value so that + * we can test API dependent behavior. + */ + static int SDK_INT = VERSION.SDK_INT; + + /** + * Prefix for android:tag on Views with binding. The root View and include tags will not have + * android:tag attributes and will use ids instead. + */ public static final String BINDING_TAG_PREFIX = "bindingTag"; + + // The length of BINDING_TAG_PREFIX prevents calling length repeatedly. private static final int BINDING_NUMBER_START = BINDING_TAG_PREFIX.length(); + /** + * Method object extracted out to attach a listener to a bound Observable object. + */ private static final CreateWeakListener CREATE_PROPERTY_LISTENER = new CreateWeakListener() { @Override - public WeakListener create(ViewDataBinder viewDataBinder, int localFieldId) { - return new WeakPropertyListener(viewDataBinder, localFieldId); + public WeakListener create(ViewDataBinding viewDataBinding, int localFieldId) { + return new WeakPropertyListener(viewDataBinding, localFieldId); } }; + /** + * Method object extracted out to attach a listener to a bound ObservableList object. + */ private static final CreateWeakListener CREATE_LIST_LISTENER = new CreateWeakListener() { @Override - public WeakListener create(ViewDataBinder viewDataBinder, int localFieldId) { - return new WeakListListener(viewDataBinder, localFieldId); + public WeakListener create(ViewDataBinding viewDataBinding, int localFieldId) { + return new WeakListListener(viewDataBinding, localFieldId); } }; + /** + * Method object extracted out to attach a listener to a bound ObservableMap object. + */ private static final CreateWeakListener CREATE_MAP_LISTENER = new CreateWeakListener() { @Override - public WeakListener create(ViewDataBinder viewDataBinder, int localFieldId) { - return new WeakMapListener(viewDataBinder, localFieldId); + public WeakListener create(ViewDataBinding viewDataBinding, int localFieldId) { + return new WeakMapListener(viewDataBinding, localFieldId); } }; - WeakListener[] mLocalFieldObservers; - protected abstract boolean onFieldChange(int mLocalFieldId, Object object, int fieldId); - public abstract boolean setVariable(int variableId, Object variable); - public abstract void rebindDirty(); - private final View mRoot; - - private boolean mPendingRebind = false; + /** + * Runnable executed on animation heartbeat to rebind the dirty Views. + */ private Runnable mRebindRunnable = new Runnable() { @Override public void run() { - rebindDirty(); - mPendingRebind = false; + if (mPendingRebind) { + mPendingRebind = false; + executePendingBindings(); + } } }; - public ViewDataBinder(View root, int localFieldCount) { + /** + * Flag indicates that there are pending bindings that need to be reevaluated. + */ + private boolean mPendingRebind = false; + + /** + * The observed expressions. + */ + private WeakListener[] mLocalFieldObservers; + + /** + * The root View that this Binding is associated with. + */ + private final View mRoot; + + protected ViewDataBinding(View root, int localFieldCount) { mLocalFieldObservers = new WeakListener[localFieldCount]; - mRoot = root; - mRoot.setTag(this); + this.mRoot = root; + // TODO: When targeting ICS and above, use setTag(id, this) instead + this.mRoot.setTag(this); } - @Override - protected void finalize() throws Throwable { + public static int getBuildSdkInt() { + return SDK_INT; + } + + /** + * Called when an observed object changes. Sets the appropriate dirty flag if applicable. + * @param localFieldId The index into mLocalFieldObservers that this Object resides in. + * @param object The object that has changed. + * @param fieldId The android.binding.BR ID of the field being changed or _all if + * no specific field is being notified. + * @return true if this change should cause a change to the UI. + */ + protected abstract boolean onFieldChange(int localFieldId, Object object, int fieldId); + + public abstract boolean setVariable(int variableId, Object variable); + + /** + * Evaluates the pending bindings, updating any Views that have expressions bound to + * modified variables. This must be run on the UI thread. + */ + public abstract void executePendingBindings(); + + /** + * Used internally to invalidate flags of included layouts. + */ + public abstract void invalidateAll(); + + /** + * Removes binding listeners to expression variables. + */ + public void unbind() { for (WeakListener weakListener : mLocalFieldObservers) { if (weakListener != null) { weakListener.unregister(); @@ -85,6 +155,15 @@ abstract public class ViewDataBinder { } } + @Override + protected void finalize() throws Throwable { + unbind(); + } + + /** + * Returns the outermost View in the layout file associated with the Binding. + * @return the outermost View in the layout file associated with the Binding. + */ public View getRoot() { return mRoot; } @@ -109,7 +188,11 @@ abstract public class ViewDataBinder { return; } mPendingRebind = true; - mRoot.postOnAnimation(mRebindRunnable); + if (VERSION.SDK_INT >= VERSION_CODES.JELLY_BEAN) { + mRoot.postOnAnimation(mRebindRunnable); + } else { + mRoot.post(mRebindRunnable); + } } protected Object getObservedField(int localFieldId) { @@ -163,27 +246,46 @@ abstract public class ViewDataBinder { listener.setTarget(observable); } - protected static void mapTaggedChildViews(View root, View[] views, - SparseArray binders) { + /** + * Walk all children of root and assign tagged Views to associated indices in views. + * + * @param root The base of the View hierarchy to walk. + * @param views An array of all Views with binding expressions and all Views with IDs. This + * will start empty and will contain the found Views when this method completes. + * @param includes A mapping of include tag IDs to the index into the views array. + * @param viewsWithIds A mapping of views with IDs but without expressions to the index + * into the views array. + */ + protected static void mapTaggedChildViews(View root, View[] views, SparseIntArray includes, + SparseIntArray viewsWithIds) { if (root instanceof ViewGroup) { ViewGroup viewGroup = (ViewGroup) root; for (int i = viewGroup.getChildCount() - 1; i >= 0; i--) { - mapTaggedViews(viewGroup.getChildAt(i), views, binders); + mapTaggedViews(viewGroup.getChildAt(i), views, includes, viewsWithIds); } } } - private static void mapTaggedViews(View view, View[] views, SparseArray binders) { + private static void mapTaggedViews(View view, View[] views, SparseIntArray includes, + SparseIntArray viewsWithIds) { + boolean visitChildren = true; String tag = (String) view.getTag(); - System.out.println("tagged with " + tag + " is " + view); + int id; if (tag != null && tag.startsWith(BINDING_TAG_PREFIX)) { int tagIndex = parseTagInt(tag); - System.out.println("tag id is " + tagIndex); views[tagIndex] = view; - } else if (view.getId() > 0 && binders != null) { - binders.put(view.getId(), view); + } else if ((id = view.getId()) > 0) { + int index; + if (viewsWithIds != null && (index = viewsWithIds.get(id, -1)) >= 0) { + views[index] = view; + } else if (includes != null && (index = includes.get(id, -1)) >= 0) { + views[index] = view; + visitChildren = false; + } + } + if (visitChildren) { + mapTaggedChildViews(view, views, includes, viewsWithIds); } - mapTaggedChildViews(view, views, binders); } /** @@ -203,13 +305,13 @@ abstract public class ViewDataBinder { return val; } - protected static abstract class WeakListener { - private final WeakReference mBinder; + private static abstract class WeakListener { + private final WeakReference mBinder; protected final int mLocalFieldId; private T mTarget; - public WeakListener(ViewDataBinder binder, int localFieldId) { - mBinder = new WeakReference(binder); + public WeakListener(ViewDataBinding binder, int localFieldId) { + mBinder = new WeakReference(binder); mLocalFieldId = localFieldId; } @@ -235,8 +337,8 @@ abstract public class ViewDataBinder { return mTarget; } - protected ViewDataBinder getBinder() { - ViewDataBinder binder = mBinder.get(); + protected ViewDataBinding getBinder() { + ViewDataBinding binder = mBinder.get(); if (binder == null) { unregister(); // The binder is dead } @@ -247,9 +349,9 @@ abstract public class ViewDataBinder { protected abstract void removeListener(T target); } - protected static class WeakPropertyListener extends WeakListener + private static class WeakPropertyListener extends WeakListener implements OnPropertyChangedListener { - public WeakPropertyListener(ViewDataBinder binder, int localFieldId) { + public WeakPropertyListener(ViewDataBinding binder, int localFieldId) { super(binder, localFieldId); } @@ -265,7 +367,7 @@ abstract public class ViewDataBinder { @Override public void onPropertyChanged(Observable sender, int fieldId) { - ViewDataBinder binder = getBinder(); + ViewDataBinding binder = getBinder(); if (binder == null) { return; } @@ -277,16 +379,16 @@ abstract public class ViewDataBinder { } } - protected static class WeakListListener extends WeakListener + private static class WeakListListener extends WeakListener implements OnListChangedListener { - public WeakListListener(ViewDataBinder binder, int localFieldId) { + public WeakListListener(ViewDataBinding binder, int localFieldId) { super(binder, localFieldId); } @Override public void onChanged() { - ViewDataBinder binder = getBinder(); + ViewDataBinding binder = getBinder(); if (binder == null) { return; } @@ -328,9 +430,9 @@ abstract public class ViewDataBinder { } } - protected static class WeakMapListener extends WeakListener + private static class WeakMapListener extends WeakListener implements OnMapChangedListener { - public WeakMapListener(ViewDataBinder binder, int localFieldId) { + public WeakMapListener(ViewDataBinding binder, int localFieldId) { super(binder, localFieldId); } @@ -346,7 +448,7 @@ abstract public class ViewDataBinder { @Override public void onMapChanged(ObservableMap sender, Object key) { - ViewDataBinder binder = getBinder(); + ViewDataBinding binder = getBinder(); if (binder == null || sender != getTarget()) { return; } @@ -355,6 +457,6 @@ abstract public class ViewDataBinder { } private interface CreateWeakListener { - WeakListener create(ViewDataBinder viewDataBinder, int localFieldId); + WeakListener create(ViewDataBinding viewDataBinding, int localFieldId); } } diff --git a/tools/data-binding/samples/BindingDemo/app/src/main/java/com/android/example/bindingdemo/DataBoundAdapter.java b/tools/data-binding/samples/BindingDemo/app/src/main/java/com/android/example/bindingdemo/DataBoundAdapter.java index 22224e6f5d0b7..0f4abaa352656 100644 --- a/tools/data-binding/samples/BindingDemo/app/src/main/java/com/android/example/bindingdemo/DataBoundAdapter.java +++ b/tools/data-binding/samples/BindingDemo/app/src/main/java/com/android/example/bindingdemo/DataBoundAdapter.java @@ -3,10 +3,10 @@ package com.android.example.bindingdemo; import android.support.v7.widget.RecyclerView; import android.view.ViewGroup; -import com.android.databinding.library.DataBinder; -import com.android.databinding.library.IViewDataBinder; +import com.android.databinding.library.DataBindingUtil; +import com.android.databinding.library.ViewDataBinding; -abstract public class DataBoundAdapter +abstract public class DataBoundAdapter extends RecyclerView.Adapter> { final int mLayoutId; final Class mBinderInterface; @@ -17,11 +17,11 @@ abstract public class DataBoundAdapter @Override public DataBoundAdapter.DataBoundViewHolder onCreateViewHolder(ViewGroup viewGroup, int type) { - T binder = DataBinder.createBinder(mBinderInterface, viewGroup.getContext(), mLayoutId, viewGroup); - return new DataBoundViewHolder(binder); + T binder = DataBindingUtil.inflate(viewGroup.getContext(), mLayoutId, viewGroup, false); + return new DataBoundViewHolder(binder); } - static class DataBoundViewHolder extends RecyclerView.ViewHolder { + static class DataBoundViewHolder extends RecyclerView.ViewHolder { public final T dataBinder; public DataBoundViewHolder(T mViewBinder) { super(mViewBinder.getRoot()); diff --git a/tools/data-binding/samples/BindingDemo/app/src/main/java/com/android/example/bindingdemo/MainActivity.java b/tools/data-binding/samples/BindingDemo/app/src/main/java/com/android/example/bindingdemo/MainActivity.java index d4a546679455b..6785b5fd73eae 100644 --- a/tools/data-binding/samples/BindingDemo/app/src/main/java/com/android/example/bindingdemo/MainActivity.java +++ b/tools/data-binding/samples/BindingDemo/app/src/main/java/com/android/example/bindingdemo/MainActivity.java @@ -15,12 +15,12 @@ import android.view.ViewGroup; import android.binding.BR; +import com.android.databinding.library.DataBindingUtil; import com.android.databinding.library.PropertyChangeRegistry; -import com.android.example.bindingdemo.generated.ListItemBinder; -import com.android.example.bindingdemo.generated.MainActivityBinder; +import com.android.example.bindingdemo.generated.ListItemBinding; +import com.android.example.bindingdemo.generated.MainActivityBinding; import com.android.example.bindingdemo.vo.User; import com.android.example.bindingdemo.vo.Users; -import com.android.databinding.library.DataBinder; import java.util.ArrayList; import java.util.Arrays; @@ -33,7 +33,7 @@ public class MainActivity extends ActionBarActivity implements Observable { @Bindable UserAdapter robotAdapter; @Bindable - MainActivityBinder dataBinder; + MainActivityBinding dataBinder; @Bindable User selected; @@ -49,7 +49,7 @@ public class MainActivity extends ActionBarActivity implements Observable { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - dataBinder = DataBinder.createBinder(MainActivityBinder.class, this, R.layout.main_activity, null); + dataBinder = MainActivityBinding.inflate(this); setContentView(dataBinder.getRoot()); dataBinder.getRobotList().setHasFixedSize(true); dataBinder.getToolkittyList().setHasFixedSize(true); @@ -58,7 +58,7 @@ public class MainActivity extends ActionBarActivity implements Observable { dataBinder.getToolkittyList().setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false)); dataBinder.getRobotList().setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false)); dataBinder.setActivity(this); - dataBinder.rebindDirty(); + dataBinder.executePendingBindings(); } public UserAdapter getTkAdapter() { @@ -156,26 +156,26 @@ public class MainActivity extends ActionBarActivity implements Observable { mListeners.remove(listener); } - public class UserAdapter extends DataBoundAdapter implements View.OnClickListener, Observable { + public class UserAdapter extends DataBoundAdapter implements View.OnClickListener, Observable { final private List userList = new ArrayList<>(); final private PropertyChangeRegistry mListeners = new PropertyChangeRegistry(); public UserAdapter(User[] toolkities) { - super(R.layout.list_item, ListItemBinder.class); + super(R.layout.list_item, ListItemBinding.class); userList.addAll(Arrays.asList(toolkities)); } @Override - public DataBoundViewHolder onCreateViewHolder(ViewGroup viewGroup, int type) { - DataBoundViewHolder vh = super.onCreateViewHolder(viewGroup, type); + public DataBoundViewHolder onCreateViewHolder(ViewGroup viewGroup, int type) { + DataBoundViewHolder vh = super.onCreateViewHolder(viewGroup, type); vh.dataBinder.setClickListener(this); return vh; } @Override - public void onBindViewHolder(DataBoundViewHolder vh, int index) { + public void onBindViewHolder(DataBoundViewHolder vh, int index) { vh.dataBinder.setUser(userList.get(index)); - vh.dataBinder.rebindDirty(); + vh.dataBinder.executePendingBindings(); } @Bindable