|
74 | 74 | import java.util.Random; |
75 | 75 | import java.util.TimeZone; |
76 | 76 | import java.util.TreeSet; |
| 77 | +import java.util.Timer; |
| 78 | +import java.util.TimerTask; |
77 | 79 |
|
78 | 80 | import static android.app.AlarmManager.RTC_WAKEUP; |
79 | 81 | import static android.app.AlarmManager.RTC; |
@@ -127,6 +129,7 @@ class AlarmManagerService extends SystemService { |
127 | 129 |
|
128 | 130 | private final ArrayList<Integer> mTriggeredUids = new ArrayList<Integer>(); |
129 | 131 | private final ArrayList<Integer> mBlockedUids = new ArrayList<Integer>(); |
| 132 | + private static final int BLOCKED_UID_CHECK_INTERVAL = 1000; // 1 sec. |
130 | 133 |
|
131 | 134 | long mNativeData; |
132 | 135 | private long mNextWakeup; |
@@ -1250,23 +1253,34 @@ public void updateBlockedUids(int uid, boolean isBlocked) { |
1250 | 1253 | synchronized(mLock) { |
1251 | 1254 | if(isBlocked) { |
1252 | 1255 | mBlockedUids.add(new Integer(uid)); |
1253 | | - if (checkReleaseWakeLock()) { |
1254 | | - /* all the uids for which the alarms are triggered |
1255 | | - * are either blocked or have called onSendFinished. |
1256 | | - */ |
1257 | | - if (mWakeLock.isHeld()) { |
1258 | | - mWakeLock.release(); |
1259 | | - if (localLOGV) |
1260 | | - Slog.v(TAG, "AM WakeLock Released Internally in updateBlockedUids"); |
1261 | | - } |
1262 | | - } |
| 1256 | + Timer checkBlockedUidTimer = new Timer(); |
| 1257 | + checkBlockedUidTimer.schedule( new CheckBlockedUidTimerTask(uid), |
| 1258 | + BLOCKED_UID_CHECK_INTERVAL); |
1263 | 1259 | } else { |
1264 | 1260 | mBlockedUids.clear(); |
1265 | 1261 | } |
1266 | 1262 | } |
1267 | 1263 | } |
1268 | 1264 | }; |
1269 | 1265 |
|
| 1266 | + class CheckBlockedUidTimerTask extends TimerTask { |
| 1267 | + private int mUid; |
| 1268 | + CheckBlockedUidTimerTask(int uid) { |
| 1269 | + mUid = uid; |
| 1270 | + } |
| 1271 | + @Override |
| 1272 | + public void run(){ |
| 1273 | + if (mBlockedUids.contains(mUid) && mTriggeredUids.contains(mUid)) { |
| 1274 | + if (mWakeLock.isHeld()) { |
| 1275 | + mWakeLock.release(); |
| 1276 | + if (localLOGV) |
| 1277 | + Slog.v(TAG, "AM WakeLock Released Internally!!"); |
| 1278 | + return; |
| 1279 | + } |
| 1280 | + } |
| 1281 | + return; |
| 1282 | + } |
| 1283 | + } |
1270 | 1284 | void dumpImpl(PrintWriter pw) { |
1271 | 1285 | synchronized (mLock) { |
1272 | 1286 | pw.println("Current Alarm Manager state:"); |
@@ -1745,20 +1759,6 @@ void rescheduleKernelAlarmsLocked() { |
1745 | 1759 | } |
1746 | 1760 | } |
1747 | 1761 |
|
1748 | | - boolean checkReleaseWakeLock() { |
1749 | | - if (mTriggeredUids.size() == 0 || mBlockedUids.size() == 0) |
1750 | | - return false; |
1751 | | - |
1752 | | - int uid; |
1753 | | - for (int i = 0; i < mTriggeredUids.size(); i++) { |
1754 | | - uid = mTriggeredUids.get(i); |
1755 | | - if (!mBlockedUids.contains(uid)) { |
1756 | | - return false; |
1757 | | - } |
1758 | | - } |
1759 | | - return true; |
1760 | | - } |
1761 | | - |
1762 | 1762 | private void removeLocked(PendingIntent operation) { |
1763 | 1763 | boolean didRemove = false; |
1764 | 1764 | for (int i = mAlarmBatches.size() - 1; i >= 0; i--) { |
@@ -2277,12 +2277,6 @@ void deliverAlarmsLocked(ArrayList<Alarm> triggerList, long nowELAPSED) { |
2277 | 2277 | mInFlight.add(inflight); |
2278 | 2278 | mBroadcastRefCount++; |
2279 | 2279 | mTriggeredUids.add(new Integer(alarm.uid)); |
2280 | | - if (checkReleaseWakeLock()) { |
2281 | | - if (mWakeLock.isHeld()) { |
2282 | | - mWakeLock.release(); |
2283 | | - if (localLOGV) Slog.v(TAG, "AM WakeLock Released Internally deliverAlarms"); |
2284 | | - } |
2285 | | - } |
2286 | 2280 |
|
2287 | 2281 | if (allowWhileIdle) { |
2288 | 2282 | // Record the last time this uid handled an ALLOW_WHILE_IDLE alarm. |
@@ -2839,13 +2833,6 @@ public void onSendFinished(PendingIntent pi, Intent intent, int resultCode, |
2839 | 2833 | mBroadcastRefCount--; |
2840 | 2834 | mTriggeredUids.remove(new Integer(uid)); |
2841 | 2835 |
|
2842 | | - if (checkReleaseWakeLock()) { |
2843 | | - if (mWakeLock.isHeld()) { |
2844 | | - mWakeLock.release(); |
2845 | | - if (localLOGV) Slog.v(TAG, "AM WakeLock Released Internally onSendFinish"); |
2846 | | - } |
2847 | | - } |
2848 | | - |
2849 | 2836 | if (mBroadcastRefCount == 0) { |
2850 | 2837 | if (mWakeLock.isHeld()) { |
2851 | 2838 | mWakeLock.release(); |
|
0 commit comments