diff options
author | melandory <melandory@chromium.org> | 2015-08-21 14:09:14 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-08-21 21:09:50 +0000 |
commit | abfc5f025e187896f68b7183064ac3a5a662ee7e (patch) | |
tree | b9178cdcb1c36e36ffd07deb5ad653b5f976aa06 | |
parent | 8dbd0f5c7ecb5809b8cc77b727c5039e1eb84f83 (diff) | |
download | chromium_src-abfc5f025e187896f68b7183064ac3a5a662ee7e.zip chromium_src-abfc5f025e187896f68b7183064ac3a5a662ee7e.tar.gz chromium_src-abfc5f025e187896f68b7183064ac3a5a662ee7e.tar.bz2 |
[Smart Lock] Auto sign-in snackbar UI.
Web site can use credential manager API in order to get user credentials from password store. So in some cases user will be auto signed in to the web site. This commit introduces the UI for the Clank, which will inform the users that they were automatically signed in.
BUG=454815
Review URL: https://codereview.chromium.org/1234063002
Cr-Commit-Position: refs/heads/master@{#344860}
10 files changed, 166 insertions, 1 deletions
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/snackbar/smartlockautosignin/AutoSigninSnackbarController.java b/chrome/android/java/src/org/chromium/chrome/browser/snackbar/smartlockautosignin/AutoSigninSnackbarController.java new file mode 100644 index 0000000..ff34151 --- /dev/null +++ b/chrome/android/java/src/org/chromium/chrome/browser/snackbar/smartlockautosignin/AutoSigninSnackbarController.java @@ -0,0 +1,88 @@ +// Copyright 2015 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.chrome.browser.snackbar.smartlockautosignin; + +import android.content.Context; + +import org.chromium.base.annotations.CalledByNative; +import org.chromium.chrome.R; +import org.chromium.chrome.browser.snackbar.Snackbar; +import org.chromium.chrome.browser.snackbar.SnackbarManager; +import org.chromium.chrome.browser.tab.EmptyTabObserver; +import org.chromium.chrome.browser.tab.Tab; +import org.chromium.chrome.browser.tab.TabObserver; + +/** + * A controller that triggers an auto sign-in snackbar. Auto sign-in snackbar is + * triggered on a request credentials call of a Credential Manager API. + */ +public class AutoSigninSnackbarController + implements SnackbarManager.SnackbarController { + + private final SnackbarManager mSnackbarManager; + private final TabObserver mTabObserver; + private final Tab mTab; + + /** + * Displays Auto sign-in snackbar, which communicates to the users that they + * were signed in to the web site. Displays the |username| in the message. + */ + @CalledByNative + private static void showSnackbar(Tab tab, String username) { + SnackbarManager snackbarManager = tab.getSnackbarManager(); + if (snackbarManager == null) return; + AutoSigninSnackbarController snackbar = + new AutoSigninSnackbarController(snackbarManager, tab); + Context context = tab.getWindowAndroid().getApplicationContext(); + String text = context.getString(R.string.passwords_auto_signin_message); + snackbarManager.showSnackbar(Snackbar.make(username, snackbar).setTemplateText(text)); + } + + /** + * Creates an instance of a {@link AutoSigninSnackbarController}. + * @param snackbarManager The manager that helps to show up snackbar. + */ + private AutoSigninSnackbarController(SnackbarManager snackbarManager, Tab tab) { + mTab = tab; + mSnackbarManager = snackbarManager; + mTabObserver = new EmptyTabObserver() { + @Override + public void onHidden(Tab tab) { + AutoSigninSnackbarController.this.dismissAutoSigninSnackbar(); + } + + @Override + public void onDestroyed(Tab tab) { + AutoSigninSnackbarController.this.dismissAutoSigninSnackbar(); + } + + @Override + public void onCrash(Tab tab, boolean sadTabShown) { + AutoSigninSnackbarController.this.dismissAutoSigninSnackbar(); + } + }; + mTab.addObserver(mTabObserver); + } + + /** + * Dismisses the snackbar. + */ + public void dismissAutoSigninSnackbar() { + if (mSnackbarManager.isShowing()) { + mSnackbarManager.removeMatchingSnackbars(this); + } + } + + @Override + public void onAction(Object actionData) {} + + @Override + public void onDismissNoAction(Object actionData) {} + + @Override + public void onDismissForEachType(boolean isTimeout) { + mTab.removeObserver(mTabObserver); + } +} diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/ChromeTab.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/ChromeTab.java index 8b0fe2d..09fe942 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tab/ChromeTab.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/ChromeTab.java @@ -57,6 +57,7 @@ import org.chromium.chrome.browser.policy.PolicyAuditor.AuditEvent; import org.chromium.chrome.browser.preferences.PrefServiceBridge; import org.chromium.chrome.browser.rlz.RevenueStats; import org.chromium.chrome.browser.search_engines.TemplateUrlService; +import org.chromium.chrome.browser.snackbar.SnackbarManager; import org.chromium.chrome.browser.tab.TabUma.TabCreationState; import org.chromium.chrome.browser.tabmodel.TabCreatorManager.TabCreator; import org.chromium.chrome.browser.tabmodel.TabModel; @@ -1366,4 +1367,9 @@ public class ChromeTab extends Tab { public OverrideUrlLoadingResult getLastOverrideUrlLoadingResultForTests() { return mLastOverrideUrlLoadingResult; } + + @Override + public SnackbarManager getSnackbarManager() { + return mActivity.getSnackbarManager(); + } } diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/Tab.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/Tab.java index 01c43c1..6312380 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tab/Tab.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/Tab.java @@ -54,6 +54,7 @@ import org.chromium.chrome.browser.metrics.UmaSessionStats; import org.chromium.chrome.browser.metrics.UmaUtils; import org.chromium.chrome.browser.printing.TabPrinter; import org.chromium.chrome.browser.profiles.Profile; +import org.chromium.chrome.browser.snackbar.SnackbarManager; import org.chromium.chrome.browser.ssl.ConnectionSecurity; import org.chromium.chrome.browser.ssl.ConnectionSecurityLevel; import org.chromium.chrome.browser.tab.TabUma.TabCreationState; @@ -2247,6 +2248,14 @@ public class Tab implements ViewGroup.OnHierarchyChangeListener, } /** + * Returns the SnackbarManager for the activity that owns this Tab, if any. May + * return null. + */ + public SnackbarManager getSnackbarManager() { + return null; + } + + /** * @return The native pointer representing the native side of this {@link Tab} object. */ @CalledByNative diff --git a/chrome/android/java/strings/android_chrome_strings.grd b/chrome/android/java/strings/android_chrome_strings.grd index 75c8fad..b286c1b 100644 --- a/chrome/android/java/strings/android_chrome_strings.grd +++ b/chrome/android/java/strings/android_chrome_strings.grd @@ -281,8 +281,11 @@ CHAR-LIMIT guidelines: <message name="IDS_PASSWORDS_AUTO_SIGNIN_TITLE" desc="Title for checkbox to enable automatically signing the user in to websites"> Auto Sign-in </message> + <message name="IDS_PASSWORDS_AUTO_SIGNIN_MESSAGE" desc="Message shown when the user is automatically signed in to a website"> + Signed in as <ph name="USERNAME">%1$s<ex>don.john.lemon@gmail.com</ex></ph> + </message> <message name="IDS_PASSWORDS_AUTO_SIGNIN_DESCRIPTION" desc="Text under 'Auto sign-in' checkbox"> - Automatically sign in to websites using stored credentials. When the feature is off, you'll be asked for verification every time before signing in to a website. + Automatically sign in to websites using stored credentials. When the feature is off, you'll be asked for verification every time before signing in to a website. </message> <message name="IDS_SECTION_SAVED_PASSWORDS" desc="Header for the list of passwords that have been saved in Chrome. [CHAR-LIMIT=32]"> Passwords diff --git a/chrome/browser/android/chrome_jni_registrar.cc b/chrome/browser/android/chrome_jni_registrar.cc index 7ece354..aa6786f 100644 --- a/chrome/browser/android/chrome_jni_registrar.cc +++ b/chrome/browser/android/chrome_jni_registrar.cc @@ -128,6 +128,7 @@ #include "chrome/browser/ui/android/navigation_popup.h" #include "chrome/browser/ui/android/omnibox/omnibox_url_emphasizer.h" #include "chrome/browser/ui/android/omnibox/omnibox_view_util.h" +#include "chrome/browser/ui/android/snackbars/auto_signin_snackbar_controller.h" #include "chrome/browser/ui/android/ssl_client_certificate_request.h" #include "chrome/browser/ui/android/tab_model/single_tab_model.h" #include "chrome/browser/ui/android/tab_model/tab_model_jni_bridge.h" @@ -193,6 +194,7 @@ static base::android::RegistrationMethod kChromeRegisteredMethods[] = { {"AutofillPopup", autofill::AutofillPopupViewAndroid::RegisterAutofillPopupViewAndroid}, {"AutofillProfileBridge", autofill::RegisterAutofillProfileBridge}, + {"AutoSigninSnackbarController", RegisterAutoSigninSnackbarController}, {"BookmarksBridge", BookmarksBridge::RegisterBookmarksBridge}, {"CardUnmaskPrompt", autofill::CardUnmaskPromptViewAndroid::Register}, {"CertificateViewer", RegisterCertificateViewer}, diff --git a/chrome/browser/password_manager/chrome_password_manager_client.cc b/chrome/browser/password_manager/chrome_password_manager_client.cc index a281e16..e98a979 100644 --- a/chrome/browser/password_manager/chrome_password_manager_client.cc +++ b/chrome/browser/password_manager/chrome_password_manager_client.cc @@ -50,7 +50,9 @@ #include "third_party/re2/re2/re2.h" #if defined(OS_ANDROID) +#include "chrome/browser/android/tab_android.h" #include "chrome/browser/password_manager/generated_password_saved_infobar_delegate_android.h" +#include "chrome/browser/ui/android/snackbars/auto_signin_snackbar_controller.h" #endif using password_manager::ContentPasswordManagerDriverFactory; @@ -239,8 +241,14 @@ void ChromePasswordManagerClient::ForceSavePassword() { void ChromePasswordManagerClient::NotifyUserAutoSignin( ScopedVector<autofill::PasswordForm> local_forms) { DCHECK(!local_forms.empty()); +#if defined(OS_ANDROID) + TabAndroid *tab = TabAndroid::FromWebContents(web_contents()); + ShowAutoSigninSnackbar(tab, local_forms[0]->username_value); +#else ManagePasswordsUIController::FromWebContents(web_contents())-> OnAutoSignin(local_forms.Pass()); + +#endif } void ChromePasswordManagerClient::AutomaticPasswordSave( diff --git a/chrome/browser/ui/android/snackbars/auto_signin_snackbar_controller.cc b/chrome/browser/ui/android/snackbars/auto_signin_snackbar_controller.cc new file mode 100644 index 0000000..7807eb9 --- /dev/null +++ b/chrome/browser/ui/android/snackbars/auto_signin_snackbar_controller.cc @@ -0,0 +1,23 @@ +// Copyright 2015 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/ui/android/snackbars/auto_signin_snackbar_controller.h" + +#include "base/android/jni_android.h" +#include "base/android/jni_string.h" +#include "chrome/browser/android/tab_android.h" +#include "jni/AutoSigninSnackbarController_jni.h" + +void ShowAutoSigninSnackbar(TabAndroid *tab, const base::string16& username) { + JNIEnv *env = base::android::AttachCurrentThread(); + ScopedJavaLocalRef<jstring> message = + base::android::ConvertUTF16ToJavaString( + env, username); + Java_AutoSigninSnackbarController_showSnackbar( + env, tab->GetJavaObject().obj(), message.obj()); +} + +bool RegisterAutoSigninSnackbarController(JNIEnv *env) { + return RegisterNativesImpl(env); +} diff --git a/chrome/browser/ui/android/snackbars/auto_signin_snackbar_controller.h b/chrome/browser/ui/android/snackbars/auto_signin_snackbar_controller.h new file mode 100644 index 0000000..1e97ac1 --- /dev/null +++ b/chrome/browser/ui/android/snackbars/auto_signin_snackbar_controller.h @@ -0,0 +1,23 @@ +// Copyright 2015 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_UI_ANDROID_SNACKBARS_AUTO_SIGNIN_SNACKBAR_CONTROLLER_H_ +#define CHROME_BROWSER_UI_ANDROID_SNACKBARS_AUTO_SIGNIN_SNACKBAR_CONTROLLER_H_ + +#include <jni.h> + +#include "base/strings/string16.h" + +class TabAndroid; + +// Shows an auto sign-in snackbar in order to inform the users that they were +// automatically signed in to the website. |username| is the username used by +// the user in order to login to the web site, it can be email, telephone number +// or any string. +void ShowAutoSigninSnackbar(TabAndroid *tab, const base::string16& username); + +// Register native method. +bool RegisterAutoSigninSnackbarController(JNIEnv* env); + +#endif // CHROME_BROWSER_UI_ANDROID_SNACKBARS_AUTO_SIGNIN_SNACKBAR_CONTROLLER_H_ diff --git a/chrome/chrome_browser.gypi b/chrome/chrome_browser.gypi index f87306b..9fdac30 100644 --- a/chrome/chrome_browser.gypi +++ b/chrome/chrome_browser.gypi @@ -1779,6 +1779,7 @@ 'android/java/src/org/chromium/chrome/browser/signin/AccountManagementScreenHelper.java', 'android/java/src/org/chromium/chrome/browser/signin/OAuth2TokenService.java', 'android/java/src/org/chromium/chrome/browser/signin/SigninManager.java', + 'android/java/src/org/chromium/chrome/browser/snackbar/smartlockautosignin/AutoSigninSnackbarController.java', 'android/java/src/org/chromium/chrome/browser/spellchecker/SpellCheckerSessionBridge.java', 'android/java/src/org/chromium/chrome/browser/sync/ProfileSyncService.java', 'android/java/src/org/chromium/chrome/browser/tab/Tab.java', diff --git a/chrome/chrome_browser_ui.gypi b/chrome/chrome_browser_ui.gypi index 179b3be..dc0d515 100644 --- a/chrome/chrome_browser_ui.gypi +++ b/chrome/chrome_browser_ui.gypi @@ -522,6 +522,8 @@ 'browser/ui/android/infobars/account_chooser_infobar.h', 'browser/ui/android/infobars/generated_password_saved_infobar.cc', 'browser/ui/android/infobars/generated_password_saved_infobar.h', + 'browser/ui/android/snackbars/auto_signin_snackbar_controller.cc', + 'browser/ui/android/snackbars/auto_signin_snackbar_controller.h', 'browser/ui/auto_login_infobar_delegate.cc', 'browser/ui/auto_login_infobar_delegate.h', 'browser/ui/screen_capture_notification_ui_stub.cc', |