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

Commit 28e170a4 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Automerger Merge Worker
Browse files

Merge "File 'open with' flow would trigger sharesheet with null intentFilter,...

Merge "File 'open with' flow would trigger sharesheet with null intentFilter, In this case, return empty list for direct share, default list for app share, skip reporting sharing targets." into rvc-dev am: 6dc1831a

Change-Id: I9dd3199ec23513e47f1badb11c86ae90c7230bbb
parents 2bed9aa0 6dc1831a
Loading
Loading
Loading
Loading
+2 −3
Original line number Original line Diff line number Diff line
@@ -210,7 +210,7 @@ public class DataManager {


    /** Reports the sharing related {@link AppTargetEvent} from App Prediction Manager. */
    /** Reports the sharing related {@link AppTargetEvent} from App Prediction Manager. */
    public void reportShareTargetEvent(@NonNull AppTargetEvent event,
    public void reportShareTargetEvent(@NonNull AppTargetEvent event,
            @Nullable IntentFilter intentFilter) {
            @NonNull IntentFilter intentFilter) {
        AppTarget appTarget = event.getTarget();
        AppTarget appTarget = event.getTarget();
        if (appTarget == null || event.getAction() != AppTargetEvent.ACTION_LAUNCH) {
        if (appTarget == null || event.getAction() != AppTargetEvent.ACTION_LAUNCH) {
            return;
            return;
@@ -220,8 +220,7 @@ public class DataManager {
            return;
            return;
        }
        }
        PackageData packageData = userData.getOrCreatePackageData(appTarget.getPackageName());
        PackageData packageData = userData.getOrCreatePackageData(appTarget.getPackageName());
        String mimeType = intentFilter != null ? intentFilter.getDataType(0) : null;
        @Event.EventType int eventType = mimeTypeToShareEventType(intentFilter.getDataType(0));
        @Event.EventType int eventType = mimeTypeToShareEventType(mimeType);
        EventHistoryImpl eventHistory;
        EventHistoryImpl eventHistory;
        if (ChooserActivity.LAUNCH_LOCATION_DIRECT_SHARE.equals(event.getLaunchLocation())) {
        if (ChooserActivity.LAUNCH_LOCATION_DIRECT_SHARE.equals(event.getLaunchLocation())) {
            // Direct share event
            // Direct share event
+11 −1
Original line number Original line Diff line number Diff line
@@ -66,8 +66,10 @@ class ShareTargetPredictor extends AppTargetPredictor {
        if (DEBUG) {
        if (DEBUG) {
            Slog.d(TAG, "reportAppTargetEvent");
            Slog.d(TAG, "reportAppTargetEvent");
        }
        }
        if (mIntentFilter != null) {
            getDataManager().reportShareTargetEvent(event, mIntentFilter);
            getDataManager().reportShareTargetEvent(event, mIntentFilter);
        }
        }
    }


    /** Provides prediction on direct share targets */
    /** Provides prediction on direct share targets */
    @WorkerThread
    @WorkerThread
@@ -76,6 +78,10 @@ class ShareTargetPredictor extends AppTargetPredictor {
        if (DEBUG) {
        if (DEBUG) {
            Slog.d(TAG, "predictTargets");
            Slog.d(TAG, "predictTargets");
        }
        }
        if (mIntentFilter == null) {
            updatePredictions(List.of());
            return;
        }
        List<ShareTarget> shareTargets = getDirectShareTargets();
        List<ShareTarget> shareTargets = getDirectShareTargets();
        SharesheetModelScorer.computeScore(shareTargets, getShareEventType(mIntentFilter),
        SharesheetModelScorer.computeScore(shareTargets, getShareEventType(mIntentFilter),
                System.currentTimeMillis());
                System.currentTimeMillis());
@@ -95,6 +101,10 @@ class ShareTargetPredictor extends AppTargetPredictor {
        if (DEBUG) {
        if (DEBUG) {
            Slog.d(TAG, "sortTargets");
            Slog.d(TAG, "sortTargets");
        }
        }
        if (mIntentFilter == null) {
            callback.accept(targets);
            return;
        }
        List<ShareTarget> shareTargets = getAppShareTargets(targets);
        List<ShareTarget> shareTargets = getAppShareTargets(targets);
        SharesheetModelScorer.computeScoreForAppShare(shareTargets,
        SharesheetModelScorer.computeScoreForAppShare(shareTargets,
                getShareEventType(mIntentFilter), getPredictionContext().getPredictedTargetCount(),
                getShareEventType(mIntentFilter), getPredictionContext().getPredictedTargetCount(),
+60 −1
Original line number Original line Diff line number Diff line
@@ -16,11 +16,14 @@


package com.android.server.people.prediction;
package com.android.server.people.prediction;


import static com.google.common.truth.Truth.assertThat;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertEquals;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anySet;
import static org.mockito.ArgumentMatchers.anySet;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import static org.mockito.Mockito.when;


@@ -30,12 +33,14 @@ import android.app.prediction.AppTargetId;
import android.content.ComponentName;
import android.content.ComponentName;
import android.content.Context;
import android.content.Context;
import android.content.Intent;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.ShortcutInfo;
import android.content.pm.ShortcutInfo;
import android.content.pm.ShortcutManager.ShareShortcutInfo;
import android.content.pm.ShortcutManager.ShareShortcutInfo;
import android.os.Bundle;
import android.os.Bundle;
import android.os.UserHandle;
import android.os.UserHandle;
import android.util.Range;
import android.util.Range;


import com.android.internal.app.ChooserActivity;
import com.android.server.people.data.ConversationInfo;
import com.android.server.people.data.ConversationInfo;
import com.android.server.people.data.DataManager;
import com.android.server.people.data.DataManager;
import com.android.server.people.data.EventHistory;
import com.android.server.people.data.EventHistory;
@@ -98,10 +103,13 @@ public final class ShareTargetPredictorTest {
        when(mDataManager.getPackage(PACKAGE_1, USER_ID)).thenReturn(mPackageData1);
        when(mDataManager.getPackage(PACKAGE_1, USER_ID)).thenReturn(mPackageData1);
        when(mDataManager.getPackage(PACKAGE_2, USER_ID)).thenReturn(mPackageData2);
        when(mDataManager.getPackage(PACKAGE_2, USER_ID)).thenReturn(mPackageData2);


        Bundle bundle = new Bundle();
        bundle.putObject(ChooserActivity.APP_PREDICTION_INTENT_FILTER_KEY,
                IntentFilter.create("SEND", "text/plain"));
        AppPredictionContext predictionContext = new AppPredictionContext.Builder(mContext)
        AppPredictionContext predictionContext = new AppPredictionContext.Builder(mContext)
                .setUiSurface(UI_SURFACE_SHARE)
                .setUiSurface(UI_SURFACE_SHARE)
                .setPredictedTargetCount(NUM_PREDICTED_TARGETS)
                .setPredictedTargetCount(NUM_PREDICTED_TARGETS)
                .setExtras(new Bundle())
                .setExtras(bundle)
                .build();
                .build();
        mPredictor = new ShareTargetPredictor(
        mPredictor = new ShareTargetPredictor(
                predictionContext, mUpdatePredictionsMethod, mDataManager, USER_ID);
                predictionContext, mUpdatePredictionsMethod, mDataManager, USER_ID);
@@ -224,6 +232,23 @@ public final class ShareTargetPredictorTest {
        assertEquals(PACKAGE_1, res.get(4).getPackageName());
        assertEquals(PACKAGE_1, res.get(4).getPackageName());
    }
    }


    @Test
    public void testPredictTargets_nullIntentFilter() {
        AppPredictionContext predictionContext = new AppPredictionContext.Builder(mContext)
                .setUiSurface(UI_SURFACE_SHARE)
                .setPredictedTargetCount(NUM_PREDICTED_TARGETS)
                .setExtras(new Bundle())
                .build();
        mPredictor = new ShareTargetPredictor(
                predictionContext, mUpdatePredictionsMethod, mDataManager, USER_ID);

        mPredictor.predictTargets();

        verify(mUpdatePredictionsMethod).accept(mAppTargetCaptor.capture());
        assertThat(mAppTargetCaptor.getValue()).isEmpty();
        verify(mDataManager, never()).getShareShortcuts(any(), anyInt());
    }

    @Test
    @Test
    public void testSortTargets() {
    public void testSortTargets() {
        AppTarget appTarget1 = new AppTarget.Builder(
        AppTarget appTarget1 = new AppTarget.Builder(
@@ -281,6 +306,40 @@ public final class ShareTargetPredictorTest {
        checkAppTarget(appTarget5, res.get(4));
        checkAppTarget(appTarget5, res.get(4));
    }
    }


    @Test
    public void testSortTargets_nullIntentFilter() {
        AppPredictionContext predictionContext = new AppPredictionContext.Builder(mContext)
                .setUiSurface(UI_SURFACE_SHARE)
                .setPredictedTargetCount(NUM_PREDICTED_TARGETS)
                .setExtras(new Bundle())
                .build();
        mPredictor = new ShareTargetPredictor(
                predictionContext, mUpdatePredictionsMethod, mDataManager, USER_ID);
        AppTarget appTarget1 = new AppTarget.Builder(
                new AppTargetId("cls1#pkg1"), PACKAGE_1, UserHandle.of(USER_ID))
                .build();
        AppTarget appTarget2 = new AppTarget.Builder(
                new AppTargetId("cls2#pkg1"), PACKAGE_1, UserHandle.of(USER_ID))
                .build();
        AppTarget appTarget3 = new AppTarget.Builder(
                new AppTargetId("cls1#pkg2"), PACKAGE_2, UserHandle.of(USER_ID))
                .build();
        AppTarget appTarget4 = new AppTarget.Builder(
                new AppTargetId("cls2#pkg2"), PACKAGE_2, UserHandle.of(USER_ID))
                .build();
        AppTarget appTarget5 = new AppTarget.Builder(
                new AppTargetId("cls1#pkg3"), PACKAGE_3, UserHandle.of(USER_ID))
                .build();
        List<AppTarget> targets = List.of(appTarget1, appTarget2, appTarget3, appTarget4,
                appTarget5);

        mPredictor.sortTargets(targets, mUpdatePredictionsMethod);

        verify(mUpdatePredictionsMethod).accept(mAppTargetCaptor.capture());
        assertThat(mAppTargetCaptor.getValue()).containsExactlyElementsIn(targets);
        verify(mDataManager, never()).getPackage(any(), anyInt());
    }

    private static void checkAppTarget(AppTarget expected, AppTarget actual) {
    private static void checkAppTarget(AppTarget expected, AppTarget actual) {
        assertEquals(expected.getId(), actual.getId());
        assertEquals(expected.getId(), actual.getId());
        assertEquals(expected.getClassName(), actual.getClassName());
        assertEquals(expected.getClassName(), actual.getClassName());