summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Helen Qin <helenqin@google.com> 2022-11-01 16:24:36 +0000
committer Helen Qin <helenqin@google.com> 2022-11-01 21:05:07 +0000
commit30ac7cbd1f353918327fac50c40dfcfe95c47e54 (patch)
treecc7ad6fddfa8e4f46ec2906a8f55d938829d7569
parent5eb65b865941d3171791d78304ce2639b33da18a (diff)
Add the clearCredentialSession api to CredentialManager.
This api is similar to the web preventSilentAccess api that clears the user credential session to prevent future automatic sign-in. Test: local deployment Bug: 256848673 Change-Id: I510fd0160d5689ef396fbf1078c42c0e1b643669
-rw-r--r--core/java/android/credentials/CredentialManager.java79
-rw-r--r--core/java/android/credentials/IClearCredentialSessionCallback.aidl27
-rw-r--r--core/java/android/credentials/ICredentialManager.aidl3
-rw-r--r--services/credentials/java/com/android/server/credentials/CredentialManagerService.java10
4 files changed, 111 insertions, 8 deletions
diff --git a/core/java/android/credentials/CredentialManager.java b/core/java/android/credentials/CredentialManager.java
index 30ee118d3b59..c9a0626341b7 100644
--- a/core/java/android/credentials/CredentialManager.java
+++ b/core/java/android/credentials/CredentialManager.java
@@ -62,10 +62,10 @@ public final class CredentialManager {
* <p>The execution can potentially launch UI flows to collect user consent to using a
* credential, display a picker when multiple credentials exist, etc.
*
- * @param request the request specifying type(s) of credentials to get from the user.
- * @param cancellationSignal an optional signal that allows for cancelling this call.
- * @param executor the callback will take place on this {@link Executor}.
- * @param callback the callback invoked when the request succeeds or fails.
+ * @param request the request specifying type(s) of credentials to get from the user
+ * @param cancellationSignal an optional signal that allows for cancelling this call
+ * @param executor the callback will take place on this {@link Executor}
+ * @param callback the callback invoked when the request succeeds or fails
*/
public void executeGetCredential(
@NonNull GetCredentialRequest request,
@@ -101,10 +101,10 @@ public final class CredentialManager {
* <p>The execution can potentially launch UI flows to collect user consent to creating
* or storing the new credential, etc.
*
- * @param request the request specifying type(s) of credentials to get from the user.
- * @param cancellationSignal an optional signal that allows for cancelling this call.
- * @param executor the callback will take place on this {@link Executor}.
- * @param callback the callback invoked when the request succeeds or fails.
+ * @param request the request specifying type(s) of credentials to get from the user
+ * @param cancellationSignal an optional signal that allows for cancelling this call
+ * @param executor the callback will take place on this {@link Executor}
+ * @param callback the callback invoked when the request succeeds or fails
*/
public void executeCreateCredential(
@NonNull CreateCredentialRequest request,
@@ -135,6 +135,44 @@ public final class CredentialManager {
}
}
+ /**
+ * Clears the current user credential session from all credential providers.
+ *
+ * <p>Usually invoked after your user signs out of your app so that they will not be
+ * automatically signed in the next time.
+ *
+ * @param cancellationSignal an optional signal that allows for cancelling this call
+ * @param executor the callback will take place on this {@link Executor}
+ * @param callback the callback invoked when the request succeeds or fails
+ *
+ * @hide
+ */
+ public void clearCredentialSession(
+ @Nullable CancellationSignal cancellationSignal,
+ @CallbackExecutor @NonNull Executor executor,
+ @NonNull OutcomeReceiver<Void, CredentialManagerException> callback) {
+ requireNonNull(executor, "executor must not be null");
+ requireNonNull(callback, "callback must not be null");
+
+ if (cancellationSignal != null && cancellationSignal.isCanceled()) {
+ Log.w(TAG, "executeCreateCredential already canceled");
+ return;
+ }
+
+ ICancellationSignal cancelRemote = null;
+ try {
+ cancelRemote = mService.clearCredentialSession(
+ new ClearCredentialSessionTransport(executor, callback),
+ mContext.getOpPackageName());
+ } catch (RemoteException e) {
+ e.rethrowFromSystemServer();
+ }
+
+ if (cancellationSignal != null && cancelRemote != null) {
+ cancellationSignal.setRemote(cancelRemote);
+ }
+ }
+
private static class GetCredentialTransport extends IGetCredentialCallback.Stub {
// TODO: listen for cancellation to release callback.
@@ -184,4 +222,29 @@ public final class CredentialManager {
() -> mCallback.onError(new CredentialManagerException(errorCode, message)));
}
}
+
+ private static class ClearCredentialSessionTransport
+ extends IClearCredentialSessionCallback.Stub {
+ // TODO: listen for cancellation to release callback.
+
+ private final Executor mExecutor;
+ private final OutcomeReceiver<Void, CredentialManagerException> mCallback;
+
+ private ClearCredentialSessionTransport(Executor executor,
+ OutcomeReceiver<Void, CredentialManagerException> callback) {
+ mExecutor = executor;
+ mCallback = callback;
+ }
+
+ @Override
+ public void onSuccess() {
+ mCallback.onResult(null);
+ }
+
+ @Override
+ public void onError(int errorCode, String message) {
+ mExecutor.execute(
+ () -> mCallback.onError(new CredentialManagerException(errorCode, message)));
+ }
+ }
}
diff --git a/core/java/android/credentials/IClearCredentialSessionCallback.aidl b/core/java/android/credentials/IClearCredentialSessionCallback.aidl
new file mode 100644
index 000000000000..903e7f56cd2e
--- /dev/null
+++ b/core/java/android/credentials/IClearCredentialSessionCallback.aidl
@@ -0,0 +1,27 @@
+/*
+ * 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.credentials;
+
+/**
+ * Listener for clearCredentialSession request.
+ *
+ * @hide
+ */
+interface IClearCredentialSessionCallback {
+ oneway void onSuccess();
+ oneway void onError(int errorCode, String message);
+} \ No newline at end of file
diff --git a/core/java/android/credentials/ICredentialManager.aidl b/core/java/android/credentials/ICredentialManager.aidl
index b0f27f9164f3..35688d7fe113 100644
--- a/core/java/android/credentials/ICredentialManager.aidl
+++ b/core/java/android/credentials/ICredentialManager.aidl
@@ -18,6 +18,7 @@ package android.credentials;
import android.credentials.CreateCredentialRequest;
import android.credentials.GetCredentialRequest;
+import android.credentials.IClearCredentialSessionCallback;
import android.credentials.ICreateCredentialCallback;
import android.credentials.IGetCredentialCallback;
import android.os.ICancellationSignal;
@@ -32,4 +33,6 @@ interface ICredentialManager {
@nullable ICancellationSignal executeGetCredential(in GetCredentialRequest request, in IGetCredentialCallback callback, String callingPackage);
@nullable ICancellationSignal executeCreateCredential(in CreateCredentialRequest request, in ICreateCredentialCallback callback, String callingPackage);
+
+ @nullable ICancellationSignal clearCredentialSession(in IClearCredentialSessionCallback callback, String callingPackage);
}
diff --git a/services/credentials/java/com/android/server/credentials/CredentialManagerService.java b/services/credentials/java/com/android/server/credentials/CredentialManagerService.java
index 40412db2ed5e..321f022f526f 100644
--- a/services/credentials/java/com/android/server/credentials/CredentialManagerService.java
+++ b/services/credentials/java/com/android/server/credentials/CredentialManagerService.java
@@ -24,6 +24,7 @@ import android.content.Context;
import android.content.pm.PackageManager;
import android.credentials.CreateCredentialRequest;
import android.credentials.GetCredentialRequest;
+import android.credentials.IClearCredentialSessionCallback;
import android.credentials.ICreateCredentialCallback;
import android.credentials.ICredentialManager;
import android.credentials.IGetCredentialCallback;
@@ -155,5 +156,14 @@ public final class CredentialManagerService extends
ICancellationSignal cancelTransport = CancellationSignal.createTransport();
return cancelTransport;
}
+
+ @Override
+ public ICancellationSignal clearCredentialSession(
+ IClearCredentialSessionCallback callback, String callingPackage) {
+ // TODO: implement.
+ Log.i(TAG, "clearCredentialSession");
+ ICancellationSignal cancelTransport = CancellationSignal.createTransport();
+ return cancelTransport;
+ }
}
}