From 230ecdbf05308f663032617f61326f22b8a99d8d Mon Sep 17 00:00:00 2001 From: George Mount Date: Thu, 12 Mar 2015 09:18:12 -0700 Subject: [PATCH] Use abstract base class instead of interfaces for Binding objects. Bug 19627511 Bug 19709604 Changed generated classes to end with "Binding" instead of "Binder" to avoid confusion with Android Binders. Removed DataBinder class and moved the important aspects of its contents to ViewDataBinding. Improved mapping of Views in included layouts. Avoid traversing included layouts while looking for bound expressions. Change-Id: I1f28093b0792d5428d07192f1fc458a5b4b788b2 --- tools/data-binding/build.gradle | 2 +- .../com/android/databinding/LayoutBinder.java | 12 +- .../databinding/reflection/ModelAnalyzer.java | 4 +- .../annotation/AnnotationAnalyzer.java | 3 +- .../databinding/store/LayoutFileParser.java | 2 +- .../databinding/store/ResourceBundle.java | 2 +- .../databinding/writer/DataBinderWriter.kt | 10 +- .../databinding/writer/LayoutBinderWriter.kt | 116 ++++++---- .../reflection/java/JavaAnalyzer.java | 2 +- .../databinding/library/DataBinderTrojan.java | 2 +- .../AbsListViewBindingAdapterTest.java | 6 +- .../testapp/AbsSeekBarBindingAdapterTest.java | 6 +- .../testapp/AbsSpinnerBindingAdapterTest.java | 6 +- ...utoCompleteTextViewBindingAdapterTest.java | 6 +- .../testapp/BaseDataBinderTest.java | 26 ++- .../testapp/BaseLandDataBinderTest.java | 6 +- .../testapp/BaseObservableTest.java | 6 +- .../databinding/testapp/BasicBindingTest.java | 8 +- .../testapp/BasicDependantBindingTest.java | 10 +- .../testapp/BindToFinalFieldTest.java | 8 +- .../BindToFinalObservableFieldTest.java | 12 +- .../testapp/BindingAdapterTestBase.java | 10 +- .../databinding/testapp/BracketTest.java | 10 +- .../android/databinding/testapp/CastTest.java | 8 +- .../CheckedTextViewBindingAdapterTest.java | 6 +- .../CompoundButtonBindingAdapterTest.java | 6 +- .../testapp/ConditionalBindingTest.java | 8 +- .../databinding/testapp/FindMethodTest.java | 8 +- .../FrameLayoutBindingAdapterTest.java | 6 +- .../testapp/ImageViewBindingAdapterTest.java | 6 +- .../databinding/testapp/IncludeTagTest.java | 10 +- .../LinearLayoutBindingAdapterTest.java | 6 +- .../testapp/ListChangeRegistryTest.java | 6 +- .../testapp/MapChangeRegistryTest.java | 6 +- .../databinding/testapp/NewApiTest.java | 17 +- .../android/databinding/testapp/NoIdTest.java | 12 +- .../testapp/ObservableArrayListTest.java | 6 +- .../testapp/ObservableArrayMapTest.java | 6 +- .../testapp/ObservableFieldTest.java | 26 +-- ...ervableWithNotBindableFieldObjectTest.java | 10 +- .../testapp/ProcessBindableTest.java | 10 +- .../ProgressBarBindingAdapterTest.java | 6 +- .../testapp/PropertyChangeRegistryTest.java | 6 +- .../testapp/RadioGroupBindingAdapterTest.java | 6 +- .../databinding/testapp/ResourceTest.java | 12 +- .../testapp/SpinnerBindingAdapterTest.java | 6 +- .../testapp/SwitchBindingAdapterTest.java | 6 +- .../testapp/TabWidgetBindingAdapterTest.java | 6 +- .../TableLayoutBindingAdapterTest.java | 6 +- .../testapp/TextViewBindingAdapterTest.java | 10 +- .../testapp/ViewBindingAdapterTest.java | 6 +- .../testapp/ViewGroupBindingAdapterTest.java | 6 +- .../testapp/ViewStubBindingAdapterTest.java | 6 +- .../multiconfig/LandscapeConfigTest.java | 31 +-- .../multiconfig/PortraitConfigTest.java | 33 ++- .../databinding/library/DataBinder.java | 134 ------------ .../databinding/library/DataBinderMapper.java | 2 +- .../databinding/library/DataBindingUtil.java | 56 +++++ .../databinding/library/IViewDataBinder.java | 25 --- ...ewDataBinder.java => ViewDataBinding.java} | 198 +++++++++++++----- .../example/bindingdemo/DataBoundAdapter.java | 12 +- .../example/bindingdemo/MainActivity.java | 24 +-- 62 files changed, 530 insertions(+), 505 deletions(-) delete mode 100644 tools/data-binding/library/src/main/java/com/android/databinding/library/DataBinder.java create mode 100644 tools/data-binding/library/src/main/java/com/android/databinding/library/DataBindingUtil.java delete mode 100644 tools/data-binding/library/src/main/java/com/android/databinding/library/IViewDataBinder.java rename tools/data-binding/library/src/main/java/com/android/databinding/library/{ViewDataBinder.java => ViewDataBinding.java} (61%) 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