Fix no vibration during shutdown.
In ShutdownThread:rebootOrShutdown, the vibrator is created by "new SystemVibrator()" which will use default constructor of Vibrator. And because system server is not bound application, ActivityThread.currentPackageName will be null. Then the member mPackageName of Vibrator is null. When doing vibration: VibratorService.startVibrationLocked -> mAppOpsService.startOperation -> getOpsLocked (null package will get null op) -> return MODE_ERRORED -> no vibration https://code.google.com/p/android/issues/detail?id=160830 Pass null context in SystemServer.performPendingShutdown because vibrator service is not ready, and from the call sequence, there is no available context to use. Change-Id: I3e0175ba6dc2e1a92787873eda4461fba6e89783
This commit is contained in:
@@ -384,7 +384,7 @@ public final class ShutdownThread extends Thread {
|
||||
}
|
||||
}
|
||||
|
||||
rebootOrShutdown(mReboot, mRebootReason);
|
||||
rebootOrShutdown(mContext, mReboot, mRebootReason);
|
||||
}
|
||||
|
||||
private void shutdownRadios(int timeout) {
|
||||
@@ -501,17 +501,18 @@ public final class ShutdownThread extends Thread {
|
||||
* Do not call this directly. Use {@link #reboot(Context, String, boolean)}
|
||||
* or {@link #shutdown(Context, boolean)} instead.
|
||||
*
|
||||
* @param context Context used to vibrate or null without vibration
|
||||
* @param reboot true to reboot or false to shutdown
|
||||
* @param reason reason for reboot
|
||||
*/
|
||||
public static void rebootOrShutdown(boolean reboot, String reason) {
|
||||
public static void rebootOrShutdown(final Context context, boolean reboot, String reason) {
|
||||
if (reboot) {
|
||||
Log.i(TAG, "Rebooting, reason: " + reason);
|
||||
PowerManagerService.lowLevelReboot(reason);
|
||||
Log.e(TAG, "Reboot failed, will attempt shutdown instead");
|
||||
} else if (SHUTDOWN_VIBRATE_MS > 0) {
|
||||
} else if (SHUTDOWN_VIBRATE_MS > 0 && context != null) {
|
||||
// vibrate before shutting down
|
||||
Vibrator vibrator = new SystemVibrator();
|
||||
Vibrator vibrator = new SystemVibrator(context);
|
||||
try {
|
||||
vibrator.vibrate(SHUTDOWN_VIBRATE_MS, VIBRATION_ATTRIBUTES);
|
||||
} catch (Exception e) {
|
||||
|
||||
@@ -288,7 +288,7 @@ public final class SystemServer {
|
||||
reason = null;
|
||||
}
|
||||
|
||||
ShutdownThread.rebootOrShutdown(reboot, reason);
|
||||
ShutdownThread.rebootOrShutdown(null, reboot, reason);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user