Loading services/core/java/com/android/server/AlarmManagerService.java +22 −0 Original line number Original line Diff line number Diff line Loading @@ -208,6 +208,7 @@ class AlarmManagerService extends SystemService { AppWakeupHistory mAppWakeupHistory; AppWakeupHistory mAppWakeupHistory; ClockReceiver mClockReceiver; ClockReceiver mClockReceiver; final DeliveryTracker mDeliveryTracker = new DeliveryTracker(); final DeliveryTracker mDeliveryTracker = new DeliveryTracker(); IBinder.DeathRecipient mListenerDeathRecipient; Intent mTimeTickIntent; Intent mTimeTickIntent; IAlarmListener mTimeTickTrigger; IAlarmListener mTimeTickTrigger; PendingIntent mDateChangeSender; PendingIntent mDateChangeSender; Loading Loading @@ -1447,6 +1448,18 @@ class AlarmManagerService extends SystemService { public void onStart() { public void onStart() { mInjector.init(); mInjector.init(); mListenerDeathRecipient = new IBinder.DeathRecipient() { @Override public void binderDied() { } @Override public void binderDied(IBinder who) { final IAlarmListener listener = IAlarmListener.Stub.asInterface(who); removeImpl(null, listener); } }; synchronized (mLock) { synchronized (mLock) { mHandler = new AlarmHandler(); mHandler = new AlarmHandler(); mConstants = new Constants(mHandler); mConstants = new Constants(mHandler); Loading Loading @@ -1653,6 +1666,15 @@ class AlarmManagerService extends SystemService { return; return; } } if (directReceiver != null) { try { directReceiver.asBinder().linkToDeath(mListenerDeathRecipient, 0); } catch (RemoteException e) { Slog.w(TAG, "Dropping unreachable alarm listener " + listenerTag); return; } } // Sanity check the window length. This will catch people mistakenly // Sanity check the window length. This will catch people mistakenly // trying to pass an end-of-window timestamp rather than a duration. // trying to pass an end-of-window timestamp rather than a duration. if (windowLength > AlarmManager.INTERVAL_HALF_DAY) { if (windowLength > AlarmManager.INTERVAL_HALF_DAY) { Loading services/tests/mockingservicestests/src/com/android/server/AlarmManagerServiceTest.java +21 −2 Original line number Original line Diff line number Diff line Loading @@ -345,8 +345,8 @@ public class AlarmManagerServiceTest { } } /** /** * Lowers quotas to make testing feasible. * Lowers quotas to make testing feasible. Careful while calling as this will replace any * Careful while calling as this will replace any existing settings for the calling test. * existing settings for the calling test. */ */ private void setTestableQuotas() { private void setTestableQuotas() { final StringBuilder constantsBuilder = new StringBuilder(); final StringBuilder constantsBuilder = new StringBuilder(); Loading Loading @@ -981,6 +981,25 @@ public class AlarmManagerServiceTest { assertEquals(0, mService.mAlarmsPerUid.get(TEST_CALLING_UID)); assertEquals(0, mService.mAlarmsPerUid.get(TEST_CALLING_UID)); } } @Test public void alarmCountOnListenerBinderDied() { final int numAlarms = 10; final IAlarmListener[] listeners = new IAlarmListener[numAlarms]; for (int i = 0; i < numAlarms; i++) { listeners[i] = new IAlarmListener.Stub() { @Override public void doAlarm(IAlarmCompleteListener callback) throws RemoteException { } }; setTestAlarmWithListener(ELAPSED_REALTIME_WAKEUP, mNowElapsedTest + i, listeners[i]); } assertEquals(numAlarms, mService.mAlarmsPerUid.get(TEST_CALLING_UID)); for (int i = 0; i < numAlarms; i++) { mService.mListenerDeathRecipient.binderDied(listeners[i].asBinder()); assertEquals(numAlarms - i - 1, mService.mAlarmsPerUid.get(TEST_CALLING_UID)); } } @After @After public void tearDown() { public void tearDown() { if (mMockingSession != null) { if (mMockingSession != null) { Loading Loading
services/core/java/com/android/server/AlarmManagerService.java +22 −0 Original line number Original line Diff line number Diff line Loading @@ -208,6 +208,7 @@ class AlarmManagerService extends SystemService { AppWakeupHistory mAppWakeupHistory; AppWakeupHistory mAppWakeupHistory; ClockReceiver mClockReceiver; ClockReceiver mClockReceiver; final DeliveryTracker mDeliveryTracker = new DeliveryTracker(); final DeliveryTracker mDeliveryTracker = new DeliveryTracker(); IBinder.DeathRecipient mListenerDeathRecipient; Intent mTimeTickIntent; Intent mTimeTickIntent; IAlarmListener mTimeTickTrigger; IAlarmListener mTimeTickTrigger; PendingIntent mDateChangeSender; PendingIntent mDateChangeSender; Loading Loading @@ -1447,6 +1448,18 @@ class AlarmManagerService extends SystemService { public void onStart() { public void onStart() { mInjector.init(); mInjector.init(); mListenerDeathRecipient = new IBinder.DeathRecipient() { @Override public void binderDied() { } @Override public void binderDied(IBinder who) { final IAlarmListener listener = IAlarmListener.Stub.asInterface(who); removeImpl(null, listener); } }; synchronized (mLock) { synchronized (mLock) { mHandler = new AlarmHandler(); mHandler = new AlarmHandler(); mConstants = new Constants(mHandler); mConstants = new Constants(mHandler); Loading Loading @@ -1653,6 +1666,15 @@ class AlarmManagerService extends SystemService { return; return; } } if (directReceiver != null) { try { directReceiver.asBinder().linkToDeath(mListenerDeathRecipient, 0); } catch (RemoteException e) { Slog.w(TAG, "Dropping unreachable alarm listener " + listenerTag); return; } } // Sanity check the window length. This will catch people mistakenly // Sanity check the window length. This will catch people mistakenly // trying to pass an end-of-window timestamp rather than a duration. // trying to pass an end-of-window timestamp rather than a duration. if (windowLength > AlarmManager.INTERVAL_HALF_DAY) { if (windowLength > AlarmManager.INTERVAL_HALF_DAY) { Loading
services/tests/mockingservicestests/src/com/android/server/AlarmManagerServiceTest.java +21 −2 Original line number Original line Diff line number Diff line Loading @@ -345,8 +345,8 @@ public class AlarmManagerServiceTest { } } /** /** * Lowers quotas to make testing feasible. * Lowers quotas to make testing feasible. Careful while calling as this will replace any * Careful while calling as this will replace any existing settings for the calling test. * existing settings for the calling test. */ */ private void setTestableQuotas() { private void setTestableQuotas() { final StringBuilder constantsBuilder = new StringBuilder(); final StringBuilder constantsBuilder = new StringBuilder(); Loading Loading @@ -981,6 +981,25 @@ public class AlarmManagerServiceTest { assertEquals(0, mService.mAlarmsPerUid.get(TEST_CALLING_UID)); assertEquals(0, mService.mAlarmsPerUid.get(TEST_CALLING_UID)); } } @Test public void alarmCountOnListenerBinderDied() { final int numAlarms = 10; final IAlarmListener[] listeners = new IAlarmListener[numAlarms]; for (int i = 0; i < numAlarms; i++) { listeners[i] = new IAlarmListener.Stub() { @Override public void doAlarm(IAlarmCompleteListener callback) throws RemoteException { } }; setTestAlarmWithListener(ELAPSED_REALTIME_WAKEUP, mNowElapsedTest + i, listeners[i]); } assertEquals(numAlarms, mService.mAlarmsPerUid.get(TEST_CALLING_UID)); for (int i = 0; i < numAlarms; i++) { mService.mListenerDeathRecipient.binderDied(listeners[i].asBinder()); assertEquals(numAlarms - i - 1, mService.mAlarmsPerUid.get(TEST_CALLING_UID)); } } @After @After public void tearDown() { public void tearDown() { if (mMockingSession != null) { if (mMockingSession != null) { Loading