diff options
| author | 2020-10-15 20:28:04 +0000 | |
|---|---|---|
| committer | 2020-10-15 20:28:04 +0000 | |
| commit | 1eeed7a34e75b7452e15932e21e29373f9873ed9 (patch) | |
| tree | efaa9e22ecc0af2d58ecbcb952f3984c1a7b431c | |
| parent | c9ba946b80cd67c58f7ca52bfec4c3d10127deaf (diff) | |
| parent | 59c9b6da367e75334efe229a5797aadfd41d1f48 (diff) | |
Merge "Count the in-app conversations (locus ID) in the recent conversations"
4 files changed, 87 insertions, 8 deletions
diff --git a/services/people/java/com/android/server/people/data/DataManager.java b/services/people/java/com/android/server/people/data/DataManager.java index 87f2c581ef8f..7803e78eee34 100644 --- a/services/people/java/com/android/server/people/data/DataManager.java +++ b/services/people/java/com/android/server/people/data/DataManager.java @@ -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; } @@ -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. */ @@ -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); } } } diff --git a/services/people/java/com/android/server/people/data/UsageStatsQueryHelper.java b/services/people/java/com/android/server/people/data/UsageStatsQueryHelper.java index d008b72c6bad..aefb6e362255 100644 --- a/services/people/java/com/android/server/people/data/UsageStatsQueryHelper.java +++ b/services/people/java/com/android/server/people/data/UsageStatsQueryHelper.java @@ -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; } /** @@ -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() { diff --git a/services/tests/servicestests/src/com/android/server/people/data/DataManagerTest.java b/services/tests/servicestests/src/com/android/server/people/data/DataManagerTest.java index f37054d269b1..9ce4ee0e8fac 100644 --- a/services/tests/servicestests/src/com/android/server/people/data/DataManagerTest.java +++ b/services/tests/servicestests/src/com/android/server/people/data/DataManagerTest.java @@ -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; @@ -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 { @@ -660,6 +662,26 @@ public final class DataManagerTest { } @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); @@ -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 = @@ -1129,6 +1163,7 @@ public final class DataManagerTest { private TestCallLogQueryHelper mCallLogQueryHelper; private TestMmsQueryHelper mMmsQueryHelper; private TestSmsQueryHelper mSmsQueryHelper; + private TestUsageStatsQueryHelper mUsageStatsQueryHelper; @Override ScheduledExecutorService createScheduledExecutor() { @@ -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; + } } } diff --git a/services/tests/servicestests/src/com/android/server/people/data/UsageStatsQueryHelperTest.java b/services/tests/servicestests/src/com/android/server/people/data/UsageStatsQueryHelperTest.java index e9686071409e..baa74b7ce960 100644 --- a/services/tests/servicestests/src/com/android/server/people/data/UsageStatsQueryHelperTest.java +++ b/services/tests/servicestests/src/com/android/server/people/data/UsageStatsQueryHelperTest.java @@ -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; @@ -72,6 +73,8 @@ public final class UsageStatsQueryHelperTest { @Mock private UsageStatsManagerInternal mUsageStatsManagerInternal; + @Mock + private UsageStatsQueryHelper.EventListener mEventListener; private TestPackageData mPackageData; private UsageStatsQueryHelper mHelper; @@ -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 @@ -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 @@ -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 @@ -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 |