diff options
author | Steve Paik <spaik@google.com> | 2018-03-13 19:25:47 -0700 |
---|---|---|
committer | Steve Paik <spaik@google.com> | 2018-03-14 13:02:49 -0700 |
commit | 87b36fdef99fec7fdba383adc48d7dd4671691fe (patch) | |
tree | feadc55b7d15aa385f8fc267aa9cb1fbb7f5dcd1 | |
parent | f95ae8ecd35900c376111a6b5c4a00129f0fe42d (diff) | |
download | Car-87b36fdef99fec7fdba383adc48d7dd4671691fe.tar.gz |
Handle display brightness change from car
Bug: 32065231
Test: python emulator
Change-Id: I72edb1602f3f5941a3b2afff4023090a738e7b37
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(); |