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
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user