summaryrefslogtreecommitdiff
path: root/services/java/com/android/server/power/DisplayPowerController.java
AgeCommit message (Collapse)Author
2013-12-19Move some system services to separate directoriesAmith Yamasani
Refactored the directory structure so that services can be optionally excluded. This is step 1. Will be followed by another change that makes it possible to remove services from the build. Change-Id: Ideacedfd34b5e213217ad3ff4ebb21c4a8e73f85
2013-12-12Introduce a Lifecycle for system servicesAdam Lesinski
Provide an abstract class for system services to extend from, similar to the android.app.Service. This will allow services to receive events in a uniform way, and will allow services to be created and started in the correct order regardless of whether or not a particular service exists. Similar to android.app.Service, services are meant to implement Binder interfaces as inner classes. This prevents services from having incestuous access to each other and makes them use the public API. Change-Id: Iaacfee8d5f080a28d7cc606761f4624673ed390f
2013-11-05Continue synthesizing data even after brightness adjustmentMichael Wright
Bug: 11337887 Change-Id: I80adb330c4e9250965030626634002a1b9c999cf
2013-09-12Allow phone to enter suspend with positive proximity.Jeff Brown
As part of the power manager rewrite in JB MR1, we removed the ability for the phone to suspend with positive proximity because it was not clear that the proximity sensor was always correctly registered as a wake-up source. The sensor service itself does not contain any code to manage wake-ups. Therefore proximity sensor based wake-up relies on the sensor driver acquiring a timed wake lock when the sensor reports a negative result. This behavior is not very well defined in the sensor HAL so there is a chance that it will not work reliably on all devices. This change adds a new config.xml resource to specify whether the device should be allowed to suspend when the screen is off due to positive proximity. Devices that support this feature should set the "config_suspendWhenScreenOffDueToProximity" resource to "true" in their resource overlays. The feature is disabled by default. Bug: 9760828 Change-Id: Ic65ab7df0357271b133e2e44f5e35e7756e1e9e0
2013-01-10Improve heuristics for detecting wireless chargers.Jeff Brown
On some devices, we need to apply heuristics to determine whether the device is docked on a wireless charger because the charging circuits do not provide sufficient information to know whether the device is on the charger unless it is actually receiving power. The previous heuristics only considered the battery level to suppress spurious dock signals. The new heuristics also take into account whether the device appears to have moved from its previous position on the dock. Bug: 7744185 Change-Id: I5ba885dac25b37840b6db46b8a0f30968a06776c
2012-12-04Pin electron beam surface to natural orientation.Jeff Brown
If a rotation occurred while the electron beam surface was showing, the surface may have appeared in the wrong orientation. We fix this problem by adjusting the transformation matrix of the electron beam surface according to the display orientation whenever a display transaction occurs. The rotation itself is allowed to proceed but it is not visible to the user. We must let this happen so that the lock screen is correctly oriented when the screen is turned back on. Note that the electron beam surface serves two purposes. First, it is used to play the screen off animation. When the animation is finished, the surface remains visible but is solid black. Then we turn the screen off. Second, when we turn the screen back on we leave the electron beam surface showing until the window manager is ready to show the new content. This prevents the user from seeing a flash of the old content while the screen is being turned on. When everything is ready, we dismiss the electron beam. It's important for the electron beam to remain visible for the entire duration from just before the screen is turned off until after the screen is turned on and is ready to be seen. This is why we cannot fix the bug by deferring rotation or otherwise getting in the way of the window manager doing what it needs to do to get the screen ready when the screen is turned on again. Bug: 7479740 Change-Id: I2fcf35114ad9b2e00fdfc67793be6df62c8dc4c3
2012-10-24Dim the screen quickly in response to user activity timeout.Jeff Brown
Reverts a previous change that made the screen dim slowly instead. The quick transition does a better job of attracting the user's attention to the fact that the screen is about to turn off unless the user touches the screen. Bug: 7386034 Change-Id: I81e4d8939f6791b96352004984a9e5b2aab79788
2012-10-22Improve auto-brightness hysteresis.Jeff Brown
Reintroduced the stability time heuristic which requires brightness to remain significantly above or below the currently accepted ambient brightnes before effecting a brightness change. The heuristic has the nice property of preventing light sensor noise from causing oscillations in brightness even when the noise has a relatively large magnitude (such as in low light environments). The time bound and filter thresholds are current set so that brightness increases typically occur within 5 seconds of a change in the ambient environment. Decreases take somewhat longer and typically occur within 10 seconds. Changed the timing for brightness animations when the screen is being dimmed due to a pending user activity timeout. The screen now dims slowly but then brightens rapidly when touched. Previously the screen dimmed quickly and brightened slowly which felt somewhat unresponsive. Fixed a problem where a brightness change might not occur because the light sensor had not reported a new value in a long time. Now we synthesize measurements when needed to ensure that a transition will take place if appropriate. Bug: 7387800 Change-Id: I998df2fec59922042a41a1ba4af97ea52c0bd02a
2012-10-19Reduce screen on/off latency.Jeff Brown
Reduce latency of screen on/off and improve how it is synchronized with backlight changes. Screen state changes are no longer posted to vsync which should save time. What's more, the state change occurs on a separate thread so we no longer run the risk of blocking the Looper for a long time while waiting for the screen to turn on or off. Bug: 7382919 Bug: 7139924 Change-Id: I375950d1b07e22fcb94efb82892fd817e2f780dc
2012-10-18Reduce auto-brightness jitter.Jeff Brown
Apply additional hysteresis controls to prevent repeated brightness changes within a short interval. Bug: 7266090 Change-Id: I73122457f6f3200c80188d3716ce2baf38f6a0a6
2012-10-10Use exactly the same timings for the ElectronBeam as JB.Jeff Brown
Bug: 7318962 Change-Id: Ic04bac5b07ec64fed84a6381ee1916ddeed01255
2012-10-08Blank or unblank all displays as need.Jeff Brown
Ensures that both the internal display and HDMI are blanked or unblanked in tandem. Bug: 7309812 Change-Id: Ie8b96d393e8bb20d23c92f3320142d9f7cf42aff
2012-10-08Improve the power off fade animation.Jeff Brown
Fixes an issue where the dim surface alpha was not actually being animated like it was supposed to. Bug: 7224614 Change-Id: Iffd54367ca97ae7fd4b9603807f4e036750442b2
2012-10-07Reduce screen on latency, eliminate flashes.Jeff Brown
Always use the ElectronBeam now, even when we are only animating the backlight so that we will have a black surface remaining on the screen after the screen turns off. When turning on the screen, keep the black surface showing until we unblock screen on then dismiss it as usual. This change eliminates the flashing of old display content when the screen is turned on. It also helps to conceal some of the latency of turning the screen on. We always turn the screen on immediately (even when screen on has nominally been blocked) and rely on the black surface to hide the screen contents until the last moment. Dismissing the black surface is practically instantaneous compared to turning the screen on. Bug: 7299370 Bug: 7139924 Change-Id: I57d13287acd05bd0a48811095bb02dc7bc7cbeb6
2012-10-06Allow the dim brightness to be brighter than the minimum.Jeff Brown
Defines the lower end of the allowable screen brightness range as the lesser of the dim level, the user brightness setting minimum value and the lowest auto-brightness level. Bug: 7295909 Change-Id: I7a72b4611631f9e51578205ff12898c5bae02b1b
2012-10-05Coordinate screen on with the window manager.Jeff Brown
Bug: 7267457 Change-Id: Ic2c322253639e1f0b2e4e72a7b145025d0240f93
2012-10-04Support animating just the backlight when turning off.Jeff Brown
Bug: 7224614 Change-Id: Ic9fa7a9e458c89d347b03bce6829f952bdf3b6a5
2012-10-04Allow phone to go to sleep while in call.Jeff Brown
Bug: 7279383 Change-Id: Ia05490218f40a1843507b95ff48fa07910e582d4
2012-10-01Disable use of twilight mode for auto-brightness.Jeff Brown
This adjustment is still experimental. Bug: 7165399 Change-Id: I3fcf361933995d02a5329eeaec80155b39371ba3
2012-09-08Enable auto-brightness adjustment feature with system prop.Jeff Brown
This feature is experimental and disabled by default. Change-Id: I183534370da7613557e4d1535f556873f8a763df
2012-08-31More improvements to the display manager.Jeff Brown
Added more complete support for logical displays with support for mirroring, rotation and scaling. Improved the overlay display adapter's touch interactions. A big change here is that the display manager no longer relies on a single-threaded model to maintain its synchronization invariants. Unfortunately we had to change this so as to play nice with the fact that the window manager wants to own the surface flinger transaction around display and surface manipulations. As a result, the display manager has to be able to update displays from the context of any thread. It would be nice to make this process more cooperative. There are already several components competing to perform surface flinger transactions including the window manager, display manager, electron beam, overlay display window, and mouse pointer. They are not manipulating the same surfaces but they can collide with one another when they make global changes to the displays. Change-Id: I04f448594241f2004f6f3d1a81ccd12c566bf296
2012-08-29Add initial multi-display support.Jeff Brown
Split the DisplayManager into two parts. One part is bound to a Context and takes care of Display compatibility and caching Display objects on behalf of the Context. The other part is global and takes care of communicating with the DisplayManagerService, handling callbacks, and caching DisplayInfo objects on behalf of the process. Implemented support for enumerating Displays and getting callbacks when displays are added, removed or changed. Elaborated the roles of DisplayManagerService, DisplayAdapter, and DisplayDevice. We now support having multiple display adapters registered, each of which can register multiple display devices and configure them dynamically. Added an OverlayDisplayAdapter which is used to simulate secondary displays by means of overlay windows. Different configurations of overlays can be selected using a new setting in the Developer Settings panel. The overlays can be repositioned and resized by the user for convenience. At the moment, all displays are mirrors of display 0 and no display transformations are applied. This will be improved in future patches. Refactored the way that the window manager creates its threads. The OverlayDisplayAdapter needs to be able to use hardware acceleration so it must share the same UI thread as the Keyguard and window manager policy. We now handle this explicitly as part of starting up the system server. This puts us in a better position to consider how we might want to share (or not share) Loopers among components. Overlay displays are disabled when in safe mode or in only-core mode to reduce the number of dependencies started in these modes. Change-Id: Ic2a661d5448dde01b095ab150697cb6791d69bb5
2012-08-25Make it easier to create asynchronous Handlers.Jeff Brown
There are potentially very many Handlers owned by services that should not be blocked by barriers introduced by UI traversals occurring on the same thread (if that ever happens). Add some convenience constructors to make it easy to switch these Handlers over to being async. Bug: 7057752 Change-Id: I64d9bffe81e7c52ada4cfad4e89d4340153f4688
2012-08-22Make the electron beam animation shorter.Jeff Brown
Now using about the same duration as it used to have when it was implemented in Surface Flinger. Change-Id: I09b28222379f4b6583f1f7b34188cc36c50509e9
2012-08-22Add a mechanism to adjust auto-brightness at night.Jeff Brown
Uses the twilight service to determine the hours of sunrise and sunset. Shortly after sunset or before sunrise gradually start to apply a gamma correction factor to the auto-brightness calculations to make the screen a little dimmer at night. The effect is relatively small and is mostly noticeable in dark rooms. This is just a first pass at the algorithm, we can tweak the adjustment later to ensure that it has even less impact in moderate or bright environments. Change-Id: Idf89022a5d0bb52975e04779352d53fa63371178
2012-08-21Add support for auto-brightness adjust, but leave it disabled.Jeff Brown
Auto-brightness adjustment applies a gamma correction factor between 1/3 and 3 depending on the setting. This feature is disabled for now. Change-Id: I2b300b5c455da545bea56b2bae5bc7903e30f30e
2012-08-20Disable electron beam on animation.Jeff Brown
We want the screen to come back on as soon as possible. Change-Id: Ifdaa2e88d19590c3da53be985dd886633e5cac59
2012-08-20Adjust auto-brightness time constants.Jeff Brown
Specifically, dim a little more slowly. Change-Id: I10d66a83ddc3a63f8c93d740a0cb116e6c974d10
2012-08-20Fix some proximity sensor bugs.Jeff Brown
Forgot to clear waiting for proximity negative flag. Waiting for proximity negative also shouldn't turn the screen off if it is currently on. Change-Id: I9885b2f54b185beb961acda44176bc5f11a9f58b
2012-08-19Refactor for multi-display support.Jeff Brown
Split WindowManagerImpl into two parts, the WindowManager interface implementation remains where it is but the global communications with the window manager are now handled by the WindowManagerGlobal class. This change greatly simplifies the challenge of having separate WindowManager instances for each Context. Removed WindowManagerImpl.getDefault(). This represents the bulk of this change. Most of the usages of this method were either to perform global functions (now handled by WindowManagerGlobal) or to obtain the default display (now handled by DisplayManager). Explicitly associate each new window with a display and make the Display object available to the View hierarchy. Add stubs for some new display manager API features. Start to split apart the concepts of display id and layer stack. since they operate at different layers of abstraction. While it's true that each logical display uniquely corresponds to a surface flinger layer stack, it is not necessarily the case that they must use the same ids. Added Display.getLayerStack() and started using it in places where it was relatively easy to do. Change-Id: I29ed909114dec86807c4d3a5059c3fa0358bea61
2012-08-16Animate brightness with electron beam.Jeff Brown
Also added an internal flag to control whether the electron beam on animation is used. It's on for now but we might want to turn if off if we can't get the HAL to provide the necessary screen on synchronization on all devices. Change-Id: Iaa3cfa0fd61de10174e68351e4db890eff2d2918
2012-08-16Use spline interpolation for auto-brightness.Jeff Brown
Strictly speaking, this is a change in behavior for all products. Instead of using discrete zones, they will all now use spline interpolation. We could make this behavior configurable but there seems to be little point to it. The range of brightness values used will be more or less the same as before, it's just that what used to be the brightness value for all levels within a particular zone now becomes the brightness value for the highest level in that zone and lower values are used for lower levels within the zone. Change-Id: I39804ee630ba55f018e1e53c0576b28e7bd27931
2012-08-15Improve auto-brightness debounce.Jeff Brown
Change-Id: I045e2a14cb31ff987a22872733c442fc92ebadbf
2012-08-15Power manager rewrite.Jeff Brown
The major goal of this rewrite is to make it easier to implement power management policies correctly. According, the new implementation primarily uses state-based rather than event-based triggers for applying changes to the current power state. For example, when an application requests that the proximity sensor be used to manage the screen state (by way of a wake lock), the power manager makes note of the fact that the set of wake locks changed. Then it executes a common update function that recalculates the entire state, first looking at wake locks, then considering user activity, and eventually determining whether the screen should be turned on or off. At this point it may make a request to a component called the DisplayPowerController to asynchronously update the display's powe state. Likewise, DisplayPowerController makes note of the updated power request and schedules its own update function to figure out what needs to be changed. The big benefit of this approach is that it's easy to mutate multiple properties of the power state simultaneously then apply their joint effects together all at once. Transitions between states are detected and resolved by the update in a consistent manner. The new power manager service has is implemented as a set of loosely coupled components. For the most part, information only flows one way through these components (by issuing a request to that component) although some components support sending a message back to indicate when the work has been completed. For example, the DisplayPowerController posts a callback runnable asynchronously to tell the PowerManagerService when the display is ready. An important feature of this approach is that each component neatly encapsulates its state and maintains its own invariants. Moreover, we do not need to worry about deadlocks or awkward mutual exclusion semantics because most of the requests are asynchronous. The benefits of this design are especially apparent in the implementation of the screen on / off and brightness control animations which are able to take advantage of framework features like properties, ObjectAnimator and Choreographer. The screen on / off animation is now the responsibility of the power manager (instead of surface flinger). This change makes it much easier to ensure that the animation is properly coordinated with other power state changes and eliminates the cause of race conditions in the older implementation. The because of the userActivity() function has been changed so that it never wakes the device from sleep. This change removes ambiguity around forcing or disabling user activity for various purposes. To wake the device, use wakeUp(). To put it to sleep, use goToSleep(). Simple. The power manager service interface and API has been significantly simplified and consolidated. Also fixed some inconsistencies related to how the minimum and maximum screen brightness setting was presented in brightness control widgets and enforced behind the scenes. At present the following features are implemented: - Wake locks. - User activity. - Wake up / go to sleep. - Power state broadcasts. - Battery stats and event log notifications. - Dreams. - Proximity screen off. - Animated screen on / off transitions. - Auto-dimming. - Auto-brightness control for the screen backlight with different timeouts for ramping up versus ramping down. - Auto-on when plugged or unplugged. - Stay on when plugged. - Device administration maximum user activity timeout. - Application controlled brightness via window manager. The following features are not yet implemented: - Reduced user activity timeout for the key guard. - Reduced user activity timeout for the phone application. - Coordinating screen on barriers with the window manager. - Preventing auto-rotation during power state changes. - Auto-brightness adjustment setting (feature was disabled in previous version of the power manager service pending an improved UI design so leaving it out for now). - Interpolated brightness control (a proposed new scheme for more compactly specifying auto-brightness levels in config.xml). - Button / keyboard backlight control. - Change window manager to associated WorkSource with KEEP_SCREEN_ON_FLAG wake lock instead of talking directly to the battery stats service. - Optionally support animating screen brightness when turning on/off instead of playing electron beam animation (config_animateScreenLights). Change-Id: I1d7a52e98f0449f76d70bf421f6a7f245957d1d7