summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSong Hu <songhu@google.com>2020-05-29 15:28:04 -0700
committerSong Hu <songhu@google.com>2020-05-29 16:53:51 -0700
commitf9d930b8e4bfdd2d7d3cd7d7ddc8a6edfeeefffa (patch)
tree78206ee41aaa08d436b07ee1fa1faacc3f3f6c95
parent4f5af837be36aaf5c84cf236d25388a54cf4b688 (diff)
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. Bug: 157647326 Test: manually test File 'open with' flow Change-Id: I3efb87a84048e5d1b2d58b1cc9669eb4568956dd
-rw-r--r--services/people/java/com/android/server/people/data/DataManager.java5
-rw-r--r--services/people/java/com/android/server/people/prediction/ShareTargetPredictor.java12
-rw-r--r--services/tests/servicestests/src/com/android/server/people/prediction/ShareTargetPredictorTest.java61
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());