getInterfaceVersion() returns -1 on unversioned interface

This change fixes a bug that getInterfaceVersion() on an unversioned
AIDL interface does not work. Now, if the remote side is unversioned
(i.e. getInterfaceVersion() is not defined), it falls back to the
getInterfaceVersion() of the default impl, which usually returns -1 but
can be overridden to return any value that makes sense for the
interface.

Note that in order for the default impl to be used, it must be set via
<IFaceName>.setDefaultImpl().

Bug: 139919934
Test: aidl_unittests
Change-Id: Ia42b44a5d95beb615c7602262364885856cf2148
diff --git a/generate_java_binder.cpp b/generate_java_binder.cpp
index 3889996..96948ca 100644
--- a/generate_java_binder.cpp
+++ b/generate_java_binder.cpp
@@ -803,8 +803,13 @@
            << "    android.os.Parcel reply = android.os.Parcel.obtain();\n"
            << "    try {\n"
            << "      data.writeInterfaceToken(DESCRIPTOR);\n"
-           << "      mRemote.transact(Stub." << transactCodeName << ", "
+           << "      boolean _status = mRemote.transact(Stub." << transactCodeName << ", "
            << "data, reply, 0);\n"
+           << "      if (!_status) {\n"
+           << "        if (getDefaultImpl() != null) {\n"
+           << "          return getDefaultImpl().getInterfaceVersion();\n"
+           << "        }\n"
+           << "      }\n"
            << "      reply.readException();\n"
            << "      mCachedVersion = reply.readInt();\n"
            << "    } finally {\n"
diff --git a/tests/test_data_example_interface.cpp b/tests/test_data_example_interface.cpp
index 8471869..58a0426 100644
--- a/tests/test_data_example_interface.cpp
+++ b/tests/test_data_example_interface.cpp
@@ -2517,7 +2517,12 @@
           android.os.Parcel reply = android.os.Parcel.obtain();
           try {
             data.writeInterfaceToken(DESCRIPTOR);
-            mRemote.transact(Stub.TRANSACTION_getInterfaceVersion, data, reply, 0);
+            boolean _status = mRemote.transact(Stub.TRANSACTION_getInterfaceVersion, data, reply, 0);
+            if (!_status) {
+              if (getDefaultImpl() != null) {
+                return getDefaultImpl().getInterfaceVersion();
+              }
+            }
             reply.readException();
             mCachedVersion = reply.readInt();
           } finally {
diff --git a/tests/test_data_string_constants.cpp b/tests/test_data_string_constants.cpp
index 18e231c..d7b4bb5 100644
--- a/tests/test_data_string_constants.cpp
+++ b/tests/test_data_string_constants.cpp
@@ -328,7 +328,12 @@
           android.os.Parcel reply = android.os.Parcel.obtain();
           try {
             data.writeInterfaceToken(DESCRIPTOR);
-            mRemote.transact(Stub.TRANSACTION_getInterfaceVersion, data, reply, 0);
+            boolean _status = mRemote.transact(Stub.TRANSACTION_getInterfaceVersion, data, reply, 0);
+            if (!_status) {
+              if (getDefaultImpl() != null) {
+                return getDefaultImpl().getInterfaceVersion();
+              }
+            }
             reply.readException();
             mCachedVersion = reply.readInt();
           } finally {