Fixes to idle alarm scheduling, package importance.
- Add new API to ask the activity manager what the current
importance of a particular package name is (along with a few
new useful importance levels).
- Fix my last alarm manager change to actually execute the
alarms we have now decided should run even while we are idle.
Change-Id: I1f14712b4e390770d53b185c96a1b36f6aadd687
diff --git a/core/java/android/app/ActivityManager.java b/core/java/android/app/ActivityManager.java
index 2b35cd4..51ececc 100644
--- a/core/java/android/app/ActivityManager.java
+++ b/core/java/android/app/ActivityManager.java
@@ -2010,27 +2010,47 @@
public int lastTrimLevel;
/**
- * Constant for {@link #importance}: this process is running the
- * foreground UI.
+ * Constant for {@link #importance}: This process is running the
+ * foreground UI; that is, it is the thing currently at the top of the screen
+ * that the user is interacting with.
*/
public static final int IMPORTANCE_FOREGROUND = 100;
/**
- * Constant for {@link #importance}: this process is running something
+ * Constant for {@link #importance}: This process is running a foreground
+ * service, for example to perform music playback even while the user is
+ * not immediately in the app. This generally indicates that the process
+ * is doing something the user actively cares about.
+ */
+ public static final int IMPORTANCE_FOREGROUND_SERVICE = 125;
+
+ /**
+ * Constant for {@link #importance}: This process is running the foreground
+ * UI, but the device is asleep so it is not visible to the user. This means
+ * the user is not really aware of the process, because they can not see or
+ * interact with it, but it is quite important because it what they expect to
+ * return to once unlocking the device.
+ */
+ public static final int IMPORTANCE_TOP_SLEEPING = 150;
+
+ /**
+ * Constant for {@link #importance}: This process is running something
* that is actively visible to the user, though not in the immediate
- * foreground.
+ * foreground. This may be running a window that is behind the current
+ * foreground (so paused and with its state saved, not interacting with
+ * the user, but visible to them to some degree); it may also be running
+ * other services under the system's control that it inconsiders important.
*/
public static final int IMPORTANCE_VISIBLE = 200;
/**
- * Constant for {@link #importance}: this process is running something
- * that is considered to be actively perceptible to the user. An
- * example would be an application performing background music playback.
+ * Constant for {@link #importance}: This process is not something the user
+ * is directly aware of, but is otherwise perceptable to them to some degree.
*/
public static final int IMPORTANCE_PERCEPTIBLE = 130;
/**
- * Constant for {@link #importance}: this process is running an
+ * Constant for {@link #importance}: This process is running an
* application that can not save its state, and thus can't be killed
* while in the background.
* @hide
@@ -2038,42 +2058,51 @@
public static final int IMPORTANCE_CANT_SAVE_STATE = 170;
/**
- * Constant for {@link #importance}: this process is contains services
- * that should remain running.
+ * Constant for {@link #importance}: This process is contains services
+ * that should remain running. These are background services apps have
+ * started, not something the user is aware of, so they may be killed by
+ * the system relatively freely (though it is generally desired that they
+ * stay running as long as they want to).
*/
public static final int IMPORTANCE_SERVICE = 300;
/**
- * Constant for {@link #importance}: this process process contains
+ * Constant for {@link #importance}: This process process contains
* background code that is expendable.
*/
public static final int IMPORTANCE_BACKGROUND = 400;
/**
- * Constant for {@link #importance}: this process is empty of any
+ * Constant for {@link #importance}: This process is empty of any
* actively running code.
*/
public static final int IMPORTANCE_EMPTY = 500;
/**
- * Constant for {@link #importance}: this process does not exist.
+ * Constant for {@link #importance}: This process does not exist.
*/
public static final int IMPORTANCE_GONE = 1000;
/** @hide */
public static int procStateToImportance(int procState) {
- if (procState >= ActivityManager.PROCESS_STATE_HOME) {
- return ActivityManager.RunningAppProcessInfo.IMPORTANCE_BACKGROUND;
- } else if (procState >= ActivityManager.PROCESS_STATE_SERVICE) {
- return ActivityManager.RunningAppProcessInfo.IMPORTANCE_SERVICE;
- } else if (procState > ActivityManager.PROCESS_STATE_HEAVY_WEIGHT) {
- return ActivityManager.RunningAppProcessInfo.IMPORTANCE_CANT_SAVE_STATE;
- } else if (procState >= ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND) {
- return ActivityManager.RunningAppProcessInfo.IMPORTANCE_PERCEPTIBLE;
- } else if (procState >= ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE) {
- return ActivityManager.RunningAppProcessInfo.IMPORTANCE_VISIBLE;
+ if (procState == PROCESS_STATE_NONEXISTENT) {
+ return IMPORTANCE_GONE;
+ } else if (procState >= PROCESS_STATE_HOME) {
+ return IMPORTANCE_BACKGROUND;
+ } else if (procState >= PROCESS_STATE_SERVICE) {
+ return IMPORTANCE_SERVICE;
+ } else if (procState > PROCESS_STATE_HEAVY_WEIGHT) {
+ return IMPORTANCE_CANT_SAVE_STATE;
+ } else if (procState >= PROCESS_STATE_IMPORTANT_BACKGROUND) {
+ return IMPORTANCE_PERCEPTIBLE;
+ } else if (procState >= PROCESS_STATE_IMPORTANT_FOREGROUND) {
+ return IMPORTANCE_VISIBLE;
+ } else if (procState >= PROCESS_STATE_TOP_SLEEPING) {
+ return IMPORTANCE_TOP_SLEEPING;
+ } else if (procState >= PROCESS_STATE_FOREGROUND_SERVICE) {
+ return IMPORTANCE_FOREGROUND_SERVICE;
} else {
- return ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND;
+ return IMPORTANCE_FOREGROUND;
}
}
@@ -2253,6 +2282,22 @@
}
/**
+ * Return the importance of a given package name, based on the processes that are
+ * currently running. The return value is one of the importance constants defined
+ * in {@link RunningAppProcessInfo}, giving you the highest importance of all the
+ * processes that this package has code running inside of. If there are no processes
+ * running its code, {@link RunningAppProcessInfo#IMPORTANCE_GONE} is returned.
+ */
+ public int getPackageImportance(String packageName) {
+ try {
+ int procState = ActivityManagerNative.getDefault().getPackageProcessState(packageName);
+ return RunningAppProcessInfo.procStateToImportance(procState);
+ } catch (RemoteException e) {
+ return RunningAppProcessInfo.IMPORTANCE_GONE;
+ }
+ }
+
+ /**
* Return global memory state information for the calling process. This
* does not fill in all fields of the {@link RunningAppProcessInfo}. The
* only fields that will be filled in are
diff --git a/core/java/android/app/ActivityManagerNative.java b/core/java/android/app/ActivityManagerNative.java
index f63d13c..256d87d 100644
--- a/core/java/android/app/ActivityManagerNative.java
+++ b/core/java/android/app/ActivityManagerNative.java
@@ -106,9 +106,24 @@
}
}
- static public void noteWakeupAlarm(PendingIntent ps, int sourceUid, String sourcePkg) {
+ static public void noteWakeupAlarm(PendingIntent ps, int sourceUid, String sourcePkg,
+ String tag) {
try {
- getDefault().noteWakeupAlarm(ps.getTarget(), sourceUid, sourcePkg);
+ getDefault().noteWakeupAlarm(ps.getTarget(), sourceUid, sourcePkg, tag);
+ } catch (RemoteException ex) {
+ }
+ }
+
+ static public void noteAlarmStart(PendingIntent ps, int sourceUid, String tag) {
+ try {
+ getDefault().noteAlarmStart(ps.getTarget(), sourceUid, tag);
+ } catch (RemoteException ex) {
+ }
+ }
+
+ static public void noteAlarmFinish(PendingIntent ps, int sourceUid, String tag) {
+ try {
+ getDefault().noteAlarmFinish(ps.getTarget(), sourceUid, tag);
} catch (RemoteException ex) {
}
}
@@ -1375,7 +1390,30 @@
data.readStrongBinder());
int sourceUid = data.readInt();
String sourcePkg = data.readString();
- noteWakeupAlarm(is, sourceUid, sourcePkg);
+ String tag = data.readString();
+ noteWakeupAlarm(is, sourceUid, sourcePkg, tag);
+ reply.writeNoException();
+ return true;
+ }
+
+ case NOTE_ALARM_START_TRANSACTION: {
+ data.enforceInterface(IActivityManager.descriptor);
+ IIntentSender is = IIntentSender.Stub.asInterface(
+ data.readStrongBinder());
+ int sourceUid = data.readInt();
+ String tag = data.readString();
+ noteAlarmStart(is, sourceUid, tag);
+ reply.writeNoException();
+ return true;
+ }
+
+ case NOTE_ALARM_FINISH_TRANSACTION: {
+ data.enforceInterface(IActivityManager.descriptor);
+ IIntentSender is = IIntentSender.Stub.asInterface(
+ data.readStrongBinder());
+ int sourceUid = data.readInt();
+ String tag = data.readString();
+ noteAlarmFinish(is, sourceUid, tag);
reply.writeNoException();
return true;
}
@@ -2461,6 +2499,15 @@
reply.writeNoException();
return true;
}
+
+ case GET_PACKAGE_PROCESS_STATE_TRANSACTION: {
+ data.enforceInterface(IActivityManager.descriptor);
+ String pkg = data.readString();
+ int res = getPackageProcessState(pkg);
+ reply.writeNoException();
+ reply.writeInt(res);
+ return true;
+ }
}
return super.onTransact(code, data, reply, flags);
@@ -3304,7 +3351,7 @@
data.writeInterfaceToken(IActivityManager.descriptor);
data.writeInt(stackBoxId);
r.writeToParcel(data, 0);
- mRemote.transact(RESIZE_STACK_TRANSACTION, data, reply, IBinder.FLAG_ONEWAY);
+ mRemote.transact(RESIZE_STACK_TRANSACTION, data, reply, 0);
reply.readException();
data.recycle();
reply.recycle();
@@ -3360,7 +3407,7 @@
Parcel reply = Parcel.obtain();
data.writeInterfaceToken(IActivityManager.descriptor);
data.writeInt(stackId);
- mRemote.transact(SET_FOCUSED_STACK_TRANSACTION, data, reply, IBinder.FLAG_ONEWAY);
+ mRemote.transact(SET_FOCUSED_STACK_TRANSACTION, data, reply, 0);
reply.readException();
data.recycle();
reply.recycle();
@@ -3384,7 +3431,7 @@
Parcel reply = Parcel.obtain();
data.writeInterfaceToken(IActivityManager.descriptor);
data.writeStrongBinder(listener.asBinder());
- mRemote.transact(REGISTER_TASK_STACK_LISTENER_TRANSACTION, data, reply, IBinder.FLAG_ONEWAY);
+ mRemote.transact(REGISTER_TASK_STACK_LISTENER_TRANSACTION, data, reply, 0);
reply.readException();
data.recycle();
reply.recycle();
@@ -4214,16 +4261,37 @@
mRemote.transact(ENTER_SAFE_MODE_TRANSACTION, data, null, 0);
data.recycle();
}
- public void noteWakeupAlarm(IIntentSender sender, int sourceUid, String sourcePkg)
+ public void noteWakeupAlarm(IIntentSender sender, int sourceUid, String sourcePkg, String tag)
throws RemoteException {
Parcel data = Parcel.obtain();
data.writeInterfaceToken(IActivityManager.descriptor);
data.writeStrongBinder(sender.asBinder());
data.writeInt(sourceUid);
data.writeString(sourcePkg);
+ data.writeString(tag);
mRemote.transact(NOTE_WAKEUP_ALARM_TRANSACTION, data, null, 0);
data.recycle();
}
+ public void noteAlarmStart(IIntentSender sender, int sourceUid, String tag)
+ throws RemoteException {
+ Parcel data = Parcel.obtain();
+ data.writeInterfaceToken(IActivityManager.descriptor);
+ data.writeStrongBinder(sender.asBinder());
+ data.writeInt(sourceUid);
+ data.writeString(tag);
+ mRemote.transact(NOTE_ALARM_START_TRANSACTION, data, null, 0);
+ data.recycle();
+ }
+ public void noteAlarmFinish(IIntentSender sender, int sourceUid, String tag)
+ throws RemoteException {
+ Parcel data = Parcel.obtain();
+ data.writeInterfaceToken(IActivityManager.descriptor);
+ data.writeStrongBinder(sender.asBinder());
+ data.writeInt(sourceUid);
+ data.writeString(tag);
+ mRemote.transact(NOTE_ALARM_FINISH_TRANSACTION, data, null, 0);
+ data.recycle();
+ }
public boolean killPids(int[] pids, String reason, boolean secure) throws RemoteException {
Parcel data = Parcel.obtain();
Parcel reply = Parcel.obtain();
@@ -5486,7 +5554,7 @@
data.writeInterfaceToken(IActivityManager.descriptor);
data.writeStrongBinder(token);
values.writeToParcel(data, 0);
- mRemote.transact(SET_TASK_DESCRIPTION_TRANSACTION, data, reply, IBinder.FLAG_ONEWAY);
+ mRemote.transact(SET_TASK_DESCRIPTION_TRANSACTION, data, reply, 0);
reply.readException();
data.recycle();
reply.recycle();
@@ -5499,7 +5567,7 @@
data.writeInterfaceToken(IActivityManager.descriptor);
data.writeInt(taskId);
data.writeInt(resizeable ? 1 : 0);
- mRemote.transact(SET_TASK_RESIZEABLE_TRANSACTION, data, reply, IBinder.FLAG_ONEWAY);
+ mRemote.transact(SET_TASK_RESIZEABLE_TRANSACTION, data, reply, 0);
reply.readException();
data.recycle();
reply.recycle();
@@ -5513,7 +5581,7 @@
data.writeInterfaceToken(IActivityManager.descriptor);
data.writeInt(taskId);
r.writeToParcel(data, 0);
- mRemote.transact(RESIZE_TASK_TRANSACTION, data, reply, IBinder.FLAG_ONEWAY);
+ mRemote.transact(RESIZE_TASK_TRANSACTION, data, reply, 0);
reply.readException();
data.recycle();
reply.recycle();
@@ -5545,7 +5613,7 @@
data.writeInt(1);
data.writeBundle(options.toBundle());
}
- mRemote.transact(START_IN_PLACE_ANIMATION_TRANSACTION, data, reply, IBinder.FLAG_ONEWAY);
+ mRemote.transact(START_IN_PLACE_ANIMATION_TRANSACTION, data, reply, 0);
reply.readException();
data.recycle();
reply.recycle();
@@ -5586,8 +5654,7 @@
Parcel reply = Parcel.obtain();
data.writeInterfaceToken(IActivityManager.descriptor);
data.writeStrongBinder(token);
- mRemote.transact(BACKGROUND_RESOURCES_RELEASED_TRANSACTION, data, reply,
- IBinder.FLAG_ONEWAY);
+ mRemote.transact(BACKGROUND_RESOURCES_RELEASED_TRANSACTION, data, reply, 0);
reply.readException();
data.recycle();
reply.recycle();
@@ -5599,8 +5666,7 @@
Parcel reply = Parcel.obtain();
data.writeInterfaceToken(IActivityManager.descriptor);
data.writeStrongBinder(token);
- mRemote.transact(NOTIFY_LAUNCH_TASK_BEHIND_COMPLETE_TRANSACTION, data, reply,
- IBinder.FLAG_ONEWAY);
+ mRemote.transact(NOTIFY_LAUNCH_TASK_BEHIND_COMPLETE_TRANSACTION, data, reply, 0);
reply.readException();
data.recycle();
reply.recycle();
@@ -5612,8 +5678,7 @@
Parcel reply = Parcel.obtain();
data.writeInterfaceToken(IActivityManager.descriptor);
data.writeStrongBinder(token);
- mRemote.transact(NOTIFY_ENTER_ANIMATION_COMPLETE_TRANSACTION, data, reply,
- IBinder.FLAG_ONEWAY);
+ mRemote.transact(NOTIFY_ENTER_ANIMATION_COMPLETE_TRANSACTION, data, reply, 0);
reply.readException();
data.recycle();
reply.recycle();
@@ -5703,11 +5768,25 @@
data.writeInterfaceToken(IActivityManager.descriptor);
data.writeInt(userId);
data.writeStringArray(packages);
- mRemote.transact(UPDATE_LOCK_TASK_PACKAGES_TRANSACTION, data, reply, IBinder.FLAG_ONEWAY);
+ mRemote.transact(UPDATE_LOCK_TASK_PACKAGES_TRANSACTION, data, reply, 0);
reply.readException();
data.recycle();
reply.recycle();
}
+ @Override
+ public int getPackageProcessState(String packageName) throws RemoteException {
+ Parcel data = Parcel.obtain();
+ Parcel reply = Parcel.obtain();
+ data.writeInterfaceToken(IActivityManager.descriptor);
+ data.writeString(packageName);
+ mRemote.transact(GET_PACKAGE_PROCESS_STATE_TRANSACTION, data, reply, 0);
+ reply.readException();
+ int res = reply.readInt();
+ data.recycle();
+ reply.recycle();
+ return res;
+ }
+
private IBinder mRemote;
}
diff --git a/core/java/android/app/IActivityManager.java b/core/java/android/app/IActivityManager.java
index 4a1d6ff..59de281 100644
--- a/core/java/android/app/IActivityManager.java
+++ b/core/java/android/app/IActivityManager.java
@@ -262,7 +262,11 @@
public void enterSafeMode() throws RemoteException;
- public void noteWakeupAlarm(IIntentSender sender, int sourceUid, String sourcePkg)
+ public void noteWakeupAlarm(IIntentSender sender, int sourceUid, String sourcePkg, String tag)
+ throws RemoteException;
+ public void noteAlarmStart(IIntentSender sender, int sourceUid, String tag)
+ throws RemoteException;
+ public void noteAlarmFinish(IIntentSender sender, int sourceUid, String tag)
throws RemoteException;
public boolean killPids(int[] pids, String reason, boolean secure) throws RemoteException;
@@ -490,6 +494,8 @@
throws RemoteException;
public void updateLockTaskPackages(int userId, String[] packages) throws RemoteException;
+ public int getPackageProcessState(String packageName) throws RemoteException;
+
/*
* Private non-Binder interfaces
*/
@@ -825,4 +831,7 @@
int DUMP_HEAP_FINISHED_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+288;
int SET_VOICE_KEEP_AWAKE_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+289;
int UPDATE_LOCK_TASK_PACKAGES_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+290;
+ int NOTE_ALARM_START_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+291;
+ int NOTE_ALARM_FINISH_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+292;
+ int GET_PACKAGE_PROCESS_STATE_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+293;
}
diff --git a/core/java/android/os/BatteryStats.java b/core/java/android/os/BatteryStats.java
index c7edb1a..7c5ddee 100644
--- a/core/java/android/os/BatteryStats.java
+++ b/core/java/android/os/BatteryStats.java
@@ -1135,8 +1135,10 @@
public static final int EVENT_PACKAGE_INSTALLED = 0x000c;
// Event for a package being uninstalled.
public static final int EVENT_PACKAGE_UNINSTALLED = 0x000d;
+ // Event for a package being uninstalled.
+ public static final int EVENT_ALARM = 0x000e;
// Number of event types.
- public static final int EVENT_COUNT = 0x000e;
+ public static final int EVENT_COUNT = 0x000f;
// Mask to extract out only the type part of the event.
public static final int EVENT_TYPE_MASK = ~(EVENT_FLAG_START|EVENT_FLAG_FINISH);
@@ -1158,6 +1160,8 @@
EVENT_USER_FOREGROUND | EVENT_FLAG_START;
public static final int EVENT_USER_FOREGROUND_FINISH =
EVENT_USER_FOREGROUND | EVENT_FLAG_FINISH;
+ public static final int EVENT_ALARM_START = EVENT_ALARM | EVENT_FLAG_START;
+ public static final int EVENT_ALARM_FINISH = EVENT_ALARM | EVENT_FLAG_FINISH;
// For CMD_EVENT.
public int eventCode;
@@ -1789,12 +1793,12 @@
public static final String[] HISTORY_EVENT_NAMES = new String[] {
"null", "proc", "fg", "top", "sync", "wake_lock_in", "job", "user", "userfg", "conn",
- "motion", "active", "pkginst", "pkgunin"
+ "motion", "active", "pkginst", "pkgunin", "alarm"
};
public static final String[] HISTORY_EVENT_CHECKIN_NAMES = new String[] {
"Enl", "Epr", "Efg", "Etp", "Esy", "Ewl", "Ejb", "Eur", "Euf", "Ecn",
- "Esm", "Eac", "Epi", "Epu"
+ "Esm", "Eac", "Epi", "Epu", "Eal"
};
/**
diff --git a/core/java/android/service/voice/VoiceInteractionSession.java b/core/java/android/service/voice/VoiceInteractionSession.java
index 20d7079..71b7f76 100644
--- a/core/java/android/service/voice/VoiceInteractionSession.java
+++ b/core/java/android/service/voice/VoiceInteractionSession.java
@@ -20,8 +20,10 @@
import android.app.Dialog;
import android.app.Instrumentation;
import android.app.VoiceInteractor;
+import android.content.ComponentCallbacks2;
import android.content.Context;
import android.content.Intent;
+import android.content.res.Configuration;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.Rect;
@@ -65,7 +67,8 @@
* when done. It can also initiate voice interactions with applications by calling
* {@link #startVoiceActivity}</p>.
*/
-public abstract class VoiceInteractionSession implements KeyEvent.Callback {
+public abstract class VoiceInteractionSession implements KeyEvent.Callback,
+ ComponentCallbacks2 {
static final String TAG = "VoiceInteractionSession";
static final boolean DEBUG = true;
@@ -855,6 +858,18 @@
hide();
}
+ @Override
+ public void onConfigurationChanged(Configuration newConfig) {
+ }
+
+ @Override
+ public void onLowMemory() {
+ }
+
+ @Override
+ public void onTrimMemory(int level) {
+ }
+
/**
* Compute the interesting insets into your UI. The default implementation
* sets {@link Insets#contentInsets outInsets.contentInsets.top} to the height
diff --git a/core/java/android/service/voice/VoiceInteractionSessionService.java b/core/java/android/service/voice/VoiceInteractionSessionService.java
index 008d55f..8f988f3 100644
--- a/core/java/android/service/voice/VoiceInteractionSessionService.java
+++ b/core/java/android/service/voice/VoiceInteractionSessionService.java
@@ -19,6 +19,7 @@
import android.app.Service;
import android.content.Context;
import android.content.Intent;
+import android.content.res.Configuration;
import android.os.Bundle;
import android.os.IBinder;
import android.os.Looper;
@@ -76,6 +77,30 @@
return mInterface.asBinder();
}
+ @Override
+ public void onConfigurationChanged(Configuration newConfig) {
+ super.onConfigurationChanged(newConfig);
+ if (mSession != null) {
+ mSession.onConfigurationChanged(newConfig);
+ }
+ }
+
+ @Override
+ public void onLowMemory() {
+ super.onLowMemory();
+ if (mSession != null) {
+ mSession.onLowMemory();
+ }
+ }
+
+ @Override
+ public void onTrimMemory(int level) {
+ super.onTrimMemory(level);
+ if (mSession != null) {
+ mSession.onTrimMemory(level);
+ }
+ }
+
void doNewSession(IBinder token, Bundle args, int startFlags) {
if (mSession != null) {
mSession.doDestroy();
diff --git a/core/java/com/android/internal/os/BatteryStatsImpl.java b/core/java/com/android/internal/os/BatteryStatsImpl.java
index fbb2dfc..87605f6 100644
--- a/core/java/com/android/internal/os/BatteryStatsImpl.java
+++ b/core/java/com/android/internal/os/BatteryStatsImpl.java
@@ -2692,6 +2692,32 @@
addHistoryEventLocked(elapsedRealtime, uptime, HistoryItem.EVENT_JOB_FINISH, name, uid);
}
+ public void noteAlarmStartLocked(String name, int uid) {
+ if (!mRecordAllHistory) {
+ return;
+ }
+ uid = mapUid(uid);
+ final long elapsedRealtime = SystemClock.elapsedRealtime();
+ final long uptime = SystemClock.uptimeMillis();
+ if (!mActiveEvents.updateState(HistoryItem.EVENT_ALARM_START, name, uid, 0)) {
+ return;
+ }
+ addHistoryEventLocked(elapsedRealtime, uptime, HistoryItem.EVENT_ALARM_START, name, uid);
+ }
+
+ public void noteAlarmFinishLocked(String name, int uid) {
+ if (!mRecordAllHistory) {
+ return;
+ }
+ uid = mapUid(uid);
+ final long elapsedRealtime = SystemClock.elapsedRealtime();
+ final long uptime = SystemClock.uptimeMillis();
+ if (!mActiveEvents.updateState(HistoryItem.EVENT_ALARM_FINISH, name, uid, 0)) {
+ return;
+ }
+ addHistoryEventLocked(elapsedRealtime, uptime, HistoryItem.EVENT_ALARM_FINISH, name, uid);
+ }
+
private void requestWakelockCpuUpdate() {
if (!mHandler.hasMessages(MSG_UPDATE_WAKELOCKS)) {
Message m = mHandler.obtainMessage(MSG_UPDATE_WAKELOCKS);
@@ -2709,6 +2735,7 @@
if (!enabled) {
// Clear out any existing state.
mActiveEvents.removeEvents(HistoryItem.EVENT_WAKE_LOCK);
+ mActiveEvents.removeEvents(HistoryItem.EVENT_ALARM);
// Record the currently running processes as stopping, now that we are no
// longer tracking them.
HashMap<String, SparseIntArray> active = mActiveEvents.getStateForEvent(