summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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;
}