From 995bd864365e70742d63a5797393723773c29619 Mon Sep 17 00:00:00 2001 From: Lais Andrade Date: Tue, 16 Feb 2021 01:29:32 +0000 Subject: [PATCH] Create VibrationThread only after binder calling ID cleared The creation of the VibrationThread does some setup for the WakeLock that the thread must hold, which should only be executed after the Binder calling ID has been cleared. The necessary checks for this operation are already done by the method enforceUpdateAppOpsStatsPermission, so the VibratorManagerService should be able to setup the thread wakelock at that stage. Fix: 180324695 Test: manual Change-Id: I2f203fc4c7ba78687e9159af93b3d1acd9c826c9 --- .../vibrator/VibratorManagerService.java | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/services/core/java/com/android/server/vibrator/VibratorManagerService.java b/services/core/java/com/android/server/vibrator/VibratorManagerService.java index 260d79abd30ce..175085475b6cd 100644 --- a/services/core/java/com/android/server/vibrator/VibratorManagerService.java +++ b/services/core/java/com/android/server/vibrator/VibratorManagerService.java @@ -352,10 +352,7 @@ public class VibratorManagerService extends IVibratorManagerService.Stub { return; } - VibrationThread vibThread = new VibrationThread(vib, mVibrators, mWakeLock, - mBatteryStatsService, mVibrationCallbacks); - - ignoreStatus = shouldIgnoreVibrationForCurrentLocked(vibThread); + ignoreStatus = shouldIgnoreVibrationForCurrentLocked(vib); if (ignoreStatus != null) { endVibrationLocked(vib, ignoreStatus); return; @@ -366,7 +363,7 @@ public class VibratorManagerService extends IVibratorManagerService.Stub { if (mCurrentVibration != null) { mCurrentVibration.cancel(); } - Vibration.Status status = startVibrationLocked(vibThread); + Vibration.Status status = startVibrationLocked(vib); if (status != Vibration.Status.RUNNING) { endVibrationLocked(vib, status); } @@ -491,19 +488,19 @@ public class VibratorManagerService extends IVibratorManagerService.Stub { } @GuardedBy("mLock") - private Vibration.Status startVibrationLocked(VibrationThread vibThread) { + private Vibration.Status startVibrationLocked(Vibration vib) { Trace.traceBegin(Trace.TRACE_TAG_VIBRATOR, "startVibrationLocked"); try { - Vibration vib = vibThread.getVibration(); vib.updateEffect(mVibrationScaler.scale(vib.getEffect(), vib.attrs.getUsage())); - boolean inputDevicesAvailable = mInputDeviceDelegate.vibrateIfAvailable( vib.uid, vib.opPkg, vib.getEffect(), vib.reason, vib.attrs); - if (inputDevicesAvailable) { return Vibration.Status.FORWARDED_TO_INPUT_DEVICES; } + VibrationThread vibThread = new VibrationThread(vib, mVibrators, mWakeLock, + mBatteryStatsService, mVibrationCallbacks); + if (mCurrentVibration == null) { return startVibrationThreadLocked(vibThread); } @@ -595,8 +592,8 @@ public class VibratorManagerService extends IVibratorManagerService.Stub { */ @GuardedBy("mLock") @Nullable - private Vibration.Status shouldIgnoreVibrationForCurrentLocked(VibrationThread vibThread) { - if (vibThread.getVibration().isRepeating()) { + private Vibration.Status shouldIgnoreVibrationForCurrentLocked(Vibration vibration) { + if (vibration.isRepeating()) { // Repeating vibrations always take precedence. return null; }