Loading services/people/java/com/android/server/people/data/DataManager.java +17 −4 Original line number Diff line number Diff line Loading @@ -1037,14 +1037,15 @@ public class DataManager { * A {@link Runnable} that queries the Usage Stats Service for recent events for a specified * user. */ private class UsageStatsQueryRunnable implements Runnable { private class UsageStatsQueryRunnable implements Runnable, UsageStatsQueryHelper.EventListener { private final UsageStatsQueryHelper mUsageStatsQueryHelper; private long mLastEventTimestamp; private UsageStatsQueryRunnable(int userId) { mUsageStatsQueryHelper = mInjector.createUsageStatsQueryHelper(userId, (packageName) -> getPackage(packageName, userId)); (packageName) -> getPackage(packageName, userId), this); mLastEventTimestamp = System.currentTimeMillis() - QUERY_EVENTS_MAX_AGE_MS; } Loading @@ -1054,6 +1055,17 @@ public class DataManager { mLastEventTimestamp = mUsageStatsQueryHelper.getLastEventTimestamp(); } } @Override public void onEvent(PackageData packageData, ConversationInfo conversationInfo, Event event) { if (event.getType() == Event.TYPE_IN_APP_CONVERSATION) { ConversationInfo updated = new ConversationInfo.Builder(conversationInfo) .setLastEventTimestamp(event.getTimestamp()) .build(); packageData.getConversationStore().addOrUpdate(updated); } } } /** A {@link BroadcastReceiver} that receives the intents for a specified user. */ Loading Loading @@ -1135,8 +1147,9 @@ public class DataManager { } UsageStatsQueryHelper createUsageStatsQueryHelper(@UserIdInt int userId, Function<String, PackageData> packageDataGetter) { return new UsageStatsQueryHelper(userId, packageDataGetter); Function<String, PackageData> packageDataGetter, UsageStatsQueryHelper.EventListener eventListener) { return new UsageStatsQueryHelper(userId, packageDataGetter, eventListener); } } } services/people/java/com/android/server/people/data/UsageStatsQueryHelper.java +16 −3 Original line number Diff line number Diff line Loading @@ -43,17 +43,24 @@ class UsageStatsQueryHelper { private final Function<String, PackageData> mPackageDataGetter; // Activity name -> Conversation start event (LOCUS_ID_SET) private final Map<ComponentName, UsageEvents.Event> mConvoStartEvents = new ArrayMap<>(); private final EventListener mEventListener; private long mLastEventTimestamp; interface EventListener { void onEvent(PackageData packageData, ConversationInfo conversationInfo, Event event); } /** * @param userId The user whose events are to be queried. * @param packageDataGetter The function to get {@link PackageData} with a package name. * @param eventListener A listener that listens to the new event. */ UsageStatsQueryHelper(@UserIdInt int userId, Function<String, PackageData> packageDataGetter) { Function<String, PackageData> packageDataGetter, EventListener eventListener) { mUsageStatsManagerInternal = getUsageStatsManagerInternal(); mUserId = userId; mPackageDataGetter = packageDataGetter; mEventListener = eventListener; } /** Loading Loading @@ -198,21 +205,27 @@ class UsageStatsQueryHelper { } private void addEventByShortcutId(PackageData packageData, String shortcutId, Event event) { if (packageData.getConversationStore().getConversation(shortcutId) == null) { ConversationInfo conversationInfo = packageData.getConversationStore().getConversation(shortcutId); if (conversationInfo == null) { return; } EventHistoryImpl eventHistory = packageData.getEventStore().getOrCreateEventHistory( EventStore.CATEGORY_SHORTCUT_BASED, shortcutId); eventHistory.addEvent(event); mEventListener.onEvent(packageData, conversationInfo, event); } private void addEventByLocusId(PackageData packageData, LocusId locusId, Event event) { if (packageData.getConversationStore().getConversationByLocusId(locusId) == null) { ConversationInfo conversationInfo = packageData.getConversationStore().getConversationByLocusId(locusId); if (conversationInfo == null) { return; } EventHistoryImpl eventHistory = packageData.getEventStore().getOrCreateEventHistory( EventStore.CATEGORY_LOCUS_ID_BASED, locusId.getId()); eventHistory.addEvent(event); mEventListener.onEvent(packageData, conversationInfo, event); } private static UsageStatsManagerInternal getUsageStatsManagerInternal() { Loading services/tests/servicestests/src/com/android/server/people/data/DataManagerTest.java +44 −0 Original line number Diff line number Diff line Loading @@ -41,6 +41,7 @@ import static org.mockito.Mockito.when; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.UserIdInt; import android.app.Notification; import android.app.NotificationChannel; import android.app.NotificationManager; Loading Loading @@ -100,6 +101,7 @@ import java.util.concurrent.Executor; import java.util.concurrent.ScheduledExecutorService; import java.util.function.BiConsumer; import java.util.function.Consumer; import java.util.function.Function; @RunWith(JUnit4.class) public final class DataManagerTest { Loading Loading @@ -659,6 +661,26 @@ public final class DataManagerTest { assertEquals(2, activeTimeSlots.size()); } @Test public void testConversationLastEventTimestampUpdate() { mDataManager.onUserUnlocked(USER_ID_PRIMARY); ShortcutInfo shortcut = buildShortcutInfo(TEST_PKG_NAME, USER_ID_PRIMARY, TEST_SHORTCUT_ID, buildPerson()); mDataManager.addOrUpdateConversationInfo(shortcut); PackageData packageData = mDataManager.getPackage(TEST_PKG_NAME, USER_ID_PRIMARY); ConversationInfo conversationInfo = packageData.getConversationStore().getConversation(TEST_SHORTCUT_ID); Event event = new Event(123L, Event.TYPE_IN_APP_CONVERSATION); mInjector.mUsageStatsQueryHelper.mEventListener.onEvent(packageData, conversationInfo, event); ConversationInfo newConversationInfo = packageData.getConversationStore().getConversation(TEST_SHORTCUT_ID); assertEquals(123L, newConversationInfo.getLastEventTimestamp()); } @Test public void testDeleteUninstalledPackageDataOnPackageRemoved() { mDataManager.onUserUnlocked(USER_ID_PRIMARY); Loading Loading @@ -1122,6 +1144,18 @@ public final class DataManagerTest { } } private class TestUsageStatsQueryHelper extends UsageStatsQueryHelper { private final EventListener mEventListener; TestUsageStatsQueryHelper(int userId, Function<String, PackageData> packageDataGetter, EventListener eventListener) { super(userId, packageDataGetter, eventListener); mEventListener = eventListener; } } private class TestInjector extends DataManager.Injector { private final TestContactsQueryHelper mContactsQueryHelper = Loading @@ -1129,6 +1163,7 @@ public final class DataManagerTest { private TestCallLogQueryHelper mCallLogQueryHelper; private TestMmsQueryHelper mMmsQueryHelper; private TestSmsQueryHelper mSmsQueryHelper; private TestUsageStatsQueryHelper mUsageStatsQueryHelper; @Override ScheduledExecutorService createScheduledExecutor() { Loading Loading @@ -1165,5 +1200,14 @@ public final class DataManagerTest { mSmsQueryHelper = new TestSmsQueryHelper(context, eventConsumer); return mSmsQueryHelper; } @Override UsageStatsQueryHelper createUsageStatsQueryHelper(@UserIdInt int userId, Function<String, PackageData> packageDataGetter, UsageStatsQueryHelper.EventListener eventListener) { mUsageStatsQueryHelper = new TestUsageStatsQueryHelper(userId, packageDataGetter, eventListener); return mUsageStatsQueryHelper; } } } services/tests/servicestests/src/com/android/server/people/data/UsageStatsQueryHelperTest.java +10 −1 Original line number Diff line number Diff line Loading @@ -26,6 +26,7 @@ import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.annotation.NonNull; Loading Loading @@ -72,6 +73,8 @@ public final class UsageStatsQueryHelperTest { @Mock private UsageStatsManagerInternal mUsageStatsManagerInternal; @Mock private UsageStatsQueryHelper.EventListener mEventListener; private TestPackageData mPackageData; private UsageStatsQueryHelper mHelper; Loading @@ -93,7 +96,7 @@ public final class UsageStatsQueryHelperTest { .setLocusId(LOCUS_ID_1) .build(); mHelper = new UsageStatsQueryHelper(USER_ID_PRIMARY, pkg -> mPackageData); mHelper = new UsageStatsQueryHelper(USER_ID_PRIMARY, pkg -> mPackageData, mEventListener); } @After Loading Loading @@ -131,6 +134,8 @@ public final class UsageStatsQueryHelperTest { Event.ALL_EVENT_TYPES, 0L, Long.MAX_VALUE); assertEquals(1, events.size()); assertEquals(createInAppConversationEvent(100_000L, 10), events.get(0)); verify(mEventListener).onEvent( mPackageData, mPackageData.mConversationStore.mConversationInfo, events.get(0)); } @Test Loading @@ -145,6 +150,8 @@ public final class UsageStatsQueryHelperTest { Event.ALL_EVENT_TYPES, 0L, Long.MAX_VALUE); assertEquals(1, events.size()); assertEquals(createInAppConversationEvent(100_000L, 10), events.get(0)); verify(mEventListener).onEvent( mPackageData, mPackageData.mConversationStore.mConversationInfo, events.get(0)); } @Test Loading @@ -159,6 +166,8 @@ public final class UsageStatsQueryHelperTest { Event.ALL_EVENT_TYPES, 0L, Long.MAX_VALUE); assertEquals(1, events.size()); assertEquals(createInAppConversationEvent(100_000L, 10), events.get(0)); verify(mEventListener).onEvent( mPackageData, mPackageData.mConversationStore.mConversationInfo, events.get(0)); } @Test Loading Loading
services/people/java/com/android/server/people/data/DataManager.java +17 −4 Original line number Diff line number Diff line Loading @@ -1037,14 +1037,15 @@ public class DataManager { * A {@link Runnable} that queries the Usage Stats Service for recent events for a specified * user. */ private class UsageStatsQueryRunnable implements Runnable { private class UsageStatsQueryRunnable implements Runnable, UsageStatsQueryHelper.EventListener { private final UsageStatsQueryHelper mUsageStatsQueryHelper; private long mLastEventTimestamp; private UsageStatsQueryRunnable(int userId) { mUsageStatsQueryHelper = mInjector.createUsageStatsQueryHelper(userId, (packageName) -> getPackage(packageName, userId)); (packageName) -> getPackage(packageName, userId), this); mLastEventTimestamp = System.currentTimeMillis() - QUERY_EVENTS_MAX_AGE_MS; } Loading @@ -1054,6 +1055,17 @@ public class DataManager { mLastEventTimestamp = mUsageStatsQueryHelper.getLastEventTimestamp(); } } @Override public void onEvent(PackageData packageData, ConversationInfo conversationInfo, Event event) { if (event.getType() == Event.TYPE_IN_APP_CONVERSATION) { ConversationInfo updated = new ConversationInfo.Builder(conversationInfo) .setLastEventTimestamp(event.getTimestamp()) .build(); packageData.getConversationStore().addOrUpdate(updated); } } } /** A {@link BroadcastReceiver} that receives the intents for a specified user. */ Loading Loading @@ -1135,8 +1147,9 @@ public class DataManager { } UsageStatsQueryHelper createUsageStatsQueryHelper(@UserIdInt int userId, Function<String, PackageData> packageDataGetter) { return new UsageStatsQueryHelper(userId, packageDataGetter); Function<String, PackageData> packageDataGetter, UsageStatsQueryHelper.EventListener eventListener) { return new UsageStatsQueryHelper(userId, packageDataGetter, eventListener); } } }
services/people/java/com/android/server/people/data/UsageStatsQueryHelper.java +16 −3 Original line number Diff line number Diff line Loading @@ -43,17 +43,24 @@ class UsageStatsQueryHelper { private final Function<String, PackageData> mPackageDataGetter; // Activity name -> Conversation start event (LOCUS_ID_SET) private final Map<ComponentName, UsageEvents.Event> mConvoStartEvents = new ArrayMap<>(); private final EventListener mEventListener; private long mLastEventTimestamp; interface EventListener { void onEvent(PackageData packageData, ConversationInfo conversationInfo, Event event); } /** * @param userId The user whose events are to be queried. * @param packageDataGetter The function to get {@link PackageData} with a package name. * @param eventListener A listener that listens to the new event. */ UsageStatsQueryHelper(@UserIdInt int userId, Function<String, PackageData> packageDataGetter) { Function<String, PackageData> packageDataGetter, EventListener eventListener) { mUsageStatsManagerInternal = getUsageStatsManagerInternal(); mUserId = userId; mPackageDataGetter = packageDataGetter; mEventListener = eventListener; } /** Loading Loading @@ -198,21 +205,27 @@ class UsageStatsQueryHelper { } private void addEventByShortcutId(PackageData packageData, String shortcutId, Event event) { if (packageData.getConversationStore().getConversation(shortcutId) == null) { ConversationInfo conversationInfo = packageData.getConversationStore().getConversation(shortcutId); if (conversationInfo == null) { return; } EventHistoryImpl eventHistory = packageData.getEventStore().getOrCreateEventHistory( EventStore.CATEGORY_SHORTCUT_BASED, shortcutId); eventHistory.addEvent(event); mEventListener.onEvent(packageData, conversationInfo, event); } private void addEventByLocusId(PackageData packageData, LocusId locusId, Event event) { if (packageData.getConversationStore().getConversationByLocusId(locusId) == null) { ConversationInfo conversationInfo = packageData.getConversationStore().getConversationByLocusId(locusId); if (conversationInfo == null) { return; } EventHistoryImpl eventHistory = packageData.getEventStore().getOrCreateEventHistory( EventStore.CATEGORY_LOCUS_ID_BASED, locusId.getId()); eventHistory.addEvent(event); mEventListener.onEvent(packageData, conversationInfo, event); } private static UsageStatsManagerInternal getUsageStatsManagerInternal() { Loading
services/tests/servicestests/src/com/android/server/people/data/DataManagerTest.java +44 −0 Original line number Diff line number Diff line Loading @@ -41,6 +41,7 @@ import static org.mockito.Mockito.when; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.UserIdInt; import android.app.Notification; import android.app.NotificationChannel; import android.app.NotificationManager; Loading Loading @@ -100,6 +101,7 @@ import java.util.concurrent.Executor; import java.util.concurrent.ScheduledExecutorService; import java.util.function.BiConsumer; import java.util.function.Consumer; import java.util.function.Function; @RunWith(JUnit4.class) public final class DataManagerTest { Loading Loading @@ -659,6 +661,26 @@ public final class DataManagerTest { assertEquals(2, activeTimeSlots.size()); } @Test public void testConversationLastEventTimestampUpdate() { mDataManager.onUserUnlocked(USER_ID_PRIMARY); ShortcutInfo shortcut = buildShortcutInfo(TEST_PKG_NAME, USER_ID_PRIMARY, TEST_SHORTCUT_ID, buildPerson()); mDataManager.addOrUpdateConversationInfo(shortcut); PackageData packageData = mDataManager.getPackage(TEST_PKG_NAME, USER_ID_PRIMARY); ConversationInfo conversationInfo = packageData.getConversationStore().getConversation(TEST_SHORTCUT_ID); Event event = new Event(123L, Event.TYPE_IN_APP_CONVERSATION); mInjector.mUsageStatsQueryHelper.mEventListener.onEvent(packageData, conversationInfo, event); ConversationInfo newConversationInfo = packageData.getConversationStore().getConversation(TEST_SHORTCUT_ID); assertEquals(123L, newConversationInfo.getLastEventTimestamp()); } @Test public void testDeleteUninstalledPackageDataOnPackageRemoved() { mDataManager.onUserUnlocked(USER_ID_PRIMARY); Loading Loading @@ -1122,6 +1144,18 @@ public final class DataManagerTest { } } private class TestUsageStatsQueryHelper extends UsageStatsQueryHelper { private final EventListener mEventListener; TestUsageStatsQueryHelper(int userId, Function<String, PackageData> packageDataGetter, EventListener eventListener) { super(userId, packageDataGetter, eventListener); mEventListener = eventListener; } } private class TestInjector extends DataManager.Injector { private final TestContactsQueryHelper mContactsQueryHelper = Loading @@ -1129,6 +1163,7 @@ public final class DataManagerTest { private TestCallLogQueryHelper mCallLogQueryHelper; private TestMmsQueryHelper mMmsQueryHelper; private TestSmsQueryHelper mSmsQueryHelper; private TestUsageStatsQueryHelper mUsageStatsQueryHelper; @Override ScheduledExecutorService createScheduledExecutor() { Loading Loading @@ -1165,5 +1200,14 @@ public final class DataManagerTest { mSmsQueryHelper = new TestSmsQueryHelper(context, eventConsumer); return mSmsQueryHelper; } @Override UsageStatsQueryHelper createUsageStatsQueryHelper(@UserIdInt int userId, Function<String, PackageData> packageDataGetter, UsageStatsQueryHelper.EventListener eventListener) { mUsageStatsQueryHelper = new TestUsageStatsQueryHelper(userId, packageDataGetter, eventListener); return mUsageStatsQueryHelper; } } }
services/tests/servicestests/src/com/android/server/people/data/UsageStatsQueryHelperTest.java +10 −1 Original line number Diff line number Diff line Loading @@ -26,6 +26,7 @@ import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.annotation.NonNull; Loading Loading @@ -72,6 +73,8 @@ public final class UsageStatsQueryHelperTest { @Mock private UsageStatsManagerInternal mUsageStatsManagerInternal; @Mock private UsageStatsQueryHelper.EventListener mEventListener; private TestPackageData mPackageData; private UsageStatsQueryHelper mHelper; Loading @@ -93,7 +96,7 @@ public final class UsageStatsQueryHelperTest { .setLocusId(LOCUS_ID_1) .build(); mHelper = new UsageStatsQueryHelper(USER_ID_PRIMARY, pkg -> mPackageData); mHelper = new UsageStatsQueryHelper(USER_ID_PRIMARY, pkg -> mPackageData, mEventListener); } @After Loading Loading @@ -131,6 +134,8 @@ public final class UsageStatsQueryHelperTest { Event.ALL_EVENT_TYPES, 0L, Long.MAX_VALUE); assertEquals(1, events.size()); assertEquals(createInAppConversationEvent(100_000L, 10), events.get(0)); verify(mEventListener).onEvent( mPackageData, mPackageData.mConversationStore.mConversationInfo, events.get(0)); } @Test Loading @@ -145,6 +150,8 @@ public final class UsageStatsQueryHelperTest { Event.ALL_EVENT_TYPES, 0L, Long.MAX_VALUE); assertEquals(1, events.size()); assertEquals(createInAppConversationEvent(100_000L, 10), events.get(0)); verify(mEventListener).onEvent( mPackageData, mPackageData.mConversationStore.mConversationInfo, events.get(0)); } @Test Loading @@ -159,6 +166,8 @@ public final class UsageStatsQueryHelperTest { Event.ALL_EVENT_TYPES, 0L, Long.MAX_VALUE); assertEquals(1, events.size()); assertEquals(createInAppConversationEvent(100_000L, 10), events.get(0)); verify(mEventListener).onEvent( mPackageData, mPackageData.mConversationStore.mConversationInfo, events.get(0)); } @Test Loading