Count the in-app conversations (locus ID) in the recent conversations
A conversation still needs to post a notification in order to be showing in the recent conversations list. But couting the in-app conversations will update their last usage timestamp whch affects the order of each conversation in the list. Bug: 162593584 Test: manual test + atest Change-Id: I8ceeb4f39d525c9137abaf01bd54cd873cb07bde
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user