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

Commit ba132e4f authored by Song Hu's avatar Song Hu
Browse files

Implement sharesheet ranking in PeopleService. Ranking is only based on

recency of past sharing for the moment.

Bug: 149822311
Test: atest com.android.server.people.data.DataManagerTest
Test: atest com.android.server.people.data.ShareTargetPredictorTest
Change-Id: I90d1b3f488b34fede7d577dc04832b976f4a1bbb
parent abe60fe3
Loading
Loading
Loading
Loading
+55 −47
Original line number Diff line number Diff line
@@ -51,7 +51,6 @@ import android.provider.Telephony.MmsSms;
import android.service.notification.NotificationListenerService;
import android.service.notification.StatusBarNotification;
import android.telecom.TelecomManager;
import android.text.TextUtils;
import android.text.format.DateUtils;
import android.util.ArraySet;
import android.util.SparseArray;
@@ -275,41 +274,36 @@ public class DataManager {
                mContext.getPackageName(), intentFilter, callingUserId);
    }

    /** Reports the {@link AppTargetEvent} from App Prediction Manager. */
    public void reportAppTargetEvent(@NonNull AppTargetEvent event,
    /** Reports the sharing related {@link AppTargetEvent} from App Prediction Manager. */
    public void reportShareTargetEvent(@NonNull AppTargetEvent event,
            @Nullable IntentFilter intentFilter) {
        AppTarget appTarget = event.getTarget();
        ShortcutInfo shortcutInfo = appTarget != null ? appTarget.getShortcutInfo() : null;
        if (shortcutInfo == null || event.getAction() != AppTargetEvent.ACTION_LAUNCH) {
        if (appTarget == null || event.getAction() != AppTargetEvent.ACTION_LAUNCH) {
            return;
        }
        PackageData packageData = getPackage(appTarget.getPackageName(),
                appTarget.getUser().getIdentifier());
        if (packageData == null) {
            return;
        }
        if (ChooserActivity.LAUNCH_LOCATON_DIRECT_SHARE.equals(event.getLaunchLocation())) {
        UserData userData = getUnlockedUserData(appTarget.getUser().getIdentifier());
        PackageData packageData = userData.getOrCreatePackageData(appTarget.getPackageName());
        String mimeType = intentFilter != null ? intentFilter.getDataType(0) : null;
            String shortcutId = shortcutInfo.getId();
            if (packageData.getConversationStore().getConversation(shortcutId) == null
                    || TextUtils.isEmpty(mimeType)) {
        @Event.EventType int eventType = mimeTypeToShareEventType(mimeType);
        EventHistoryImpl eventHistory;
        if (ChooserActivity.LAUNCH_LOCATON_DIRECT_SHARE.equals(event.getLaunchLocation())) {
            // Direct share event
            if (appTarget.getShortcutInfo() == null) {
                return;
            }
            EventHistoryImpl eventHistory = packageData.getEventStore().getOrCreateEventHistory(
                    EventStore.CATEGORY_SHORTCUT_BASED, shortcutInfo.getId());
            @Event.EventType int eventType;
            if (mimeType.startsWith("text/")) {
                eventType = Event.TYPE_SHARE_TEXT;
            } else if (mimeType.startsWith("image/")) {
                eventType = Event.TYPE_SHARE_IMAGE;
            } else if (mimeType.startsWith("video/")) {
                eventType = Event.TYPE_SHARE_VIDEO;
            String shortcutId = appTarget.getShortcutInfo().getId();
            if (packageData.getConversationStore().getConversation(shortcutId) == null) {
                addOrUpdateConversationInfo(appTarget.getShortcutInfo());
            }
            eventHistory = packageData.getEventStore().getOrCreateEventHistory(
                    EventStore.CATEGORY_SHORTCUT_BASED, shortcutId);
        } else {
                eventType = Event.TYPE_SHARE_OTHER;
            // App share event
            eventHistory = packageData.getEventStore().getOrCreateEventHistory(
                    EventStore.CATEGORY_CLASS_BASED, appTarget.getClassName());
        }
        eventHistory.addEvent(new Event(System.currentTimeMillis(), eventType));
    }
    }

    /** Prunes the data for the specified user. */
    public void pruneDataForUser(@UserIdInt int userId, @NonNull CancellationSignal signal) {
@@ -335,6 +329,17 @@ public class DataManager {
        });
    }

    private int mimeTypeToShareEventType(String mimeType) {
        if (mimeType.startsWith("text/")) {
            return Event.TYPE_SHARE_TEXT;
        } else if (mimeType.startsWith("image/")) {
            return Event.TYPE_SHARE_IMAGE;
        } else if (mimeType.startsWith("video/")) {
            return Event.TYPE_SHARE_VIDEO;
        }
        return Event.TYPE_SHARE_OTHER;
    }

    private void pruneUninstalledPackageData(@NonNull UserData userData) {
        Set<String> installApps = new ArraySet<>();
        mPackageManagerInternal.forEachInstalledPackage(
@@ -410,12 +415,13 @@ public class DataManager {
                EventStore.CATEGORY_SHORTCUT_BASED, shortcutId);
    }

    private boolean isPersonShortcut(@NonNull ShortcutInfo shortcutInfo) {
        return shortcutInfo.getPersons() != null && shortcutInfo.getPersons().length != 0;
    }

    @VisibleForTesting
    @WorkerThread
    void onShortcutAddedOrUpdated(@NonNull ShortcutInfo shortcutInfo) {
        if (shortcutInfo.getPersons() == null || shortcutInfo.getPersons().length == 0) {
            return;
        }
    void addOrUpdateConversationInfo(@NonNull ShortcutInfo shortcutInfo) {
        UserData userData = getUnlockedUserData(shortcutInfo.getUserId());
        if (userData == null) {
            return;
@@ -431,7 +437,11 @@ public class DataManager {
        builder.setShortcutId(shortcutInfo.getId());
        builder.setLocusId(shortcutInfo.getLocusId());
        builder.setShortcutFlags(shortcutInfo.getFlags());
        builder.setContactUri(null);
        builder.setContactPhoneNumber(null);
        builder.setContactStarred(false);

        if (shortcutInfo.getPersons() != null && shortcutInfo.getPersons().length != 0) {
            Person person = shortcutInfo.getPersons()[0];
            builder.setPersonImportant(person.isImportant());
            builder.setPersonBot(person.isBot());
@@ -443,12 +453,8 @@ public class DataManager {
                    builder.setContactStarred(helper.isStarred());
                    builder.setContactPhoneNumber(helper.getPhoneNumber());
                }
        } else {
            builder.setContactUri(null);
            builder.setContactPhoneNumber(null);
            builder.setContactStarred(false);
            }

        }
        conversationStore.addOrUpdate(builder.build());
    }

@@ -626,7 +632,9 @@ public class DataManager {
                List<ShortcutInfo> shortcuts = getShortcuts(packageName, userId,
                        /*shortcutIds=*/ null);
                for (ShortcutInfo shortcut : shortcuts) {
                    onShortcutAddedOrUpdated(shortcut);
                    if (isPersonShortcut(shortcut)) {
                        addOrUpdateConversationInfo(shortcut);
                    }
                }
            });
        }
+6 −0
Original line number Diff line number Diff line
@@ -73,6 +73,7 @@ public class AppTargetPredictor {
     */
    @MainThread
    public void onAppTargetEvent(AppTargetEvent event) {
        mCallbackExecutor.execute(() -> reportAppTargetEvent(event));
    }

    /**
@@ -104,6 +105,11 @@ public class AppTargetPredictor {
        return mUpdatePredictionsMethod;
    }

    /** To be overridden by the subclass to report app target event. */
    @WorkerThread
    void reportAppTargetEvent(AppTargetEvent event) {
    }

    /** To be overridden by the subclass to predict the targets. */
    @WorkerThread
    void predictTargets() {
+95 −43
Original line number Diff line number Diff line
@@ -16,7 +16,6 @@

package com.android.server.people.prediction;

import android.annotation.MainThread;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.UserIdInt;
@@ -28,15 +27,18 @@ import android.app.prediction.AppTargetId;
import android.content.IntentFilter;
import android.content.pm.ShortcutInfo;
import android.content.pm.ShortcutManager.ShareShortcutInfo;
import android.util.Range;

import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.app.ChooserActivity;
import com.android.server.people.data.ConversationInfo;
import com.android.server.people.data.DataManager;
import com.android.server.people.data.Event;
import com.android.server.people.data.EventHistory;
import com.android.server.people.data.PackageData;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.function.Consumer;

@@ -52,62 +54,102 @@ class ShareTargetPredictor extends AppTargetPredictor {
                ChooserActivity.APP_PREDICTION_INTENT_FILTER_KEY);
    }

    @MainThread
    /** Reports chosen history of direct/app share targets. */
    @WorkerThread
    @Override
    public void onAppTargetEvent(AppTargetEvent event) {
        getDataManager().reportAppTargetEvent(event, mIntentFilter);
    void reportAppTargetEvent(AppTargetEvent event) {
        getDataManager().reportShareTargetEvent(event, mIntentFilter);
    }

    /** Provides prediction on direct share targets */
    @WorkerThread
    @Override
    protected void predictTargets() {
        List<ShareTarget> shareTargets = getShareTargets();
        // TODO: Rank the share targets with the data in ShareTarget.mConversationData.
        List<AppTarget> appTargets = new ArrayList<>();
        for (ShareTarget shareTarget : shareTargets) {

            ShortcutInfo shortcutInfo = shareTarget.getShareShortcutInfo().getShortcutInfo();
            AppTargetId appTargetId = new AppTargetId(shortcutInfo.getId());
            String shareTargetClassName =
                    shareTarget.getShareShortcutInfo().getTargetComponent().getClassName();
            AppTarget appTarget = new AppTarget.Builder(appTargetId, shortcutInfo)
                    .setClassName(shareTargetClassName)
                    .build();
            appTargets.add(appTarget);
            if (appTargets.size() >= getPredictionContext().getPredictedTargetCount()) {
                break;
    void predictTargets() {
        List<ShareTarget> shareTargets = getDirectShareTargets();
        rankTargets(shareTargets);
        List<AppTarget> res = new ArrayList<>();
        for (int i = 0; i < Math.min(getPredictionContext().getPredictedTargetCount(),
                shareTargets.size()); i++) {
            res.add(shareTargets.get(i).getAppTarget());
        }
        updatePredictions(res);
    }
        updatePredictions(appTargets);

    /** Provides prediction on app share targets */
    @WorkerThread
    @Override
    void sortTargets(List<AppTarget> targets, Consumer<List<AppTarget>> callback) {
        List<ShareTarget> shareTargets = getAppShareTargets(targets);
        rankTargets(shareTargets);
        List<AppTarget> appTargetList = new ArrayList<>();
        shareTargets.forEach(t -> appTargetList.add(t.getAppTarget()));
        callback.accept(appTargetList);
    }

    @VisibleForTesting
    List<ShareTarget> getShareTargets() {
    private void rankTargets(List<ShareTarget> shareTargets) {
        // Rank targets based on recency of sharing history only for the moment.
        // TODO: Take more factors into ranking, e.g. frequency, mime type, foreground app.
        Collections.sort(shareTargets, (t1, t2) -> {
            if (t1.getEventHistory() == null) {
                return 1;
            }
            if (t2.getEventHistory() == null) {
                return -1;
            }
            Range<Long> timeSlot1 = t1.getEventHistory().getEventIndex(
                    Event.SHARE_EVENT_TYPES).getMostRecentActiveTimeSlot();
            Range<Long> timeSlot2 = t2.getEventHistory().getEventIndex(
                    Event.SHARE_EVENT_TYPES).getMostRecentActiveTimeSlot();
            if (timeSlot1 == null) {
                return 1;
            } else if (timeSlot2 == null) {
                return -1;
            } else {
                return -Long.compare(timeSlot1.getUpper(), timeSlot2.getUpper());
            }
        });
    }

    private List<ShareTarget> getDirectShareTargets() {
        List<ShareTarget> shareTargets = new ArrayList<>();
        List<ShareShortcutInfo> shareShortcuts =
                getDataManager().getShareShortcuts(mIntentFilter, mCallingUserId);

        for (ShareShortcutInfo shareShortcut : shareShortcuts) {
            ShortcutInfo shortcutInfo = shareShortcut.getShortcutInfo();
            AppTarget appTarget = new AppTarget.Builder(
                    new AppTargetId(shortcutInfo.getId()),
                    shortcutInfo)
                    .setClassName(shareShortcut.getTargetComponent().getClassName())
                    .build();
            String packageName = shortcutInfo.getPackage();
            int userId = shortcutInfo.getUserId();
            PackageData packageData = getDataManager().getPackage(packageName, userId);

            ConversationData conversationData = null;
            ConversationInfo conversationInfo = null;
            EventHistory eventHistory = null;
            if (packageData != null) {
                String shortcutId = shortcutInfo.getId();
                ConversationInfo conversationInfo =
                        packageData.getConversationInfo(shortcutId);

                conversationInfo = packageData.getConversationInfo(shortcutId);
                if (conversationInfo != null) {
                    EventHistory eventHistory = packageData.getEventHistory(shortcutId);
                    conversationData = new ConversationData(
                            packageName, userId, conversationInfo, eventHistory);
                    eventHistory = packageData.getEventHistory(shortcutId);
                }
            }
            shareTargets.add(new ShareTarget(appTarget, eventHistory, conversationInfo));
        }
            shareTargets.add(new ShareTarget(shareShortcut, conversationData));

        return shareTargets;
    }

    private List<ShareTarget> getAppShareTargets(List<AppTarget> targets) {
        List<ShareTarget> shareTargets = new ArrayList<>();
        for (AppTarget target : targets) {
            PackageData packageData = getDataManager().getPackage(target.getPackageName(),
                    target.getUser().getIdentifier());
            shareTargets.add(new ShareTarget(target,
                    packageData == null ? null
                            : packageData.getClassLevelEventHistory(target.getClassName()), null));
        }
        return shareTargets;
    }

@@ -115,26 +157,36 @@ class ShareTargetPredictor extends AppTargetPredictor {
    static class ShareTarget {

        @NonNull
        private final ShareShortcutInfo mShareShortcutInfo;
        private final AppTarget mAppTarget;
        @Nullable
        private final ConversationData mConversationData;

        private ShareTarget(@NonNull ShareShortcutInfo shareShortcutInfo,
                @Nullable ConversationData conversationData) {
            mShareShortcutInfo = shareShortcutInfo;
            mConversationData = conversationData;
        private final EventHistory mEventHistory;
        @Nullable
        private final ConversationInfo mConversationInfo;

        private ShareTarget(@NonNull AppTarget appTarget,
                @Nullable EventHistory eventHistory,
                @Nullable ConversationInfo conversationInfo) {
            mAppTarget = appTarget;
            mEventHistory = eventHistory;
            mConversationInfo = conversationInfo;
        }

        @NonNull
        @VisibleForTesting
        ShareShortcutInfo getShareShortcutInfo() {
            return mShareShortcutInfo;
        AppTarget getAppTarget() {
            return mAppTarget;
        }

        @Nullable
        @VisibleForTesting
        EventHistory getEventHistory() {
            return mEventHistory;
        }

        @Nullable
        @VisibleForTesting
        ConversationData getConversationData() {
            return mConversationData;
        ConversationInfo getConversationInfo() {
            return mConversationInfo;
        }
    }
}
+70 −20
Original line number Diff line number Diff line
@@ -100,6 +100,7 @@ public final class DataManagerTest {
    private static final int USER_ID_PRIMARY_MANAGED = 10;
    private static final int USER_ID_SECONDARY = 11;
    private static final String TEST_PKG_NAME = "pkg";
    private static final String TEST_CLASS_NAME = "class";
    private static final String TEST_SHORTCUT_ID = "sc";
    private static final String CONTACT_URI = "content://com.android.contacts/contacts/lookup/123";
    private static final String PHONE_NUMBER = "+1234567890";
@@ -206,13 +207,13 @@ public final class DataManagerTest {
        mDataManager.onUserUnlocked(USER_ID_PRIMARY_MANAGED);
        mDataManager.onUserUnlocked(USER_ID_SECONDARY);

        mDataManager.onShortcutAddedOrUpdated(
        mDataManager.addOrUpdateConversationInfo(
                buildShortcutInfo("pkg_1", USER_ID_PRIMARY, "sc_1",
                        buildPerson(true, false)));
        mDataManager.onShortcutAddedOrUpdated(
        mDataManager.addOrUpdateConversationInfo(
                buildShortcutInfo("pkg_2", USER_ID_PRIMARY_MANAGED, "sc_2",
                        buildPerson(false, true)));
        mDataManager.onShortcutAddedOrUpdated(
        mDataManager.addOrUpdateConversationInfo(
                buildShortcutInfo("pkg_3", USER_ID_SECONDARY, "sc_3", buildPerson()));

        List<ConversationInfo> conversations = getConversationsInPrimary();
@@ -236,9 +237,9 @@ public final class DataManagerTest {
    @Test
    public void testAccessConversationForUnlockedUsersOnly() {
        mDataManager.onUserUnlocked(USER_ID_PRIMARY);
        mDataManager.onShortcutAddedOrUpdated(
        mDataManager.addOrUpdateConversationInfo(
                buildShortcutInfo("pkg_1", USER_ID_PRIMARY, "sc_1", buildPerson()));
        mDataManager.onShortcutAddedOrUpdated(
        mDataManager.addOrUpdateConversationInfo(
                buildShortcutInfo("pkg_2", USER_ID_PRIMARY_MANAGED, "sc_2", buildPerson()));

        List<ConversationInfo> conversations = getConversationsInPrimary();
@@ -261,11 +262,12 @@ public final class DataManagerTest {
    }

    @Test
    public void testReportAppTargetEvent() throws IntentFilter.MalformedMimeTypeException {
    public void testReportAppTargetEvent_directSharing()
            throws IntentFilter.MalformedMimeTypeException {
        mDataManager.onUserUnlocked(USER_ID_PRIMARY);
        ShortcutInfo shortcut = buildShortcutInfo(TEST_PKG_NAME, USER_ID_PRIMARY, TEST_SHORTCUT_ID,
                buildPerson());
        mDataManager.onShortcutAddedOrUpdated(shortcut);
        mDataManager.addOrUpdateConversationInfo(shortcut);

        AppTarget appTarget = new AppTarget.Builder(new AppTargetId(TEST_SHORTCUT_ID), shortcut)
                .build();
@@ -274,7 +276,55 @@ public final class DataManagerTest {
                        .setLaunchLocation(ChooserActivity.LAUNCH_LOCATON_DIRECT_SHARE)
                        .build();
        IntentFilter intentFilter = new IntentFilter(Intent.ACTION_SEND, "image/jpg");
        mDataManager.reportAppTargetEvent(appTargetEvent, intentFilter);
        mDataManager.reportShareTargetEvent(appTargetEvent, intentFilter);

        List<Range<Long>> activeShareTimeSlots = getActiveSlotsForTestShortcut(
                Event.SHARE_EVENT_TYPES);
        assertEquals(1, activeShareTimeSlots.size());
    }

    @Test
    public void testReportAppTargetEvent_directSharing_createConversation()
            throws IntentFilter.MalformedMimeTypeException {
        mDataManager.onUserUnlocked(USER_ID_PRIMARY);
        ShortcutInfo shortcut = buildShortcutInfo(TEST_PKG_NAME, USER_ID_PRIMARY, TEST_SHORTCUT_ID,
                null);
        AppTarget appTarget = new AppTarget.Builder(new AppTargetId(TEST_SHORTCUT_ID), shortcut)
                .build();
        AppTargetEvent appTargetEvent =
                new AppTargetEvent.Builder(appTarget, AppTargetEvent.ACTION_LAUNCH)
                        .setLaunchLocation(ChooserActivity.LAUNCH_LOCATON_DIRECT_SHARE)
                        .build();
        IntentFilter intentFilter = new IntentFilter(Intent.ACTION_SEND, "image/jpg");

        mDataManager.reportShareTargetEvent(appTargetEvent, intentFilter);

        List<Range<Long>> activeShareTimeSlots = getActiveSlotsForTestShortcut(
                Event.SHARE_EVENT_TYPES);
        assertEquals(1, activeShareTimeSlots.size());
        ConversationInfo conversationInfo = mDataManager.getPackage(TEST_PKG_NAME, USER_ID_PRIMARY)
                .getConversationStore()
                .getConversation(TEST_SHORTCUT_ID);
        assertNotNull(conversationInfo);
        assertEquals(conversationInfo.getShortcutId(), TEST_SHORTCUT_ID);
    }

    @Test
    public void testReportAppTargetEvent_appSharing()
            throws IntentFilter.MalformedMimeTypeException {
        mDataManager.onUserUnlocked(USER_ID_PRIMARY);
        AppTarget appTarget = new AppTarget.Builder(
                    new AppTargetId(TEST_SHORTCUT_ID),
                    TEST_PKG_NAME,
                    UserHandle.of(USER_ID_PRIMARY))
                .setClassName(TEST_CLASS_NAME)
                .build();
        AppTargetEvent appTargetEvent =
                new AppTargetEvent.Builder(appTarget, AppTargetEvent.ACTION_LAUNCH)
                        .build();
        IntentFilter intentFilter = new IntentFilter(Intent.ACTION_SEND, "image/jpg");

        mDataManager.reportShareTargetEvent(appTargetEvent, intentFilter);

        List<Range<Long>> activeShareTimeSlots = getActiveSlotsForTestShortcut(
                Event.SHARE_EVENT_TYPES);
@@ -288,7 +338,7 @@ public final class DataManagerTest {

        ShortcutInfo shortcut = buildShortcutInfo(TEST_PKG_NAME, USER_ID_PRIMARY, TEST_SHORTCUT_ID,
                buildPerson());
        mDataManager.onShortcutAddedOrUpdated(shortcut);
        mDataManager.addOrUpdateConversationInfo(shortcut);

        final String newPhoneNumber = "+1000000000";
        mInjector.mContactsQueryHelper.mIsStarred = true;
@@ -312,7 +362,7 @@ public final class DataManagerTest {

        ShortcutInfo shortcut = buildShortcutInfo(TEST_PKG_NAME, USER_ID_PRIMARY, TEST_SHORTCUT_ID,
                buildPerson());
        mDataManager.onShortcutAddedOrUpdated(shortcut);
        mDataManager.addOrUpdateConversationInfo(shortcut);

        NotificationListenerService listenerService =
                mDataManager.getNotificationListenerServiceForTesting(USER_ID_PRIMARY);
@@ -330,7 +380,7 @@ public final class DataManagerTest {

        ShortcutInfo shortcut = buildShortcutInfo(TEST_PKG_NAME, USER_ID_PRIMARY, TEST_SHORTCUT_ID,
                buildPerson());
        mDataManager.onShortcutAddedOrUpdated(shortcut);
        mDataManager.addOrUpdateConversationInfo(shortcut);

        NotificationListenerService listenerService =
                mDataManager.getNotificationListenerServiceForTesting(USER_ID_PRIMARY);
@@ -350,7 +400,7 @@ public final class DataManagerTest {

        ShortcutInfo shortcut = buildShortcutInfo(TEST_PKG_NAME, USER_ID_PRIMARY, TEST_SHORTCUT_ID,
                buildPerson());
        mDataManager.onShortcutAddedOrUpdated(shortcut);
        mDataManager.addOrUpdateConversationInfo(shortcut);

        NotificationListenerService listenerService =
                mDataManager.getNotificationListenerServiceForTesting(USER_ID_PRIMARY);
@@ -375,7 +425,7 @@ public final class DataManagerTest {

        ShortcutInfo shortcut = buildShortcutInfo(TEST_PKG_NAME, USER_ID_PRIMARY, TEST_SHORTCUT_ID,
                buildPerson());
        mDataManager.onShortcutAddedOrUpdated(shortcut);
        mDataManager.addOrUpdateConversationInfo(shortcut);

        NotificationListenerService listenerService =
                mDataManager.getNotificationListenerServiceForTesting(USER_ID_PRIMARY);
@@ -401,7 +451,7 @@ public final class DataManagerTest {

        ShortcutInfo shortcut = buildShortcutInfo(TEST_PKG_NAME, USER_ID_PRIMARY, TEST_SHORTCUT_ID,
                buildPerson());
        mDataManager.onShortcutAddedOrUpdated(shortcut);
        mDataManager.addOrUpdateConversationInfo(shortcut);

        NotificationListenerService listenerService =
                mDataManager.getNotificationListenerServiceForTesting(USER_ID_PRIMARY);
@@ -430,7 +480,7 @@ public final class DataManagerTest {

        ShortcutInfo shortcut = buildShortcutInfo(TEST_PKG_NAME, USER_ID_PRIMARY, TEST_SHORTCUT_ID,
                buildPerson());
        mDataManager.onShortcutAddedOrUpdated(shortcut);
        mDataManager.addOrUpdateConversationInfo(shortcut);

        ContentObserver contentObserver = mDataManager.getCallLogContentObserverForTesting();
        contentObserver.onChange(false);
@@ -453,7 +503,7 @@ public final class DataManagerTest {

        ShortcutInfo shortcut = buildShortcutInfo(TEST_PKG_NAME, USER_ID_PRIMARY, TEST_SHORTCUT_ID,
                buildPerson());
        mDataManager.onShortcutAddedOrUpdated(shortcut);
        mDataManager.addOrUpdateConversationInfo(shortcut);
        mDataManager.getUserDataForTesting(USER_ID_PRIMARY).setDefaultSmsApp(TEST_PKG_NAME);

        ContentObserver contentObserver = mDataManager.getMmsSmsContentObserverForTesting();
@@ -476,7 +526,7 @@ public final class DataManagerTest {

        ShortcutInfo shortcut = buildShortcutInfo(TEST_PKG_NAME, USER_ID_PRIMARY, TEST_SHORTCUT_ID,
                buildPerson());
        mDataManager.onShortcutAddedOrUpdated(shortcut);
        mDataManager.addOrUpdateConversationInfo(shortcut);
        assertNotNull(mDataManager.getPackage(TEST_PKG_NAME, USER_ID_PRIMARY));

        PackageMonitor packageMonitor = mDataManager.getPackageMonitorForTesting(USER_ID_PRIMARY);
@@ -493,7 +543,7 @@ public final class DataManagerTest {

        ShortcutInfo shortcut = buildShortcutInfo(TEST_PKG_NAME, USER_ID_PRIMARY, TEST_SHORTCUT_ID,
                buildPerson());
        mDataManager.onShortcutAddedOrUpdated(shortcut);
        mDataManager.addOrUpdateConversationInfo(shortcut);
        assertNotNull(mDataManager.getPackage(TEST_PKG_NAME, USER_ID_PRIMARY));

        doAnswer(ans -> null).when(mPackageManagerInternal)
@@ -508,7 +558,7 @@ public final class DataManagerTest {

        ShortcutInfo shortcut = buildShortcutInfo(TEST_PKG_NAME, USER_ID_PRIMARY, TEST_SHORTCUT_ID,
                buildPerson());
        mDataManager.onShortcutAddedOrUpdated(shortcut);
        mDataManager.addOrUpdateConversationInfo(shortcut);

        long currentTimestamp = System.currentTimeMillis();
        mInjector.mCallLogQueryHelper.mEventConsumer.accept(PHONE_NUMBER,
@@ -529,7 +579,7 @@ public final class DataManagerTest {

        ShortcutInfo shortcut = buildShortcutInfo(TEST_PKG_NAME, USER_ID_PRIMARY, TEST_SHORTCUT_ID,
                buildPerson());
        mDataManager.onShortcutAddedOrUpdated(shortcut);
        mDataManager.addOrUpdateConversationInfo(shortcut);
        mDataManager.getUserDataForTesting(USER_ID_PRIMARY).setDefaultSmsApp(TEST_PKG_NAME);

        long currentTimestamp = System.currentTimeMillis();
+166 −20

File changed.

Preview size limit exceeded, changes collapsed.