summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJeff Brown <jeffbrown@google.com>2014-04-09 09:12:40 +0000
committerAndroid Git Automerger <android-git-automerger@android.com>2014-04-09 09:12:40 +0000
commit7f9599d63c892934c7f8a2e46d1e518ddb0d43df (patch)
tree6cb03cde27062bdd6cc136caa20e5fe1e41195ae
parent668b1bf80b0e34e7079f826cd9e7358835a1e9cd (diff)
parentea72cdf22f8efde4d3b872a60587e4b26bc93e43 (diff)
downloadframeworks_base-7f9599d63c892934c7f8a2e46d1e518ddb0d43df.zip
frameworks_base-7f9599d63c892934c7f8a2e46d1e518ddb0d43df.tar.gz
frameworks_base-7f9599d63c892934c7f8a2e46d1e518ddb0d43df.tar.bz2
am ea72cdf2: Merge "Move display power controller to display manager service. (DO NOT MERGE)" into klp-modular-dev
* commit 'ea72cdf22f8efde4d3b872a60587e4b26bc93e43': Move display power controller to display manager service. (DO NOT MERGE)
-rw-r--r--core/java/android/hardware/display/DisplayManagerInternal.java164
-rw-r--r--services/core/java/com/android/server/display/DisplayManagerService.java29
-rw-r--r--services/core/java/com/android/server/display/DisplayPowerController.java (renamed from services/core/java/com/android/server/power/DisplayPowerController.java)98
-rw-r--r--services/core/java/com/android/server/display/DisplayPowerState.java (renamed from services/core/java/com/android/server/power/DisplayPowerState.java)20
-rw-r--r--services/core/java/com/android/server/display/ElectronBeam.java (renamed from services/core/java/com/android/server/power/ElectronBeam.java)2
-rw-r--r--services/core/java/com/android/server/display/RampAnimator.java (renamed from services/core/java/com/android/server/power/RampAnimator.java)2
-rw-r--r--services/core/java/com/android/server/power/DisplayBlanker.java25
-rw-r--r--services/core/java/com/android/server/power/DisplayPowerRequest.java135
-rw-r--r--services/core/java/com/android/server/power/Notifier.java45
-rw-r--r--services/core/java/com/android/server/power/PowerManagerService.java125
10 files changed, 309 insertions, 336 deletions
diff --git a/core/java/android/hardware/display/DisplayManagerInternal.java b/core/java/android/hardware/display/DisplayManagerInternal.java
index 8430973..03fa1d5 100644
--- a/core/java/android/hardware/display/DisplayManagerInternal.java
+++ b/core/java/android/hardware/display/DisplayManagerInternal.java
@@ -16,6 +16,9 @@
package android.hardware.display;
+import android.hardware.SensorManager;
+import android.os.Handler;
+import android.os.PowerManager;
import android.view.DisplayInfo;
/**
@@ -25,6 +28,36 @@ import android.view.DisplayInfo;
*/
public abstract class DisplayManagerInternal {
/**
+ * Called by the power manager to initialize power management facilities.
+ */
+ public abstract void initPowerManagement(DisplayPowerCallbacks callbacks,
+ Handler handler, SensorManager sensorManager);
+
+ /**
+ * Called by the power manager to request a new power state.
+ * <p>
+ * The display power controller makes a copy of the provided object and then
+ * begins adjusting the power state to match what was requested.
+ * </p>
+ *
+ * @param request The requested power state.
+ * @param waitForNegativeProximity If true, issues a request to wait for
+ * negative proximity before turning the screen back on, assuming the screen
+ * was turned off by the proximity sensor.
+ * @return True if display is ready, false if there are important changes that must
+ * be made asynchronously (such as turning the screen on), in which case the caller
+ * should grab a wake lock, watch for {@link DisplayPowerCallbacks#onStateChanged()}
+ * then try the request again later until the state converges.
+ */
+ public abstract boolean requestPowerState(DisplayPowerRequest request,
+ boolean waitForNegativeProximity);
+
+ /**
+ * Returns true if the proximity sensor screen-off function is available.
+ */
+ public abstract boolean isProximitySensorAvailable();
+
+ /**
* Called by the power manager to blank all displays.
*/
public abstract void blankAllDisplaysFromPowerManager();
@@ -99,6 +132,137 @@ public abstract class DisplayManagerInternal {
boolean inTraversal);
/**
+ * Describes the requested power state of the display.
+ *
+ * This object is intended to describe the general characteristics of the
+ * power state, such as whether the screen should be on or off and the current
+ * brightness controls leaving the DisplayPowerController to manage the
+ * details of how the transitions between states should occur. The goal is for
+ * the PowerManagerService to focus on the global power state and not
+ * have to micro-manage screen off animations, auto-brightness and other effects.
+ */
+ public static final class DisplayPowerRequest {
+ public static final int SCREEN_STATE_OFF = 0;
+ public static final int SCREEN_STATE_DOZE = 1;
+ public static final int SCREEN_STATE_DIM = 2;
+ public static final int SCREEN_STATE_BRIGHT = 3;
+
+ // The requested minimum screen power state: off, doze, dim or bright.
+ public int screenState;
+
+ // If true, the proximity sensor overrides the screen state when an object is
+ // nearby, turning it off temporarily until the object is moved away.
+ public boolean useProximitySensor;
+
+ // The desired screen brightness in the range 0 (minimum / off) to 255 (brightest).
+ // The display power controller may choose to clamp the brightness.
+ // When auto-brightness is enabled, this field should specify a nominal default
+ // value to use while waiting for the light sensor to report enough data.
+ public int screenBrightness;
+
+ // The screen auto-brightness adjustment factor in the range -1 (dimmer) to 1 (brighter).
+ public float screenAutoBrightnessAdjustment;
+
+ // If true, enables automatic brightness control.
+ public boolean useAutoBrightness;
+
+ // If true, prevents the screen from completely turning on if it is currently off.
+ // The display does not enter a "ready" state if this flag is true and screen on is
+ // blocked. The window manager policy blocks screen on while it prepares the keyguard to
+ // prevent the user from seeing intermediate updates.
+ //
+ // Technically, we may not block the screen itself from turning on (because that introduces
+ // extra unnecessary latency) but we do prevent content on screen from becoming
+ // visible to the user.
+ public boolean blockScreenOn;
+
+ public DisplayPowerRequest() {
+ screenState = SCREEN_STATE_BRIGHT;
+ useProximitySensor = false;
+ screenBrightness = PowerManager.BRIGHTNESS_ON;
+ screenAutoBrightnessAdjustment = 0.0f;
+ useAutoBrightness = false;
+ blockScreenOn = false;
+ }
+
+ public DisplayPowerRequest(DisplayPowerRequest other) {
+ copyFrom(other);
+ }
+
+ // Returns true if we want the screen on in any mode, including doze.
+ public boolean wantScreenOnAny() {
+ return screenState != SCREEN_STATE_OFF;
+ }
+
+ // Returns true if we want the screen on in a normal mode, excluding doze.
+ // This is usually what we want to tell the rest of the system. For compatibility
+ // reasons, we pretend the screen is off when dozing.
+ public boolean wantScreenOnNormal() {
+ return screenState == SCREEN_STATE_DIM || screenState == SCREEN_STATE_BRIGHT;
+ }
+
+ public boolean wantLightSensorEnabled() {
+ // Specifically, we don't want the light sensor while dozing.
+ return useAutoBrightness && wantScreenOnNormal();
+ }
+
+ public void copyFrom(DisplayPowerRequest other) {
+ screenState = other.screenState;
+ useProximitySensor = other.useProximitySensor;
+ screenBrightness = other.screenBrightness;
+ screenAutoBrightnessAdjustment = other.screenAutoBrightnessAdjustment;
+ useAutoBrightness = other.useAutoBrightness;
+ blockScreenOn = other.blockScreenOn;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ return o instanceof DisplayPowerRequest
+ && equals((DisplayPowerRequest)o);
+ }
+
+ public boolean equals(DisplayPowerRequest other) {
+ return other != null
+ && screenState == other.screenState
+ && useProximitySensor == other.useProximitySensor
+ && screenBrightness == other.screenBrightness
+ && screenAutoBrightnessAdjustment == other.screenAutoBrightnessAdjustment
+ && useAutoBrightness == other.useAutoBrightness
+ && blockScreenOn == other.blockScreenOn;
+ }
+
+ @Override
+ public int hashCode() {
+ return 0; // don't care
+ }
+
+ @Override
+ public String toString() {
+ return "screenState=" + screenState
+ + ", useProximitySensor=" + useProximitySensor
+ + ", screenBrightness=" + screenBrightness
+ + ", screenAutoBrightnessAdjustment=" + screenAutoBrightnessAdjustment
+ + ", useAutoBrightness=" + useAutoBrightness
+ + ", blockScreenOn=" + blockScreenOn;
+ }
+ }
+
+ /**
+ * Asynchronous callbacks from the power controller to the power manager service.
+ */
+ public interface DisplayPowerCallbacks {
+ void onStateChanged();
+ void onProximityPositive();
+ void onProximityNegative();
+
+ void acquireSuspendBlocker();
+ void releaseSuspendBlocker();
+
+ void blankAllDisplays();
+ void unblankAllDisplays();
+ }
+
+ /**
* Called within a Surface transaction whenever the size or orientation of a
* display may have changed. Provides an opportunity for the client to
* update the position of its surfaces as part of the same transaction.
diff --git a/services/core/java/com/android/server/display/DisplayManagerService.java b/services/core/java/com/android/server/display/DisplayManagerService.java
index 6be6405..693f7d8 100644
--- a/services/core/java/com/android/server/display/DisplayManagerService.java
+++ b/services/core/java/com/android/server/display/DisplayManagerService.java
@@ -21,6 +21,7 @@ import com.android.internal.util.IndentingPrintWriter;
import android.Manifest;
import android.content.Context;
import android.content.pm.PackageManager;
+import android.hardware.SensorManager;
import android.hardware.display.DisplayManager;
import android.hardware.display.DisplayManagerGlobal;
import android.hardware.display.DisplayManagerInternal;
@@ -172,6 +173,9 @@ public final class DisplayManagerService extends SystemService {
private final CopyOnWriteArrayList<DisplayTransactionListener> mDisplayTransactionListeners =
new CopyOnWriteArrayList<DisplayTransactionListener>();
+ // Display power controller.
+ private DisplayPowerController mDisplayPowerController;
+
// Set to true if all displays have been blanked by the power manager.
private int mAllDisplayBlankStateFromPowerManager = DISPLAY_BLANK_STATE_UNKNOWN;
@@ -936,6 +940,10 @@ public final class DisplayManagerService extends SystemService {
pw.println(" " + i + ": mPid=" + callback.mPid
+ ", mWifiDisplayScanRequested=" + callback.mWifiDisplayScanRequested);
}
+
+ if (mDisplayPowerController != null) {
+ mDisplayPowerController.dump(pw);
+ }
}
}
@@ -1314,6 +1322,27 @@ public final class DisplayManagerService extends SystemService {
private final class LocalService extends DisplayManagerInternal {
@Override
+ public void initPowerManagement(DisplayPowerCallbacks callbacks, Handler handler,
+ SensorManager sensorManager) {
+ synchronized (mSyncRoot) {
+ mDisplayPowerController = new DisplayPowerController(
+ mContext, callbacks, handler, sensorManager);
+ }
+ }
+
+ @Override
+ public boolean requestPowerState(DisplayPowerRequest request,
+ boolean waitForNegativeProximity) {
+ return mDisplayPowerController.requestPowerState(request,
+ waitForNegativeProximity);
+ }
+
+ @Override
+ public boolean isProximitySensorAvailable() {
+ return mDisplayPowerController.isProximitySensorAvailable();
+ }
+
+ @Override
public void blankAllDisplaysFromPowerManager() {
blankAllDisplaysFromPowerManagerInternal();
}
diff --git a/services/core/java/com/android/server/power/DisplayPowerController.java b/services/core/java/com/android/server/display/DisplayPowerController.java
index e83f734..dcf7da2 100644
--- a/services/core/java/com/android/server/power/DisplayPowerController.java
+++ b/services/core/java/com/android/server/display/DisplayPowerController.java
@@ -14,8 +14,11 @@
* limitations under the License.
*/
-package com.android.server.power;
+package com.android.server.display;
+import com.android.internal.app.IBatteryStats;
+import com.android.server.LocalServices;
+import com.android.server.am.BatteryStatsService;
import com.android.server.lights.LightsManager;
import com.android.server.twilight.TwilightListener;
import com.android.server.twilight.TwilightManager;
@@ -29,10 +32,13 @@ import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
+import android.hardware.display.DisplayManagerInternal.DisplayPowerCallbacks;
+import android.hardware.display.DisplayManagerInternal.DisplayPowerRequest;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.os.PowerManager;
+import android.os.RemoteException;
import android.os.SystemClock;
import android.text.format.DateUtils;
import android.util.FloatMath;
@@ -160,23 +166,15 @@ final class DisplayPowerController {
private final Object mLock = new Object();
- // Notifier for sending asynchronous notifications.
- private final Notifier mNotifier;
-
- // The display suspend blocker.
- // Held while there are pending state change notifications.
- private final SuspendBlocker mDisplaySuspendBlocker;
-
- // The display blanker.
- private final DisplayBlanker mDisplayBlanker;
-
// Our handler.
private final DisplayControllerHandler mHandler;
// Asynchronous callbacks into the power manager service.
// Only invoked from the handler thread while no locks are held.
- private final Callbacks mCallbacks;
- private Handler mCallbackHandler;
+ private final DisplayPowerCallbacks mCallbacks;
+
+ // Battery stats.
+ private final IBatteryStats mBatteryStats;
// The lights service.
private final LightsManager mLights;
@@ -350,19 +348,14 @@ final class DisplayPowerController {
/**
* Creates the display power controller.
*/
- public DisplayPowerController(Looper looper, Context context, Notifier notifier,
- LightsManager lights, TwilightManager twilight, SensorManager sensorManager,
- SuspendBlocker displaySuspendBlocker, DisplayBlanker displayBlanker,
- Callbacks callbacks, Handler callbackHandler) {
- mHandler = new DisplayControllerHandler(looper);
- mNotifier = notifier;
- mDisplaySuspendBlocker = displaySuspendBlocker;
- mDisplayBlanker = displayBlanker;
+ public DisplayPowerController(Context context,
+ DisplayPowerCallbacks callbacks, Handler handler, SensorManager sensorManager) {
+ mHandler = new DisplayControllerHandler(handler.getLooper());
mCallbacks = callbacks;
- mCallbackHandler = callbackHandler;
- mLights = lights;
- mTwilight = twilight;
+ mBatteryStats = BatteryStatsService.getService();
+ mLights = LocalServices.getService(LightsManager.class);
+ mTwilight = LocalServices.getService(TwilightManager.class);
mSensorManager = sensorManager;
final Resources resources = context.getResources();
@@ -527,7 +520,7 @@ final class DisplayPowerController {
}
private void initialize() {
- mPowerState = new DisplayPowerState(new ElectronBeam(), mDisplayBlanker,
+ mPowerState = new DisplayPowerState(new ElectronBeam(), mCallbacks,
mLights.getLight(LightsManager.LIGHT_ID_BACKLIGHT));
mElectronBeamOnAnimator = ObjectAnimator.ofFloat(
@@ -779,10 +772,14 @@ final class DisplayPowerController {
private void setScreenOn(boolean on) {
if (mPowerState.isScreenOn() != on) {
mPowerState.setScreenOn(on);
- if (on) {
- mNotifier.onScreenOn();
- } else {
- mNotifier.onScreenOff();
+ try {
+ if (on) {
+ mBatteryStats.noteScreenOn();
+ } else {
+ mBatteryStats.noteScreenOff();
+ }
+ } catch (RemoteException ex) {
+ // same process
}
}
}
@@ -811,7 +808,11 @@ final class DisplayPowerController {
private void animateScreenBrightness(int target, int rate) {
if (mScreenBrightnessRampAnimator.animateTo(target, rate)) {
- mNotifier.onScreenBrightness(target);
+ try {
+ mBatteryStats.noteScreenBrightness(target);
+ } catch (RemoteException ex) {
+ // same process
+ }
}
}
@@ -896,13 +897,13 @@ final class DisplayPowerController {
private void clearPendingProximityDebounceTime() {
if (mPendingProximityDebounceTime >= 0) {
mPendingProximityDebounceTime = -1;
- mDisplaySuspendBlocker.release(); // release wake lock
+ mCallbacks.releaseSuspendBlocker(); // release wake lock
}
}
private void setPendingProximityDebounceTime(long debounceTime) {
if (mPendingProximityDebounceTime < 0) {
- mDisplaySuspendBlocker.acquire(); // acquire wake lock
+ mCallbacks.acquireSuspendBlocker(); // acquire wake lock
}
mPendingProximityDebounceTime = debounceTime;
}
@@ -1172,48 +1173,48 @@ final class DisplayPowerController {
}
private void sendOnStateChangedWithWakelock() {
- mDisplaySuspendBlocker.acquire();
- mCallbackHandler.post(mOnStateChangedRunnable);
+ mCallbacks.acquireSuspendBlocker();
+ mHandler.post(mOnStateChangedRunnable);
}
private final Runnable mOnStateChangedRunnable = new Runnable() {
@Override
public void run() {
mCallbacks.onStateChanged();
- mDisplaySuspendBlocker.release();
+ mCallbacks.releaseSuspendBlocker();
}
};
private void sendOnProximityPositiveWithWakelock() {
- mDisplaySuspendBlocker.acquire();
- mCallbackHandler.post(mOnProximityPositiveRunnable);
+ mCallbacks.acquireSuspendBlocker();
+ mHandler.post(mOnProximityPositiveRunnable);
}
private final Runnable mOnProximityPositiveRunnable = new Runnable() {
@Override
public void run() {
mCallbacks.onProximityPositive();
- mDisplaySuspendBlocker.release();
+ mCallbacks.releaseSuspendBlocker();
}
};
private void sendOnProximityNegativeWithWakelock() {
- mDisplaySuspendBlocker.acquire();
- mCallbackHandler.post(mOnProximityNegativeRunnable);
+ mCallbacks.acquireSuspendBlocker();
+ mHandler.post(mOnProximityNegativeRunnable);
}
private final Runnable mOnProximityNegativeRunnable = new Runnable() {
@Override
public void run() {
mCallbacks.onProximityNegative();
- mDisplaySuspendBlocker.release();
+ mCallbacks.releaseSuspendBlocker();
}
};
public void dump(final PrintWriter pw) {
synchronized (mLock) {
pw.println();
- pw.println("Display Controller Locked State:");
+ pw.println("Display Power Controller Locked State:");
pw.println(" mDisplayReadyLocked=" + mDisplayReadyLocked);
pw.println(" mPendingRequestLocked=" + mPendingRequestLocked);
pw.println(" mPendingRequestChangedLocked=" + mPendingRequestChangedLocked);
@@ -1223,7 +1224,7 @@ final class DisplayPowerController {
}
pw.println();
- pw.println("Display Controller Configuration:");
+ pw.println("Display Power Controller Configuration:");
pw.println(" mScreenBrightnessDozeConfig=" + mScreenBrightnessDozeConfig);
pw.println(" mScreenBrightnessDimConfig=" + mScreenBrightnessDimConfig);
pw.println(" mScreenBrightnessRangeMinimum=" + mScreenBrightnessRangeMinimum);
@@ -1243,7 +1244,7 @@ final class DisplayPowerController {
private void dumpLocal(PrintWriter pw) {
pw.println();
- pw.println("Display Controller Thread State:");
+ pw.println("Display Power Controller Thread State:");
pw.println(" mPowerRequest=" + mPowerRequest);
pw.println(" mWaitingForNegativeProximity=" + mWaitingForNegativeProximity);
@@ -1302,15 +1303,6 @@ final class DisplayPowerController {
}
}
- /**
- * Asynchronous callbacks from the power controller to the power manager service.
- */
- public interface Callbacks {
- void onStateChanged();
- void onProximityPositive();
- void onProximityNegative();
- }
-
private final class DisplayControllerHandler extends Handler {
public DisplayControllerHandler(Looper looper) {
super(looper, null, true /*async*/);
diff --git a/services/core/java/com/android/server/power/DisplayPowerState.java b/services/core/java/com/android/server/display/DisplayPowerState.java
index 8e331ad..e1416d7 100644
--- a/services/core/java/com/android/server/power/DisplayPowerState.java
+++ b/services/core/java/com/android/server/display/DisplayPowerState.java
@@ -14,10 +14,11 @@
* limitations under the License.
*/
-package com.android.server.power;
+package com.android.server.display;
import com.android.server.lights.Light;
+import android.hardware.display.DisplayManagerInternal.DisplayPowerCallbacks;
import android.os.AsyncTask;
import android.os.Handler;
import android.os.Looper;
@@ -32,8 +33,8 @@ import java.io.PrintWriter;
/**
* Controls the display power state.
* <p>
- * This component is similar in nature to a {@link View} except that it describes
- * the properties of a display. When properties are changed, the component
+ * This component is similar in nature to a {@link android.view.View} except that it
+ * describes the properties of a display. When properties are changed, the component
* invalidates itself and posts a callback to apply the changes in a consistent order.
* This mechanism enables multiple properties of the display power state to be animated
* together smoothly by the animation framework. Some of the work to blank or unblank
@@ -43,8 +44,7 @@ import java.io.PrintWriter;
* that belongs to the {@link DisplayPowerController}.
* </p><p>
* We don't need to worry about holding a suspend blocker here because the
- * {@link PowerManagerService} does that for us whenever there is a change
- * in progress.
+ * power manager does that for us whenever there is a change in progress.
* </p>
*/
final class DisplayPowerState {
@@ -55,7 +55,7 @@ final class DisplayPowerState {
private final Handler mHandler;
private final Choreographer mChoreographer;
private final ElectronBeam mElectronBeam;
- private final DisplayBlanker mDisplayBlanker;
+ private final DisplayPowerCallbacks mCallbacks;
private final Light mBacklight;
private final PhotonicModulator mPhotonicModulator;
@@ -72,11 +72,11 @@ final class DisplayPowerState {
private Runnable mCleanListener;
public DisplayPowerState(ElectronBeam electronBean,
- DisplayBlanker displayBlanker, Light backlight) {
+ DisplayPowerCallbacks callbacks, Light backlight) {
mHandler = new Handler(true /*async*/);
mChoreographer = Choreographer.getInstance();
mElectronBeam = electronBean;
- mDisplayBlanker = displayBlanker;
+ mCallbacks = callbacks;
mBacklight = backlight;
mPhotonicModulator = new PhotonicModulator();
@@ -403,13 +403,13 @@ final class DisplayPowerState {
+ ", backlight=" + backlight);
}
if (onChanged && on) {
- mDisplayBlanker.unblankAllDisplays();
+ mCallbacks.unblankAllDisplays();
}
if (backlightChanged) {
mBacklight.setBrightness(backlight);
}
if (onChanged && !on) {
- mDisplayBlanker.blankAllDisplays();
+ mCallbacks.blankAllDisplays();
}
}
diff --git a/services/core/java/com/android/server/power/ElectronBeam.java b/services/core/java/com/android/server/display/ElectronBeam.java
index 64921d7..13816bb 100644
--- a/services/core/java/com/android/server/power/ElectronBeam.java
+++ b/services/core/java/com/android/server/display/ElectronBeam.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.server.power;
+package com.android.server.display;
import java.io.PrintWriter;
import java.nio.ByteBuffer;
diff --git a/services/core/java/com/android/server/power/RampAnimator.java b/services/core/java/com/android/server/display/RampAnimator.java
index 4a4f080..6688d6a 100644
--- a/services/core/java/com/android/server/power/RampAnimator.java
+++ b/services/core/java/com/android/server/display/RampAnimator.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.server.power;
+package com.android.server.display;
import android.animation.ValueAnimator;
import android.util.IntProperty;
diff --git a/services/core/java/com/android/server/power/DisplayBlanker.java b/services/core/java/com/android/server/power/DisplayBlanker.java
deleted file mode 100644
index 6072053..0000000
--- a/services/core/java/com/android/server/power/DisplayBlanker.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.server.power;
-
-/**
- * Blanks or unblanks all displays.
- */
-interface DisplayBlanker {
- public void blankAllDisplays();
- public void unblankAllDisplays();
-}
diff --git a/services/core/java/com/android/server/power/DisplayPowerRequest.java b/services/core/java/com/android/server/power/DisplayPowerRequest.java
deleted file mode 100644
index 6061a40..0000000
--- a/services/core/java/com/android/server/power/DisplayPowerRequest.java
+++ /dev/null
@@ -1,135 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.server.power;
-
-import android.os.PowerManager;
-
-/**
- * Describes the requested power state of the display.
- *
- * This object is intended to describe the general characteristics of the
- * power state, such as whether the screen should be on or off and the current
- * brightness controls leaving the {@link DisplayPowerController} to manage the
- * details of how the transitions between states should occur. The goal is for
- * the {@link PowerManagerService} to focus on the global power state and not
- * have to micro-manage screen off animations, auto-brightness and other effects.
- */
-final class DisplayPowerRequest {
- public static final int SCREEN_STATE_OFF = 0;
- public static final int SCREEN_STATE_DOZE = 1;
- public static final int SCREEN_STATE_DIM = 2;
- public static final int SCREEN_STATE_BRIGHT = 3;
-
- // The requested minimum screen power state: off, doze, dim or bright.
- public int screenState;
-
- // If true, the proximity sensor overrides the screen state when an object is
- // nearby, turning it off temporarily until the object is moved away.
- public boolean useProximitySensor;
-
- // The desired screen brightness in the range 0 (minimum / off) to 255 (brightest).
- // The display power controller may choose to clamp the brightness.
- // When auto-brightness is enabled, this field should specify a nominal default
- // value to use while waiting for the light sensor to report enough data.
- public int screenBrightness;
-
- // The screen auto-brightness adjustment factor in the range -1 (dimmer) to 1 (brighter).
- public float screenAutoBrightnessAdjustment;
-
- // If true, enables automatic brightness control.
- public boolean useAutoBrightness;
-
- // If true, prevents the screen from completely turning on if it is currently off.
- // The display does not enter a "ready" state if this flag is true and screen on is
- // blocked. The window manager policy blocks screen on while it prepares the keyguard to
- // prevent the user from seeing intermediate updates.
- //
- // Technically, we may not block the screen itself from turning on (because that introduces
- // extra unnecessary latency) but we do prevent content on screen from becoming
- // visible to the user.
- public boolean blockScreenOn;
-
- public DisplayPowerRequest() {
- screenState = SCREEN_STATE_BRIGHT;
- useProximitySensor = false;
- screenBrightness = PowerManager.BRIGHTNESS_ON;
- screenAutoBrightnessAdjustment = 0.0f;
- useAutoBrightness = false;
- blockScreenOn = false;
- }
-
- public DisplayPowerRequest(DisplayPowerRequest other) {
- copyFrom(other);
- }
-
- // Returns true if we want the screen on in any mode, including doze.
- public boolean wantScreenOnAny() {
- return screenState != SCREEN_STATE_OFF;
- }
-
- // Returns true if we want the screen on in a normal mode, excluding doze.
- // This is usually what we want to tell the rest of the system. For compatibility
- // reasons, we pretend the screen is off when dozing.
- public boolean wantScreenOnNormal() {
- return screenState == SCREEN_STATE_DIM || screenState == SCREEN_STATE_BRIGHT;
- }
-
- public boolean wantLightSensorEnabled() {
- // Specifically, we don't want the light sensor while dozing.
- return useAutoBrightness && wantScreenOnNormal();
- }
-
- public void copyFrom(DisplayPowerRequest other) {
- screenState = other.screenState;
- useProximitySensor = other.useProximitySensor;
- screenBrightness = other.screenBrightness;
- screenAutoBrightnessAdjustment = other.screenAutoBrightnessAdjustment;
- useAutoBrightness = other.useAutoBrightness;
- blockScreenOn = other.blockScreenOn;
- }
-
- @Override
- public boolean equals(Object o) {
- return o instanceof DisplayPowerRequest
- && equals((DisplayPowerRequest)o);
- }
-
- public boolean equals(DisplayPowerRequest other) {
- return other != null
- && screenState == other.screenState
- && useProximitySensor == other.useProximitySensor
- && screenBrightness == other.screenBrightness
- && screenAutoBrightnessAdjustment == other.screenAutoBrightnessAdjustment
- && useAutoBrightness == other.useAutoBrightness
- && blockScreenOn == other.blockScreenOn;
- }
-
- @Override
- public int hashCode() {
- return 0; // don't care
- }
-
- @Override
- public String toString() {
- return "screenState=" + screenState
- + ", useProximitySensor=" + useProximitySensor
- + ", screenBrightness=" + screenBrightness
- + ", screenAutoBrightnessAdjustment=" + screenAutoBrightnessAdjustment
- + ", useAutoBrightness=" + useAutoBrightness
- + ", blockScreenOn=" + blockScreenOn;
- }
-}
diff --git a/services/core/java/com/android/server/power/Notifier.java b/services/core/java/com/android/server/power/Notifier.java
index 264e2e9..c5a71ec 100644
--- a/services/core/java/com/android/server/power/Notifier.java
+++ b/services/core/java/com/android/server/power/Notifier.java
@@ -189,51 +189,6 @@ final class Notifier {
}
/**
- * Called when the screen is turned on.
- */
- public void onScreenOn() {
- if (DEBUG) {
- Slog.d(TAG, "onScreenOn");
- }
-
- try {
- mBatteryStats.noteScreenOn();
- } catch (RemoteException ex) {
- // Ignore
- }
- }
-
- /**
- * Called when the screen is turned off.
- */
- public void onScreenOff() {
- if (DEBUG) {
- Slog.d(TAG, "onScreenOff");
- }
-
- try {
- mBatteryStats.noteScreenOff();
- } catch (RemoteException ex) {
- // Ignore
- }
- }
-
- /**
- * Called when the screen changes brightness.
- */
- public void onScreenBrightness(int brightness) {
- if (DEBUG) {
- Slog.d(TAG, "onScreenBrightness: brightness=" + brightness);
- }
-
- try {
- mBatteryStats.noteScreenBrightness(brightness);
- } catch (RemoteException ex) {
- // Ignore
- }
- }
-
- /**
* Called when the device is waking up from sleep and the
* display is about to be turned on.
*/
diff --git a/services/core/java/com/android/server/power/PowerManagerService.java b/services/core/java/com/android/server/power/PowerManagerService.java
index c251af1..6b2ca4c 100644
--- a/services/core/java/com/android/server/power/PowerManagerService.java
+++ b/services/core/java/com/android/server/power/PowerManagerService.java
@@ -24,7 +24,6 @@ import com.android.server.LocalServices;
import com.android.server.ServiceThread;
import com.android.server.lights.Light;
import com.android.server.lights.LightsManager;
-import com.android.server.twilight.TwilightManager;
import com.android.server.Watchdog;
import android.Manifest;
@@ -39,6 +38,7 @@ import android.database.ContentObserver;
import android.hardware.SensorManager;
import android.hardware.SystemSensorManager;
import android.hardware.display.DisplayManagerInternal;
+import android.hardware.display.DisplayManagerInternal.DisplayPowerRequest;
import android.net.Uri;
import android.os.BatteryManager;
import android.os.Binder;
@@ -177,7 +177,6 @@ public final class PowerManagerService extends com.android.server.SystemService
private PowerManagerHandler mHandler;
private WindowManagerPolicy mPolicy;
private Notifier mNotifier;
- private DisplayPowerController mDisplayPowerController;
private WirelessChargerDetector mWirelessChargerDetector;
private SettingsObserver mSettingsObserver;
private DreamManagerInternal mDreamManager;
@@ -258,9 +257,6 @@ public final class PowerManagerService extends com.android.server.SystemService
// screen is coming up.
private final ScreenOnBlockerImpl mScreenOnBlocker;
- // The display blanker used to turn the screen on or off.
- private final DisplayBlankerImpl mDisplayBlanker;
-
// True if systemReady() has been called.
private boolean mSystemReady;
@@ -417,7 +413,6 @@ public final class PowerManagerService extends com.android.server.SystemService
mHoldingDisplaySuspendBlocker = true;
mScreenOnBlocker = new ScreenOnBlockerImpl();
- mDisplayBlanker = new DisplayBlankerImpl();
mWakefulness = WAKEFULNESS_AWAKE;
}
@@ -457,7 +452,7 @@ public final class PowerManagerService extends com.android.server.SystemService
// into the activity manager to check permissions. Unfortunately the
// activity manager is not running when the constructor is called, so we
// have to defer setting the screen state until this point.
- mDisplayBlanker.unblankAllDisplays();
+ mDisplayPowerCallbacks.unblankAllDisplays();
}
void setPolicy(WindowManagerPolicy policy) {
@@ -484,20 +479,16 @@ public final class PowerManagerService extends com.android.server.SystemService
mAppOps, createSuspendBlockerLocked("PowerManagerService.Broadcasts"),
mScreenOnBlocker, mPolicy);
- // The display power controller runs on the power manager service's
- // own handler thread to ensure timely operation.
- mDisplayPowerController = new DisplayPowerController(mHandler.getLooper(),
- mContext, mNotifier, mLightsManager,
- LocalServices.getService(TwilightManager.class), sensorManager,
- mDisplaySuspendBlocker, mDisplayBlanker,
- mDisplayPowerControllerCallbacks, mHandler);
-
mWirelessChargerDetector = new WirelessChargerDetector(sensorManager,
createSuspendBlockerLocked("PowerManagerService.WirelessChargerDetector"),
mHandler);
mSettingsObserver = new SettingsObserver(mHandler);
mAttentionLight = mLightsManager.getLight(LightsManager.LIGHT_ID_ATTENTION);
+ // Initialize display power management.
+ mDisplayManagerInternal.initPowerManagement(
+ mDisplayPowerCallbacks, mHandler, sensorManager);
+
// Register for broadcasts from other components of the system.
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_BATTERY_CHANGED);
@@ -810,7 +801,7 @@ public final class PowerManagerService extends com.android.server.SystemService
return true;
case PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK:
- return mSystemReady && mDisplayPowerController.isProximitySensorAvailable();
+ return mSystemReady && mDisplayManagerInternal.isProximitySensorAvailable();
default:
return false;
@@ -1633,7 +1624,7 @@ public final class PowerManagerService extends com.android.server.SystemService
mDisplayPowerRequest.blockScreenOn = mScreenOnBlocker.isHeld();
- mDisplayReady = mDisplayPowerController.requestPowerState(mDisplayPowerRequest,
+ mDisplayReady = mDisplayManagerInternal.requestPowerState(mDisplayPowerRequest,
mRequestWaitForNegativeProximity);
mRequestWaitForNegativeProximity = false;
@@ -1675,8 +1666,10 @@ public final class PowerManagerService extends com.android.server.SystemService
return DisplayPowerRequest.SCREEN_STATE_DIM;
}
- private final DisplayPowerController.Callbacks mDisplayPowerControllerCallbacks =
- new DisplayPowerController.Callbacks() {
+ private final DisplayManagerInternal.DisplayPowerCallbacks mDisplayPowerCallbacks =
+ new DisplayManagerInternal.DisplayPowerCallbacks() {
+ private boolean mBlanked;
+
@Override
public void onStateChanged() {
synchronized (mLock) {
@@ -1704,6 +1697,51 @@ public final class PowerManagerService extends com.android.server.SystemService
updatePowerStateLocked();
}
}
+
+ @Override
+ public void acquireSuspendBlocker() {
+ mDisplaySuspendBlocker.acquire();
+ }
+
+ @Override
+ public void releaseSuspendBlocker() {
+ mDisplaySuspendBlocker.release();
+ }
+
+ @Override
+ public void blankAllDisplays() {
+ synchronized (this) {
+ mBlanked = true;
+ mDisplayManagerInternal.blankAllDisplaysFromPowerManager();
+ if (!mDecoupleInteractiveModeFromDisplayConfig) {
+ setInteractiveModeLocked(false);
+ }
+ if (!mDecoupleAutoSuspendModeFromDisplayConfig) {
+ setAutoSuspendModeLocked(true);
+ }
+ }
+ }
+
+ @Override
+ public void unblankAllDisplays() {
+ synchronized (this) {
+ if (!mDecoupleAutoSuspendModeFromDisplayConfig) {
+ setAutoSuspendModeLocked(false);
+ }
+ if (!mDecoupleInteractiveModeFromDisplayConfig) {
+ setInteractiveModeLocked(true);
+ }
+ mDisplayManagerInternal.unblankAllDisplaysFromPowerManager();
+ mBlanked = false;
+ }
+ }
+
+ @Override
+ public String toString() {
+ synchronized (this) {
+ return "blanked=" + mBlanked;
+ }
+ }
};
private boolean shouldUseProximitySensorLocked() {
@@ -2018,7 +2056,6 @@ public final class PowerManagerService extends com.android.server.SystemService
private void dumpInternal(PrintWriter pw) {
pw.println("POWER MANAGER (dumpsys power)\n");
- final DisplayPowerController dpc;
final WirelessChargerDetector wcd;
synchronized (mLock) {
pw.println("Power Manager State:");
@@ -2123,16 +2160,11 @@ public final class PowerManagerService extends com.android.server.SystemService
pw.println("Screen On Blocker: " + mScreenOnBlocker);
pw.println();
- pw.println("Display Blanker: " + mDisplayBlanker);
+ pw.println("Display Power: " + mDisplayPowerCallbacks);
- dpc = mDisplayPowerController;
wcd = mWirelessChargerDetector;
}
- if (dpc != null) {
- dpc.dump(pw);
- }
-
if (wcd != null) {
wcd.dump(pw);
}
@@ -2467,45 +2499,6 @@ public final class PowerManagerService extends com.android.server.SystemService
}
}
- private final class DisplayBlankerImpl implements DisplayBlanker {
- private boolean mBlanked;
-
- @Override
- public void blankAllDisplays() {
- synchronized (this) {
- mBlanked = true;
- mDisplayManagerInternal.blankAllDisplaysFromPowerManager();
- if (!mDecoupleInteractiveModeFromDisplayConfig) {
- setInteractiveModeLocked(false);
- }
- if (!mDecoupleAutoSuspendModeFromDisplayConfig) {
- setAutoSuspendModeLocked(true);
- }
- }
- }
-
- @Override
- public void unblankAllDisplays() {
- synchronized (this) {
- if (!mDecoupleAutoSuspendModeFromDisplayConfig) {
- setAutoSuspendModeLocked(false);
- }
- if (!mDecoupleInteractiveModeFromDisplayConfig) {
- setInteractiveModeLocked(true);
- }
- mDisplayManagerInternal.unblankAllDisplaysFromPowerManager();
- mBlanked = false;
- }
- }
-
- @Override
- public String toString() {
- synchronized (this) {
- return "blanked=" + mBlanked;
- }
- }
- }
-
private final class BinderService extends IPowerManager.Stub {
@Override // Binder call
public void acquireWakeLockWithUid(IBinder lock, int flags, String tag,
@@ -2830,7 +2823,7 @@ public final class PowerManagerService extends com.android.server.SystemService
*
* @param adj The overridden brightness, or Float.NaN to disable the override.
*
- * @see Settings.System#SCREEN_AUTO_BRIGHTNESS_ADJ
+ * @see android.provider.Settings.System#SCREEN_AUTO_BRIGHTNESS_ADJ
*/
@Override // Binder call
public void setTemporaryScreenAutoBrightnessAdjustmentSettingOverride(float adj) {