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
This commit is contained in:
Song Hu
2020-05-29 15:28:04 -07:00
parent 4f5af837be
commit f9d930b8e4
3 changed files with 73 additions and 5 deletions

View File

@@ -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

View File

@@ -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(),

View File

@@ -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);
@@ -224,6 +232,23 @@ public final class ShareTargetPredictorTest {
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
public void testSortTargets() {
AppTarget appTarget1 = new AppTarget.Builder(
@@ -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());