Revert "Revert "getService respects the vendor interface object.""

This reverts commit e3fa5da4da2a6b07b7a3d4de4b082fd58e4d9e65.

Reason for revert: Add checks back in after security policy is updated with
https://googleplex-android-review.git.corp.google.com/c/1827725/.

Test: with the above CL, media codec no longer crashes. Wifi/nfc/fingerprint/etc
all function with ENABLE_TREBLE = true/false. hidl_test.

Change-Id: Ia99e554209d39eccbef6240489ebb78ca28b538e
diff --git a/generateCpp.cpp b/generateCpp.cpp
index b81051b..d81d241 100644
--- a/generateCpp.cpp
+++ b/generateCpp.cpp
@@ -158,41 +158,54 @@
         << "::android::sp<" << interfaceName << "> " << interfaceName << "::getService("
         << "const std::string &serviceName, bool getStub) ";
     out.block([&] {
-        out << "::android::sp<" << interfaceName << "> iface = nullptr;\n"
-            << "const ::android::sp<::android::hidl::manager::V1_0::IServiceManager> sm\n";
-        out.indent(2, [&] {
-            out << "= ::android::hardware::defaultServiceManager();\n";
-        });
-        out.sIf("sm != nullptr && !getStub", [&] {
-            out << "::android::hardware::Return<::android::sp<" << gIBaseFqName.cppName() << ">> ret = \n";
+        out << "::android::sp<" << interfaceName << "> iface = nullptr;\n";
+        out << "::android::vintf::Transport transport = ::android::hardware::getTransportFromManifest(\""
+            << fqName.package() << "\");\n";
+
+        out.sIf("!getStub && "
+                "(transport == ::android::vintf::Transport::HWBINDER || "
+                // TODO(b/34625838): Don't load in passthrough mode
+                "transport == ::android::vintf::Transport::PASSTHROUGH || "
+                "transport == ::android::vintf::Transport::EMPTY)", [&] {
+            out << "const ::android::sp<::android::hidl::manager::V1_0::IServiceManager> sm\n";
             out.indent(2, [&] {
-                out << "sm->get(" << interfaceName << "::descriptor" << ", serviceName);\n";
+                out << "= ::android::hardware::defaultServiceManager();\n";
             });
-            out.sIf("ret.isOk()", [&] {
-                out << "iface = " << interfaceName << "::castFrom(ret);\n";
-                out.sIf("iface != nullptr", [&] {
-                    out << "return iface;\n";
+            out.sIf("sm != nullptr", [&] {
+                out << "::android::hardware::Return<::android::sp<" << gIBaseFqName.cppName() << ">> ret = \n";
+                out.indent(2, [&] {
+                    out << "sm->get(" << interfaceName << "::descriptor" << ", serviceName);\n";
+                });
+                out.sIf("ret.isOk()", [&] {
+                    out << "iface = " << interfaceName << "::castFrom(ret);\n";
+                    out.sIf("iface != nullptr", [&] {
+                        out << "return iface;\n";
+                    }).endl();
                 }).endl();
             }).endl();
         }).endl();
 
-        out << "const ::android::sp<::android::hidl::manager::V1_0::IServiceManager> pm\n";
-        out.indent(2, [&] {
-            out << "= ::android::hardware::getPassthroughServiceManager();\n";
-        });
-
-        out.sIf("pm != nullptr", [&] () {
-            out << "::android::hardware::Return<::android::sp<" << gIBaseFqName.cppName() << ">> ret = \n";
+        out.sIf("getStub || "
+                "transport == ::android::vintf::Transport::PASSTHROUGH || "
+                "transport == ::android::vintf::Transport::EMPTY", [&] {
+            out << "const ::android::sp<::android::hidl::manager::V1_0::IServiceManager> pm\n";
             out.indent(2, [&] {
-                out << "pm->get(" << interfaceName << "::descriptor" << ", serviceName);\n";
+                out << "= ::android::hardware::getPassthroughServiceManager();\n";
             });
-            out.sIf("ret.isOk()", [&] {
-                out << "::android::sp<" << gIBaseFqName.cppName()
-                    << "> baseInterface = ret;\n";
-                out.sIf("baseInterface != nullptr", [&]() {
-                    out << "iface = new " << fqName.getInterfacePassthroughName()
-                        << "(" << interfaceName << "::castFrom(baseInterface));\n";
+
+            out.sIf("pm != nullptr", [&] () {
+                out << "::android::hardware::Return<::android::sp<" << gIBaseFqName.cppName() << ">> ret = \n";
+                out.indent(2, [&] {
+                    out << "pm->get(" << interfaceName << "::descriptor" << ", serviceName);\n";
                 });
+                out.sIf("ret.isOk()", [&] {
+                    out << "::android::sp<" << gIBaseFqName.cppName()
+                        << "> baseInterface = ret;\n";
+                    out.sIf("baseInterface != nullptr", [&]() {
+                        out << "iface = new " << fqName.getInterfacePassthroughName()
+                            << "(" << interfaceName << "::castFrom(baseInterface));\n";
+                    });
+                }).endl();
             }).endl();
         }).endl();