aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSteve Paik <spaik@google.com>2018-03-13 19:25:47 -0700
committerSteve Paik <spaik@google.com>2018-03-14 13:02:49 -0700
commit87b36fdef99fec7fdba383adc48d7dd4671691fe (patch)
treefeadc55b7d15aa385f8fc267aa9cb1fbb7f5dcd1
parentf95ae8ecd35900c376111a6b5c4a00129f0fe42d (diff)
downloadCar-87b36fdef99fec7fdba383adc48d7dd4671691fe.tar.gz
Handle display brightness change from car
Bug: 32065231 Test: python emulator Change-Id: I72edb1602f3f5941a3b2afff4023090a738e7b37
-rw-r--r--service/src/com/android/car/CarPowerManagementService.java38
-rw-r--r--service/src/com/android/car/hal/PowerHalService.java32
-rw-r--r--service/src/com/android/car/systeminterface/DisplayInterface.java36
-rw-r--r--service/src/com/android/car/systeminterface/SystemInterface.java7
-rw-r--r--tests/carservice_test/src/com/android/car/CarPowerManagementTest.java7
-rw-r--r--tests/carservice_test/src/com/android/car/MockedCarTestBase.java3
-rw-r--r--tests/carservice_unit_test/src/com/android/car/CarPowerManagementServiceTest.java5
7 files changed, 94 insertions, 34 deletions
diff --git a/service/src/com/android/car/CarPowerManagementService.java b/service/src/com/android/car/CarPowerManagementService.java
index 017a1e7a7b..3aa473caed 100644
--- a/service/src/com/android/car/CarPowerManagementService.java
+++ b/service/src/com/android/car/CarPowerManagementService.java
@@ -15,37 +15,35 @@
*/
package com.android.car;
-import java.io.PrintWriter;
-import java.util.LinkedList;
-import java.util.Map;
-import java.util.Timer;
-import java.util.TimerTask;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.CopyOnWriteArrayList;
-
-import com.android.car.hal.PowerHalService;
-import com.android.car.hal.PowerHalService.PowerState;
-import com.android.car.systeminterface.SystemInterface;
-import com.android.internal.annotations.GuardedBy;
-import com.android.internal.annotations.VisibleForTesting;
-
import android.car.Car;
import android.car.hardware.power.CarPowerManager.CarPowerStateListener;
import android.car.hardware.power.ICarPower;
import android.car.hardware.power.ICarPowerStateListener;
import android.content.Context;
-import android.os.Binder;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.IBinder;
import android.os.Looper;
import android.os.Message;
-import android.os.PowerManager;
import android.os.RemoteCallbackList;
import android.os.RemoteException;
import android.os.SystemClock;
import android.util.Log;
+import com.android.car.hal.PowerHalService;
+import com.android.car.hal.PowerHalService.PowerState;
+import com.android.car.systeminterface.SystemInterface;
+import com.android.internal.annotations.GuardedBy;
+import com.android.internal.annotations.VisibleForTesting;
+
+import java.io.PrintWriter;
+import java.util.LinkedList;
+import java.util.Map;
+import java.util.Timer;
+import java.util.TimerTask;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.CopyOnWriteArrayList;
+
public class CarPowerManagementService extends ICarPower.Stub implements CarServiceBase,
PowerHalService.PowerEventListener {
@@ -594,11 +592,15 @@ public class CarPowerManagementService extends ICarPower.Stub implements CarServ
@Override
public void onDisplayBrightnessChange(int brightness) {
- // TODO bug: 32065231
+ PowerHandler handler;
+ synchronized (this) {
+ handler = mHandler;
+ }
+ handler.handleDisplayBrightnessChange(brightness);
}
private void doHandleDisplayBrightnessChange(int brightness) {
- //TODO bug: 32065231
+ mSystemInterface.setDisplayBrightness(brightness);
}
private void doHandleMainDisplayStateChange(boolean on) {
diff --git a/service/src/com/android/car/hal/PowerHalService.java b/service/src/com/android/car/hal/PowerHalService.java
index 6901a4827e..00c8e6929b 100644
--- a/service/src/com/android/car/hal/PowerHalService.java
+++ b/service/src/com/android/car/hal/PowerHalService.java
@@ -54,6 +54,9 @@ public class PowerHalService extends HalServiceBase {
public static final int BOOT_REASON_USER_UNLOCK = VehicleApPowerBootupReason.USER_UNLOCK;
public static final int BOOT_REASON_TIMER = VehicleApPowerBootupReason.TIMER;
+ // Set display brightness from 0-100%
+ public static final int MAX_BRIGHTNESS = 100;
+
@VisibleForTesting
public static final int SET_BOOT_COMPLETE = VehicleApPowerSetState.BOOT_COMPLETE;
@VisibleForTesting
@@ -327,20 +330,23 @@ public class PowerHalService extends HalServiceBase {
listener.onApPowerStateChange(new PowerState(state, param));
break;
case DISPLAY_BRIGHTNESS:
- int maxBrightness;
- synchronized (this) {
- maxBrightness = mMaxDisplayBrightness;
- }
- int brightness = v.value.int32Values.get(0) * 100 / maxBrightness;
- if (brightness < 0) {
- Log.e(CarLog.TAG_POWER, "invalid brightness: " + brightness + ", set to 0");
- brightness = 0;
- } else if(brightness > 100) {
- Log.e(CarLog.TAG_POWER, "invalid brightness: " + brightness + ", set to 100");
- brightness = 100;
+ {
+ int maxBrightness;
+ synchronized (this) {
+ maxBrightness = mMaxDisplayBrightness;
+ }
+ int brightness = v.value.int32Values.get(0) * MAX_BRIGHTNESS / maxBrightness;
+ if (brightness < 0) {
+ Log.e(CarLog.TAG_POWER, "invalid brightness: " + brightness + ", set to 0");
+ brightness = 0;
+ } else if (brightness > MAX_BRIGHTNESS) {
+ Log.e(CarLog.TAG_POWER, "invalid brightness: " + brightness + ", set to "
+ + MAX_BRIGHTNESS);
+ brightness = MAX_BRIGHTNESS;
+ }
+ Log.i(CarLog.TAG_POWER, "Received DISPLAY_BRIGHTNESS=" + brightness);
+ listener.onDisplayBrightnessChange(brightness);
}
- Log.i(CarLog.TAG_POWER, "Received DISPLAY_BRIGHTNESS=" + brightness);
- listener.onDisplayBrightnessChange(brightness);
break;
}
}
diff --git a/service/src/com/android/car/systeminterface/DisplayInterface.java b/service/src/com/android/car/systeminterface/DisplayInterface.java
index f798b0d096..8ef4aecf35 100644
--- a/service/src/com/android/car/systeminterface/DisplayInterface.java
+++ b/service/src/com/android/car/systeminterface/DisplayInterface.java
@@ -21,8 +21,10 @@ import android.hardware.display.DisplayManager;
import android.hardware.display.DisplayManager.DisplayListener;
import android.os.PowerManager;
import android.os.SystemClock;
+import android.provider.Settings;
import android.util.Log;
import android.view.Display;
+
import com.android.car.CarLog;
import com.android.car.CarPowerManagementService;
@@ -30,12 +32,19 @@ import com.android.car.CarPowerManagementService;
* Interface that abstracts display operations
*/
public interface DisplayInterface {
+ /**
+ * @param brightness Level from 0 to 100%
+ */
+ void setDisplayBrightness(int brightness);
void setDisplayState(boolean on);
void startDisplayStateMonitoring(CarPowerManagementService service);
void stopDisplayStateMonitoring();
class DefaultImpl implements DisplayInterface {
+ private final Context mContext;
private final DisplayManager mDisplayManager;
+ private final int mMaximumBacklight;
+ private final int mMinimumBacklight;
private final PowerManager mPowerManager;
private final WakeLockInterface mWakeLockInterface;
private CarPowerManagementService mService;
@@ -60,9 +69,12 @@ public interface DisplayInterface {
};
DefaultImpl(Context context, WakeLockInterface wakeLockInterface) {
+ mContext = context;
mWakeLockInterface = wakeLockInterface;
mDisplayManager = (DisplayManager) context.getSystemService(Context.DISPLAY_SERVICE);
mPowerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
+ mMaximumBacklight = mPowerManager.getMaximumScreenBrightnessSetting();
+ mMinimumBacklight = mPowerManager.getMinimumScreenBrightnessSetting();
}
private void handleMainDisplayChanged() {
@@ -83,6 +95,30 @@ public interface DisplayInterface {
}
@Override
+ public void setDisplayBrightness(int brightness) {
+ // Brightness is set in percent. Need to convert this into 0-255 scale. The actual
+ // brightness algorithm should look like this:
+ //
+ // newBrightness = (brightness * (max - min)) + min
+ //
+ // Since we're using integer arithmetic, do the multiplication first, then add 50 to
+ // round up as needed.
+ brightness *= mMaximumBacklight - mMinimumBacklight; // Multiply by full range
+ brightness += 50; // Integer rounding
+ brightness /= 100; // Divide by 100
+ brightness += mMinimumBacklight;
+ // Range checking
+ if (brightness < mMinimumBacklight) {
+ brightness = mMinimumBacklight;
+ } else if (brightness > mMaximumBacklight) {
+ brightness = mMaximumBacklight;
+ }
+ // Set the brightness
+ Settings.System.putInt(mContext.getContentResolver(), Settings.System.SCREEN_BRIGHTNESS,
+ brightness);
+ }
+
+ @Override
public void startDisplayStateMonitoring(CarPowerManagementService service) {
synchronized (this) {
mService = service;
diff --git a/service/src/com/android/car/systeminterface/SystemInterface.java b/service/src/com/android/car/systeminterface/SystemInterface.java
index a6af5d7525..b50898882d 100644
--- a/service/src/com/android/car/systeminterface/SystemInterface.java
+++ b/service/src/com/android/car/systeminterface/SystemInterface.java
@@ -17,12 +17,14 @@
package com.android.car.systeminterface;
import android.content.Context;
+
import com.android.car.CarPowerManagementService;
import com.android.car.procfsinspector.ProcessInfo;
import com.android.car.storagemonitoring.LifetimeWriteInfoProvider;
import com.android.car.storagemonitoring.UidIoStatsProvider;
import com.android.car.storagemonitoring.WearInformationProvider;
import com.android.internal.car.ICarServiceHelper;
+
import java.io.File;
import java.time.Duration;
import java.util.List;
@@ -111,6 +113,11 @@ public final class SystemInterface implements DisplayInterface, IOInterface,
}
@Override
+ public void setDisplayBrightness(int brightness) {
+ mDisplayInterface.setDisplayBrightness(brightness);
+ }
+
+ @Override
public void setDisplayState(boolean on) {
mDisplayInterface.setDisplayState(on);
}
diff --git a/tests/carservice_test/src/com/android/car/CarPowerManagementTest.java b/tests/carservice_test/src/com/android/car/CarPowerManagementTest.java
index 17d7cac737..62008c11be 100644
--- a/tests/carservice_test/src/com/android/car/CarPowerManagementTest.java
+++ b/tests/carservice_test/src/com/android/car/CarPowerManagementTest.java
@@ -31,13 +31,13 @@ import android.support.test.annotation.UiThreadTest;
import android.support.test.filters.MediumTest;
import android.support.test.runner.AndroidJUnit4;
-import com.google.android.collect.Lists;
-
import com.android.car.systeminterface.DisplayInterface;
import com.android.car.systeminterface.SystemInterface;
import com.android.car.vehiclehal.VehiclePropValueBuilder;
import com.android.car.vehiclehal.test.MockedVehicleHal.VehicleHalPropertyHandler;
+import com.google.android.collect.Lists;
+
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -134,6 +134,9 @@ public class CarPowerManagementTest extends MockedCarTestBase {
private final Semaphore mDisplayStateWait = new Semaphore(0);
@Override
+ public void setDisplayBrightness(int brightness) {}
+
+ @Override
public synchronized void setDisplayState(boolean on) {
mDisplayOn = on;
mDisplayStateWait.release();
diff --git a/tests/carservice_test/src/com/android/car/MockedCarTestBase.java b/tests/carservice_test/src/com/android/car/MockedCarTestBase.java
index 792813f467..a8a6c12626 100644
--- a/tests/carservice_test/src/com/android/car/MockedCarTestBase.java
+++ b/tests/carservice_test/src/com/android/car/MockedCarTestBase.java
@@ -288,6 +288,9 @@ public class MockedCarTestBase {
static final class MockDisplayInterface implements DisplayInterface {
@Override
+ public void setDisplayBrightness(int brightness) {}
+
+ @Override
public void setDisplayState(boolean on) {}
@Override
diff --git a/tests/carservice_unit_test/src/com/android/car/CarPowerManagementServiceTest.java b/tests/carservice_unit_test/src/com/android/car/CarPowerManagementServiceTest.java
index 6b6859c3c1..cb2b4b83e2 100644
--- a/tests/carservice_unit_test/src/com/android/car/CarPowerManagementServiceTest.java
+++ b/tests/carservice_unit_test/src/com/android/car/CarPowerManagementServiceTest.java
@@ -24,13 +24,13 @@ import com.android.car.CarPowerManagementService.PowerEventProcessingHandler;
import com.android.car.CarPowerManagementService.PowerServiceEventListener;
import com.android.car.hal.PowerHalService;
import com.android.car.hal.PowerHalService.PowerState;
-
import com.android.car.systeminterface.DisplayInterface;
import com.android.car.systeminterface.IOInterface;
import com.android.car.systeminterface.SystemInterface;
import com.android.car.systeminterface.SystemStateInterface;
import com.android.car.systeminterface.WakeLockInterface;
import com.android.car.test.utils.TemporaryDirectory;
+
import java.io.File;
import java.io.IOException;
import java.time.Duration;
@@ -246,6 +246,9 @@ public class CarPowerManagementServiceTest extends AndroidTestCase {
private final Semaphore mDisplayStateWait = new Semaphore(0);
@Override
+ public void setDisplayBrightness(int brightness) {}
+
+ @Override
public synchronized void setDisplayState(boolean on) {
mDisplayOn = on;
mDisplayStateWait.release();