Skip to content

Commit b9b5695

Browse files
Craig MautnerAndroid (Google) Code Review
authored andcommitted
Merge "Eliminate special battery calls by WindowManager" into jb-mr1-dev
2 parents 6cf3b92 + 259328c commit b9b5695

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
@@ -267,13 +267,6 @@ public final class PowerManager {
267267
*/
268268
public static final int USER_ACTIVITY_FLAG_NO_CHANGE_LIGHTS = 1 << 0;
269269

270-
/**
271-
* Special wake lock tag used for the wake lock in the Window Manager that handles the
272-
* {@link android.view.WindowManager.LayoutParams#FLAG_KEEP_SCREEN_ON} flag.
273-
* @hide
274-
*/
275-
public static final String KEEP_SCREEN_ON_FLAG_TAG = "KEEP_SCREEN_ON_FLAG";
276-
277270
/**
278271
* Go to sleep reason code: Going to sleep due by user request.
279272
* @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)