Move backlight brightness from HardwareService to PowerManager

to prevent apps from changing the hardware behind its back.
Fixes b/2041941 Lock screen flashes the screen very bright before dimming

Change-Id: Ice757f7ae87902bdfb3634471cf44f020ebfaae4
Signed-off-by: Mike Lockwood <lockwood@android.com>
diff --git a/core/java/android/os/IHardwareService.aidl b/core/java/android/os/IHardwareService.aidl
index a6ef647..594c0e8 100755
--- a/core/java/android/os/IHardwareService.aidl
+++ b/core/java/android/os/IHardwareService.aidl
@@ -28,12 +28,6 @@
     boolean getFlashlightEnabled();
     void setFlashlightEnabled(boolean on);
     void enableCameraFlash(int milliseconds);
-    
-    // sets the brightness of the backlights (screen, keyboard, button) 0-255
-    void setBacklights(int brightness);
-
-    // enables or disables automatic brightness mode
-    void setAutoBrightness(boolean on);
 
     // for the phone
     void setAttentionLight(boolean on);
diff --git a/core/java/android/os/IPowerManager.aidl b/core/java/android/os/IPowerManager.aidl
index 188e7ff..189335e 100644
--- a/core/java/android/os/IPowerManager.aidl
+++ b/core/java/android/os/IPowerManager.aidl
@@ -31,4 +31,10 @@
     long getScreenOnTime();
     void preventScreenOn(boolean prevent);
     void setScreenBrightnessOverride(int brightness);
+
+    // sets the brightness of the backlights (screen, keyboard, button) 0-255
+    void setBacklightBrightness(int brightness);
+
+    // enables or disables automatic brightness mode
+    void setAutoBrightness(boolean on);
 }
diff --git a/core/java/android/os/PowerManager.java b/core/java/android/os/PowerManager.java
index d5934102..11c96d2 100644
--- a/core/java/android/os/PowerManager.java
+++ b/core/java/android/os/PowerManager.java
@@ -379,6 +379,21 @@
         }
     }
 
+    /**
+     * sets the brightness of the backlights (screen, keyboard, button).
+     *
+     * @param brightness value from 0 to 255
+     *
+     * {@hide}
+     */
+    public void setBacklightBrightness(int brightness)
+    {
+        try {
+            mService.setBacklightBrightness(brightness);
+        } catch (RemoteException e) {
+        }
+    }
+
    /**
      * Returns the set of flags for {@link #newWakeLock(int, String) newWakeLock()}
      * that are supported on the device.
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsHelper.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsHelper.java
index b13883e..39084a7 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsHelper.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsHelper.java
@@ -27,7 +27,7 @@
 import android.content.res.Configuration;
 import android.location.LocationManager;
 import android.media.AudioManager;
-import android.os.IHardwareService;
+import android.os.IPowerManager;
 import android.os.RemoteException;
 import android.os.ServiceManager;
 import android.provider.Settings;
@@ -94,10 +94,10 @@
 
     private void setBrightness(int brightness) {
         try {
-            IHardwareService hardware = IHardwareService.Stub
-                    .asInterface(ServiceManager.getService("hardware"));
-            if (hardware != null) {
-                hardware.setBacklights(brightness);
+            IPowerManager power = IPowerManager.Stub.asInterface(
+                    ServiceManager.getService("power"));
+            if (power != null) {
+                power.setBacklightBrightness(brightness);
             }
         } catch (RemoteException doe) {
 
diff --git a/services/java/com/android/server/HardwareService.java b/services/java/com/android/server/HardwareService.java
index 01daae3..29c13e0 100755
--- a/services/java/com/android/server/HardwareService.java
+++ b/services/java/com/android/server/HardwareService.java
@@ -269,26 +269,6 @@
         Hardware.enableCameraFlash(milliseconds);
     }
 
-    public void setBacklights(int brightness) {
-        if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.HARDWARE_TEST) 
-                != PackageManager.PERMISSION_GRANTED) {
-            throw new SecurityException("Requires HARDWARE_TEST permission");
-        }
-        // Don't let applications turn the screen all the way off
-        brightness = Math.max(brightness, Power.BRIGHTNESS_DIM);
-        setLightBrightness_UNCHECKED(LIGHT_ID_BACKLIGHT, brightness);
-        setLightBrightness_UNCHECKED(LIGHT_ID_KEYBOARD, brightness);
-        setLightBrightness_UNCHECKED(LIGHT_ID_BUTTONS, brightness);
-        long identity = Binder.clearCallingIdentity();
-        try {
-            mBatteryStats.noteScreenBrightness(brightness);
-        } catch (RemoteException e) {
-            Log.w(TAG, "RemoteException calling noteScreenBrightness on BatteryStatsService", e);
-        } finally {
-            Binder.restoreCallingIdentity(identity);
-        }
-    }
-
     void setLightOff_UNCHECKED(int light) {
         setLight_native(mNativePointer, light, 0, LIGHT_FLASH_NONE, 0, 0);
     }
@@ -307,14 +287,6 @@
         setLight_native(mNativePointer, light, color, mode, onMS, offMS);
     }
 
-    public void setAutoBrightness(boolean on) {
-        if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.HARDWARE_TEST)
-                != PackageManager.PERMISSION_GRANTED) {
-            throw new SecurityException("Requires HARDWARE_TEST permission");
-        }
-        setAutoBrightness_UNCHECKED(on);
-    }
-
     void setAutoBrightness_UNCHECKED(boolean on) {
         if (mAutoBrightnessAvailable) {
             setAutoBrightness_native(mNativePointer, on);
diff --git a/services/java/com/android/server/PowerManagerService.java b/services/java/com/android/server/PowerManagerService.java
index 2951384..35f508b8 100644
--- a/services/java/com/android/server/PowerManagerService.java
+++ b/services/java/com/android/server/PowerManagerService.java
@@ -2061,6 +2061,42 @@
         return result;
     }
 
+    public void setBacklightBrightness(int brightness) {
+        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);
+        mHardware.setLightBrightness_UNCHECKED(HardwareService.LIGHT_ID_KEYBOARD, brightness);
+        mHardware.setLightBrightness_UNCHECKED(HardwareService.LIGHT_ID_BUTTONS, brightness);
+        long identity = Binder.clearCallingIdentity();
+        try {
+            mBatteryStats.noteScreenBrightness(brightness);
+        } catch (RemoteException e) {
+            Log.w(TAG, "RemoteException calling noteScreenBrightness on BatteryStatsService", e);
+        } finally {
+            Binder.restoreCallingIdentity(identity);
+        }
+
+        // update our animation state
+        if (ANIMATE_SCREEN_LIGHTS) {
+            mScreenBrightness.curValue = brightness;
+            mScreenBrightness.animating = false;
+        }
+        if (ANIMATE_KEYBOARD_LIGHTS) {
+            mKeyboardBrightness.curValue = brightness;
+            mKeyboardBrightness.animating = false;
+        }
+        if (ANIMATE_BUTTON_LIGHTS) {
+            mButtonBrightness.curValue = brightness;
+            mButtonBrightness.animating = false;
+        }
+    }
+
+    public void setAutoBrightness(boolean on) {
+        mContext.enforceCallingOrSelfPermission(android.Manifest.permission.DEVICE_POWER, null);
+        mHardware.setAutoBrightness_UNCHECKED(on);
+    }
+
     private SensorManager getSensorManager() {
         if (mSensorManager == null) {
             mSensorManager = new SensorManager(mHandlerThread.getLooper());
diff --git a/tests/AndroidTests/src/com/android/unit_tests/os/PowerManagerTest.java b/tests/AndroidTests/src/com/android/unit_tests/os/PowerManagerTest.java
index bd5c955..2f1a738 100644
--- a/tests/AndroidTests/src/com/android/unit_tests/os/PowerManagerTest.java
+++ b/tests/AndroidTests/src/com/android/unit_tests/os/PowerManagerTest.java
@@ -63,6 +63,8 @@
         wl = mPm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "PARTIAL_WAKE_LOCK");
         doTestWakeLock(wl);
         
+        doTestSetBacklightBrightness();
+
         // TODO: Some sort of functional test (maybe not in the unit test here?) 
         // that confirms that things are really happening e.g. screen power, keyboard power.
 }
@@ -121,5 +123,20 @@
         // TODO: Threaded test (needs handler) to make sure timed wakelocks work too
     }
     
-    
+ 
+    /**
+     * Test that calling {@link android.os.IHardwareService#setBacklights(int)} requires
+     * permissions.
+     * <p>Tests permission:
+     *   {@link android.Manifest.permission#DEVICE_POWER}
+     */
+    private void doTestSetBacklightBrightness() {
+        try {
+            mPm.setBacklightBrightness(0);
+            fail("setBacklights did not throw SecurityException as expected");
+        } catch (SecurityException e) {
+            // expected
+        }
+    }
+
 }
