Don't crash on null Vibrator during reboot.

Bug: 3099305
Change-Id: I9af126f7a719f36ae544f517a2fccd0d33339389
diff --git a/core/java/android/os/Vibrator.java b/core/java/android/os/Vibrator.java
index 1895cf8..58ed986 100644
--- a/core/java/android/os/Vibrator.java
+++ b/core/java/android/os/Vibrator.java
@@ -16,6 +16,8 @@
 
 package android.os;
 
+import android.util.Log;
+
 /**
  * Class that operates the vibrator on the device.
  * <p>
@@ -23,6 +25,8 @@
  */
 public class Vibrator
 {
+    private static final String TAG = "Vibrator";
+
     IVibratorService mService;
     private final Binder mToken = new Binder();
 
@@ -40,9 +44,14 @@
      */
     public void vibrate(long milliseconds)
     {
+        if (mService == null) {
+            Log.w(TAG, "Failed to vibrate; no vibrator service.");
+            return;
+        }
         try {
             mService.vibrate(milliseconds, mToken);
-        } catch (RemoteException e) {
+        } catch (Exception e) {
+            Log.w(TAG, "Failed to vibrate.", e);
         }
     }
 
@@ -61,13 +70,18 @@
      */
     public void vibrate(long[] pattern, int repeat)
     {
+        if (mService == null) {
+            Log.w(TAG, "Failed to vibrate; no vibrator service.");
+            return;
+        }
         // catch this here because the server will do nothing.  pattern may
         // not be null, let that be checked, because the server will drop it
         // anyway
         if (repeat < pattern.length) {
             try {
                 mService.vibratePattern(pattern, repeat, mToken);
-            } catch (RemoteException e) {
+            } catch (Exception e) {
+                Log.w(TAG, "Failed to vibrate.", e);
             }
         } else {
             throw new ArrayIndexOutOfBoundsException();
@@ -79,9 +93,13 @@
      */
     public void cancel()
     {
+        if (mService == null) {
+            return;
+        }
         try {
             mService.cancelVibrate(mToken);
         } catch (RemoteException e) {
+            Log.w(TAG, "Failed to cancel vibration.", e);
         }
     }
 }
diff --git a/core/java/com/android/internal/app/ShutdownThread.java b/core/java/com/android/internal/app/ShutdownThread.java
index 714b259..1fcd654 100644
--- a/core/java/com/android/internal/app/ShutdownThread.java
+++ b/core/java/com/android/internal/app/ShutdownThread.java
@@ -364,7 +364,7 @@
             // vibrator is asynchronous so we need to wait to avoid shutting down too soon.
             try {
                 Thread.sleep(SHUTDOWN_VIBRATE_MS);
-            } catch (InterruptedException e) {
+            } catch (InterruptedException unused) {
             }
         }