summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--compiler/src/main/java/android/databinding/tool/expr/TernaryExpr.java13
-rw-r--r--compiler/src/main/java/android/databinding/tool/reflection/ModelAnalyzer.java6
-rw-r--r--integration-tests/TestApp/app/src/androidTestApi7/java/android/databinding/testapp/ConditionalBindingTest.java14
-rw-r--r--integration-tests/TestApp/app/src/main/java/android/databinding/testapp/vo/ConditionalVo.java8
-rw-r--r--integration-tests/TestApp/app/src/main/res/layout/conditional_binding.xml5
5 files changed, 44 insertions, 2 deletions
diff --git a/compiler/src/main/java/android/databinding/tool/expr/TernaryExpr.java b/compiler/src/main/java/android/databinding/tool/expr/TernaryExpr.java
index f8f61123..a1a4432a 100644
--- a/compiler/src/main/java/android/databinding/tool/expr/TernaryExpr.java
+++ b/compiler/src/main/java/android/databinding/tool/expr/TernaryExpr.java
@@ -48,10 +48,23 @@ public class TernaryExpr extends Expr {
@Override
protected ModelClass resolveType(ModelAnalyzer modelAnalyzer) {
+ final Expr ifTrue = getIfTrue();
+ final Expr ifFalse = getIfFalse();
+ if (isNullLiteral(ifTrue)) {
+ return ifFalse.getResolvedType();
+ } else if (isNullLiteral(ifFalse)) {
+ return ifTrue.getResolvedType();
+ }
return modelAnalyzer.findCommonParentOf(getIfTrue().getResolvedType(),
getIfFalse().getResolvedType());
}
+ private static boolean isNullLiteral(Expr expr) {
+ final ModelClass type = expr.getResolvedType();
+ return (type.isObject() && (expr instanceof SymbolExpr) &&
+ "null".equals(((SymbolExpr)expr).getText()));
+ }
+
@Override
protected List<Dependency> constructDependencies() {
List<Dependency> deps = new ArrayList<>();
diff --git a/compiler/src/main/java/android/databinding/tool/reflection/ModelAnalyzer.java b/compiler/src/main/java/android/databinding/tool/reflection/ModelAnalyzer.java
index 739c9e0b..b1de46e4 100644
--- a/compiler/src/main/java/android/databinding/tool/reflection/ModelAnalyzer.java
+++ b/compiler/src/main/java/android/databinding/tool/reflection/ModelAnalyzer.java
@@ -94,6 +94,12 @@ public abstract class ModelAnalyzer {
curr = curr.getSuperclass();
}
if (curr == null) {
+ if (modelClass1.isObject() && modelClass2.isInterface()) {
+ return modelClass1;
+ } else if (modelClass2.isObject() && modelClass1.isInterface()) {
+ return modelClass2;
+ }
+
ModelClass primitive1 = modelClass1.unbox();
ModelClass primitive2 = modelClass2.unbox();
if (!modelClass1.equals(primitive1) || !modelClass2.equals(primitive2)) {
diff --git a/integration-tests/TestApp/app/src/androidTestApi7/java/android/databinding/testapp/ConditionalBindingTest.java b/integration-tests/TestApp/app/src/androidTestApi7/java/android/databinding/testapp/ConditionalBindingTest.java
index 6a7b8bad..73c8c58e 100644
--- a/integration-tests/TestApp/app/src/androidTestApi7/java/android/databinding/testapp/ConditionalBindingTest.java
+++ b/integration-tests/TestApp/app/src/androidTestApi7/java/android/databinding/testapp/ConditionalBindingTest.java
@@ -30,6 +30,20 @@ public class ConditionalBindingTest extends BaseDataBinderTest<ConditionalBindin
assertEquals("Hello World", mBinder.textView1.getText().toString());
}
+ @UiThreadTest
+ public void testNullListener() throws Throwable {
+ ConditionalVo obj4 = new ConditionalVo();
+ initBinder();
+ mBinder.setObj4(obj4);
+ mBinder.executePendingBindings();
+ mBinder.view1.callOnClick();
+ assertFalse(obj4.wasClicked);
+ mBinder.setCond1(true);
+ mBinder.executePendingBindings();
+ mBinder.view1.callOnClick();
+ assertTrue(obj4.wasClicked);
+ }
+
private void testCorrectness(boolean cond1, boolean cond2) {
NotBindableVo o1 = new NotBindableVo("a");
NotBindableVo o2 = new NotBindableVo("b");
diff --git a/integration-tests/TestApp/app/src/main/java/android/databinding/testapp/vo/ConditionalVo.java b/integration-tests/TestApp/app/src/main/java/android/databinding/testapp/vo/ConditionalVo.java
index 0a7dda16..22ecb054 100644
--- a/integration-tests/TestApp/app/src/main/java/android/databinding/testapp/vo/ConditionalVo.java
+++ b/integration-tests/TestApp/app/src/main/java/android/databinding/testapp/vo/ConditionalVo.java
@@ -17,11 +17,13 @@ package android.databinding.testapp.vo;
import android.databinding.BaseObservable;
import android.databinding.Bindable;
-import android.databinding.ObservableBoolean;
import android.databinding.testapp.BR;
+import android.view.View;
public class ConditionalVo extends BaseObservable {
private boolean useHello;
+ public String text = "Hello World";
+ public boolean wasClicked;
@Bindable
public boolean getUseHello() {
@@ -33,5 +35,7 @@ public class ConditionalVo extends BaseObservable {
notifyPropertyChanged(BR.useHello);
}
- public String text = "Hello World";
+ public void clicked(View view) {
+ wasClicked = true;
+ }
}
diff --git a/integration-tests/TestApp/app/src/main/res/layout/conditional_binding.xml b/integration-tests/TestApp/app/src/main/res/layout/conditional_binding.xml
index 8c7fc686..675c37cb 100644
--- a/integration-tests/TestApp/app/src/main/res/layout/conditional_binding.xml
+++ b/integration-tests/TestApp/app/src/main/res/layout/conditional_binding.xml
@@ -39,5 +39,10 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{obj4.useHello ? obj4.text : `hello`}"/>
+ <View
+ android:id="@+id/view1"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:onClick="@{cond1 ? obj4.clicked : null}"/>
</LinearLayout>
</layout> \ No newline at end of file