Merge "Resolve tiles intent before prompting a dialog for profile selection"

This commit is contained in:
Yanting Yang
2020-09-09 14:44:35 +00:00
committed by Android (Google) Code Review
2 changed files with 45 additions and 6 deletions

View File

@@ -398,26 +398,41 @@ public class DashboardFeatureProviderImpl implements DashboardFeatureProvider {
return; return;
} }
ProfileSelectDialog.updateUserHandlesIfNeeded(mContext, tile); ProfileSelectDialog.updateUserHandlesIfNeeded(mContext, tile);
mMetricsFeatureProvider.logStartedIntent(intent, sourceMetricCategory);
if (tile.userHandle == null || tile.isPrimaryProfileOnly()) { if (tile.userHandle == null || tile.isPrimaryProfileOnly()) {
mMetricsFeatureProvider.logStartedIntent(intent, sourceMetricCategory);
activity.startActivityForResult(intent, 0); activity.startActivityForResult(intent, 0);
} else if (tile.userHandle.size() == 1) { } else if (tile.userHandle.size() == 1) {
mMetricsFeatureProvider.logStartedIntent(intent, sourceMetricCategory);
activity.startActivityForResultAsUser(intent, 0, tile.userHandle.get(0)); activity.startActivityForResultAsUser(intent, 0, tile.userHandle.get(0));
} else { } else {
mMetricsFeatureProvider.logStartedIntent(intent, sourceMetricCategory);
final UserHandle userHandle = intent.getParcelableExtra(EXTRA_USER); final UserHandle userHandle = intent.getParcelableExtra(EXTRA_USER);
if (userHandle != null && tile.userHandle.contains(userHandle)) { if (userHandle != null && tile.userHandle.contains(userHandle)) {
activity.startActivityForResultAsUser(intent, 0, userHandle); activity.startActivityForResultAsUser(intent, 0, userHandle);
} else { return;
}
final List<UserHandle> resolvableUsers = getResolvableUsers(intent, tile);
if (resolvableUsers.size() == 1) {
activity.startActivityForResultAsUser(intent, 0, resolvableUsers.get(0));
return;
}
ProfileSelectDialog.show(activity.getSupportFragmentManager(), tile, ProfileSelectDialog.show(activity.getSupportFragmentManager(), tile,
sourceMetricCategory); sourceMetricCategory);
} }
} }
}
private boolean isIntentResolvable(Intent intent) { private boolean isIntentResolvable(Intent intent) {
return mPackageManager.resolveActivity(intent, 0) != null; return mPackageManager.resolveActivity(intent, 0) != null;
} }
private List<UserHandle> getResolvableUsers(Intent intent, Tile tile) {
final ArrayList<UserHandle> eligibleUsers = new ArrayList<>();
for (UserHandle user : tile.userHandle) {
if (mPackageManager.resolveActivityAsUser(intent, 0, user.getIdentifier()) != null) {
eligibleUsers.add(user);
}
}
return eligibleUsers;
}
} }

View File

@@ -583,4 +583,28 @@ public class DashboardFeatureProviderImplTest {
.startActivityForResultAsUser(any(Intent.class), anyInt(), any(UserHandle.class)); .startActivityForResultAsUser(any(Intent.class), anyInt(), any(UserHandle.class));
verify(mActivity).getSupportFragmentManager(); verify(mActivity).getSupportFragmentManager();
} }
@Test
public void openTileIntent_profileSelectionDialog_unresolvableWorkProfileIntentShouldNotShow() {
final int userId = 10;
ShadowUserManager.getShadow().addUser(userId, "Someone", 0);
final UserHandle userHandle = new UserHandle(userId);
final Tile tile = new ActivityTile(mActivityInfo, CategoryKey.CATEGORY_HOMEPAGE);
final ArrayList<UserHandle> handles = new ArrayList<>();
handles.add(new UserHandle(0));
handles.add(userHandle);
tile.userHandle = handles;
when(mPackageManager.resolveActivityAsUser(any(Intent.class), anyInt(), eq(0)))
.thenReturn(new ResolveInfo());
when(mPackageManager.resolveActivityAsUser(any(Intent.class), anyInt(), eq(userId)))
.thenReturn(null);
mImpl.openTileIntent(mActivity, tile);
final ArgumentCaptor<UserHandle> argument = ArgumentCaptor.forClass(UserHandle.class);
verify(mActivity)
.startActivityForResultAsUser(any(Intent.class), anyInt(), argument.capture());
assertThat(argument.getValue().getIdentifier()).isEqualTo(0);
verify(mActivity, never()).getSupportFragmentManager();
}
} }