Skip to content

Commit 259328c

Browse files
author
Craig Mautner
committed
Eliminate special battery calls by WindowManager
Previous to this change the WindowManager was notifying the BatteryDtatsService about windows that keep the screen on. WM used a custom WakeLock tag to indicate to PowerManagerService that it had already notified the BatteryStatsService. This change eliminates WindowManager notifying the BatteryStatsService and lets PowerManagerService do the job. Fixes bug 7030326. Change-Id: I666dc6ef8f094b8d3d109fea6876be058e057b4f
1 parent f967807 commit 259328c

File tree

3 files changed

+31
-84
lines changed

3 files changed

+31
-84
lines changed

core/java/android/os/PowerManager.java

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -274,13 +274,6 @@ public final class PowerManager {
274274
*/
275275
public static final int USER_ACTIVITY_FLAG_NO_CHANGE_LIGHTS = 1 << 0;
276276

277-
/**
278-
* Special wake lock tag used for the wake lock in the Window Manager that handles the
279-
* {@link android.view.WindowManager.LayoutParams#FLAG_KEEP_SCREEN_ON} flag.
280-
* @hide
281-
*/
282-
public static final String KEEP_SCREEN_ON_FLAG_TAG = "KEEP_SCREEN_ON_FLAG";
283-
284277
/**
285278
* Go to sleep reason code: Going to sleep due by user request.
286279
* @hide

services/java/com/android/server/power/Notifier.java

Lines changed: 16 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@
2828
import android.os.Looper;
2929
import android.os.Message;
3030
import android.os.PowerManager;
31-
import android.os.Process;
3231
import android.os.RemoteException;
3332
import android.os.SystemClock;
3433
import android.os.WorkSource;
@@ -117,19 +116,15 @@ public void onWakeLockAcquired(int flags, String tag, int ownerUid, int ownerPid
117116
+ ", workSource=" + workSource);
118117
}
119118

120-
if (!isWakeLockAlreadyReportedToBatteryStats(tag, ownerUid)) {
121-
try {
122-
final int monitorType = getBatteryStatsWakeLockMonitorType(flags);
123-
if (workSource != null) {
124-
mBatteryStats.noteStartWakelockFromSource(
125-
workSource, ownerPid, tag, monitorType);
126-
} else {
127-
mBatteryStats.noteStartWakelock(
128-
ownerUid, ownerPid, tag, monitorType);
129-
}
130-
} catch (RemoteException ex) {
131-
// Ignore
119+
try {
120+
final int monitorType = getBatteryStatsWakeLockMonitorType(flags);
121+
if (workSource != null) {
122+
mBatteryStats.noteStartWakelockFromSource(workSource, ownerPid, tag, monitorType);
123+
} else {
124+
mBatteryStats.noteStartWakelock(ownerUid, ownerPid, tag, monitorType);
132125
}
126+
} catch (RemoteException ex) {
127+
// Ignore
133128
}
134129
}
135130

@@ -144,30 +139,18 @@ public void onWakeLockReleased(int flags, String tag, int ownerUid, int ownerPid
144139
+ ", workSource=" + workSource);
145140
}
146141

147-
if (!isWakeLockAlreadyReportedToBatteryStats(tag, ownerUid)) {
148-
try {
149-
final int monitorType = getBatteryStatsWakeLockMonitorType(flags);
150-
if (workSource != null) {
151-
mBatteryStats.noteStopWakelockFromSource(
152-
workSource, ownerPid, tag, monitorType);
153-
} else {
154-
mBatteryStats.noteStopWakelock(
155-
ownerUid, ownerPid, tag, monitorType);
156-
}
157-
} catch (RemoteException ex) {
158-
// Ignore
142+
try {
143+
final int monitorType = getBatteryStatsWakeLockMonitorType(flags);
144+
if (workSource != null) {
145+
mBatteryStats.noteStopWakelockFromSource(workSource, ownerPid, tag, monitorType);
146+
} else {
147+
mBatteryStats.noteStopWakelock(ownerUid, ownerPid, tag, monitorType);
159148
}
149+
} catch (RemoteException ex) {
150+
// Ignore
160151
}
161152
}
162153

163-
private static boolean isWakeLockAlreadyReportedToBatteryStats(String tag, int uid) {
164-
// The window manager already takes care of reporting battery stats associated
165-
// with the use of the KEEP_SCREEN_ON_FLAG.
166-
// TODO: Use a WorkSource to handle this situation instead of hardcoding it here.
167-
return uid == Process.SYSTEM_UID
168-
&& tag.equals(PowerManager.KEEP_SCREEN_ON_FLAG_TAG);
169-
}
170-
171154
private static int getBatteryStatsWakeLockMonitorType(int flags) {
172155
switch (flags & PowerManager.WAKE_LOCK_LEVEL_MASK) {
173156
case PowerManager.PARTIAL_WAKE_LOCK:

services/java/com/android/server/wm/WindowManagerService.java

Lines changed: 15 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,7 @@
9494
import android.os.SystemProperties;
9595
import android.os.TokenWatcher;
9696
import android.os.Trace;
97+
import android.os.WorkSource;
9798
import android.provider.Settings;
9899
import android.util.DisplayMetrics;
99100
import android.util.EventLog;
@@ -923,7 +924,7 @@ private WindowManagerService(Context context, PowerManagerService pm,
923924
mContext.registerReceiver(mBroadcastReceiver, filter);
924925

925926
mHoldingScreenWakeLock = pmc.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK
926-
| PowerManager.ON_AFTER_RELEASE, PowerManager.KEEP_SCREEN_ON_FLAG_TAG);
927+
| PowerManager.ON_AFTER_RELEASE, TAG);
927928
mHoldingScreenWakeLock.setReferenceCounted(false);
928929

929930
mInputManager = new InputManagerService(context, mInputMonitor);
@@ -7020,7 +7021,7 @@ final class H extends Handler {
70207021
public static final int REPORT_APPLICATION_TOKEN_WINDOWS = 8;
70217022
public static final int REPORT_APPLICATION_TOKEN_DRAWN = 9;
70227023
public static final int WINDOW_FREEZE_TIMEOUT = 11;
7023-
public static final int HOLD_SCREEN_CHANGED = 12;
7024+
70247025
public static final int APP_TRANSITION_TIMEOUT = 13;
70257026
public static final int PERSIST_ANIMATION_SCALE = 14;
70267027
public static final int FORCE_GC = 15;
@@ -7041,8 +7042,6 @@ final class H extends Handler {
70417042
public static final int SET_TRANSPARENT_REGION = ANIMATOR_WHAT_OFFSET + 1;
70427043
public static final int CLEAR_PENDING_ACTIONS = ANIMATOR_WHAT_OFFSET + 2;
70437044

7044-
private Session mLastReportedHold;
7045-
70467045
public H() {
70477046
}
70487047

@@ -7294,33 +7293,6 @@ public void handleMessage(Message msg) {
72947293
break;
72957294
}
72967295

7297-
case HOLD_SCREEN_CHANGED: {
7298-
Session oldHold;
7299-
Session newHold;
7300-
synchronized (mWindowMap) {
7301-
oldHold = mLastReportedHold;
7302-
newHold = (Session)msg.obj;
7303-
mLastReportedHold = newHold;
7304-
}
7305-
7306-
if (oldHold != newHold) {
7307-
try {
7308-
if (oldHold != null) {
7309-
mBatteryStats.noteStopWakelock(oldHold.mUid, -1,
7310-
"window",
7311-
BatteryStats.WAKE_TYPE_WINDOW);
7312-
}
7313-
if (newHold != null) {
7314-
mBatteryStats.noteStartWakelock(newHold.mUid, -1,
7315-
"window",
7316-
BatteryStats.WAKE_TYPE_WINDOW);
7317-
}
7318-
} catch (RemoteException e) {
7319-
}
7320-
}
7321-
break;
7322-
}
7323-
73247296
case APP_TRANSITION_TIMEOUT: {
73257297
synchronized (mWindowMap) {
73267298
if (mNextAppTransition != WindowManagerPolicy.TRANSIT_UNSET) {
@@ -9134,7 +9106,7 @@ private final void performLayoutAndPlaceSurfacesLockedInner(
91349106
// Finally update all input windows now that the window changes have stabilized.
91359107
mInputMonitor.updateInputWindowsLw(true /*force*/);
91369108

