summaryrefslogtreecommitdiff
path: root/services/java/com/android/server/power/PowerManagerService.java
diff options
context:
space:
mode:
authorDianne Hackborn <hackbod@google.com>2013-05-17 11:27:57 -0700
committerDianne Hackborn <hackbod@google.com>2013-05-20 16:49:46 -0700
commit713df150b92a0a5eea877f99405e31eefbf93a09 (patch)
treeddbd542da84e2f131f924d411fa1f11dcee51c3a /services/java/com/android/server/power/PowerManagerService.java
parentea0735ff12a444ae7e498132ffd7096bfa2f3925 (diff)
Add app ops for wake locks.
Currently only supports auditing, not disabling. Change-Id: Ie85f02c29b490d96e073f54d59e165d48c7c00c9
Diffstat (limited to 'services/java/com/android/server/power/PowerManagerService.java')
-rw-r--r--services/java/com/android/server/power/PowerManagerService.java60
1 files changed, 41 insertions, 19 deletions
diff --git a/services/java/com/android/server/power/PowerManagerService.java b/services/java/com/android/server/power/PowerManagerService.java
index 6c283faf7934..5c81cde27809 100644
--- a/services/java/com/android/server/power/PowerManagerService.java
+++ b/services/java/com/android/server/power/PowerManagerService.java
@@ -16,6 +16,7 @@
package com.android.server.power;
+import com.android.internal.app.IAppOpsService;
import com.android.internal.app.IBatteryStats;
import com.android.server.BatteryService;
import com.android.server.EventLogTags;
@@ -172,6 +173,7 @@ public final class PowerManagerService extends IPowerManager.Stub
private BatteryService mBatteryService;
private DisplayManagerService mDisplayManagerService;
private IBatteryStats mBatteryStats;
+ private IAppOpsService mAppOps;
private HandlerThread mHandlerThread;
private PowerManagerHandler mHandler;
private WindowManagerPolicy mPolicy;
@@ -394,11 +396,12 @@ public final class PowerManagerService extends IPowerManager.Stub
*/
public void init(Context context, LightsService ls,
ActivityManagerService am, BatteryService bs, IBatteryStats bss,
- DisplayManagerService dm) {
+ IAppOpsService appOps, DisplayManagerService dm) {
mContext = context;
mLightsService = ls;
mBatteryService = bs;
mBatteryStats = bss;
+ mAppOps = appOps;
mDisplayManagerService = dm;
mHandlerThread = new HandlerThread(TAG);
mHandlerThread.start();
@@ -437,7 +440,7 @@ public final class PowerManagerService extends IPowerManager.Stub
// The notifier runs on the system server's main looper so as not to interfere
// with the animations and other critical functions of the power manager.
mNotifier = new Notifier(Looper.getMainLooper(), mContext, mBatteryStats,
- createSuspendBlockerLocked("PowerManagerService.Broadcasts"),
+ mAppOps, createSuspendBlockerLocked("PowerManagerService.Broadcasts"),
mScreenOnBlocker, mPolicy);
// The display power controller runs on the power manager service's
@@ -572,10 +575,14 @@ public final class PowerManagerService extends IPowerManager.Stub
}
@Override // Binder call
- public void acquireWakeLock(IBinder lock, int flags, String tag, WorkSource ws) {
+ public void acquireWakeLock(IBinder lock, int flags, String tag, String packageName,
+ WorkSource ws) {
if (lock == null) {
throw new IllegalArgumentException("lock must not be null");
}
+ if (packageName == null) {
+ throw new IllegalArgumentException("packageName must not be null");
+ }
PowerManager.validateWakeLockParameters(flags, tag);
mContext.enforceCallingOrSelfPermission(android.Manifest.permission.WAKE_LOCK, null);
@@ -590,14 +597,14 @@ public final class PowerManagerService extends IPowerManager.Stub
final int pid = Binder.getCallingPid();
final long ident = Binder.clearCallingIdentity();
try {
- acquireWakeLockInternal(lock, flags, tag, ws, uid, pid);
+ acquireWakeLockInternal(lock, flags, tag, packageName, ws, uid, pid);
} finally {
Binder.restoreCallingIdentity(ident);
}
}
- private void acquireWakeLockInternal(IBinder lock, int flags, String tag, WorkSource ws,
- int uid, int pid) {
+ private void acquireWakeLockInternal(IBinder lock, int flags, String tag, String packageName,
+ WorkSource ws, int uid, int pid) {
synchronized (mLock) {
if (DEBUG_SPEW) {
Slog.d(TAG, "acquireWakeLockInternal: lock=" + Objects.hashCode(lock)
@@ -612,11 +619,11 @@ public final class PowerManagerService extends IPowerManager.Stub
if (!wakeLock.hasSameProperties(flags, tag, ws, uid, pid)) {
// Update existing wake lock. This shouldn't happen but is harmless.
notifyWakeLockReleasedLocked(wakeLock);
- wakeLock.updateProperties(flags, tag, ws, uid, pid);
+ wakeLock.updateProperties(flags, tag, packageName, ws, uid, pid);
notifyWakeLockAcquiredLocked(wakeLock);
}
} else {
- wakeLock = new WakeLock(lock, flags, tag, ws, uid, pid);
+ wakeLock = new WakeLock(lock, flags, tag, packageName, ws, uid, pid);
try {
lock.linkToDeath(wakeLock, 0);
} catch (RemoteException ex) {
@@ -785,14 +792,16 @@ public final class PowerManagerService extends IPowerManager.Stub
private void notifyWakeLockAcquiredLocked(WakeLock wakeLock) {
if (mSystemReady) {
- mNotifier.onWakeLockAcquired(wakeLock.mFlags, wakeLock.mTag,
+ wakeLock.mNotifiedAcquired = true;
+ mNotifier.onWakeLockAcquired(wakeLock.mFlags, wakeLock.mTag, wakeLock.mPackageName,
wakeLock.mOwnerUid, wakeLock.mOwnerPid, wakeLock.mWorkSource);
}
}
private void notifyWakeLockReleasedLocked(WakeLock wakeLock) {
- if (mSystemReady) {
- mNotifier.onWakeLockReleased(wakeLock.mFlags, wakeLock.mTag,
+ if (mSystemReady && wakeLock.mNotifiedAcquired) {
+ wakeLock.mNotifiedAcquired = false;
+ mNotifier.onWakeLockReleased(wakeLock.mFlags, wakeLock.mTag, wakeLock.mPackageName,
wakeLock.mOwnerUid, wakeLock.mOwnerPid, wakeLock.mWorkSource);
}
}
@@ -2428,15 +2437,18 @@ public final class PowerManagerService extends IPowerManager.Stub
public final IBinder mLock;
public int mFlags;
public String mTag;
+ public final String mPackageName;
public WorkSource mWorkSource;
- public int mOwnerUid;
- public int mOwnerPid;
+ public final int mOwnerUid;
+ public final int mOwnerPid;
+ public boolean mNotifiedAcquired;
- public WakeLock(IBinder lock, int flags, String tag, WorkSource workSource,
- int ownerUid, int ownerPid) {
+ public WakeLock(IBinder lock, int flags, String tag, String packageName,
+ WorkSource workSource, int ownerUid, int ownerPid) {
mLock = lock;
mFlags = flags;
mTag = tag;
+ mPackageName = packageName;
mWorkSource = copyWorkSource(workSource);
mOwnerUid = ownerUid;
mOwnerPid = ownerPid;
@@ -2456,13 +2468,23 @@ public final class PowerManagerService extends IPowerManager.Stub
&& mOwnerPid == ownerPid;
}
- public void updateProperties(int flags, String tag, WorkSource workSource,
- int ownerUid, int ownerPid) {
+ public void updateProperties(int flags, String tag, String packageName,
+ WorkSource workSource, int ownerUid, int ownerPid) {
+ if (!mPackageName.equals(packageName)) {
+ throw new IllegalStateException("Existing wake lock package name changed: "
+ + mPackageName + " to " + packageName);
+ }
+ if (mOwnerUid != ownerUid) {
+ throw new IllegalStateException("Existing wake lock uid changed: "
+ + mOwnerUid + " to " + ownerUid);
+ }
+ if (mOwnerPid != ownerPid) {
+ throw new IllegalStateException("Existing wake lock pid changed: "
+ + mOwnerPid + " to " + ownerPid);
+ }
mFlags = flags;
mTag = tag;
updateWorkSource(workSource);
- mOwnerUid = ownerUid;
- mOwnerPid = ownerPid;
}
public boolean hasSameWorkSource(WorkSource workSource) {