Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 67de6b76 authored by riddle_hsu's avatar riddle_hsu Committed by Gerrit Code Review
Browse files

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
parent 71f7d996
Loading
Loading
Loading
Loading
+5 −4
Original line number Diff line number Diff line
@@ -562,7 +562,7 @@ public final class ShutdownThread extends Thread {
            }
        }

        rebootOrShutdown(mReboot, mRebootReason);
        rebootOrShutdown(mContext, mReboot, mRebootReason);
    }

    private void shutdownRadios(int timeout) {
@@ -678,18 +678,19 @@ 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) {
        deviceRebootOrShutdown(reboot, 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) {
+1 −1
Original line number Diff line number Diff line
@@ -317,7 +317,7 @@ public final class SystemServer {
                reason = null;
            }

            ShutdownThread.rebootOrShutdown(reboot, reason);
            ShutdownThread.rebootOrShutdown(null, reboot, reason);
        }
    }