diff options
| author | 2019-11-06 17:03:14 -0800 | |
|---|---|---|
| committer | 2019-11-06 17:03:14 -0800 | |
| commit | 54f76a4872d08b863bb9c587e11086a56517c355 (patch) | |
| tree | 06f6ff26ab61bfdc4e37001f5202b72cc554fcac | |
| parent | d660afae5700e2890a11573d3ddbd2ae8a3b30fc (diff) | |
| parent | 614f9258ef2cbf734842c9ca203ce44089bc3fe3 (diff) | |
Merge "vibrator: handle aidl HAL dying" am: e29882bdfa am: d6ae1794f1
am: 614f9258ef
Change-Id: If803401ccd61cb3572316ab4f956ea8b588abfec
| -rw-r--r-- | services/core/jni/com_android_server_VibratorService.cpp | 24 |
1 files changed, 19 insertions, 5 deletions
diff --git a/services/core/jni/com_android_server_VibratorService.cpp b/services/core/jni/com_android_server_VibratorService.cpp index 8ddb86b08ea3..51bea1f068ad 100644 --- a/services/core/jni/com_android_server_VibratorService.cpp +++ b/services/core/jni/com_android_server_VibratorService.cpp @@ -154,21 +154,29 @@ class VibratorShim : public V1_4::IVibrator { sp<aidl::IVibratorCallback> cb = callback ? new CallbackShim(callback) : nullptr; int timeoutMs = 0; - V1_0::Status status = toHidlStatus( + Return<V1_0::Status> status = toHidlStatus( mVib->perform(static_cast<aidl::Effect>(effect), static_cast<aidl::EffectStrength>(strength), cb, &timeoutMs)); - _hidl_cb(status, timeoutMs); - return android::hardware::Status::ok(); + + if (status.isOk()) { + _hidl_cb(status, timeoutMs); + return android::hardware::Status::ok(); + } else { + return android::hardware::details::StatusOf<V1_0::Status, void>(status); + } } private: sp<aidl::IVibrator> mVib; - V1_0::Status toHidlStatus(const android::binder::Status& status) { + Return<V1_0::Status> toHidlStatus(const android::binder::Status& status) { switch(status.exceptionCode()) { using android::hardware::Status; case Status::EX_NONE: return V1_0::Status::OK; case Status::EX_ILLEGAL_ARGUMENT: return V1_0::Status::BAD_VALUE; case Status::EX_UNSUPPORTED_OPERATION: return V1_0::Status::UNSUPPORTED_OPERATION; + case Status::EX_TRANSACTION_FAILED: { + return Status::fromStatusT(status.transactionError()); + } } return V1_0::Status::UNKNOWN_ERROR; } @@ -247,8 +255,14 @@ class HalWrapper { } ALOGE("Failed to issue command to vibrator HAL. Retrying."); + // Restoring connection to the HAL. - mHal = I::tryGetService(); + sp<aidl::IVibrator> aidlVib = checkVintfService<aidl::IVibrator>(); + if (aidlVib) { + mHal = new VibratorShim(aidlVib); + } else { + mHal = I::tryGetService(); + } } return ret; } |