Fix problem with inverted unary expression.

Bug 33963737

The inverted unary expression was incorrected constructed, making
it ineffective.

Test: gradlew runTestsOfTestApp

Change-Id: Ie280ebfca41480b8c09f6aa93003210ec3c9b5ca
diff --git a/compiler/src/main/java/android/databinding/tool/expr/UnaryExpr.java b/compiler/src/main/java/android/databinding/tool/expr/UnaryExpr.java
index 503b86f..875e239 100644
--- a/compiler/src/main/java/android/databinding/tool/expr/UnaryExpr.java
+++ b/compiler/src/main/java/android/databinding/tool/expr/UnaryExpr.java
@@ -41,7 +41,7 @@
 
     @Override
     public Expr generateInverse(ExprModel model, Expr value, String bindingClassName) {
-        return model.unary(mOp, getExpr().generateInverse(model, value, bindingClassName));
+        return getExpr().generateInverse(model, model.unary(mOp, value), bindingClassName);
     }
 
     @Override
diff --git a/integration-tests/TestApp/app/src/androidTestApi9/java/android/databinding/testapp/TwoWayBindingAdapterTest.java b/integration-tests/TestApp/app/src/androidTestApi9/java/android/databinding/testapp/TwoWayBindingAdapterTest.java
index 58ac53d..6ecd017 100644
--- a/integration-tests/TestApp/app/src/androidTestApi9/java/android/databinding/testapp/TwoWayBindingAdapterTest.java
+++ b/integration-tests/TestApp/app/src/androidTestApi9/java/android/databinding/testapp/TwoWayBindingAdapterTest.java
@@ -1111,6 +1111,34 @@
         assertTrue(mBinder.mixView2.isEnabled());
     }
 
+    /**
+     * This tests whether the unary not properly converts back
+     */
+    public void testUnaryNot() throws Throwable {
+        mBindingObject.checked.set(false);
+        makeVisible(mBinder.unaryNot);
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mBinder.executePendingBindings();
+            }
+        });
+        assertTrue(mBinder.unaryNot.isChecked());
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mBinder.unaryNot.setChecked(false);
+            }
+        });
+        waitWhile(new TestCondition() {
+            @Override
+            public boolean testValue() {
+                return !mBindingObject.checked.get();
+            }
+        });
+        assertTrue(mBindingObject.checked.get());
+    }
+
     private void makeVisible(final View... views) throws Throwable {
         runTestOnUiThread(new Runnable() {
             @Override
@@ -1154,6 +1182,7 @@
                 mBinder.sameTarget.setVisibility(View.GONE);
                 mBinder.mixView1.setVisibility(View.GONE);
                 mBinder.mixView2.setVisibility(View.GONE);
+                mBinder.unaryNot.setVisibility(View.GONE);
                 for (View view : views) {
                     view.setVisibility(View.VISIBLE);
                 }
diff --git a/integration-tests/TestApp/app/src/main/res/layout/two_way.xml b/integration-tests/TestApp/app/src/main/res/layout/two_way.xml
index bf9ede7..3158f79 100644
--- a/integration-tests/TestApp/app/src/main/res/layout/two_way.xml
+++ b/integration-tests/TestApp/app/src/main/res/layout/two_way.xml
@@ -282,5 +282,10 @@
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:enabled="@{obj.validate(mixView1.text)}"/>
+        <CheckBox
+            android:id="@+id/unaryNot"
+            android:checked="@={!obj.checked}"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"/>
     </LinearLayout>
 </layout>
diff --git a/integration-tests/TestApp/gradle/wrapper/gradle-wrapper.properties b/integration-tests/TestApp/gradle/wrapper/gradle-wrapper.properties
index 1081cc3..8c647a3 100644
--- a/integration-tests/TestApp/gradle/wrapper/gradle-wrapper.properties
+++ b/integration-tests/TestApp/gradle/wrapper/gradle-wrapper.properties
@@ -1,6 +1,6 @@
-#Wed Apr 10 15:27:10 PDT 2013
+#Wed Jan 11 14:07:01 PST 2017
 distributionBase=GRADLE_USER_HOME
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-3.3-all.zip