Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1eeed7a3 authored by Danning Chen's avatar Danning Chen Committed by Android (Google) Code Review
Browse files

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

parents c9ba946b 59c9b6da
Loading
Loading
Loading
Loading
+17 −4
Original line number Diff line number Diff line
@@ -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);
        }
    }
}
+16 −3
Original line number Diff line number Diff line
@@ -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() {
+44 −0
Original line number Diff line number Diff line
@@ -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;
        }
    }
}
+10 −1
Original line number Diff line number Diff line
@@ -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