diff options
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 |