Add computepipe example implementation

Fix: 148017613

Change-Id: I0b579cd5ce45deff0e723634fdf4a09513715e83
diff --git a/computepipe/example/Runner.cpp b/computepipe/example/Runner.cpp
new file mode 100644
index 0000000..b46345e
--- /dev/null
+++ b/computepipe/example/Runner.cpp
@@ -0,0 +1,75 @@
+// Copyright 2020 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+#include <android-base/logging.h>
+#include <android/binder_process.h>
+#include <utils/Errors.h>
+#include <utils/Log.h>
+
+#include <iostream>
+#include <memory>
+#include <thread>
+
+#include "ClientConfig.pb.h"
+#include "ClientInterface.h"
+#include "MemHandle.h"
+#include "Options.pb.h"
+#include "PrebuiltGraph.h"
+#include "RunnerEngine.h"
+#include "types/Status.h"
+
+using android::automotive::computepipe::Status;
+using android::automotive::computepipe::graph::PrebuiltGraph;
+using android::automotive::computepipe::proto::ClientConfig;
+using android::automotive::computepipe::proto::Options;
+using android::automotive::computepipe::runner::client_interface::ClientInterface;
+using android::automotive::computepipe::runner::client_interface::ClientInterfaceFactory;
+using android::automotive::computepipe::runner::engine::RunnerEngine;
+using android::automotive::computepipe::runner::engine::RunnerEngineFactory;
+
+namespace {
+RunnerEngineFactory sEngineFactory;
+ClientInterfaceFactory sClientFactory;
+}  // namespace
+void terminate(bool isError, std::string msg) {
+    if (isError) {
+        LOG(ERROR) << "Error msg " << msg;
+        exit(2);
+    }
+    LOG(ERROR) << "Test complete";
+    exit(0);
+}
+
+int main(int /* argc */, char** /* argv */) {
+    std::shared_ptr<RunnerEngine> engine =
+        sEngineFactory.createRunnerEngine(RunnerEngineFactory::kDefault, "");
+
+    std::unique_ptr<PrebuiltGraph> graph;
+    graph.reset(PrebuiltGraph::GetPrebuiltGraphFromLibrary("libfacegraph.so", engine));
+
+    Options options = graph->GetSupportedGraphConfigs();
+    engine->setPrebuiltGraph(std::move(graph));
+
+    std::function<void(bool, std::string)> cb = terminate;
+    std::unique_ptr<ClientInterface> client =
+        sClientFactory.createClientInterface("aidl", options, engine);
+    if (!client) {
+        std::cerr << "Unable to allocate client";
+        return -1;
+    }
+    engine->setClientInterface(std::move(client));
+    ABinderProcess_startThreadPool();
+    engine->activate();
+    ABinderProcess_joinThreadPool();
+    return 0;
+}