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

Commit a98fbc1a authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Add the clear credential provider API"

parents a2305d89 c79a4aaa
Loading
Loading
Loading
Loading
+10 −0
Original line number Diff line number Diff line
@@ -39598,6 +39598,15 @@ package android.service.credentials {
    field @NonNull public static final android.os.Parcelable.Creator<android.service.credentials.CallingAppInfo> CREATOR;
  }
  public final class ClearCredentialStateRequest implements android.os.Parcelable {
    ctor public ClearCredentialStateRequest(@NonNull android.service.credentials.CallingAppInfo, @NonNull android.os.Bundle);
    method public int describeContents();
    method @NonNull public android.service.credentials.CallingAppInfo getCallingAppInfo();
    method @NonNull public android.os.Bundle getData();
    method public void writeToParcel(@NonNull android.os.Parcel, int);
    field @NonNull public static final android.os.Parcelable.Creator<android.service.credentials.ClearCredentialStateRequest> CREATOR;
  }
  public final class CreateCredentialRequest implements android.os.Parcelable {
    ctor public CreateCredentialRequest(@NonNull android.service.credentials.CallingAppInfo, @NonNull String, @NonNull android.os.Bundle);
    method public int describeContents();
@@ -39638,6 +39647,7 @@ package android.service.credentials {
    method public abstract void onBeginCreateCredential(@NonNull android.service.credentials.BeginCreateCredentialRequest, @NonNull android.os.CancellationSignal, @NonNull android.os.OutcomeReceiver<android.service.credentials.BeginCreateCredentialResponse,android.credentials.CreateCredentialException>);
    method public abstract void onBeginGetCredential(@NonNull android.service.credentials.BeginGetCredentialRequest, @NonNull android.os.CancellationSignal, @NonNull android.os.OutcomeReceiver<android.service.credentials.BeginGetCredentialResponse,android.credentials.GetCredentialException>);
    method @NonNull public final android.os.IBinder onBind(@NonNull android.content.Intent);
    method public abstract void onClearCredentialState(@NonNull android.service.credentials.ClearCredentialStateRequest, @NonNull android.os.CancellationSignal, @NonNull android.os.OutcomeReceiver<java.lang.Void,android.credentials.ClearCredentialStateException>);
    field public static final String CAPABILITY_META_DATA_KEY = "android.credentials.capabilities";
    field public static final String EXTRA_CREATE_CREDENTIAL_EXCEPTION = "android.service.credentials.extra.CREATE_CREDENTIAL_EXCEPTION";
    field public static final String EXTRA_CREATE_CREDENTIAL_REQUEST = "android.service.credentials.extra.CREATE_CREDENTIAL_REQUEST";
+3 −0
Original line number Diff line number Diff line
package android.service.credentials;

parcelable ClearCredentialStateRequest;
 No newline at end of file
+100 −0
Original line number Diff line number Diff line
/*
 * Copyright 2022 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package android.service.credentials;

import static java.util.Objects.requireNonNull;

import android.annotation.NonNull;
import android.os.Bundle;
import android.os.Parcel;
import android.os.Parcelable;

import com.android.internal.util.AnnotationValidations;
/**
 * A request class for clearing a user's credential state.
 * Providers must clear the credential state when they receive this request.
 */
public final class ClearCredentialStateRequest implements Parcelable {
    /** The request data. */
    @NonNull
    private final CallingAppInfo mCallingAppInfo;

    /** The request data. */
    @NonNull
    private final Bundle mData;

    /** Returns the request data. */
    @NonNull
    public Bundle getData() {
        return mData;
    }

    /** Returns the calling app info containing information pertaining to the calling app. */
    @NonNull
    public CallingAppInfo getCallingAppInfo() {
        return mCallingAppInfo;
    }

    @Override
    public void writeToParcel(@NonNull Parcel dest, int flags) {
        dest.writeTypedObject(mCallingAppInfo, flags);
        dest.writeBundle(mData);
    }

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public String toString() {
        return "ClearCredentialStateRequest {callingAppInfo="
                + mCallingAppInfo.toString() + " }, {data= " + mData + "}";
    }

    /**
     * Constructs a {@link ClearCredentialStateRequest}.
     *
     * @param data the request data
     */
    public ClearCredentialStateRequest(@NonNull CallingAppInfo callingAppInfo,
            @NonNull Bundle data) {
        mCallingAppInfo = requireNonNull(
                callingAppInfo, "callingAppInfo must not be null");
        mData = requireNonNull(data, "data must not be null");
    }

    private ClearCredentialStateRequest(@NonNull Parcel in) {
        mCallingAppInfo = in.readTypedObject(CallingAppInfo.CREATOR);
        Bundle data = in.readBundle();
        mData = data;
        AnnotationValidations.validate(NonNull.class, null, mData);
    }

    public static final @NonNull Creator<ClearCredentialStateRequest> CREATOR =
            new Creator<ClearCredentialStateRequest>() {
        @Override
        public ClearCredentialStateRequest[] newArray(int size) {
            return new ClearCredentialStateRequest[size];
        }

        @Override
        public ClearCredentialStateRequest createFromParcel(@NonNull Parcel in) {
            return new ClearCredentialStateRequest(in);
        }
    };
}
+57 −0
Original line number Diff line number Diff line
@@ -24,6 +24,7 @@ import android.annotation.SdkConstant;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Intent;
import android.credentials.ClearCredentialStateException;
import android.credentials.CreateCredentialException;
import android.credentials.GetCredentialException;
import android.os.CancellationSignal;
@@ -224,6 +225,40 @@ public abstract class CredentialProviderService extends Service {
            ));
            return transport;
        }

        @Override
        public ICancellationSignal onClearCredentialState(ClearCredentialStateRequest request,
                IClearCredentialStateCallback callback) {
            Objects.requireNonNull(request);
            Objects.requireNonNull(callback);

            ICancellationSignal transport = CancellationSignal.createTransport();

            mHandler.sendMessage(obtainMessage(
                    CredentialProviderService::onClearCredentialState,
                    CredentialProviderService.this, request,
                    CancellationSignal.fromTransport(transport),
                    new OutcomeReceiver<Void, ClearCredentialStateException>() {
                        @Override
                        public void onResult(Void result) {
                            try {
                                callback.onSuccess();
                            } catch (RemoteException e) {
                                e.rethrowFromSystemServer();
                            }
                        }
                        @Override
                        public void onError(ClearCredentialStateException e) {
                            try {
                                callback.onFailure(e.errorType, e.getMessage());
                            } catch (RemoteException ex) {
                                ex.rethrowFromSystemServer();
                            }
                        }
                    }
            ));
            return transport;
        }
    };

    /**
@@ -262,4 +297,26 @@ public abstract class CredentialProviderService extends Service {
            @NonNull CancellationSignal cancellationSignal,
            @NonNull OutcomeReceiver<BeginCreateCredentialResponse,
                    CreateCredentialException> callback);

    /**
     * Called by the android system to clear the credential state.
     *
     * This api isinvoked by developers after users sign out of an app, with an intention to
     * clear any stored credential session that providers have retained.
     *
     * As a provider, you must clear any credential state, if maintained. For e.g. a provider may
     * have stored an active credential session that is used to limit or rank sign-in options for
     * future credential retrieval flows. When a user signs out of the app, such state should be
     * cleared and an exhaustive list of credentials must be presented to the user on subsequent
     * credential retrieval flows.
     *
     * @param request The clear credential request for the provider to handle.
     * @param cancellationSignal Signal for providers to listen to any cancellation requests from
     *                           the android system.
     * @param callback Object used to relay the result of the request.
     */
    public abstract void onClearCredentialState(@NonNull ClearCredentialStateRequest request,
            @NonNull CancellationSignal cancellationSignal,
            @NonNull OutcomeReceiver<Void,
                    ClearCredentialStateException> callback);
}
+27 −0
Original line number Diff line number Diff line
/*
 * Copyright 2022 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package android.service.credentials;

/**
 * Callback for onClearCredentialState request.
 *
 * @hide
 */
interface IClearCredentialStateCallback {
    oneway void onSuccess();
    oneway void onFailure(String errorType, CharSequence message);
}
 No newline at end of file
Loading