Merge "Count the in-app conversations (locus ID) in the recent conversations"

This commit is contained in:
Danning Chen
2020-10-15 20:28:04 +00:00
committed by Android (Google) Code Review
4 changed files with 87 additions and 8 deletions

View File

@@ -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);
}
}
}

View File

@@ -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() {

View File

@@ -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 {
@@ -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);
@@ -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;
}
}
}

View File

@@ -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