85ca130527
By calling close() when the framework client dies. Bug: 35624326 Test: NFC HAL stays alive and works after com.android.nfc is killed Change-Id: I91fcf6685783cd630a44d19b4cb99127a2c0e89b
76 lines
2.5 KiB
C++
76 lines
2.5 KiB
C++
#ifndef ANDROID_HARDWARE_NFC_V1_0_NFC_H
|
|
#define ANDROID_HARDWARE_NFC_V1_0_NFC_H
|
|
|
|
#include <android/hardware/nfc/1.0/INfc.h>
|
|
#include <hidl/Status.h>
|
|
#include <hardware/hardware.h>
|
|
#include <hardware/nfc.h>
|
|
namespace android {
|
|
namespace hardware {
|
|
namespace nfc {
|
|
namespace V1_0 {
|
|
namespace implementation {
|
|
|
|
using ::android::hardware::nfc::V1_0::INfc;
|
|
using ::android::hardware::nfc::V1_0::INfcClientCallback;
|
|
using ::android::hardware::Return;
|
|
using ::android::hardware::Void;
|
|
using ::android::hardware::hidl_vec;
|
|
using ::android::hardware::hidl_string;
|
|
using ::android::sp;
|
|
|
|
struct NfcDeathRecipient : hidl_death_recipient {
|
|
NfcDeathRecipient(const sp<INfc> nfc) : mNfc(nfc) {
|
|
}
|
|
|
|
virtual void serviceDied(uint64_t /*cookie*/, const wp<::android::hidl::base::V1_0::IBase>& /*who*/) {
|
|
mNfc->close();
|
|
}
|
|
sp<INfc> mNfc;
|
|
};
|
|
|
|
struct Nfc : public INfc {
|
|
Nfc(nfc_nci_device_t* device);
|
|
::android::hardware::Return<NfcStatus> open(const sp<INfcClientCallback>& clientCallback) override;
|
|
::android::hardware::Return<uint32_t> write(const hidl_vec<uint8_t>& data) override;
|
|
::android::hardware::Return<NfcStatus> coreInitialized(const hidl_vec<uint8_t>& data) override;
|
|
::android::hardware::Return<NfcStatus> prediscover() override;
|
|
::android::hardware::Return<NfcStatus> close() override;
|
|
::android::hardware::Return<NfcStatus> controlGranted() override;
|
|
::android::hardware::Return<NfcStatus> powerCycle() override;
|
|
|
|
static void eventCallback(uint8_t event, uint8_t status) {
|
|
if (mCallback != nullptr) {
|
|
auto ret = mCallback->sendEvent(
|
|
(::android::hardware::nfc::V1_0::NfcEvent) event,
|
|
(::android::hardware::nfc::V1_0::NfcStatus) status);
|
|
if (!ret.isOk()) {
|
|
ALOGW("Failed to call back into NFC process.");
|
|
}
|
|
}
|
|
}
|
|
static void dataCallback(uint16_t data_len, uint8_t* p_data) {
|
|
hidl_vec<uint8_t> data;
|
|
data.setToExternal(p_data, data_len);
|
|
if (mCallback != nullptr) {
|
|
auto ret = mCallback->sendData(data);
|
|
if (!ret.isOk()) {
|
|
ALOGW("Failed to call back into NFC process.");
|
|
}
|
|
}
|
|
}
|
|
private:
|
|
static sp<INfcClientCallback> mCallback;
|
|
const nfc_nci_device_t* mDevice;
|
|
sp<NfcDeathRecipient> mDeathRecipient;
|
|
};
|
|
|
|
extern "C" INfc* HIDL_FETCH_INfc(const char* name);
|
|
|
|
} // namespace implementation
|
|
} // namespace V1_0
|
|
} // namespace nfc
|
|
} // namespace hardware
|
|
} // namespace android
|
|
|
|
#endif // ANDROID_HARDWARE_NFC_V1_0_NFC_H
|