Merge "Plumb display brightness from Android to VHAL" into pi-dev
am: 0ff20fa66b

Change-Id: I7c21b8f6b32001ff3b0a7984dfea40355b94fff3
diff --git a/service/src/com/android/car/CarPowerManagementService.java b/service/src/com/android/car/CarPowerManagementService.java
index 3aa473c..57ccf62 100644
--- a/service/src/com/android/car/CarPowerManagementService.java
+++ b/service/src/com/android/car/CarPowerManagementService.java
@@ -604,7 +604,7 @@
     }
 
     private void doHandleMainDisplayStateChange(boolean on) {
-        //TODO bug: 32065231
+        Log.w(CarLog.TAG_POWER, "Unimplemented:  doHandleMainDisplayStateChange() - on = " + on);
     }
 
     public void handleMainDisplayChanged(boolean on) {
@@ -615,6 +615,14 @@
         handler.handleMainDisplayStateChange(on);
     }
 
+    /**
+     * Send display brightness to VHAL.
+     * @param brightness value 0-100%
+     */
+    public void sendDisplayBrightness(int brightness) {
+        mHal.sendDisplayBrightness(brightness);
+    }
+
     public synchronized Handler getHandler() {
         return mHandler;
     }
diff --git a/service/src/com/android/car/hal/PowerHalService.java b/service/src/com/android/car/hal/PowerHalService.java
index 00c8e69..f43e853 100644
--- a/service/src/com/android/car/hal/PowerHalService.java
+++ b/service/src/com/android/car/hal/PowerHalService.java
@@ -204,6 +204,24 @@
         setPowerState(VehicleApPowerSetState.SHUTDOWN_START, wakeupTimeSec);
     }
 
+    /**
+     * Sets the display brightness for the vehicle.
+     * @param brightness value from 0 to 100.
+     */
+    public void sendDisplayBrightness(int brightness) {
+        if (brightness < 0) {
+            brightness = 0;
+        } else if (brightness > 100) {
+            brightness = 100;
+        }
+        try {
+            mHal.set(VehicleProperty.DISPLAY_BRIGHTNESS, 0).to(brightness);
+            Log.i(CarLog.TAG_POWER, "send display brightness = " + brightness);
+        } catch (PropertyTimeoutException e) {
+            Log.e(CarLog.TAG_POWER, "cannot set DISPLAY_BRIGHTNESS", e);
+        }
+    }
+
     public void sendDisplayOn() {
         Log.i(CarLog.TAG_POWER, "send display on");
         setPowerState(VehicleApPowerSetState.DISPLAY_ON, 0);
@@ -217,7 +235,7 @@
     private void setPowerState(int state, int additionalParam) {
         int[] values = { state, additionalParam };
         try {
-            mHal.set(VehicleProperty.AP_POWER_STATE).to(values);
+            mHal.set(VehicleProperty.AP_POWER_STATE, 0).to(values);
             Log.i(CarLog.TAG_POWER, "setPowerState=" + state + " param=" + additionalParam);
         } catch (PropertyTimeoutException e) {
             Log.e(CarLog.TAG_POWER, "cannot set to AP_POWER_STATE", e);
diff --git a/service/src/com/android/car/systeminterface/DisplayInterface.java b/service/src/com/android/car/systeminterface/DisplayInterface.java
index 8ef4aec..015f54d 100644
--- a/service/src/com/android/car/systeminterface/DisplayInterface.java
+++ b/service/src/com/android/car/systeminterface/DisplayInterface.java
@@ -16,12 +16,17 @@
 
 package com.android.car.systeminterface;
 
+import android.content.ContentResolver;
 import android.content.Context;
+import android.database.ContentObserver;
 import android.hardware.display.DisplayManager;
 import android.hardware.display.DisplayManager.DisplayListener;
+import android.os.Handler;
+import android.os.Looper;
 import android.os.PowerManager;
 import android.os.SystemClock;
-import android.provider.Settings;
+import android.provider.Settings.SettingNotFoundException;
+import android.provider.Settings.System;
 import android.util.Log;
 import android.view.Display;
 
@@ -41,6 +46,7 @@
     void stopDisplayStateMonitoring();
 
     class DefaultImpl implements DisplayInterface {
+        private final ContentResolver mContentResolver;
         private final Context mContext;
         private final DisplayManager mDisplayManager;
         private final int mMaximumBacklight;
@@ -49,6 +55,28 @@
         private final WakeLockInterface mWakeLockInterface;
         private CarPowerManagementService mService;
         private boolean mDisplayStateSet;
+
+        private ContentObserver mBrightnessObserver =
+                new ContentObserver(new Handler(Looper.getMainLooper())) {
+                    @Override
+                    public void onChange(boolean selfChange) {
+                        int brightness = mMinimumBacklight;
+                        int range = mMaximumBacklight - mMinimumBacklight;
+
+                        try {
+                            brightness = System.getInt(mContentResolver, System.SCREEN_BRIGHTNESS);
+                        } catch (SettingNotFoundException e) {
+                            Log.e(CarLog.TAG_POWER, "Could not get SCREEN_BRIGHTNESS:  " + e);
+                        }
+                        // Convert brightness from 0-255 to 0-100%
+                        brightness -= mMinimumBacklight;
+                        brightness *= 100;
+                        brightness += (range + 1) / 2;
+                        brightness /= range;
+                        mService.sendDisplayBrightness(brightness);
+                    }
+                };
+
         private final DisplayManager.DisplayListener mDisplayListener = new DisplayListener() {
             @Override
             public void onDisplayAdded(int displayId) {
@@ -70,11 +98,12 @@
 
         DefaultImpl(Context context, WakeLockInterface wakeLockInterface) {
             mContext = context;
-            mWakeLockInterface = wakeLockInterface;
+            mContentResolver = mContext.getContentResolver();
             mDisplayManager = (DisplayManager) context.getSystemService(Context.DISPLAY_SERVICE);
             mPowerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
             mMaximumBacklight = mPowerManager.getMaximumScreenBrightnessSetting();
             mMinimumBacklight = mPowerManager.getMinimumScreenBrightnessSetting();
+            mWakeLockInterface = wakeLockInterface;
         }
 
         private void handleMainDisplayChanged() {
@@ -114,8 +143,7 @@
                 brightness = mMaximumBacklight;
             }
             // Set the brightness
-            Settings.System.putInt(mContext.getContentResolver(), Settings.System.SCREEN_BRIGHTNESS,
-                                   brightness);
+            System.putInt(mContentResolver, System.SCREEN_BRIGHTNESS, brightness);
         }
 
         @Override
@@ -124,12 +152,15 @@
                 mService = service;
                 mDisplayStateSet = isMainDisplayOn();
             }
+            mContentResolver.registerContentObserver(System.getUriFor(System.SCREEN_BRIGHTNESS),
+                                                     false, mBrightnessObserver);
             mDisplayManager.registerDisplayListener(mDisplayListener, service.getHandler());
         }
 
         @Override
         public void stopDisplayStateMonitoring() {
             mDisplayManager.unregisterDisplayListener(mDisplayListener);
+            mContentResolver.unregisterContentObserver(mBrightnessObserver);
         }
 
         @Override