Fix CredDesc reg flow bugs

Fixed the issue caused by intent creation without system context and the
npe caused by null action chip list. Dropping then restoring caller id
before intent creation and passing an empty list to avoid npe.
Using uuid to distinguish different cred options in session.

Bug: 287538489
Bug: 287529343
Bug: 287689739
Test: local
Change-Id: I5612dd0f08a90a762c5ca5794a55a7abccecad2f
This commit is contained in:
Omer Ozer
2023-06-16 04:44:33 +00:00
parent 6afdda2f9d
commit 78998ccaf5
2 changed files with 18 additions and 12 deletions

View File

@@ -28,6 +28,7 @@ import android.credentials.GetCredentialResponse;
import android.credentials.IGetCredentialCallback;
import android.credentials.ui.ProviderData;
import android.credentials.ui.RequestInfo;
import android.os.Binder;
import android.os.CancellationSignal;
import android.os.RemoteException;
import android.service.credentials.CallingAppInfo;
@@ -98,8 +99,9 @@ public class GetRequestSession extends RequestSession<GetCredentialRequest,
protected void launchUiWithProviderData(ArrayList<ProviderData> providerDataList) {
mRequestSessionMetric.collectUiCallStartTime(System.nanoTime());
mCredentialManagerUi.setStatus(CredentialManagerUi.UiStatus.USER_INTERACTION);
cancelExistingPendingIntent();
Binder.withCleanCallingIdentity(()-> {
try {
cancelExistingPendingIntent();
mPendingIntent = mCredentialManagerUi.createPendingIntent(
RequestInfo.newGetRequestInfo(
mRequestId, mClientRequest, mClientAppInfo.getPackageName(),
@@ -112,9 +114,9 @@ public class GetRequestSession extends RequestSession<GetCredentialRequest,
mCredentialManagerUi.setStatus(CredentialManagerUi.UiStatus.TERMINATED);
String exception = GetCredentialException.TYPE_UNKNOWN;
mRequestSessionMetric.collectFrameworkException(exception);
respondToClientWithErrorAndFinish(
exception, "Unable to instantiate selector");
}
respondToClientWithErrorAndFinish(exception, "Unable to instantiate selector");
}
});
}
@Override

View File

@@ -38,11 +38,13 @@ import android.util.Slog;
import com.android.internal.annotations.VisibleForTesting;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.Stream;
@@ -116,7 +118,7 @@ public class ProviderRegistryGetSession extends ProviderSession<CredentialOption
@NonNull String servicePackageName,
@NonNull CredentialOption requestOption) {
super(context, requestOption, session,
new ComponentName(servicePackageName, servicePackageName),
new ComponentName(servicePackageName, UUID.randomUUID().toString()),
userId, null);
mCredentialDescriptionRegistry = CredentialDescriptionRegistry.forUser(userId);
mCallingAppInfo = callingAppInfo;
@@ -133,7 +135,7 @@ public class ProviderRegistryGetSession extends ProviderSession<CredentialOption
@NonNull String servicePackageName,
@NonNull CredentialOption requestOption) {
super(context, requestOption, session,
new ComponentName(servicePackageName, servicePackageName),
new ComponentName(servicePackageName, UUID.randomUUID().toString()),
userId, null);
mCredentialDescriptionRegistry = CredentialDescriptionRegistry.forUser(userId);
mCallingAppInfo = callingAppInfo;
@@ -179,7 +181,9 @@ public class ProviderRegistryGetSession extends ProviderSession<CredentialOption
return null;
}
return new GetCredentialProviderData.Builder(
mComponentName.flattenToString()).setActionChips(null)
mComponentName.flattenToString())
.setActionChips(Collections.EMPTY_LIST)
.setAuthenticationEntries(Collections.EMPTY_LIST)
.setCredentialEntries(prepareUiCredentialEntries(
mProviderResponse.stream().flatMap((Function<CredentialDescriptionRegistry
.FilterResult,
@@ -261,12 +265,12 @@ public class ProviderRegistryGetSession extends ProviderSession<CredentialOption
.getFilteredResultForProvider(mCredentialProviderPackageName,
mElementKeys);
mCredentialEntries = mProviderResponse.stream().flatMap(
(Function<CredentialDescriptionRegistry.FilterResult,
Stream<CredentialEntry>>) filterResult
-> filterResult.mCredentialEntries.stream())
.collect(Collectors.toList());
(Function<CredentialDescriptionRegistry.FilterResult,
Stream<CredentialEntry>>)
filterResult -> filterResult.mCredentialEntries.stream())
.collect(Collectors.toList());
updateStatusAndInvokeCallback(Status.CREDENTIALS_RECEIVED,
/*source=*/ CredentialsSource.REGISTRY);
/*source=*/ CredentialsSource.REGISTRY);
mProviderSessionMetric.collectCandidateEntryMetrics(mCredentialEntries);
}