diff --git a/services/credentials/java/com/android/server/credentials/ClearRequestSession.java b/services/credentials/java/com/android/server/credentials/ClearRequestSession.java index e3d4c224f1fda..fe8a8c8979f7c 100644 --- a/services/credentials/java/com/android/server/credentials/ClearRequestSession.java +++ b/services/credentials/java/com/android/server/credentials/ClearRequestSession.java @@ -30,8 +30,6 @@ import android.os.RemoteException; import android.service.credentials.CallingAppInfo; import android.util.Slog; -import com.android.server.credentials.metrics.ProviderSessionMetric; - import java.util.ArrayList; import java.util.Set; @@ -95,12 +93,8 @@ public final class ClearRequestSession extends RequestSession implements CredentialManagerUi.Credential mRequestSessionMetric.logFailureOrUserCancel(isUserCanceled); finishSession(/*propagateCancellation=*/false); } + + /** + * Reveals if a certain provider is primary after ensuring it exists at all in the designated + * provider info. + * + * @param componentName used to identify the provider we want to check primary status for + */ + protected boolean isPrimaryProviderViaProviderInfo(ComponentName componentName) { + var chosenProviderSession = mProviders.get(componentName.flattenToString()); + return chosenProviderSession != null && chosenProviderSession.mProviderInfo != null + && chosenProviderSession.mProviderInfo.isPrimary(); + } } diff --git a/services/credentials/java/com/android/server/credentials/metrics/ChosenProviderFinalPhaseMetric.java b/services/credentials/java/com/android/server/credentials/metrics/ChosenProviderFinalPhaseMetric.java index e8af86012aaf9..468d3c80707c7 100644 --- a/services/credentials/java/com/android/server/credentials/metrics/ChosenProviderFinalPhaseMetric.java +++ b/services/credentials/java/com/android/server/credentials/metrics/ChosenProviderFinalPhaseMetric.java @@ -76,6 +76,8 @@ public class ChosenProviderFinalPhaseMetric { // Stores the response credential information, as well as the response entry information which // by default, contains empty info private ResponseCollective mResponseCollective = new ResponseCollective(Map.of(), Map.of()); + // Indicates if this chosen provider was the primary provider, false by default + private boolean mIsPrimary = false; public ChosenProviderFinalPhaseMetric(int sessionIdCaller, int sessionIdProvider) { @@ -292,4 +294,12 @@ public class ChosenProviderFinalPhaseMetric { public int getSessionIdCaller() { return mSessionIdCaller; } + + public void setPrimary(boolean primary) { + mIsPrimary = primary; + } + + public boolean isPrimary() { + return mIsPrimary; + } } diff --git a/services/credentials/java/com/android/server/credentials/metrics/RequestSessionMetric.java b/services/credentials/java/com/android/server/credentials/metrics/RequestSessionMetric.java index a9e241fc7fce9..281f3cc705be3 100644 --- a/services/credentials/java/com/android/server/credentials/metrics/RequestSessionMetric.java +++ b/services/credentials/java/com/android/server/credentials/metrics/RequestSessionMetric.java @@ -28,6 +28,7 @@ import static com.android.server.credentials.MetricUtilities.logApiCalledFinalPh import static com.android.server.credentials.MetricUtilities.logApiCalledNoUidFinal; import android.annotation.NonNull; +import android.content.ComponentName; import android.credentials.GetCredentialRequest; import android.credentials.ui.UserSelectionDialogResult; import android.util.Slog; @@ -280,6 +281,26 @@ public class RequestSessionMetric { } } + /** + * Used to update metrics when a response is received in a RequestSession. + * + * @param componentName the component name associated with the provider the response is for + */ + public void updateMetricsOnResponseReceived(Map providers, + ComponentName componentName, boolean isPrimary) { + try { + var chosenProviderSession = providers.get(componentName.flattenToString()); + if (chosenProviderSession != null) { + ProviderSessionMetric providerSessionMetric = + chosenProviderSession.getProviderSessionMetric(); + collectChosenMetricViaCandidateTransfer(providerSessionMetric + .getCandidatePhasePerProviderMetric(), isPrimary); + } + } catch (Exception e) { + Slog.i(TAG, "Exception upon candidate to chosen metric transfer: " + e); + } + } + /** * Called by RequestSessions upon chosen metric determination. It's expected that most bits * are transferred here. However, certain new information, such as the selected provider's final @@ -289,10 +310,13 @@ public class RequestSessionMetric { * {@link com.android.internal.util.FrameworkStatsLog} metric generation. * * @param candidatePhaseMetric the componentName to associate with a provider + * @param isPrimary indicates that this chosen provider is the primary provider (or not) */ - public void collectChosenMetricViaCandidateTransfer(CandidatePhaseMetric candidatePhaseMetric) { + public void collectChosenMetricViaCandidateTransfer(CandidatePhaseMetric candidatePhaseMetric, + boolean isPrimary) { try { mChosenProviderFinalPhaseMetric.setChosenUid(candidatePhaseMetric.getCandidateUid()); + mChosenProviderFinalPhaseMetric.setPrimary(isPrimary); mChosenProviderFinalPhaseMetric.setQueryPhaseLatencyMicroseconds( candidatePhaseMetric.getQueryLatencyMicroseconds());