Loading services/core/java/com/android/server/attention/AttentionManagerService.java +47 −46 Original line number Diff line number Diff line Loading @@ -90,10 +90,12 @@ public class AttentionManagerService extends SystemService { * DeviceConfig flag name, describes how much time we consider a result fresh; if the check * attention called within that period - cached value will be returned. */ @VisibleForTesting static final String KEY_STALE_AFTER_MILLIS = "stale_after_millis"; @VisibleForTesting static final String KEY_STALE_AFTER_MILLIS = "stale_after_millis"; /** Default value in absence of {@link DeviceConfig} override. */ @VisibleForTesting static final long DEFAULT_STALE_AFTER_MILLIS = 1_000; @VisibleForTesting static final long DEFAULT_STALE_AFTER_MILLIS = 1_000; /** The size of the buffer that stores recent attention check results. */ @VisibleForTesting Loading Loading @@ -237,7 +239,7 @@ public class AttentionManagerService extends SystemService { } } userState.mCurrentAttentionCheck = createAttentionCheck(callbackInternal, userState); userState.mCurrentAttentionCheck = new AttentionCheck(callbackInternal, userState); if (userState.mService != null) { try { Loading @@ -255,46 +257,6 @@ public class AttentionManagerService extends SystemService { } } private AttentionCheck createAttentionCheck(AttentionCallbackInternal callbackInternal, UserState userState) { final IAttentionCallback iAttentionCallback = new IAttentionCallback.Stub() { @Override public void onSuccess(@AttentionSuccessCodes int result, long timestamp) { if (userState.mCurrentAttentionCheck.mIsFulfilled) { return; } userState.mCurrentAttentionCheck.mIsFulfilled = true; callbackInternal.onSuccess(result, timestamp); logStats(result); synchronized (mLock) { if (userState.mAttentionCheckCacheBuffer == null) { userState.mAttentionCheckCacheBuffer = new AttentionCheckCacheBuffer(); } userState.mAttentionCheckCacheBuffer.add( new AttentionCheckCache(SystemClock.uptimeMillis(), result, timestamp)); } } @Override public void onFailure(@AttentionFailureCodes int error) { if (userState.mCurrentAttentionCheck.mIsFulfilled) { return; } userState.mCurrentAttentionCheck.mIsFulfilled = true; callbackInternal.onFailure(error); logStats(error); } private void logStats(int result) { FrameworkStatsLog.write( FrameworkStatsLog.ATTENTION_MANAGER_SERVICE_RESULT_REPORTED, result); } }; return new AttentionCheck(callbackInternal, iAttentionCallback); } /** Cancels the specified attention check. */ @VisibleForTesting void cancelAttentionCheck(AttentionCallbackInternal callbackInternal) { Loading Loading @@ -505,13 +467,42 @@ public class AttentionManagerService extends SystemService { static final class AttentionCheck { private final AttentionCallbackInternal mCallbackInternal; private final IAttentionCallback mIAttentionCallback; private boolean mIsDispatched; private boolean mIsFulfilled; AttentionCheck(AttentionCallbackInternal callbackInternal, IAttentionCallback iAttentionCallback) { AttentionCheck(AttentionCallbackInternal callbackInternal, UserState userState) { mCallbackInternal = callbackInternal; mIAttentionCallback = iAttentionCallback; mIAttentionCallback = new IAttentionCallback.Stub() { @Override public void onSuccess(@AttentionSuccessCodes int result, long timestamp) { if (mIsFulfilled) { return; } mIsFulfilled = true; callbackInternal.onSuccess(result, timestamp); logStats(result); userState.appendResultToAttentionCacheBuffer( new AttentionCheckCache(SystemClock.uptimeMillis(), result, timestamp)); } @Override public void onFailure(@AttentionFailureCodes int error) { if (mIsFulfilled) { return; } mIsFulfilled = true; callbackInternal.onFailure(error); logStats(error); } private void logStats(int result) { FrameworkStatsLog.write( FrameworkStatsLog.ATTENTION_MANAGER_SERVICE_RESULT_REPORTED, result); } }; } void cancelInternal() { Loading Loading @@ -611,6 +602,16 @@ public class AttentionManagerService extends SystemService { } } private void appendResultToAttentionCacheBuffer(AttentionCheckCache cache) { synchronized (mLock) { if (mAttentionCheckCacheBuffer == null) { mAttentionCheckCacheBuffer = new AttentionCheckCacheBuffer(); } mAttentionCheckCacheBuffer.add(cache); } } private class AttentionServiceConnection implements ServiceConnection { @Override public void onServiceConnected(ComponentName name, IBinder service) { Loading services/tests/servicestests/src/com/android/server/attention/AttentionManagerServiceTest.java +3 −3 Original line number Diff line number Diff line Loading @@ -71,7 +71,7 @@ public class AttentionManagerServiceTest { @Mock private AttentionHandler mMockHandler; @Mock private IAttentionCallback mMockIAttentionCallback; private UserState mMockUserState; @Mock private IPowerManager mMockIPowerManager; @Mock Loading Loading @@ -117,7 +117,7 @@ public class AttentionManagerServiceTest { @Test public void testCancelAttentionCheck_noCrashWhenCallbackMismatched() { mSpyUserState.mCurrentAttentionCheck = new AttentionCheck(mMockAttentionCallbackInternal, mMockIAttentionCallback); new AttentionCheck(mMockAttentionCallbackInternal, mMockUserState); doReturn(mSpyUserState).when(mSpyAttentionManager).peekCurrentUserStateLocked(); mSpyAttentionManager.cancelAttentionCheck(null); } Loading @@ -125,7 +125,7 @@ public class AttentionManagerServiceTest { @Test public void testCancelAttentionCheck_cancelCallbackWhenMatched() { mSpyUserState.mCurrentAttentionCheck = new AttentionCheck(mMockAttentionCallbackInternal, mMockIAttentionCallback); new AttentionCheck(mMockAttentionCallbackInternal, mMockUserState); doReturn(mSpyUserState).when(mSpyAttentionManager).peekCurrentUserStateLocked(); mSpyAttentionManager.cancelAttentionCheck(mMockAttentionCallbackInternal); verify(mSpyAttentionManager).cancel(any()); Loading Loading
services/core/java/com/android/server/attention/AttentionManagerService.java +47 −46 Original line number Diff line number Diff line Loading @@ -90,10 +90,12 @@ public class AttentionManagerService extends SystemService { * DeviceConfig flag name, describes how much time we consider a result fresh; if the check * attention called within that period - cached value will be returned. */ @VisibleForTesting static final String KEY_STALE_AFTER_MILLIS = "stale_after_millis"; @VisibleForTesting static final String KEY_STALE_AFTER_MILLIS = "stale_after_millis"; /** Default value in absence of {@link DeviceConfig} override. */ @VisibleForTesting static final long DEFAULT_STALE_AFTER_MILLIS = 1_000; @VisibleForTesting static final long DEFAULT_STALE_AFTER_MILLIS = 1_000; /** The size of the buffer that stores recent attention check results. */ @VisibleForTesting Loading Loading @@ -237,7 +239,7 @@ public class AttentionManagerService extends SystemService { } } userState.mCurrentAttentionCheck = createAttentionCheck(callbackInternal, userState); userState.mCurrentAttentionCheck = new AttentionCheck(callbackInternal, userState); if (userState.mService != null) { try { Loading @@ -255,46 +257,6 @@ public class AttentionManagerService extends SystemService { } } private AttentionCheck createAttentionCheck(AttentionCallbackInternal callbackInternal, UserState userState) { final IAttentionCallback iAttentionCallback = new IAttentionCallback.Stub() { @Override public void onSuccess(@AttentionSuccessCodes int result, long timestamp) { if (userState.mCurrentAttentionCheck.mIsFulfilled) { return; } userState.mCurrentAttentionCheck.mIsFulfilled = true; callbackInternal.onSuccess(result, timestamp); logStats(result); synchronized (mLock) { if (userState.mAttentionCheckCacheBuffer == null) { userState.mAttentionCheckCacheBuffer = new AttentionCheckCacheBuffer(); } userState.mAttentionCheckCacheBuffer.add( new AttentionCheckCache(SystemClock.uptimeMillis(), result, timestamp)); } } @Override public void onFailure(@AttentionFailureCodes int error) { if (userState.mCurrentAttentionCheck.mIsFulfilled) { return; } userState.mCurrentAttentionCheck.mIsFulfilled = true; callbackInternal.onFailure(error); logStats(error); } private void logStats(int result) { FrameworkStatsLog.write( FrameworkStatsLog.ATTENTION_MANAGER_SERVICE_RESULT_REPORTED, result); } }; return new AttentionCheck(callbackInternal, iAttentionCallback); } /** Cancels the specified attention check. */ @VisibleForTesting void cancelAttentionCheck(AttentionCallbackInternal callbackInternal) { Loading Loading @@ -505,13 +467,42 @@ public class AttentionManagerService extends SystemService { static final class AttentionCheck { private final AttentionCallbackInternal mCallbackInternal; private final IAttentionCallback mIAttentionCallback; private boolean mIsDispatched; private boolean mIsFulfilled; AttentionCheck(AttentionCallbackInternal callbackInternal, IAttentionCallback iAttentionCallback) { AttentionCheck(AttentionCallbackInternal callbackInternal, UserState userState) { mCallbackInternal = callbackInternal; mIAttentionCallback = iAttentionCallback; mIAttentionCallback = new IAttentionCallback.Stub() { @Override public void onSuccess(@AttentionSuccessCodes int result, long timestamp) { if (mIsFulfilled) { return; } mIsFulfilled = true; callbackInternal.onSuccess(result, timestamp); logStats(result); userState.appendResultToAttentionCacheBuffer( new AttentionCheckCache(SystemClock.uptimeMillis(), result, timestamp)); } @Override public void onFailure(@AttentionFailureCodes int error) { if (mIsFulfilled) { return; } mIsFulfilled = true; callbackInternal.onFailure(error); logStats(error); } private void logStats(int result) { FrameworkStatsLog.write( FrameworkStatsLog.ATTENTION_MANAGER_SERVICE_RESULT_REPORTED, result); } }; } void cancelInternal() { Loading Loading @@ -611,6 +602,16 @@ public class AttentionManagerService extends SystemService { } } private void appendResultToAttentionCacheBuffer(AttentionCheckCache cache) { synchronized (mLock) { if (mAttentionCheckCacheBuffer == null) { mAttentionCheckCacheBuffer = new AttentionCheckCacheBuffer(); } mAttentionCheckCacheBuffer.add(cache); } } private class AttentionServiceConnection implements ServiceConnection { @Override public void onServiceConnected(ComponentName name, IBinder service) { Loading
services/tests/servicestests/src/com/android/server/attention/AttentionManagerServiceTest.java +3 −3 Original line number Diff line number Diff line Loading @@ -71,7 +71,7 @@ public class AttentionManagerServiceTest { @Mock private AttentionHandler mMockHandler; @Mock private IAttentionCallback mMockIAttentionCallback; private UserState mMockUserState; @Mock private IPowerManager mMockIPowerManager; @Mock Loading Loading @@ -117,7 +117,7 @@ public class AttentionManagerServiceTest { @Test public void testCancelAttentionCheck_noCrashWhenCallbackMismatched() { mSpyUserState.mCurrentAttentionCheck = new AttentionCheck(mMockAttentionCallbackInternal, mMockIAttentionCallback); new AttentionCheck(mMockAttentionCallbackInternal, mMockUserState); doReturn(mSpyUserState).when(mSpyAttentionManager).peekCurrentUserStateLocked(); mSpyAttentionManager.cancelAttentionCheck(null); } Loading @@ -125,7 +125,7 @@ public class AttentionManagerServiceTest { @Test public void testCancelAttentionCheck_cancelCallbackWhenMatched() { mSpyUserState.mCurrentAttentionCheck = new AttentionCheck(mMockAttentionCallbackInternal, mMockIAttentionCallback); new AttentionCheck(mMockAttentionCallbackInternal, mMockUserState); doReturn(mSpyUserState).when(mSpyAttentionManager).peekCurrentUserStateLocked(); mSpyAttentionManager.cancelAttentionCheck(mMockAttentionCallbackInternal); verify(mSpyAttentionManager).cancel(any()); Loading