diff --git a/tests/FrameworkTest/src/com/android/frameworktest/settings/BrightnessLimit.java b/tests/FrameworkTest/src/com/android/frameworktest/settings/BrightnessLimit.java
index 5644044..6d5996c 100644
--- a/tests/FrameworkTest/src/com/android/frameworktest/settings/BrightnessLimit.java
+++ b/tests/FrameworkTest/src/com/android/frameworktest/settings/BrightnessLimit.java
@@ -16,7 +16,7 @@
 
 package com.android.frameworktest.settings;
 
-import android.os.IHardwareService;
+import android.os.IPowerManager;
 
 import android.app.Activity;
 import android.os.Bundle;
@@ -45,11 +45,11 @@
     }
 
     public void onClick(View v) {
-        IHardwareService hardware = IHardwareService.Stub.asInterface(
-                ServiceManager.getService("hardware"));
-        if (hardware != null) {
+        IPowerManager power = IPowerManager.Stub.asInterface(
+                ServiceManager.getService("power"));
+        if (power != null) {
             try {
-                hardware.setBacklights(0);
+                power.setBacklightBrightness(0);
             } catch (RemoteException darn) {
                 
             }
diff --git a/tests/permission/src/com/android/framework/permission/tests/HardwareServicePermissionTest.java b/tests/permission/src/com/android/framework/permission/tests/HardwareServicePermissionTest.java
index aebd68c..2290c1d 100644
--- a/tests/permission/src/com/android/framework/permission/tests/HardwareServicePermissionTest.java
+++ b/tests/permission/src/com/android/framework/permission/tests/HardwareServicePermissionTest.java
@@ -117,20 +117,4 @@
             // expected
         }
     }
-
-    /**
-     * Test that calling {@link android.os.IHardwareService#setBacklights(int)} requires
-     * permissions.
-     * <p>Tests permission:
-     *   {@link android.Manifest.permission#HARDWARE_TEST}
-     * @throws RemoteException
-     */
-    public void testSetBacklights() throws RemoteException {
-        try {
-            mHardwareService.setBacklights(0);
-            fail("setBacklights did not throw SecurityException as expected");
-        } catch (SecurityException e) {
-            // expected
-        }
-    }
 }