| /* | 
 |  * Copyright (C) 2016 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 "GnssHAL_GnssNiInterface" | 
 |  | 
 | #include "GnssNi.h" | 
 |  | 
 | namespace android { | 
 | namespace hardware { | 
 | namespace gnss { | 
 | namespace V1_0 { | 
 | namespace implementation { | 
 |  | 
 | std::vector<std::unique_ptr<ThreadFuncArgs>> GnssNi::sThreadFuncArgsList; | 
 | sp<IGnssNiCallback> GnssNi::sGnssNiCbIface = nullptr; | 
 | bool GnssNi::sInterfaceExists = false; | 
 |  | 
 | GpsNiCallbacks GnssNi::sGnssNiCb = { | 
 |     .notify_cb = niNotifyCb, | 
 |     .create_thread_cb = createThreadCb | 
 | }; | 
 |  | 
 | GnssNi::GnssNi(const GpsNiInterface* gpsNiIface) : mGnssNiIface(gpsNiIface) { | 
 |     /* Error out if an instance of the interface already exists. */ | 
 |     LOG_ALWAYS_FATAL_IF(sInterfaceExists); | 
 |     sInterfaceExists = true; | 
 | } | 
 |  | 
 | GnssNi::~GnssNi() { | 
 |     sThreadFuncArgsList.clear(); | 
 |     sInterfaceExists = false; | 
 | } | 
 |  | 
 | pthread_t GnssNi::createThreadCb(const char* name, void (*start)(void*), void* arg) { | 
 |     return createPthread(name, start, arg, &sThreadFuncArgsList); | 
 | } | 
 |  | 
 | void GnssNi::niNotifyCb(GpsNiNotification* notification) { | 
 |     if (sGnssNiCbIface == nullptr) { | 
 |         ALOGE("%s: GNSS NI Callback Interface configured incorrectly", __func__); | 
 |         return; | 
 |     } | 
 |  | 
 |     if (notification == nullptr) { | 
 |         ALOGE("%s: Invalid GpsNotification callback from GNSS HAL", __func__); | 
 |         return; | 
 |     } | 
 |  | 
 |     IGnssNiCallback::GnssNiNotification notificationGnss = { | 
 |         .notificationId =  notification->notification_id, | 
 |         .niType = static_cast<IGnssNiCallback::GnssNiType>(notification->ni_type), | 
 |         .notifyFlags = notification->notify_flags, | 
 |         .timeoutSec = static_cast<uint32_t>(notification->timeout), | 
 |         .defaultResponse = | 
 |                 static_cast<IGnssNiCallback::GnssUserResponseType>(notification->default_response), | 
 |         .requestorId = notification->requestor_id, | 
 |         .notificationMessage = notification->text, | 
 |         .requestorIdEncoding = | 
 |                 static_cast<IGnssNiCallback::GnssNiEncodingType>(notification->requestor_id_encoding), | 
 |         .notificationIdEncoding = | 
 |                 static_cast<IGnssNiCallback::GnssNiEncodingType>(notification->text_encoding) | 
 |     }; | 
 |  | 
 |     auto ret = sGnssNiCbIface->niNotifyCb(notificationGnss); | 
 |     if (!ret.isOk()) { | 
 |         ALOGE("%s: Unable to invoke callback", __func__); | 
 |     } | 
 | } | 
 |  | 
 | // Methods from ::android::hardware::gnss::V1_0::IGnssNi follow. | 
 | Return<void> GnssNi::setCallback(const sp<IGnssNiCallback>& callback)  { | 
 |     if (mGnssNiIface == nullptr) { | 
 |        ALOGE("%s: GnssNi interface is unavailable", __func__); | 
 |        return Void(); | 
 |     } | 
 |  | 
 |     sGnssNiCbIface = callback; | 
 |  | 
 |     mGnssNiIface->init(&sGnssNiCb); | 
 |     return Void(); | 
 | } | 
 |  | 
 | Return<void> GnssNi::respond(int32_t notifId, IGnssNiCallback::GnssUserResponseType userResponse)  { | 
 |     if (mGnssNiIface == nullptr) { | 
 |         ALOGE("%s: GnssNi interface is unavailable", __func__); | 
 |     } else { | 
 |         mGnssNiIface->respond(notifId, static_cast<GpsUserResponseType>(userResponse)); | 
 |     } | 
 |     return Void(); | 
 | } | 
 |  | 
 | }  // namespace implementation | 
 | }  // namespace V1_0 | 
 | }  // namespace gnss | 
 | }  // namespace hardware | 
 | }  // namespace android |