Remove HardwareService and move vibrator support to VibratorService.

The lights support is only needed by PowerManagerService and NotificationManagerService, so we do not need a Binder API for it.
Move backlight and notification light support to new LightsService class.
The camera flash is now handled directly by the camera HAL, so the flash Hardware service flash support is obsolete.

Change-Id: I086d681f54668e7f7de3e8b90df3de19d59833c5
Signed-off-by: Mike Lockwood <lockwood@android.com>
diff --git a/Android.mk b/Android.mk
index be3f569..1d4b10f 100644
--- a/Android.mk
+++ b/Android.mk
@@ -108,13 +108,13 @@
 	core/java/android/hardware/ISensorService.aidl \
 	core/java/android/net/IConnectivityManager.aidl \
 	core/java/android/os/ICheckinService.aidl \
-	core/java/android/os/IHardwareService.aidl \
 	core/java/android/os/IMessenger.aidl \
 	core/java/android/os/IMountService.aidl \
 	core/java/android/os/INetStatService.aidl \
 	core/java/android/os/IParentalControlCallback.aidl \
 	core/java/android/os/IPermissionController.aidl \
 	core/java/android/os/IPowerManager.aidl \
+	core/java/android/os/IVibratorService.aidl \
     core/java/android/service/wallpaper/IWallpaperConnection.aidl \
     core/java/android/service/wallpaper/IWallpaperEngine.aidl \
     core/java/android/service/wallpaper/IWallpaperService.aidl \
diff --git a/core/java/android/os/Hardware.java b/core/java/android/os/Hardware.java
deleted file mode 100644
index efc5617..0000000
--- a/core/java/android/os/Hardware.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Copyright (C) 2006 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.os;
-
-/**
- * {@hide}
- */
-public class Hardware 
-{
-
-
-    /* ********************************************************************************
-     *
-     *
-     *
-     *
-     *
-     *
-     *
-     *
-     *   Don't add anything else to this class.  Add it to HardwareService instead.
-     *
-     *
-     *
-     *
-     *
-     *
-     *
-     * ********************************************************************************/
-
-
-    public static native boolean getFlashlightEnabled();
-    public static native void setFlashlightEnabled(boolean on);
-    public static native void enableCameraFlash(int milliseconds);
-}
diff --git a/core/java/android/os/IHardwareService.aidl b/core/java/android/os/IVibratorService.aidl
similarity index 74%
rename from core/java/android/os/IHardwareService.aidl
rename to core/java/android/os/IVibratorService.aidl
index 34f30a7..c98fb56 100755
--- a/core/java/android/os/IHardwareService.aidl
+++ b/core/java/android/os/IVibratorService.aidl
@@ -17,19 +17,10 @@
 package android.os;
 
 /** {@hide} */
-interface IHardwareService
+interface IVibratorService
 {
-    // Vibrator support
     void vibrate(long milliseconds, IBinder token);
     void vibratePattern(in long[] pattern, int repeat, IBinder token);
     void cancelVibrate(IBinder token);
-
-    // flashlight support
-    boolean getFlashlightEnabled();
-    void setFlashlightEnabled(boolean on);
-    void enableCameraFlash(int milliseconds);
-
-    // for the phone
-    void setAttentionLight(boolean on, int color);
 }
 
