Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5df61280 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge changes from topic "remoteaccess_hal"

* changes:
  Implement receiving remote task.
  Implement the GrpcWakeupClient.
  Define remoteaccess grpc HAL.
parents 780b6e41 b138c42a
Loading
Loading
Loading
Loading
+66 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2022 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.
 */

package {
    default_applicable_licenses: ["Android-Apache-2.0"],
}

cc_binary {
    name: "android.hardware.automotive.remoteaccess@V1-default-service",
    vendor: true,
    vintf_fragments: ["remoteaccess-default-service.xml"],
    init_rc: ["remoteaccess-default-service.rc"],
    relative_install_path: "hw",
    srcs: ["src/RemoteAccessImpl.cpp"],
    whole_static_libs: [
        "RemoteAccessService",
    ],
    shared_libs: [
        "libbinder_ndk",
        "liblog",
        "libutils",
        "libgrpc++",
        "libprotobuf-cpp-full",
    ],
    cflags: [
        "-Wno-unused-parameter",
    ],
}

cc_library {
    name: "RemoteAccessService",
    vendor: true,
    local_include_dirs: ["include"],
    export_include_dirs: ["include"],
    srcs: [
        "src/RemoteAccessService.cpp",
    ],
    whole_static_libs: [
        "android.hardware.automotive.remoteaccess-V1-ndk",
        "wakeup_client_protos",
    ],
    shared_libs: [
        "libbase",
        "libbinder_ndk",
        "liblog",
        "libutils",
        "libgrpc++",
        "libprotobuf-cpp-full",
    ],
    cflags: [
        "-Wno-unused-parameter",
    ],
}
+83 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2022 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.
 */

#pragma once

#include <aidl/android/hardware/automotive/remoteaccess/ApState.h>
#include <aidl/android/hardware/automotive/remoteaccess/BnRemoteAccess.h>
#include <aidl/android/hardware/automotive/remoteaccess/IRemoteTaskCallback.h>
#include <android-base/thread_annotations.h>
#include <wakeup_client.grpc.pb.h>

#include <string>
#include <thread>

namespace android {
namespace hardware {
namespace automotive {
namespace remoteaccess {

class RemoteAccessService
    : public aidl::android::hardware::automotive::remoteaccess::BnRemoteAccess {
  public:
    explicit RemoteAccessService(WakeupClient::StubInterface* grpcStub);

    ~RemoteAccessService();

    ndk::ScopedAStatus getDeviceId(std::string* deviceId) override;

    ndk::ScopedAStatus getWakeupServiceName(std::string* wakeupServiceName) override;

    ndk::ScopedAStatus setRemoteTaskCallback(
            const std::shared_ptr<
                    aidl::android::hardware::automotive::remoteaccess::IRemoteTaskCallback>&
                    callback) override;

    ndk::ScopedAStatus clearRemoteTaskCallback() override;

    ndk::ScopedAStatus notifyApStateChange(
            const aidl::android::hardware::automotive::remoteaccess::ApState& newState) override;

  private:
    // For testing.
    friend class RemoteAccessServiceUnitTest;

    WakeupClient::StubInterface* mGrpcStub;
    std::thread mThread;
    std::mutex mLock;
    std::condition_variable mCv;
    std::shared_ptr<aidl::android::hardware::automotive::remoteaccess::IRemoteTaskCallback>
            mRemoteTaskCallback GUARDED_BY(mLock);
    std::unique_ptr<grpc::ClientContext> mGetRemoteTasksContext GUARDED_BY(mLock);
    // Associated with mCv to notify the task loop to stop waiting and exit.
    bool mTaskWaitStopped GUARDED_BY(mLock);
    // A mutex to make sure startTaskLoop does not overlap with stopTaskLoop.
    std::mutex mStartStopTaskLoopLock;
    bool mTaskLoopRunning GUARDED_BY(mStartStopTaskLoopLock);
    // Default wait time before retry connecting to remote access client is 10s.
    size_t mRetryWaitInMs = 10'000;

    void runTaskLoop();
    void maybeStartTaskLoop();
    void maybeStopTaskLoop();

    void setRetryWaitInMs(size_t retryWaitInMs) { mRetryWaitInMs = retryWaitInMs; }
};

}  // namespace remoteaccess
}  // namespace automotive
}  // namespace hardware
}  // namespace android
+4 −0
Original line number Diff line number Diff line
service vendor.remoteaccess-default /vendor/bin/hw/android.hardware.automotive.remoteaccess@V1-default-service
    class hal
    user vehicle_network
    group system inet
+7 −0
Original line number Diff line number Diff line
<manifest version="1.0" type="device">
    <hal format="aidl">
        <name>android.hardware.automotive.remoteaccess</name>
        <version>1</version>
        <fqname>IRemoteAccess/default</fqname>
    </hal>
</manifest>
+54 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2022 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.
 */

#define LOG_TAG "RemoteAccessImpl"

#include "RemoteAccessService.h"

#include <android/binder_manager.h>
#include <android/binder_process.h>
#include <utils/Log.h>

int main(int /* argc */, char* /* argv */[]) {
    ALOGI("Registering RemoteAccessService as service...");

    // TODO(b/241483300): Create GrpcClientStub here.
    auto service = ndk::SharedRefBase::make<
            android::hardware::automotive::remoteaccess::RemoteAccessService>(nullptr);

    binder_exception_t err = AServiceManager_addService(
            service->asBinder().get(), "android.hardware.automotive.remote.IRemoteAccess/default");
    if (err != EX_NONE) {
        ALOGE("failed to register android.hardware.automotive.remote.IRemoteAccess service, "
              "exception: %d",
              err);
        return 1;
    }

    if (!ABinderProcess_setThreadPoolMaxThreadCount(1)) {
        ALOGE("%s", "failed to set thread pool max thread count");
        return 1;
    }
    ABinderProcess_startThreadPool();

    ALOGI("RemoteAccess service Ready");

    ABinderProcess_joinThreadPool();

    ALOGW("Should not reach here");

    return 0;
}
Loading