diff options
3 files changed, 73 insertions, 5 deletions
diff --git a/services/people/java/com/android/server/people/data/DataManager.java b/services/people/java/com/android/server/people/data/DataManager.java index 63b716206313..4d1129567ca6 100644 --- a/services/people/java/com/android/server/people/data/DataManager.java +++ b/services/people/java/com/android/server/people/data/DataManager.java @@ -210,7 +210,7 @@ public class DataManager { /** Reports the sharing related {@link AppTargetEvent} from App Prediction Manager. */ public void reportShareTargetEvent(@NonNull AppTargetEvent event, - @Nullable IntentFilter intentFilter) { + @NonNull IntentFilter intentFilter) { AppTarget appTarget = event.getTarget(); if (appTarget == null || event.getAction() != AppTargetEvent.ACTION_LAUNCH) { return; @@ -220,8 +220,7 @@ public class DataManager { return; } PackageData packageData = userData.getOrCreatePackageData(appTarget.getPackageName()); - String mimeType = intentFilter != null ? intentFilter.getDataType(0) : null; - @Event.EventType int eventType = mimeTypeToShareEventType(mimeType); + @Event.EventType int eventType = mimeTypeToShareEventType(intentFilter.getDataType(0)); EventHistoryImpl eventHistory; if (ChooserActivity.LAUNCH_LOCATION_DIRECT_SHARE.equals(event.getLaunchLocation())) { // Direct share event diff --git a/services/people/java/com/android/server/people/prediction/ShareTargetPredictor.java b/services/people/java/com/android/server/people/prediction/ShareTargetPredictor.java index 43acd459f84b..2e60f2afcdea 100644 --- a/services/people/java/com/android/server/people/prediction/ShareTargetPredictor.java +++ b/services/people/java/com/android/server/people/prediction/ShareTargetPredictor.java @@ -66,7 +66,9 @@ class ShareTargetPredictor extends AppTargetPredictor { if (DEBUG) { Slog.d(TAG, "reportAppTargetEvent"); } - getDataManager().reportShareTargetEvent(event, mIntentFilter); + if (mIntentFilter != null) { + getDataManager().reportShareTargetEvent(event, mIntentFilter); + } } /** Provides prediction on direct share targets */ @@ -76,6 +78,10 @@ class ShareTargetPredictor extends AppTargetPredictor { if (DEBUG) { Slog.d(TAG, "predictTargets"); } + if (mIntentFilter == null) { + updatePredictions(List.of()); + return; + } List<ShareTarget> shareTargets = getDirectShareTargets(); SharesheetModelScorer.computeScore(shareTargets, getShareEventType(mIntentFilter), System.currentTimeMillis()); @@ -95,6 +101,10 @@ class ShareTargetPredictor extends AppTargetPredictor { if (DEBUG) { Slog.d(TAG, "sortTargets"); } + if (mIntentFilter == null) { + callback.accept(targets); + return; + } List<ShareTarget> shareTargets = getAppShareTargets(targets); SharesheetModelScorer.computeScoreForAppShare(shareTargets, getShareEventType(mIntentFilter), getPredictionContext().getPredictedTargetCount(), diff --git a/services/tests/servicestests/src/com/android/server/people/prediction/ShareTargetPredictorTest.java b/services/tests/servicestests/src/com/android/server/people/prediction/ShareTargetPredictorTest.java index c2716393b947..60104d390eb7 100644 --- a/services/tests/servicestests/src/com/android/server/people/prediction/ShareTargetPredictorTest.java +++ b/services/tests/servicestests/src/com/android/server/people/prediction/ShareTargetPredictorTest.java @@ -16,11 +16,14 @@ package com.android.server.people.prediction; +import static com.google.common.truth.Truth.assertThat; + import static org.junit.Assert.assertEquals; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anySet; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -30,12 +33,14 @@ import android.app.prediction.AppTargetId; import android.content.ComponentName; import android.content.Context; import android.content.Intent; +import android.content.IntentFilter; import android.content.pm.ShortcutInfo; import android.content.pm.ShortcutManager.ShareShortcutInfo; import android.os.Bundle; import android.os.UserHandle; import android.util.Range; +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.EventHistory; @@ -98,10 +103,13 @@ public final class ShareTargetPredictorTest { when(mDataManager.getPackage(PACKAGE_1, USER_ID)).thenReturn(mPackageData1); 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) .setUiSurface(UI_SURFACE_SHARE) .setPredictedTargetCount(NUM_PREDICTED_TARGETS) - .setExtras(new Bundle()) + .setExtras(bundle) .build(); mPredictor = new ShareTargetPredictor( predictionContext, mUpdatePredictionsMethod, mDataManager, USER_ID); @@ -225,6 +233,23 @@ public final class ShareTargetPredictorTest { } @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 public void testSortTargets() { AppTarget appTarget1 = new AppTarget.Builder( new AppTargetId("cls1#pkg1"), PACKAGE_1, UserHandle.of(USER_ID)) @@ -281,6 +306,40 @@ public final class ShareTargetPredictorTest { 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) { assertEquals(expected.getId(), actual.getId()); assertEquals(expected.getClassName(), actual.getClassName()); |