diff --git a/CredentialsSignIn/.gitignore b/CredentialsSignIn/.gitignore deleted file mode 100644 index fb2a300..0000000 --- a/CredentialsSignIn/.gitignore +++ /dev/null @@ -1,10 +0,0 @@ -.gradle -/local.properties -.DS_Store -build/ -.idea -*.iml -app/build -*.apk -*.aar - diff --git a/CredentialsSignIn/.google/packaging.yaml b/CredentialsSignIn/.google/packaging.yaml deleted file mode 100644 index 461396a..0000000 --- a/CredentialsSignIn/.google/packaging.yaml +++ /dev/null @@ -1,16 +0,0 @@ - -# GOOGLE SAMPLE PACKAGING DATA -# -# This file is used by Google as part of our samples packaging process. -# End users may safely ignore this file. It has no relevance to other systems. ---- -status: PUBLISHED -technologies: [Android] -categories: [Identity] -languages: [Java] -solutions: [Mobile] -github: android/identity -level: EXPERT -apiRefs: - - gms:com.google.android.gms.auth.api.credentials.Credential -license: apache2 diff --git a/CredentialsSignIn/README.md b/CredentialsSignIn/README.md deleted file mode 100644 index 2bb0b4c..0000000 --- a/CredentialsSignIn/README.md +++ /dev/null @@ -1,6 +0,0 @@ -# Credentials API + Google Sign In API Quickstart - -This sample demonstrates how to use both the Credentials API (SmartLock for Passwords) -and the Google Sign In API in the same application. - -For more information, visit https://developers.google.com/identity/ diff --git a/CredentialsSignIn/app/.gitignore b/CredentialsSignIn/app/.gitignore deleted file mode 100644 index 796b96d..0000000 --- a/CredentialsSignIn/app/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/build diff --git a/CredentialsSignIn/app/build.gradle b/CredentialsSignIn/app/build.gradle deleted file mode 100644 index 8b33260..0000000 --- a/CredentialsSignIn/app/build.gradle +++ /dev/null @@ -1,28 +0,0 @@ -apply plugin: 'com.android.application' - -android { - compileSdkVersion 30 - buildToolsVersion "30.0.3" - - defaultConfig { - applicationId "com.google.example.credentialssignin" - minSdkVersion 16 - targetSdkVersion 30 - versionCode 1 - versionName "1.0" - } - buildTypes { - release { - minifyEnabled false - proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' - } - } -} - -dependencies { - implementation 'androidx.core:core-ktx:1.5.0' - implementation 'androidx.appcompat:appcompat:1.3.0' - implementation 'androidx.cardview:cardview:1.0.0' - - implementation 'com.google.android.gms:play-services-auth:19.0.0' -} diff --git a/CredentialsSignIn/app/proguard-rules.pro b/CredentialsSignIn/app/proguard-rules.pro deleted file mode 100644 index a5afa49..0000000 --- a/CredentialsSignIn/app/proguard-rules.pro +++ /dev/null @@ -1,17 +0,0 @@ -# Add project specific ProGuard rules here. -# By default, the flags in this file are appended to flags specified -# in /usr/local/google/home/samstern/android-sdk-linux/tools/proguard/proguard-android.txt -# You can edit the include path and order by changing the proguardFiles -# directive in build.gradle. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# Add any project specific keep options here: - -# If your project uses WebView with JS, uncomment the following -# and specify the fully qualified class name to the JavaScript interface -# class: -#-keepclassmembers class fqcn.of.javascript.interface.for.webview { -# public *; -#} diff --git a/CredentialsSignIn/app/src/main/AndroidManifest.xml b/CredentialsSignIn/app/src/main/AndroidManifest.xml deleted file mode 100644 index 74fd82f..0000000 --- a/CredentialsSignIn/app/src/main/AndroidManifest.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - - - - - diff --git a/CredentialsSignIn/app/src/main/java/com/google/example/credentialssignin/MainActivity.java b/CredentialsSignIn/app/src/main/java/com/google/example/credentialssignin/MainActivity.java deleted file mode 100644 index 0a03ac8..0000000 --- a/CredentialsSignIn/app/src/main/java/com/google/example/credentialssignin/MainActivity.java +++ /dev/null @@ -1,364 +0,0 @@ -/** - * Copyright Google Inc. All Rights Reserved. - * - * 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 com.google.example.credentialssignin; - -import android.app.ProgressDialog; -import android.content.Intent; -import android.content.IntentSender; -import android.os.Bundle; -import androidx.annotation.NonNull; -import androidx.appcompat.app.AppCompatActivity; -import android.util.Log; -import android.view.View; -import android.widget.EditText; -import android.widget.TextView; -import android.widget.Toast; - -import com.google.android.gms.auth.api.credentials.Credential; -import com.google.android.gms.auth.api.credentials.CredentialRequest; -import com.google.android.gms.auth.api.credentials.CredentialRequestResponse; -import com.google.android.gms.auth.api.credentials.Credentials; -import com.google.android.gms.auth.api.credentials.CredentialsClient; -import com.google.android.gms.auth.api.credentials.IdentityProviders; -import com.google.android.gms.auth.api.signin.GoogleSignIn; -import com.google.android.gms.auth.api.signin.GoogleSignInAccount; -import com.google.android.gms.auth.api.signin.GoogleSignInClient; -import com.google.android.gms.auth.api.signin.GoogleSignInOptions; -import com.google.android.gms.common.SignInButton; -import com.google.android.gms.common.api.ResolvableApiException; -import com.google.android.gms.tasks.OnCompleteListener; -import com.google.android.gms.tasks.Task; - -public class MainActivity extends AppCompatActivity implements - View.OnClickListener { - - private static final String TAG = "MainActivity"; - private static final String KEY_IS_RESOLVING = "is_resolving"; - private static final String KEY_CREDENTIAL = "key_credential"; - private static final String KEY_CREDENTIAL_TO_SAVE = "key_credential_to_save"; - - private static final int RC_SIGN_IN = 1; - private static final int RC_CREDENTIALS_READ = 2; - private static final int RC_CREDENTIALS_SAVE = 3; - - private CredentialsClient mCredentialsClient; - private GoogleSignInClient mSignInClient; - private ProgressDialog mProgressDialog; - private boolean mIsResolving = false; - private Credential mCredential; - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_main); - - if (savedInstanceState != null) { - mIsResolving = savedInstanceState.getBoolean(KEY_IS_RESOLVING, false); - mCredential = savedInstanceState.getParcelable(KEY_CREDENTIAL); - } - - // Build CredentialsClient and GoogleSignInClient, don't set account name - buildClients(null); - - // Sign in button - SignInButton signInButton = (SignInButton) findViewById(R.id.button_google_sign_in); - signInButton.setSize(SignInButton.SIZE_WIDE); - signInButton.setOnClickListener(this); - - // Other buttons - findViewById(R.id.button_email_sign_in).setOnClickListener(this); - findViewById(R.id.button_google_revoke).setOnClickListener(this); - findViewById(R.id.button_google_sign_out).setOnClickListener(this); - findViewById(R.id.button_email_save).setOnClickListener(this); - } - - private void buildClients(String accountName) { - GoogleSignInOptions.Builder gsoBuilder = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) - .requestEmail(); - - if (accountName != null) { - gsoBuilder.setAccountName(accountName); - } - - mCredentialsClient = Credentials.getClient(this); - mSignInClient = GoogleSignIn.getClient(this, gsoBuilder.build()); - } - - @Override - public void onSaveInstanceState(Bundle outState) { - super.onSaveInstanceState(outState); - outState.putBoolean(KEY_IS_RESOLVING, mIsResolving); - outState.putParcelable(KEY_CREDENTIAL, mCredential); - } - - @Override - public void onStart() { - super.onStart(); - if (!mIsResolving) { - requestCredentials(true /* shouldResolve */, false /* onlyPasswords */); - } - } - - @Override - public void onActivityResult(int requestCode, int resultCode, Intent data) { - super.onActivityResult(requestCode, resultCode, data); - Log.d(TAG, "onActivityResult:" + requestCode + ":" + resultCode + ":" + data); - - if (requestCode == RC_SIGN_IN) { - Task task = GoogleSignIn.getSignedInAccountFromIntent(data); - handleGoogleSignIn(task); - } else if (requestCode == RC_CREDENTIALS_READ) { - mIsResolving = false; - if (resultCode == RESULT_OK) { - Credential credential = data.getParcelableExtra(Credential.EXTRA_KEY); - handleCredential(credential); - } - } else if (requestCode == RC_CREDENTIALS_SAVE) { - mIsResolving = false; - if (resultCode == RESULT_OK) { - Toast.makeText(this, "Saved", Toast.LENGTH_SHORT).show(); - } else { - Log.w(TAG, "Credential save failed."); - } - } - } - - private void googleSilentSignIn() { - // Try silent sign-in with Google Sign In API - Task silentSignIn = mSignInClient.silentSignIn(); - - if (silentSignIn.isComplete() && silentSignIn.isSuccessful()) { - handleGoogleSignIn(silentSignIn); - return; - } - - showProgress(); - silentSignIn.addOnCompleteListener(new OnCompleteListener() { - @Override - public void onComplete(@NonNull Task task) { - hideProgress(); - handleGoogleSignIn(task); - } - }); - } - - private void handleCredential(Credential credential) { - mCredential = credential; - - Log.d(TAG, "handleCredential:" + credential.getAccountType() + ":" + credential.getId()); - if (IdentityProviders.GOOGLE.equals(credential.getAccountType())) { - // Google account, rebuild GoogleApiClient to set account name and then try - buildClients(credential.getId()); - googleSilentSignIn(); - } else { - // Email/password account - String status = String.format("Signed in as %s", credential.getId()); - ((TextView) findViewById(R.id.text_email_status)).setText(status); - } - } - - private void handleGoogleSignIn(Task completedTask) { - Log.d(TAG, "handleGoogleSignIn:" + completedTask); - - boolean isSignedIn = (completedTask != null) && completedTask.isSuccessful(); - if (isSignedIn) { - // Display signed-in UI - GoogleSignInAccount gsa = completedTask.getResult(); - String status = String.format("Signed in as %s (%s)", gsa.getDisplayName(), - gsa.getEmail()); - ((TextView) findViewById(R.id.text_google_status)).setText(status); - - // Save Google Sign In to SmartLock - Credential credential = new Credential.Builder(gsa.getEmail()) - .setAccountType(IdentityProviders.GOOGLE) - .setName(gsa.getDisplayName()) - .setProfilePictureUri(gsa.getPhotoUrl()) - .build(); - - saveCredential(credential); - } else { - // Display signed-out UI - ((TextView) findViewById(R.id.text_google_status)).setText(R.string.signed_out); - } - - findViewById(R.id.button_google_sign_in).setEnabled(!isSignedIn); - findViewById(R.id.button_google_sign_out).setEnabled(isSignedIn); - findViewById(R.id.button_google_revoke).setEnabled(isSignedIn); - } - - private void requestCredentials(final boolean shouldResolve, boolean onlyPasswords) { - CredentialRequest.Builder crBuilder = new CredentialRequest.Builder() - .setPasswordLoginSupported(true); - - if (!onlyPasswords) { - crBuilder.setAccountTypes(IdentityProviders.GOOGLE); - } - - showProgress(); - mCredentialsClient.request(crBuilder.build()).addOnCompleteListener( - new OnCompleteListener() { - @Override - public void onComplete(@NonNull Task task) { - hideProgress(); - - if (task.isSuccessful()) { - // Auto sign-in success - handleCredential(task.getResult().getCredential()); - return; - } - - Exception e = task.getException(); - if (e instanceof ResolvableApiException && shouldResolve) { - // Getting credential needs to show some UI, start resolution - ResolvableApiException rae = (ResolvableApiException) e; - resolveResult(rae, RC_CREDENTIALS_READ); - } else { - Log.w(TAG, "request: not handling exception", e); - } - } - }); - } - - private void resolveResult(ResolvableApiException rae, int requestCode) { - if (!mIsResolving) { - try { - rae.startResolutionForResult(MainActivity.this, requestCode); - mIsResolving = true; - } catch (IntentSender.SendIntentException e) { - Log.e(TAG, "Failed to send Credentials intent.", e); - mIsResolving = false; - } - } - } - - private void saveCredential(Credential credential) { - if (credential == null) { - Log.w(TAG, "Ignoring null credential."); - return; - } - - mCredentialsClient.save(mCredential).addOnCompleteListener( - new OnCompleteListener() { - @Override - public void onComplete(@NonNull Task task) { - if (task.isSuccessful()) { - Log.d(TAG, "save:SUCCESS"); - return; - } - - Exception e = task.getException(); - if (e instanceof ResolvableApiException) { - // Saving the credential can sometimes require showing some UI - // to the user, which means we need to fire this resolution. - ResolvableApiException rae = (ResolvableApiException) e; - resolveResult(rae, RC_CREDENTIALS_SAVE); - } else { - Log.w(TAG, "save:FAILURE", e); - Toast.makeText(MainActivity.this, - "Unexpected error, see logs for detals", - Toast.LENGTH_SHORT).show(); - } - } - }); - } - - private void onGoogleSignInClicked() { - Intent intent = mSignInClient.getSignInIntent(); - startActivityForResult(intent, RC_SIGN_IN); - } - - private void onGoogleRevokeClicked() { - if (mCredential != null) { - mCredentialsClient.delete(mCredential); - } - mSignInClient.revokeAccess().addOnCompleteListener( - new OnCompleteListener() { - @Override - public void onComplete(@NonNull Task task) { - handleGoogleSignIn(null); - } - }); - } - - private void onGoogleSignOutClicked() { - mCredentialsClient.disableAutoSignIn(); - mSignInClient.signOut().addOnCompleteListener( - new OnCompleteListener() { - @Override - public void onComplete(@NonNull Task task) { - handleGoogleSignIn(null); - } - }); - } - - private void onEmailSignInClicked() { - requestCredentials(true, true); - } - - private void onEmailSaveClicked() { - String email = ((EditText) findViewById(R.id.edit_text_email)).getText().toString(); - String password = ((EditText) findViewById(R.id.edit_text_password)).getText().toString(); - - if (email.length() == 0|| password.length() == 0) { - Log.w(TAG, "Blank email or password, can't save Credential."); - Toast.makeText(this, "Email/Password must not be blank.", Toast.LENGTH_SHORT).show(); - return; - } - - Credential credential = new Credential.Builder(email) - .setPassword(password) - .build(); - - saveCredential(credential); - } - - @Override - public void onClick(View v) { - switch (v.getId()) { - case R.id.button_google_sign_in: - onGoogleSignInClicked(); - break; - case R.id.button_google_revoke: - onGoogleRevokeClicked(); - break; - case R.id.button_google_sign_out: - onGoogleSignOutClicked(); - break; - case R.id.button_email_sign_in: - onEmailSignInClicked(); - break; - case R.id.button_email_save: - onEmailSaveClicked(); - break; - } - } - - private void showProgress() { - if (mProgressDialog == null) { - mProgressDialog = new ProgressDialog(this); - mProgressDialog.setIndeterminate(true); - mProgressDialog.setMessage("Loading..."); - } - - mProgressDialog.show(); - } - - private void hideProgress() { - if (mProgressDialog != null && mProgressDialog.isShowing()) { - mProgressDialog.dismiss(); - } - } -} diff --git a/CredentialsSignIn/app/src/main/res/layout/activity_main.xml b/CredentialsSignIn/app/src/main/res/layout/activity_main.xml deleted file mode 100644 index 2262fe6..0000000 --- a/CredentialsSignIn/app/src/main/res/layout/activity_main.xml +++ /dev/null @@ -1,120 +0,0 @@ - - - - - - - - - - - - -