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:
@@ -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
|
||||
|
||||
@@ -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(),
|
||||
|
||||
@@ -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());
|
||||
|
||||
Reference in New Issue
Block a user