9137-
setHoldScreenLocked(mInnerFields.mHoldScreen != null);
9109+
setHoldScreenLocked(mInnerFields.mHoldScreen);
91389110
if (!mDisplayFrozen) {
91399111
if (mInnerFields.mScreenBrightness < 0 || mInnerFields.mScreenBrightness > 1.0f) {
91409112
mPowerManager.setScreenBrightnessOverrideFromWindowManager(-1);
@@ -9149,11 +9121,6 @@ private final void performLayoutAndPlaceSurfacesLockedInner(
91499121
toBrightnessOverride(mInnerFields.mButtonBrightness));
91509122
}
91519123
}
9152-
if (mInnerFields.mHoldScreen != mHoldingScreenOn) {
9153-
mHoldingScreenOn = mInnerFields.mHoldScreen;
9154-
Message m = mH.obtainMessage(H.HOLD_SCREEN_CHANGED, mInnerFields.mHoldScreen);
9155-
mH.sendMessage(m);
9156-
}
91579124

91589125
if (mTurnOnScreen) {
91599126
if (DEBUG_VISIBILITY) Slog.v(TAG, "Turning screen on after layout!");
@@ -9237,13 +9204,17 @@ public void waitForWindowDrawn(IBinder token, IRemoteCallback callback) {
92379204
}
92389205
}
92399206

9240-
/**
9241-
* Must be called with the main window manager lock held.
9242-
*/
9243-
void setHoldScreenLocked(boolean holding) {
9244-
boolean state = mHoldingScreenWakeLock.isHeld();
9245-
if (holding != state) {
9246-
if (holding) {
9207+
void setHoldScreenLocked(final Session newHoldScreen) {
9208+
final boolean hold = newHoldScreen != null;
9209+
9210+
if (hold && mHoldingScreenOn != newHoldScreen) {
9211+
mHoldingScreenWakeLock.setWorkSource(new WorkSource(newHoldScreen.mUid));
9212+
}
9213+
mHoldingScreenOn = newHoldScreen;
9214+
9215+
final boolean state = mHoldingScreenWakeLock.isHeld();
9216+
if (hold != state) {
9217+
if (hold) {
92479218
mPolicy.screenOnStartedLw();
92489219
mHoldingScreenWakeLock.acquire();
92499220
} else {

0 commit comments

Comments
 (0)