diff --git a/core/java/android/os/Vibrator.java b/core/java/android/os/Vibrator.java
index 51dcff1..1895cf8 100644
--- a/core/java/android/os/Vibrator.java
+++ b/core/java/android/os/Vibrator.java
@@ -23,14 +23,14 @@
  */
 public class Vibrator
 {
-    IHardwareService mService;
+    IVibratorService mService;
     private final Binder mToken = new Binder();
 
     /** @hide */
     public Vibrator()
     {
-        mService = IHardwareService.Stub.asInterface(
-                ServiceManager.getService("hardware"));
+        mService = IVibratorService.Stub.asInterface(
+                ServiceManager.getService("vibrator"));
     }
 
     /**
diff --git a/core/jni/Android.mk b/core/jni/Android.mk
index b9042f9..edb0b78 100644
--- a/core/jni/Android.mk
+++ b/core/jni/Android.mk
@@ -54,7 +54,6 @@
 	android_os_SystemClock.cpp \
 	android_os_SystemProperties.cpp \
 	android_os_UEventObserver.cpp \
-	android_os_Hardware.cpp \
 	android_net_LocalSocketImpl.cpp \
 	android_net_NetUtils.cpp \
 	android_net_wifi_Wifi.cpp \
diff --git a/core/jni/AndroidRuntime.cpp b/core/jni/AndroidRuntime.cpp
index d069d7d..9f617fb 100644
--- a/core/jni/AndroidRuntime.cpp
+++ b/core/jni/AndroidRuntime.cpp
@@ -130,7 +130,6 @@
 extern int register_android_os_Power(JNIEnv *env);
 extern int register_android_os_StatFs(JNIEnv *env);
 extern int register_android_os_SystemProperties(JNIEnv *env);
-extern int register_android_os_Hardware(JNIEnv* env);
 extern int register_android_os_SystemClock(JNIEnv* env);
 extern int register_android_os_FileObserver(JNIEnv *env);
 extern int register_android_os_FileUtils(JNIEnv *env);
@@ -1166,7 +1165,6 @@
     REG_JNI(register_android_text_KeyCharacterMap),
     REG_JNI(register_android_os_Process),
     REG_JNI(register_android_os_Binder),
-    REG_JNI(register_android_os_Hardware),
     REG_JNI(register_android_view_Display),
     REG_JNI(register_android_nio_utils),
     REG_JNI(register_android_graphics_PixelFormat),
diff --git a/core/jni/android_os_Hardware.cpp b/core/jni/android_os_Hardware.cpp
deleted file mode 100644
index 8007662..0000000
--- a/core/jni/android_os_Hardware.cpp
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Copyright 2006, The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
-*/
-
-#include <hardware_legacy/flashlight.h>
-#include <hardware_legacy/power.h>
-
-#include <nativehelper/jni.h>
-#include <android_runtime/AndroidRuntime.h>
-#include <nativehelper/JNIHelp.h>
-
-namespace android {
-
-static jint
-getFlashlightEnabled(JNIEnv *env, jobject clazz)
-{
-    return get_flashlight_enabled();
-}
-
-static void
-setFlashlightEnabled(JNIEnv *env, jobject clazz, jboolean on)
-{
-    set_flashlight_enabled(on);
-}
-
-static void
-enableCameraFlash(JNIEnv *env, jobject clazz, jint milliseconds)
-{
-    enable_camera_flash(milliseconds);
-}
-
-// ============================================================================
-/*
- * JNI registration.
- */
-
-static JNINativeMethod g_methods[] = {
-    /* name, signature, funcPtr */
-    { "getFlashlightEnabled", "()Z", (void*)getFlashlightEnabled },
-    { "setFlashlightEnabled", "(Z)V", (void*)setFlashlightEnabled },
-    { "enableCameraFlash", "(I)V", (void*)enableCameraFlash },
-};
-
-int register_android_os_Hardware(JNIEnv* env)
-{
-    return AndroidRuntime::registerNativeMethods(env,
-            "android/os/Hardware", g_methods, NELEM(g_methods));
-}
-
-}; // namespace android
diff --git a/preloaded-classes b/preloaded-classes
index 08fc2a1..73bab87 100644
--- a/preloaded-classes
+++ b/preloaded-classes
@@ -501,10 +501,8 @@
 android.os.FileUtils$FileStatus
 android.os.Handler
 android.os.HandlerThread
-android.os.Hardware
 android.os.IBinder
 android.os.ICheckinService$Stub
-android.os.IHardwareService$Stub
 android.os.IInterface
 android.os.IMountService$Stub
 android.os.IMountService$Stub$Proxy
@@ -512,6 +510,7 @@
 android.os.IParentalControlCallback$Stub
 android.os.IPowerManager$Stub
 android.os.IPowerManager$Stub$Proxy
+android.os.IVibratorService$Stub
 android.os.Looper
 android.os.MemoryFile
 android.os.Message
diff --git a/services/java/com/android/server/LightsService.java b/services/java/com/android/server/LightsService.java
new file mode 100644
index 0000000..ae8d321
--- /dev/null
+++ b/services/java/com/android/server/LightsService.java
@@ -0,0 +1,133 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server;
+
+import android.content.Context;
+import android.os.Handler;
+import android.os.Message;
+import android.util.Log;
+
+public class LightsService {
+    private static final String TAG = "LightsService";
+
+    static final int LIGHT_ID_BACKLIGHT = 0;
+    static final int LIGHT_ID_KEYBOARD = 1;
+    static final int LIGHT_ID_BUTTONS = 2;
+    static final int LIGHT_ID_BATTERY = 3;
+    static final int LIGHT_ID_NOTIFICATIONS = 4;
+    static final int LIGHT_ID_ATTENTION = 5;
+
+    static final int LIGHT_FLASH_NONE = 0;
+    static final int LIGHT_FLASH_TIMED = 1;
+    static final int LIGHT_FLASH_HARDWARE = 2;
+
+    /**
+     * Light brightness is managed by a user setting.
+     */
+    static final int BRIGHTNESS_MODE_USER = 0;
+
+    /**
+     * Light brightness is managed by a light sensor.
+     */
+    static final int BRIGHTNESS_MODE_SENSOR = 1;
+
+    private boolean mAttentionLightOn;
+    private boolean mPulsing;
+
+    LightsService(Context context) {
+
+        mNativePointer = init_native();
+        mContext = context;
+    }
+
+    protected void finalize() throws Throwable {
+        finalize_native(mNativePointer);
+        super.finalize();
+    }
+
+    void setLightOff(int light) {
+        setLight_native(mNativePointer, light, 0, LIGHT_FLASH_NONE, 0, 0, 0);
+    }
+
+    void setLightBrightness(int light, int brightness, int brightnessMode) {
+        int b = brightness & 0x000000ff;
+        b = 0xff000000 | (b << 16) | (b << 8) | b;
+        setLight_native(mNativePointer, light, b, LIGHT_FLASH_NONE, 0, 0, brightnessMode);
+    }
+
+    void setLightColor(int light, int color) {
+        setLight_native(mNativePointer, light, color, LIGHT_FLASH_NONE, 0, 0, 0);
+    }
+
+    void setLightFlashing(int light, int color, int mode, int onMS, int offMS) {
+        setLight_native(mNativePointer, light, color, mode, onMS, offMS, 0);
+    }
+
+    public void setAttentionLight(boolean on, int color) {
+        // Not worthy of a permission.  We shouldn't have a flashlight permission.
+        synchronized (this) {
+            mAttentionLightOn = on;
+            mPulsing = false;
+            setLight_native(mNativePointer, LIGHT_ID_ATTENTION, color,
+                    LIGHT_FLASH_HARDWARE, on ? 3 : 0, 0, 0);
+        }
+    }
+
+    public void pulseBreathingLight() {
+        synchronized (this) {
+            // HACK: Added at the last minute of cupcake -- design this better;
+            // Don't reuse the attention light -- make another one.
+            if (false) {
+                Log.d(TAG, "pulseBreathingLight mAttentionLightOn=" + mAttentionLightOn
+                        + " mPulsing=" + mPulsing);
+            }
+            if (!mAttentionLightOn && !mPulsing) {
+                mPulsing = true;
+                setLight_native(mNativePointer, LIGHT_ID_ATTENTION, 0x00ffffff,
+                        LIGHT_FLASH_HARDWARE, 7, 0, 0);
+                mH.sendMessageDelayed(Message.obtain(mH, 1), 3000);
+            }
+        }
+    }
+
+    private Handler mH = new Handler() {
+        @Override
+        public void handleMessage(Message msg) {
+            synchronized (this) {
+                if (false) {
+                    Log.d(TAG, "pulse cleanup handler firing mPulsing=" + mPulsing);
+                }
+                if (mPulsing) {
+                    mPulsing = false;
+                    setLight_native(mNativePointer, LIGHT_ID_ATTENTION,
+                            mAttentionLightOn ? 0xffffffff : 0,
+                            LIGHT_FLASH_NONE, 0, 0, 0);
+                }
+            }
+        }
+    };
+
+    private static native int init_native();
+    private static native void finalize_native(int ptr);
+
+    private static native void setLight_native(int ptr, int light, int color, int mode,
+            int onMS, int offMS, int brightnessMode);
+
+    private final Context mContext;
+
+    private int mNativePointer;
+}
diff --git a/services/java/com/android/server/NotificationManagerService.java b/services/java/com/android/server/NotificationManagerService.java
index ff23a13..b89cd3f 100755
--- a/services/java/com/android/server/NotificationManagerService.java
+++ b/services/java/com/android/server/NotificationManagerService.java
@@ -86,7 +86,7 @@
 
     private WorkerHandler mHandler;
     private StatusBarService mStatusBarService;
-    private HardwareService mHardware;
+    private LightsService mLightsService;
 
     private NotificationRecord mSoundNotification;
     private AsyncPlayer mSound;
@@ -363,11 +363,11 @@
     private final SettingsObserver mSettingsObserver;
     
     NotificationManagerService(Context context, StatusBarService statusBar,
-            HardwareService hardware)
+            LightsService lights)
     {
         super();
         mContext = context;
-        mHardware = hardware;
+        mLightsService = lights;
         mAm = ActivityManagerNative.getDefault();
         mSound = new AsyncPlayer(TAG);
         mSound.setUsesWakeLock(context);
@@ -678,7 +678,7 @@
                     long identity = Binder.clearCallingIdentity();
                     try {
                         r.statusBarKey = mStatusBarService.addIcon(icon, n);
-                        mHardware.pulseBreathingLight();
+                        mLightsService.pulseBreathingLight();
                     }
                     finally {
                         Binder.restoreCallingIdentity(identity);
@@ -969,24 +969,24 @@
         // Battery low always shows, other states only show if charging.
         if (mBatteryLow) {
             if (mBatteryCharging) {
-                mHardware.setLightColor_UNCHECKED(HardwareService.LIGHT_ID_BATTERY,
+                mLightsService.setLightColor(LightsService.LIGHT_ID_BATTERY,
                     BATTERY_LOW_ARGB);
             } else {
                 // Flash when battery is low and not charging
-                mHardware.setLightFlashing_UNCHECKED(HardwareService.LIGHT_ID_BATTERY,
-                    BATTERY_LOW_ARGB, HardwareService.LIGHT_FLASH_TIMED,
+                mLightsService.setLightFlashing(LightsService.LIGHT_ID_BATTERY,
+                    BATTERY_LOW_ARGB, LightsService.LIGHT_FLASH_TIMED,
                     BATTERY_BLINK_ON, BATTERY_BLINK_OFF);
             }
         } else if (mBatteryCharging) {
             if (mBatteryFull) {
-                mHardware.setLightColor_UNCHECKED(HardwareService.LIGHT_ID_BATTERY,
+                mLightsService.setLightColor(LightsService.LIGHT_ID_BATTERY,
                         BATTERY_FULL_ARGB);
             } else {
-                mHardware.setLightColor_UNCHECKED(HardwareService.LIGHT_ID_BATTERY,
+                mLightsService.setLightColor(LightsService.LIGHT_ID_BATTERY,
                         BATTERY_MEDIUM_ARGB);
             }
         } else {
-            mHardware.setLightOff_UNCHECKED(HardwareService.LIGHT_ID_BATTERY);
+            mLightsService.setLightOff(LightsService.LIGHT_ID_BATTERY);
         }
 
         // handle notification lights
@@ -998,12 +998,12 @@
             }
         }
         if (mLedNotification == null) {
-            mHardware.setLightOff_UNCHECKED(HardwareService.LIGHT_ID_NOTIFICATIONS);
+            mLightsService.setLightOff(LightsService.LIGHT_ID_NOTIFICATIONS);
         } else {
-            mHardware.setLightFlashing_UNCHECKED(
-                    HardwareService.LIGHT_ID_NOTIFICATIONS,
+            mLightsService.setLightFlashing(
+                    LightsService.LIGHT_ID_NOTIFICATIONS,
                     mLedNotification.notification.ledARGB,
-                    HardwareService.LIGHT_FLASH_TIMED,
+                    LightsService.LIGHT_FLASH_TIMED,
                     mLedNotification.notification.ledOnMS,
                     mLedNotification.notification.ledOffMS);
         }
diff --git a/services/java/com/android/server/PowerManagerService.java b/services/java/com/android/server/PowerManagerService.java
index feab7d2..b1ecb3c 100644
--- a/services/java/com/android/server/PowerManagerService.java
+++ b/services/java/com/android/server/PowerManagerService.java
@@ -181,7 +181,7 @@
     private final LockList mLocks = new LockList();
     private Intent mScreenOffIntent;
     private Intent mScreenOnIntent;
-    private HardwareService mHardware;
+    private LightsService mLightsService;
     private Context mContext;
     private UnsynchronizedWakeLock mBroadcastWakeLock;
     private UnsynchronizedWakeLock mStayOnWhilePluggedInScreenDimLock;
@@ -420,9 +420,9 @@
 
     private ContentQueryMap mSettings;
 
-    void init(Context context, HardwareService hardware, IActivityManager activity,
+    void init(Context context, LightsService lights, IActivityManager activity,
             BatteryService battery) {
-        mHardware = hardware;
+        mLightsService = lights;
         mContext = context;
         mActivityService = activity;
         mBatteryStats = BatteryStatsService.getService();
@@ -1363,11 +1363,11 @@
                 if (!on) {
                     // make sure button and key backlights are off too
                     int brightnessMode = (mUseSoftwareAutoBrightness
-                            ? HardwareService.BRIGHTNESS_MODE_SENSOR
-                            : HardwareService.BRIGHTNESS_MODE_USER);
-                    mHardware.setLightBrightness_UNCHECKED(HardwareService.LIGHT_ID_BUTTONS, 0,
+                            ? LightsService.BRIGHTNESS_MODE_SENSOR
+                            : LightsService.BRIGHTNESS_MODE_USER);
+                    mLightsService.setLightBrightness(LightsService.LIGHT_ID_BUTTONS, 0,
                         brightnessMode);
-                    mHardware.setLightBrightness_UNCHECKED(HardwareService.LIGHT_ID_KEYBOARD, 0,
+                    mLightsService.setLightBrightness(LightsService.LIGHT_ID_KEYBOARD, 0,
                         brightnessMode);
                     // clear current value so we will update based on the new conditions
                     // when the sensor is reenabled.
@@ -1720,21 +1720,21 @@
 
     private void setLightBrightness(int mask, int value) {
         int brightnessMode = (mAutoBrightessEnabled
-                            ? HardwareService.BRIGHTNESS_MODE_SENSOR
-                            : HardwareService.BRIGHTNESS_MODE_USER);
+                            ? LightsService.BRIGHTNESS_MODE_SENSOR
+                            : LightsService.BRIGHTNESS_MODE_USER);
         if ((mask & SCREEN_BRIGHT_BIT) != 0) {
-            mHardware.setLightBrightness_UNCHECKED(HardwareService.LIGHT_ID_BACKLIGHT, value,
+            mLightsService.setLightBrightness(LightsService.LIGHT_ID_BACKLIGHT, value,
                 brightnessMode);
         }
         brightnessMode = (mUseSoftwareAutoBrightness
-                            ? HardwareService.BRIGHTNESS_MODE_SENSOR
-                            : HardwareService.BRIGHTNESS_MODE_USER);
+                            ? LightsService.BRIGHTNESS_MODE_SENSOR
+                            : LightsService.BRIGHTNESS_MODE_USER);
         if ((mask & BUTTON_BRIGHT_BIT) != 0) {
-            mHardware.setLightBrightness_UNCHECKED(HardwareService.LIGHT_ID_BUTTONS, value,
+            mLightsService.setLightBrightness(LightsService.LIGHT_ID_BUTTONS, value,
                 brightnessMode);
         }
         if ((mask & KEYBOARD_BRIGHT_BIT) != 0) {
-            mHardware.setLightBrightness_UNCHECKED(HardwareService.LIGHT_ID_KEYBOARD, value,
+            mLightsService.setLightBrightness(LightsService.LIGHT_ID_KEYBOARD, value,
                 brightnessMode);
         }
     }
@@ -2081,9 +2081,9 @@
                         }
                     } else {
                         int brightnessMode = (mAutoBrightessEnabled
-                                            ? HardwareService.BRIGHTNESS_MODE_SENSOR
-                                            : HardwareService.BRIGHTNESS_MODE_USER);
-                        mHardware.setLightBrightness_UNCHECKED(HardwareService.LIGHT_ID_BACKLIGHT,
+                                            ? LightsService.BRIGHTNESS_MODE_SENSOR
+                                            : LightsService.BRIGHTNESS_MODE_USER);
+                        mLightsService.setLightBrightness(LightsService.LIGHT_ID_BACKLIGHT,
                                 lcdValue, brightnessMode);
                     }
                 }
@@ -2096,9 +2096,9 @@
                         }
                     } else {
                         int brightnessMode = (mUseSoftwareAutoBrightness
-                                            ? HardwareService.BRIGHTNESS_MODE_SENSOR
-                                            : HardwareService.BRIGHTNESS_MODE_USER);
-                        mHardware.setLightBrightness_UNCHECKED(HardwareService.LIGHT_ID_BUTTONS,
+                                            ? LightsService.BRIGHTNESS_MODE_SENSOR
+                                            : LightsService.BRIGHTNESS_MODE_USER);
+                        mLightsService.setLightBrightness(LightsService.LIGHT_ID_BUTTONS,
                                 buttonValue, brightnessMode);
                     }
                 }
@@ -2111,9 +2111,9 @@
                         }
                     } else {
                         int brightnessMode = (mUseSoftwareAutoBrightness
-                                            ? HardwareService.BRIGHTNESS_MODE_SENSOR
-                                            : HardwareService.BRIGHTNESS_MODE_USER);
-                        mHardware.setLightBrightness_UNCHECKED(HardwareService.LIGHT_ID_KEYBOARD,
+                                            ? LightsService.BRIGHTNESS_MODE_SENSOR
+                                            : LightsService.BRIGHTNESS_MODE_USER);
+                        mLightsService.setLightBrightness(LightsService.LIGHT_ID_KEYBOARD,
                                 keyboardValue, brightnessMode);
                     }
                 }
@@ -2443,12 +2443,12 @@
         mContext.enforceCallingOrSelfPermission(android.Manifest.permission.DEVICE_POWER, null);
         // Don't let applications turn the screen all the way off
         brightness = Math.max(brightness, Power.BRIGHTNESS_DIM);
-        mHardware.setLightBrightness_UNCHECKED(HardwareService.LIGHT_ID_BACKLIGHT, brightness,
-                HardwareService.BRIGHTNESS_MODE_USER);
-        mHardware.setLightBrightness_UNCHECKED(HardwareService.LIGHT_ID_KEYBOARD,
-            (mKeyboardVisible ? brightness : 0), HardwareService.BRIGHTNESS_MODE_USER);
-        mHardware.setLightBrightness_UNCHECKED(HardwareService.LIGHT_ID_BUTTONS, brightness,
-            HardwareService.BRIGHTNESS_MODE_USER);
+        mLightsService.setLightBrightness(LightsService.LIGHT_ID_BACKLIGHT, brightness,
+                LightsService.BRIGHTNESS_MODE_USER);
+        mLightsService.setLightBrightness(LightsService.LIGHT_ID_KEYBOARD,
+            (mKeyboardVisible ? brightness : 0), LightsService.BRIGHTNESS_MODE_USER);
+        mLightsService.setLightBrightness(LightsService.LIGHT_ID_BUTTONS, brightness,
+            LightsService.BRIGHTNESS_MODE_USER);
         long identity = Binder.clearCallingIdentity();
         try {
             mBatteryStats.noteScreenBrightness(brightness);
diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java
index 3cfd1a9..a0a9a93 100644
--- a/services/java/com/android/server/SystemServer.java
+++ b/services/java/com/android/server/SystemServer.java
@@ -84,7 +84,7 @@
         int factoryTest = "".equals(factoryTestStr) ? SystemServer.FACTORY_TEST_OFF
                 : Integer.parseInt(factoryTestStr);
 
-        HardwareService hardware = null;
+        LightsService lights = null;
         PowerManagerService power = null;
         BatteryService battery = null;
         ConnectivityService connectivity = null;
@@ -141,13 +141,15 @@
             battery = new BatteryService(context);
             ServiceManager.addService("battery", battery);
 
-            Log.i(TAG, "Hardware Service");
-            hardware = new HardwareService(context);
-            ServiceManager.addService("hardware", hardware);
+            Log.i(TAG, "Lights Service");
+            lights = new LightsService(context);
+
+            Log.i(TAG, "Vibrator Service");
+            ServiceManager.addService("vibrator", new VibratorService(context));
 
             // only initialize the power service after we have started the
-            // hardware service, content providers and the battery service.
-            power.init(context, hardware, ActivityManagerService.getDefault(), battery);
+            // lights service, content providers and the battery service.
+            power.init(context, lights, ActivityManagerService.getDefault(), battery);
 
             Log.i(TAG, "Alarm Manager");
             AlarmManagerService alarm = new AlarmManagerService(context);
@@ -253,7 +255,7 @@
 
             try {
                 Log.i(TAG, "Notification Manager");
-                notification = new NotificationManagerService(context, statusBar, hardware);
+                notification = new NotificationManagerService(context, statusBar, lights);
                 ServiceManager.addService(Context.NOTIFICATION_SERVICE, notification);
             } catch (Throwable e) {
                 Log.e(TAG, "Failure starting Notification Manager", e);
diff --git a/services/java/com/android/server/HardwareService.java b/services/java/com/android/server/VibratorService.java
similarity index 70%
rename from services/java/com/android/server/HardwareService.java
rename to services/java/com/android/server/VibratorService.java
index 88074c2..5282ba2 100755
--- a/services/java/com/android/server/HardwareService.java
+++ b/services/java/com/android/server/VibratorService.java
@@ -16,19 +16,13 @@
 
 package com.android.server;
 
-import com.android.internal.app.IBatteryStats;
-import com.android.server.am.BatteryStatsService;
-
 import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
 import android.content.IntentFilter;
 import android.content.pm.PackageManager;
 import android.os.Handler;
-import android.os.Hardware;
-import android.os.IHardwareService;
-import android.os.Message;
-import android.os.Power;
+import android.os.IVibratorService;
 import android.os.PowerManager;
 import android.os.Process;
 import android.os.RemoteException;
@@ -40,36 +34,12 @@
 import java.util.LinkedList;
 import java.util.ListIterator;
 
-public class HardwareService extends IHardwareService.Stub {
-    private static final String TAG = "HardwareService";
-
-    static final int LIGHT_ID_BACKLIGHT = 0;
-    static final int LIGHT_ID_KEYBOARD = 1;
-    static final int LIGHT_ID_BUTTONS = 2;
-    static final int LIGHT_ID_BATTERY = 3;
-    static final int LIGHT_ID_NOTIFICATIONS = 4;
-    static final int LIGHT_ID_ATTENTION = 5;
-
-    static final int LIGHT_FLASH_NONE = 0;
-    static final int LIGHT_FLASH_TIMED = 1;
-    static final int LIGHT_FLASH_HARDWARE = 2;
-
-    /**
-     * Light brightness is managed by a user setting.
-     */
-    static final int BRIGHTNESS_MODE_USER = 0;
-
-    /**
-     * Light brightness is managed by a light sensor.
-     */
-    static final int BRIGHTNESS_MODE_SENSOR = 1;
+public class VibratorService extends IVibratorService.Stub {
+    private static final String TAG = "VibratorService";
 
     private final LinkedList<Vibration> mVibrations;
     private Vibration mCurrentVibration;
 
-    private boolean mAttentionLightOn;
-    private boolean mPulsing;
-
     private class Vibration implements IBinder.DeathRecipient {
         private final IBinder mToken;
         private final long    mTimeout;
@@ -120,13 +90,11 @@
         }
     }
 
-    HardwareService(Context context) {
+    VibratorService(Context context) {
         // Reset the hardware to a default state, in case this is a runtime
         // restart instead of a fresh boot.
         vibratorOff();
 
-        mNativePointer = init_native();
-
         mContext = context;
         PowerManager pm = (PowerManager)context.getSystemService(
                 Context.POWER_SERVICE);
@@ -135,18 +103,11 @@
 
         mVibrations = new LinkedList<Vibration>();
 
-        mBatteryStats = BatteryStatsService.getService();
-
         IntentFilter filter = new IntentFilter();
         filter.addAction(Intent.ACTION_SCREEN_OFF);
         context.registerReceiver(mIntentReceiver, filter);
     }
 
-    protected void finalize() throws Throwable {
-        finalize_native(mNativePointer);
-        super.finalize();
-    }
-
     public void vibrate(long milliseconds, IBinder token) {
         if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.VIBRATE)
                 != PackageManager.PERMISSION_GRANTED) {
@@ -251,92 +212,6 @@
         }
     }
 
-    public boolean getFlashlightEnabled() {
-        return Hardware.getFlashlightEnabled();
-    }
-
-    public void setFlashlightEnabled(boolean on) {
-        if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.FLASHLIGHT)
-                != PackageManager.PERMISSION_GRANTED &&
-                mContext.checkCallingOrSelfPermission(android.Manifest.permission.HARDWARE_TEST)
-                != PackageManager.PERMISSION_GRANTED) {
-            throw new SecurityException("Requires FLASHLIGHT or HARDWARE_TEST permission");
-        }
-        Hardware.setFlashlightEnabled(on);
-    }
-
-    public void enableCameraFlash(int milliseconds) {
-        if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.CAMERA)
-                != PackageManager.PERMISSION_GRANTED &&
-                mContext.checkCallingOrSelfPermission(android.Manifest.permission.HARDWARE_TEST)
-                != PackageManager.PERMISSION_GRANTED) {
-            throw new SecurityException("Requires CAMERA or HARDWARE_TEST permission");
-        }
-        Hardware.enableCameraFlash(milliseconds);
-    }
-
-    void setLightOff_UNCHECKED(int light) {
-        setLight_native(mNativePointer, light, 0, LIGHT_FLASH_NONE, 0, 0, 0);
-    }
-
-    void setLightBrightness_UNCHECKED(int light, int brightness, int brightnessMode) {
-        int b = brightness & 0x000000ff;
-        b = 0xff000000 | (b << 16) | (b << 8) | b;
-        setLight_native(mNativePointer, light, b, LIGHT_FLASH_NONE, 0, 0, brightnessMode);
-    }
-
-    void setLightColor_UNCHECKED(int light, int color) {
-        setLight_native(mNativePointer, light, color, LIGHT_FLASH_NONE, 0, 0, 0);
-    }
-
-    void setLightFlashing_UNCHECKED(int light, int color, int mode, int onMS, int offMS) {
-        setLight_native(mNativePointer, light, color, mode, onMS, offMS, 0);
-    }
-
-    public void setAttentionLight(boolean on, int color) {
-        // Not worthy of a permission.  We shouldn't have a flashlight permission.
-        synchronized (this) {
-            mAttentionLightOn = on;
-            mPulsing = false;
-            setLight_native(mNativePointer, LIGHT_ID_ATTENTION, color,
-                    LIGHT_FLASH_HARDWARE, on ? 3 : 0, 0, 0);
-        }
-    }
-
-    public void pulseBreathingLight() {
-        synchronized (this) {
-            // HACK: Added at the last minute of cupcake -- design this better;
-            // Don't reuse the attention light -- make another one.
-            if (false) {
-                Log.d(TAG, "pulseBreathingLight mAttentionLightOn=" + mAttentionLightOn
-                        + " mPulsing=" + mPulsing);
-            }
-            if (!mAttentionLightOn && !mPulsing) {
-                mPulsing = true;
-                setLight_native(mNativePointer, LIGHT_ID_ATTENTION, 0x00ffffff,
-                        LIGHT_FLASH_HARDWARE, 7, 0, 0);
-                mH.sendMessageDelayed(Message.obtain(mH, 1), 3000);
-            }
-        }
-    }
-
-    private Handler mH = new Handler() {
-        @Override
-        public void handleMessage(Message msg) {
-            synchronized (this) {
-                if (false) {
-                    Log.d(TAG, "pulse cleanup handler firing mPulsing=" + mPulsing);
-                }
-                if (mPulsing) {
-                    mPulsing = false;
-                    setLight_native(mNativePointer, LIGHT_ID_ATTENTION,
-                            mAttentionLightOn ? 0xffffffff : 0,
-                            LIGHT_FLASH_NONE, 0, 0, 0);
-                }
-            }
-        }
-    };
-
     private final Runnable mVibrationRunnable = new Runnable() {
         public void run() {
             synchronized (mVibrations) {
@@ -452,7 +327,7 @@
                         // duration is saved for delay() at top of loop
                         duration = pattern[index++];
                         if (duration > 0) {
-                            HardwareService.this.vibratorOn(duration);
+                            VibratorService.this.vibratorOn(duration);
                         }
                     } else {
                         if (repeat < 0) {
@@ -490,21 +365,13 @@
         }
     };
 
-    private static native int init_native();
-    private static native void finalize_native(int ptr);
-
-    private static native void setLight_native(int ptr, int light, int color, int mode,
-            int onMS, int offMS, int brightnessMode);
+    private Handler mH = new Handler();
 
     private final Context mContext;
     private final PowerManager.WakeLock mWakeLock;
 
-    private final IBatteryStats mBatteryStats;
-
     volatile VibrateThread mThread;
 
-    private int mNativePointer;
-
     native static void vibratorOn(long milliseconds);
     native static void vibratorOff();
 }
diff --git a/services/jni/Android.mk b/services/jni/Android.mk
index 2f48edf..9d2760e 100644
--- a/services/jni/Android.mk
+++ b/services/jni/Android.mk
@@ -4,10 +4,11 @@
 LOCAL_SRC_FILES:= \
     com_android_server_AlarmManagerService.cpp \
     com_android_server_BatteryService.cpp \
-    com_android_server_HardwareService.cpp \
     com_android_server_KeyInputQueue.cpp \
+    com_android_server_LightsService.cpp \
     com_android_server_SensorService.cpp \
     com_android_server_SystemServer.cpp \
+    com_android_server_VibratorService.cpp \
     onload.cpp
 
 LOCAL_C_INCLUDES += \
diff --git a/services/jni/com_android_server_HardwareService.cpp b/services/jni/com_android_server_LightsService.cpp
similarity index 69%
rename from services/jni/com_android_server_HardwareService.cpp
rename to services/jni/com_android_server_LightsService.cpp
index 253e655..1df9c81 100644
--- a/services/jni/com_android_server_HardwareService.cpp
+++ b/services/jni/com_android_server_LightsService.cpp
@@ -1,21 +1,20 @@
-/* //device/libs/android_runtime/android_os_Vibrator.cpp
-**
-** Copyright 2006, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License"); 
-** you may not use this file except in compliance with the License. 
-** You may obtain a copy of the License at 
-**
-**     http://www.apache.org/licenses/LICENSE-2.0 
-**
-** Unless required by applicable law or agreed to in writing, software 
-** distributed under the License is distributed on an "AS IS" BASIS, 
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
-** See the License for the specific language governing permissions and 
-** limitations under the License.
-*/
+/*
+ * Copyright (C) 2009 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
 
-#define LOG_TAG "HardwareService"
+#define LOG_TAG "LightsService"
 
 #include "jni.h"
 #include "JNIHelp.h"
@@ -23,18 +22,16 @@
 
 #include <utils/misc.h>
 #include <utils/Log.h>
-#include <hardware_legacy/vibrator.h>
 #include <hardware/hardware.h>
 #include <hardware/lights.h>
 
 #include <stdio.h>
-//#include <string.h>
 
 namespace android
 {
 
 // These values must correspond with the LIGHT_ID constants in
-// HardwareService.java
+// LightsService.java
 enum {
     LIGHT_INDEX_BACKLIGHT = 0,
     LIGHT_INDEX_KEYBOARD = 1,
@@ -120,29 +117,15 @@
     devices->lights[light]->set_light(devices->lights[light], &state);
 }
 
-static void vibratorOn(JNIEnv *env, jobject clazz, jlong timeout_ms)
-{
-    // LOGI("vibratorOn\n");
-    vibrator_on(timeout_ms);
-}
-
-static void vibratorOff(JNIEnv *env, jobject clazz)
-{
-    // LOGI("vibratorOff\n");
-    vibrator_off();
-}
-
 static JNINativeMethod method_table[] = {
     { "init_native", "()I", (void*)init_native },
     { "finalize_native", "(I)V", (void*)finalize_native },
     { "setLight_native", "(IIIIIII)V", (void*)setLight_native },
-    { "vibratorOn", "(J)V", (void*)vibratorOn },
-    { "vibratorOff", "()V", (void*)vibratorOff }
 };
 
-int register_android_server_HardwareService(JNIEnv *env)
+int register_android_server_LightsService(JNIEnv *env)
 {
-    return jniRegisterNativeMethods(env, "com/android/server/HardwareService",
+    return jniRegisterNativeMethods(env, "com/android/server/LightsService",
             method_table, NELEM(method_table));
 }
 
diff --git a/services/jni/com_android_server_VibratorService.cpp b/services/jni/com_android_server_VibratorService.cpp
new file mode 100644
index 0000000..6ec5c07
--- /dev/null
+++ b/services/jni/com_android_server_VibratorService.cpp
@@ -0,0 +1,55 @@
+/*
+ * Copyright (C) 2009 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "VibratorService"
+
+#include "jni.h"
+#include "JNIHelp.h"
+#include "android_runtime/AndroidRuntime.h"
+
+#include <utils/misc.h>
+#include <utils/Log.h>
+#include <hardware_legacy/vibrator.h>
+
+#include <stdio.h>
+
+namespace android
+{
+
+static void vibratorOn(JNIEnv *env, jobject clazz, jlong timeout_ms)
+{
+    // LOGI("vibratorOn\n");
+    vibrator_on(timeout_ms);
+}
+
+static void vibratorOff(JNIEnv *env, jobject clazz)
+{
+    // LOGI("vibratorOff\n");
+    vibrator_off();
+}
+
+static JNINativeMethod method_table[] = {
+    { "vibratorOn", "(J)V", (void*)vibratorOn },
+    { "vibratorOff", "()V", (void*)vibratorOff }
+};
+
+int register_android_server_VibratorService(JNIEnv *env)
+{
+    return jniRegisterNativeMethods(env, "com/android/server/VibratorService",
+            method_table, NELEM(method_table));
+}
+
+};
diff --git a/services/jni/onload.cpp b/services/jni/onload.cpp
index 26200d3..c16fdb8 100644
--- a/services/jni/onload.cpp
+++ b/services/jni/onload.cpp
@@ -7,8 +7,9 @@
 int register_android_server_AlarmManagerService(JNIEnv* env);
 int register_android_server_BatteryService(JNIEnv* env);
 int register_android_server_KeyInputQueue(JNIEnv* env);
-int register_android_server_HardwareService(JNIEnv* env);
+int register_android_server_LightsService(JNIEnv* env);
 int register_android_server_SensorService(JNIEnv* env);
+int register_android_server_VibratorService(JNIEnv* env);
 int register_android_server_SystemServer(JNIEnv* env);
 };
 
@@ -26,10 +27,11 @@
     LOG_ASSERT(env, "Could not retrieve the env!");
 
     register_android_server_KeyInputQueue(env);
-    register_android_server_HardwareService(env);
+    register_android_server_LightsService(env);
     register_android_server_AlarmManagerService(env);
     register_android_server_BatteryService(env);
     register_android_server_SensorService(env);
+    register_android_server_VibratorService(env);
     register_android_server_SystemServer(env);
 
     return JNI_VERSION_1_4;
diff --git a/tests/permission/src/com/android/framework/permission/tests/HardwareServicePermissionTest.java b/tests/permission/src/com/android/framework/permission/tests/HardwareServicePermissionTest.java
deleted file mode 100644
index 2290c1d..0000000
--- a/tests/permission/src/com/android/framework/permission/tests/HardwareServicePermissionTest.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- * Copyright (C) 2009 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.framework.permission.tests;
-
-import junit.framework.TestCase;
-
-import android.os.Binder;
-import android.os.IHardwareService;
-import android.os.RemoteException;
-import android.os.ServiceManager;
-import android.test.suitebuilder.annotation.SmallTest;
-
-/**
- * Verify that Hardware apis cannot be called without required permissions.
- */
-@SmallTest
-public class HardwareServicePermissionTest extends TestCase {
-
-    private IHardwareService mHardwareService;
-
-    @Override
-    protected void setUp() throws Exception {
-        mHardwareService = IHardwareService.Stub.asInterface(
-                ServiceManager.getService("hardware"));
-    }
-
-    /**
-     * Test that calling {@link android.os.IHardwareService#vibrate(long)} requires permissions.
-     * <p>Tests permission:
-     *   {@link android.Manifest.permission#VIBRATE}
-     * @throws RemoteException
-     */
-    public void testVibrate() throws RemoteException {
-        try {
-            mHardwareService.vibrate(2000, new Binder());
-            fail("vibrate did not throw SecurityException as expected");
-        } catch (SecurityException e) {
-            // expected
-        }
-    }
-
-    /**
-     * Test that calling {@link android.os.IHardwareService#vibratePattern(long[],
-     * int, android.os.IBinder)} requires permissions.
-     * <p>Tests permission:
-     *   {@link android.Manifest.permission#VIBRATE}
-     * @throws RemoteException
-     */
-    public void testVibratePattern() throws RemoteException {
-        try {
-            mHardwareService.vibratePattern(new long[] {0}, 0, new Binder());
-            fail("vibratePattern did not throw SecurityException as expected");
-        } catch (SecurityException e) {
-            // expected
-        }
-    }
-
-    /**
-     * Test that calling {@link android.os.IHardwareService#cancelVibrate()} requires permissions.
-     * <p>Tests permission:
-     *   {@link android.Manifest.permission#VIBRATE}
-     * @throws RemoteException
-     */
-    public void testCancelVibrate() throws RemoteException {
-        try {
-            mHardwareService.cancelVibrate(new Binder());
-            fail("cancelVibrate did not throw SecurityException as expected");
-        } catch (SecurityException e) {
-            // expected
-        }
-    }
-
-    /**
-     * Test that calling {@link android.os.IHardwareService#setFlashlightEnabled(boolean)}
-     * requires permissions.
-     * <p>Tests permissions:
-     *   {@link android.Manifest.permission#HARDWARE_TEST}
-     *   {@link android.Manifest.permission#FLASHLIGHT}
-     * @throws RemoteException
-     */
-    public void testSetFlashlightEnabled() throws RemoteException {
-        try {
-            mHardwareService.setFlashlightEnabled(true);
-            fail("setFlashlightEnabled did not throw SecurityException as expected");
-        } catch (SecurityException e) {
-            // expected
-        }
-    }
-
-    /**
-     * Test that calling {@link android.os.IHardwareService#enableCameraFlash(int)} requires
-     * permissions.
-     * <p>Tests permission:
-     *   {@link android.Manifest.permission#HARDWARE_TEST}
-     *   {@link android.Manifest.permission#CAMERA}
-     * @throws RemoteException
-     */
-    public void testEnableCameraFlash() throws RemoteException {
-        try {
-            mHardwareService.enableCameraFlash(100);
-            fail("enableCameraFlash did not throw SecurityException as expected");
-        } catch (SecurityException e) {
-            // expected
-        }
-    }
-}
diff --git a/tests/permission/src/com/android/framework/permission/tests/VibratorServicePermissionTest.java b/tests/permission/src/com/android/framework/permission/tests/VibratorServicePermissionTest.java
new file mode 100644
index 0000000..274ac00
--- /dev/null
+++ b/tests/permission/src/com/android/framework/permission/tests/VibratorServicePermissionTest.java
@@ -0,0 +1,86 @@
+/*
+ * Copyright (C) 2009 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.framework.permission.tests;
+
+import junit.framework.TestCase;
+
+import android.os.Binder;
+import android.os.IVibratorService;
+import android.os.RemoteException;
+import android.os.ServiceManager;
+import android.test.suitebuilder.annotation.SmallTest;
+
+/**
+ * Verify that Hardware apis cannot be called without required permissions.
+ */
+@SmallTest
+public class VibratorServicePermissionTest extends TestCase {
+
+    private IVibratorService mVibratorService;
+
+    @Override
+    protected void setUp() throws Exception {
+        mVibratorService = IVibratorService.Stub.asInterface(
+                ServiceManager.getService("vibrator"));
+    }
+
+    /**
+     * Test that calling {@link android.os.IVibratorService#vibrate(long)} requires permissions.
+     * <p>Tests permission:
+     *   {@link android.Manifest.permission#VIBRATE}
+     * @throws RemoteException
+     */
+    public void testVibrate() throws RemoteException {
+        try {
+            mVibratorService.vibrate(2000, new Binder());
+            fail("vibrate did not throw SecurityException as expected");
+        } catch (SecurityException e) {
+            // expected
+        }
+    }
+
+    /**
+     * Test that calling {@link android.os.IVibratorService#vibratePattern(long[],
+     * int, android.os.IBinder)} requires permissions.
+     * <p>Tests permission:
+     *   {@link android.Manifest.permission#VIBRATE}
+     * @throws RemoteException
+     */
+    public void testVibratePattern() throws RemoteException {
+        try {
+            mVibratorService.vibratePattern(new long[] {0}, 0, new Binder());
+            fail("vibratePattern did not throw SecurityException as expected");
+        } catch (SecurityException e) {
+            // expected
+        }
+    }
+
+    /**
+     * Test that calling {@link android.os.IVibratorService#cancelVibrate()} requires permissions.
+     * <p>Tests permission:
+     *   {@link android.Manifest.permission#VIBRATE}
+     * @throws RemoteException
+     */
+    public void testCancelVibrate() throws RemoteException {
+        try {
+            mVibratorService.cancelVibrate(new Binder());
+            fail("cancelVibrate did not throw SecurityException as expected");
+        } catch (SecurityException e) {
+            // expected
+        }
+    }
+}