Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ac014cf3 authored by Reema Bajwa's avatar Reema Bajwa
Browse files

Add status enum to RequestSession

If request session is in 'COMPLETE' state, this change will ignore all future UI events that may arrive. This is a safety check for conditions that ideally should not happen.

Test: built locally
Bug: 269466386

Change-Id: I6734c3d52ee65f4527ee2014b3ef3d43616921e6
parent bbd6a5ec
Loading
Loading
Loading
Loading
+10 −0
Original line number Diff line number Diff line
@@ -164,4 +164,14 @@ public final class ClearRequestSession extends RequestSession<ClearCredentialSta
        // TODO: Replace with properly defined error type
        respondToClientWithErrorAndFinish("UNKNOWN", "All providers failed");
    }

    @Override
    public void onUiCancellation(boolean isUserCancellation) {
        // Not needed since UI is not involved
    }

    @Override
    public void onUiSelectorInvocationFailure() {
        // Not needed since UI is not involved
    }
}
+8 −0
Original line number Diff line number Diff line
@@ -135,6 +135,10 @@ public final class CreateRequestSession extends RequestSession<CreateCredentialR

    private void respondToClientWithResponseAndFinish(CreateCredentialResponse response) {
        Log.i(TAG, "respondToClientWithResponseAndFinish");
        if (mRequestSessionStatus == RequestSessionStatus.COMPLETE) {
            Log.i(TAG, "Request has already been completed. This is strange.");
            return;
        }
        if (isSessionCancelled()) {
            // TODO: Differentiate btw cancelled and false
            logApiCalled(RequestType.CREATE_CREDENTIALS, /* isSuccessful */ true);
@@ -153,6 +157,10 @@ public final class CreateRequestSession extends RequestSession<CreateCredentialR

    private void respondToClientWithErrorAndFinish(String errorType, String errorMsg) {
        Log.i(TAG, "respondToClientWithErrorAndFinish");
        if (mRequestSessionStatus == RequestSessionStatus.COMPLETE) {
            Log.i(TAG, "Request has already been completed. This is strange.");
            return;
        }
        if (isSessionCancelled()) {
            // TODO: Differentiate btw cancelled and false
            logApiCalled(RequestType.CREATE_CREDENTIALS, /* isSuccessful */ true);
+10 −1
Original line number Diff line number Diff line
@@ -112,6 +112,10 @@ public final class GetRequestSession extends RequestSession<GetCredentialRequest
    }

    private void respondToClientWithResponseAndFinish(GetCredentialResponse response) {
        if (mRequestSessionStatus == RequestSessionStatus.COMPLETE) {
            Log.i(TAG, "Request has already been completed. This is strange.");
            return;
        }
        if (isSessionCancelled()) {
            // TODO: Differentiate btw cancelled and false
            logApiCalled(RequestType.GET_CREDENTIALS, /* isSuccessful */ false);
@@ -129,11 +133,16 @@ public final class GetRequestSession extends RequestSession<GetCredentialRequest
    }

    private void respondToClientWithErrorAndFinish(String errorType, String errorMsg) {
        if (mRequestSessionStatus == RequestSessionStatus.COMPLETE) {
            Log.i(TAG, "Request has already been completed. This is strange.");
            return;
        }
        if (isSessionCancelled()) {
            logApiCalled(RequestType.GET_CREDENTIALS, /* isSuccessful */ false);
            finishSession(/*propagateCancellation=*/true);
            return;
        }

        try {
            mClientCallback.onError(errorType, errorMsg);
        } catch (RemoteException e) {
@@ -157,7 +166,7 @@ public final class GetRequestSession extends RequestSession<GetCredentialRequest
    @Override
    public void onUiSelectorInvocationFailure() {
        respondToClientWithErrorAndFinish(GetCredentialException.TYPE_NO_CREDENTIAL,
                    "No credentials to show on the selector.");
                    "No credentials available.");
    }

    @Override
+18 −16
Original line number Diff line number Diff line
@@ -82,6 +82,19 @@ abstract class RequestSession<T, U> implements CredentialManagerUi.CredentialMan
    //TODO improve design to allow grouped metrics per request
    protected final String mHybridService;

    @NonNull protected RequestSessionStatus mRequestSessionStatus =
            RequestSessionStatus.IN_PROGRESS;

    /** The status in which a given request session is. */
    enum RequestSessionStatus {
        /** Request is in progress. This is the status a request session is instantiated with. */
        IN_PROGRESS,
        /** Request has been cancelled by the developer. */
        CANCELLED,
        /** Request is complete. */
        COMPLETE
    }

    protected RequestSession(@NonNull Context context,
            @UserIdInt int userId, int callingUid, @NonNull T clientRequest, U clientCallback,
            @NonNull String requestType,
@@ -112,6 +125,10 @@ abstract class RequestSession<T, U> implements CredentialManagerUi.CredentialMan

    @Override // from CredentialManagerUiCallbacks
    public void onUiSelection(UserSelectionDialogResult selection) {
        if (mRequestSessionStatus == RequestSessionStatus.COMPLETE) {
            Log.i(TAG, "Request has already been completed. This is strange.");
            return;
        }
        if (isSessionCancelled()) {
            finishSession(/*propagateCancellation=*/true);
            return;
@@ -128,27 +145,12 @@ abstract class RequestSession<T, U> implements CredentialManagerUi.CredentialMan
                selection.getEntrySubkey(), selection.getPendingIntentProviderResponse());
    }

    @Override // from CredentialManagerUiCallbacks
    public void onUiCancellation(boolean isUserCancellation) {
        Log.i(TAG, "Ui canceled. Canceled by user: " + isUserCancellation);
        if (isSessionCancelled()) {
            finishSession(/*propagateCancellation=*/true);
            return;
        }
        // User canceled the activity
        finishSession(/*propagateCancellation=*/false);
    }

    @Override
    public void onUiSelectorInvocationFailure() {
        Log.i(TAG, "onUiSelectorInvocationFailure");
    }

    protected void finishSession(boolean propagateCancellation) {
        Log.i(TAG, "finishing session");
        if (propagateCancellation) {
            mProviders.values().forEach(ProviderSession::cancelProviderRemoteSession);
        }
        mRequestSessionStatus = RequestSessionStatus.COMPLETE;
        mProviders.clear();
    }