diff options
author | Dianne Hackborn <hackbod@google.com> | 2014-05-15 21:57:27 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2014-05-15 21:57:27 +0000 |
commit | 0a3103e755218c1ee48c7d078892eb6b42cc2081 (patch) | |
tree | 175056d0bbc70de07dfb163c00d2fe20c5c1dee9 /services | |
parent | 9e1e95f6e3af79f0d659afa2476e462fdac2f5e2 (diff) | |
parent | cbefd8dd2befcb768f911a63becc427ec4c13250 (diff) | |
download | frameworks_base-0a3103e755218c1ee48c7d078892eb6b42cc2081.zip frameworks_base-0a3103e755218c1ee48c7d078892eb6b42cc2081.tar.gz frameworks_base-0a3103e755218c1ee48c7d078892eb6b42cc2081.tar.bz2 |
Merge "Battery stats more wake history, power save mode."
Diffstat (limited to 'services')
3 files changed, 103 insertions, 20 deletions
diff --git a/services/core/java/com/android/server/am/BatteryStatsService.java b/services/core/java/com/android/server/am/BatteryStatsService.java index dd12a65..908bfbd 100644 --- a/services/core/java/com/android/server/am/BatteryStatsService.java +++ b/services/core/java/com/android/server/am/BatteryStatsService.java @@ -27,6 +27,7 @@ import android.os.Binder; import android.os.Handler; import android.os.IBinder; import android.os.Parcel; +import android.os.PowerManagerInternal; import android.os.Process; import android.os.ServiceManager; import android.os.SystemClock; @@ -40,6 +41,7 @@ import android.util.Slog; import com.android.internal.app.IBatteryStats; import com.android.internal.os.BatteryStatsImpl; import com.android.internal.os.PowerProfile; +import com.android.server.LocalServices; import java.io.FileDescriptor; import java.io.PrintWriter; @@ -49,7 +51,8 @@ import java.util.List; * All information we are collecting about things that can happen that impact * battery life. */ -public final class BatteryStatsService extends IBatteryStats.Stub { +public final class BatteryStatsService extends IBatteryStats.Stub + implements PowerManagerInternal.LowPowerModeListener { static final String TAG = "BatteryStatsService"; static IBatteryStats sService; @@ -58,6 +61,7 @@ public final class BatteryStatsService extends IBatteryStats.Stub { Context mContext; private boolean mBluetoothPendingStats; private BluetoothHeadset mBluetoothHeadset; + PowerManagerInternal mPowerManagerInternal; BatteryStatsService(String filename, Handler handler) { mStats = new BatteryStatsImpl(filename, handler); @@ -70,6 +74,9 @@ public final class BatteryStatsService extends IBatteryStats.Stub { mStats.setRadioScanningTimeout(mContext.getResources().getInteger( com.android.internal.R.integer.config_radioScanningTimeout) * 1000L); + mPowerManagerInternal = LocalServices.getService(PowerManagerInternal.class); + mPowerManagerInternal.registerLowPowerModeObserver(this); + mStats.noteLowPowerMode(mPowerManagerInternal.getLowPowerModeEnabled()); (new WakeupReasonThread()).start(); } @@ -88,7 +95,14 @@ public final class BatteryStatsService extends IBatteryStats.Stub { sService = asInterface(b); return sService; } - + + @Override + public void onLowPowerModeChanged(boolean enabled) { + synchronized (mStats) { + mStats.noteLowPowerMode(enabled); + } + } + /** * @return the current statistics object, which may be modified * to reflect events that affect battery usage. You must lock the @@ -154,11 +168,11 @@ public final class BatteryStatsService extends IBatteryStats.Stub { } } - public void noteStopWakelock(int uid, int pid, String name, int type) { + public void noteStopWakelock(int uid, int pid, String name, String historyName, int type) { enforceCallingPermission(); synchronized (mStats) { - mStats.noteStopWakeLocked(uid, pid, name, type, SystemClock.elapsedRealtime(), - SystemClock.uptimeMillis()); + mStats.noteStopWakeLocked(uid, pid, name, historyName, type, + SystemClock.elapsedRealtime(), SystemClock.uptimeMillis()); } } @@ -171,20 +185,21 @@ public final class BatteryStatsService extends IBatteryStats.Stub { } } - public void noteChangeWakelockFromSource(WorkSource ws, int pid, String name, int type, - WorkSource newWs, int newPid, String newName, + public void noteChangeWakelockFromSource(WorkSource ws, int pid, String name, + String historyName, int type, WorkSource newWs, int newPid, String newName, String newHistoryName, int newType, boolean newUnimportantForLogging) { enforceCallingPermission(); synchronized (mStats) { - mStats.noteChangeWakelockFromSourceLocked(ws, pid, name, type, + mStats.noteChangeWakelockFromSourceLocked(ws, pid, name, historyName, type, newWs, newPid, newName, newHistoryName, newType, newUnimportantForLogging); } } - public void noteStopWakelockFromSource(WorkSource ws, int pid, String name, int type) { + public void noteStopWakelockFromSource(WorkSource ws, int pid, String name, String historyName, + int type) { enforceCallingPermission(); synchronized (mStats) { - mStats.noteStopWakeFromSourceLocked(ws, pid, name, type); + mStats.noteStopWakeFromSourceLocked(ws, pid, name, historyName, type); } } @@ -608,10 +623,31 @@ public final class BatteryStatsService extends IBatteryStats.Stub { pw.println(" --charged: only output data since last charged."); pw.println(" --reset: reset the stats, clearing all current data."); pw.println(" --write: force write current collected stats to disk."); + pw.println(" --enable: enable an option: full-wake-history."); + pw.println(" --disable: disable an option: full-wake-history."); pw.println(" -h: print this help text."); pw.println(" <package.name>: optional name of package to filter output by."); } + private int doEnableOrDisable(PrintWriter pw, int i, String[] args, boolean enable) { + i++; + if (i >= args.length) { + pw.println("Missing option argument for " + (enable ? "--enable" : "--disable")); + dumpHelp(pw); + return -1; + } + if ("full-wake-history".equals(args[i])) { + synchronized (mStats) { + mStats.setRecordAllWakeLocksLocked(enable); + } + } else { + pw.println("Unknown enable/disable option: " + args[i]); + dumpHelp(pw); + return -1; + } + return i; + } + @Override protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) { if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.DUMP) @@ -662,6 +698,20 @@ public final class BatteryStatsService extends IBatteryStats.Stub { pw.println("Battery stats written."); noOutput = true; } + } else if ("--enable".equals(arg)) { + i = doEnableOrDisable(pw, i, args, true); + if (i < 0) { + return; + } + pw.println("Enabled: " + args[i]); + return; + } else if ("--disable".equals(arg)) { + i = doEnableOrDisable(pw, i, args, false); + if (i < 0) { + return; + } + pw.println("Disabled: " + args[i]); + return; } else if ("-h".equals(arg)) { dumpHelp(pw); return; diff --git a/services/core/java/com/android/server/power/Notifier.java b/services/core/java/com/android/server/power/Notifier.java index 2d6cc7c..e244bde 100644 --- a/services/core/java/com/android/server/power/Notifier.java +++ b/services/core/java/com/android/server/power/Notifier.java @@ -190,14 +190,14 @@ final class Notifier { + ", workSource=" + newWorkSource); } try { - mBatteryStats.noteChangeWakelockFromSource(workSource, ownerPid, tag, monitorType, - newWorkSource, newOwnerPid, newTag, newHistoryTag, + mBatteryStats.noteChangeWakelockFromSource(workSource, ownerPid, tag, historyTag, + monitorType, newWorkSource, newOwnerPid, newTag, newHistoryTag, newMonitorType, unimportantForLogging); } catch (RemoteException ex) { // Ignore } } else { - onWakeLockReleased(flags, tag, packageName, ownerUid, ownerPid, workSource); + onWakeLockReleased(flags, tag, packageName, ownerUid, ownerPid, workSource, historyTag); onWakeLockAcquired(newFlags, newTag, newPackageName, newOwnerUid, newOwnerPid, newWorkSource, newHistoryTag); } @@ -207,7 +207,7 @@ final class Notifier { * Called when a wake lock is released. */ public void onWakeLockReleased(int flags, String tag, String packageName, - int ownerUid, int ownerPid, WorkSource workSource) { + int ownerUid, int ownerPid, WorkSource workSource, String historyTag) { if (DEBUG) { Slog.d(TAG, "onWakeLockReleased: flags=" + flags + ", tag=\"" + tag + "\", packageName=" + packageName @@ -218,9 +218,10 @@ final class Notifier { try { final int monitorType = getBatteryStatsWakeLockMonitorType(flags); if (workSource != null) { - mBatteryStats.noteStopWakelockFromSource(workSource, ownerPid, tag, monitorType); + mBatteryStats.noteStopWakelockFromSource(workSource, ownerPid, tag, historyTag, + monitorType); } else { - mBatteryStats.noteStopWakelock(ownerUid, ownerPid, tag, monitorType); + mBatteryStats.noteStopWakelock(ownerUid, ownerPid, tag, historyTag, monitorType); mAppOps.finishOperation(AppOpsManager.getToken(mAppOps), AppOpsManager.OP_WAKE_LOCK, ownerUid, packageName); } diff --git a/services/core/java/com/android/server/power/PowerManagerService.java b/services/core/java/com/android/server/power/PowerManagerService.java index 03941c6..f0b7861 100644 --- a/services/core/java/com/android/server/power/PowerManagerService.java +++ b/services/core/java/com/android/server/power/PowerManagerService.java @@ -18,6 +18,7 @@ package com.android.server.power; import com.android.internal.app.IAppOpsService; import com.android.internal.app.IBatteryStats; +import com.android.internal.os.BackgroundThread; import com.android.server.BatteryService; import com.android.server.EventLogTags; import com.android.server.LocalServices; @@ -400,7 +401,10 @@ public final class PowerManagerService extends com.android.server.SystemService private long mLastWarningAboutUserActivityPermission = Long.MIN_VALUE; // If true, the device is in low power mode. - private static boolean mLowPowerModeEnabled; + private boolean mLowPowerModeEnabled; + + private final ArrayList<PowerManagerInternal.LowPowerModeListener> mLowPowerModeListeners + = new ArrayList<PowerManagerInternal.LowPowerModeListener>(); private native void nativeInit(); @@ -623,11 +627,24 @@ public final class PowerManagerService extends com.android.server.SystemService Settings.System.SCREEN_BRIGHTNESS_MODE, Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL, UserHandle.USER_CURRENT); - boolean lowPowerModeEnabled = Settings.Global.getInt(resolver, + final boolean lowPowerModeEnabled = Settings.Global.getInt(resolver, Settings.Global.LOW_POWER_MODE, 0) != 0; if (lowPowerModeEnabled != mLowPowerModeEnabled) { powerHintInternal(POWER_HINT_LOW_POWER_MODE, lowPowerModeEnabled ? 1 : 0); mLowPowerModeEnabled = lowPowerModeEnabled; + BackgroundThread.getHandler().post(new Runnable() { + @Override + public void run() { + ArrayList<PowerManagerInternal.LowPowerModeListener> listeners; + synchronized (mLock) { + listeners = new ArrayList<PowerManagerInternal.LowPowerModeListener>( + mLowPowerModeListeners); + } + for (int i=0; i<listeners.size(); i++) { + listeners.get(i).onLowPowerModeChanged(lowPowerModeEnabled); + } + } + }); } mDirty |= DIRTY_SETTINGS; @@ -812,8 +829,9 @@ public final class PowerManagerService extends com.android.server.SystemService private void notifyWakeLockReleasedLocked(WakeLock wakeLock) { if (mSystemReady && wakeLock.mNotifiedAcquired) { wakeLock.mNotifiedAcquired = false; - mNotifier.onWakeLockReleased(wakeLock.mFlags, wakeLock.mTag, wakeLock.mPackageName, - wakeLock.mOwnerUid, wakeLock.mOwnerPid, wakeLock.mWorkSource); + mNotifier.onWakeLockReleased(wakeLock.mFlags, wakeLock.mTag, + wakeLock.mPackageName, wakeLock.mOwnerUid, wakeLock.mOwnerPid, + wakeLock.mWorkSource, wakeLock.mHistoryTag); } } @@ -2972,6 +2990,20 @@ public final class PowerManagerService extends com.android.server.SystemService } @Override + public boolean getLowPowerModeEnabled() { + synchronized (mLock) { + return mLowPowerModeEnabled; + } + } + + @Override + public void registerLowPowerModeObserver(LowPowerModeListener listener) { + synchronized (mLock) { + mLowPowerModeListeners.add(listener); + } + } + + @Override public void setPolicy(WindowManagerPolicy policy) { PowerManagerService.this.setPolicy(policy); } |