summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Steven Moreland <smoreland@google.com> 2019-11-06 17:03:14 -0800
committer android-build-merger <android-build-merger@google.com> 2019-11-06 17:03:14 -0800
commit54f76a4872d08b863bb9c587e11086a56517c355 (patch)
tree06f6ff26ab61bfdc4e37001f5202b72cc554fcac
parentd660afae5700e2890a11573d3ddbd2ae8a3b30fc (diff)
parent614f9258ef2cbf734842c9ca203ce44089bc3fe3 (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.cpp24
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;
}