diff options
author | Dianne Hackborn <hackbod@google.com> | 2013-05-17 11:27:57 -0700 |
---|---|---|
committer | Dianne Hackborn <hackbod@google.com> | 2013-05-20 16:49:46 -0700 |
commit | 713df150b92a0a5eea877f99405e31eefbf93a09 (patch) | |
tree | ddbd542da84e2f131f924d411fa1f11dcee51c3a /services/java/com/android/server/power/PowerManagerService.java | |
parent | ea0735ff12a444ae7e498132ffd7096bfa2f3925 (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.java | 60 |
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) { |