[iOS][Passwords] Add google account disclaimer to the footer
This CL adds disclaimer claiming that the password would be added to the
google account in both cases of signed-in and non signed-in in the add
credential VC.
Mocks: https://docs.google.com/presentation/d/1X79wp1xX9QTwCiqnHingswAfaiwmdysNTI7VZ313IJA/edit?resourcekey=0--WwLl01uAB8RlH1aIixU6A#slide=id.ge35bd19155_0_262
Bug: 1226006
Change-Id: Ie71a42dd7402696058832365d965aa659db704a6
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3250910
Commit-Queue: Vidhan Jain <[email protected]>
Reviewed-by: Jérôme <[email protected]>
Reviewed-by: Gauthier Ambard <[email protected]>
Cr-Commit-Position: refs/heads/main@{#945048}
diff --git a/ios/chrome/app/strings/ios_chromium_strings.grd b/ios/chrome/app/strings/ios_chromium_strings.grd
index 71c7ffd..bf64321e 100644
--- a/ios/chrome/app/strings/ios_chromium_strings.grd
+++ b/ios/chrome/app/strings/ios_chromium_strings.grd
@@ -484,6 +484,9 @@
<message name="IDS_IOS_GOOGLE_SERVICES_SETTINGS_ALLOW_SIGNIN_TEXT" desc="Feature title in the Google services Settings for the user to enable/disable Chrome express sign-in from the web [iOS only]">
Allow Chromium Sign-in
</message>
+ <message name="IDS_IOS_SETTINGS_ADD_PASSWORD_FOOTER" desc="Disclaimer telling users what will happen to their passwords">
+ Your password will be saved in your Account (<ph name="EMAIL">$1<ex>[email protected]</ex></ph>).
+ </message>
</messages>
</release>
</grit>
diff --git a/ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_SETTINGS_ADD_PASSWORD_FOOTER.png.sha1 b/ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_SETTINGS_ADD_PASSWORD_FOOTER.png.sha1
new file mode 100644
index 0000000..bbe93b8f
--- /dev/null
+++ b/ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_SETTINGS_ADD_PASSWORD_FOOTER.png.sha1
@@ -0,0 +1 @@
+28a8bd63cda9102951be672241e045ff00368b61
\ No newline at end of file
diff --git a/ios/chrome/app/strings/ios_google_chrome_strings.grd b/ios/chrome/app/strings/ios_google_chrome_strings.grd
index bd46fbd..016abd5 100644
--- a/ios/chrome/app/strings/ios_google_chrome_strings.grd
+++ b/ios/chrome/app/strings/ios_google_chrome_strings.grd
@@ -484,6 +484,9 @@
<message name="IDS_IOS_GOOGLE_SERVICES_SETTINGS_ALLOW_SIGNIN_TEXT" desc="Feature title in the Google services Settings for the user to enable/disable Chrome express sign-in from the web [iOS only]">
Allow Chrome Sign-in
</message>
+ <message name="IDS_IOS_SETTINGS_ADD_PASSWORD_FOOTER" desc="Disclaimer telling users what will happen to their passwords">
+ Your password will be saved in your Google Account (<ph name="EMAIL">$1<ex>[email protected]</ex></ph>).
+ </message>
</messages>
</release>
</grit>
diff --git a/ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_SETTINGS_ADD_PASSWORD_FOOTER.png.sha1 b/ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_SETTINGS_ADD_PASSWORD_FOOTER.png.sha1
new file mode 100644
index 0000000..bbe93b8f
--- /dev/null
+++ b/ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_SETTINGS_ADD_PASSWORD_FOOTER.png.sha1
@@ -0,0 +1 @@
+28a8bd63cda9102951be672241e045ff00368b61
\ No newline at end of file
diff --git a/ios/chrome/app/strings/ios_strings.grd b/ios/chrome/app/strings/ios_strings.grd
index 309e10e..03923245 100644
--- a/ios/chrome/app/strings/ios_strings.grd
+++ b/ios/chrome/app/strings/ios_strings.grd
@@ -1898,6 +1898,9 @@
<message name="IDS_IOS_SETTINGS_PASSWORDS_DUPLICATE_SECTION_ALERT_DESCRIPTION_WITHOUT_USERNAME" desc="Text shown alerting the user that a similar credential exists with the same website combination when adding a new credential [iOS only]">
You already saved a password for <ph name="WEBSITE">$1<ex>twitter.com</ex></ph>
</message>
+ <message name="IDS_IOS_SETTINGS_ADD_PASSWORD_FOOTER_NON_SYNCING" desc="Disclaimer telling non-syncing users what will happen to their passwords">
+ Your password will be saved to your device.
+ </message>
<message name="IDS_IOS_LEAK_CHECK_SWITCH" desc="Title for the switch toggling whether Chrome should check that entered credentials have been part of a leak.">
Warn you if passwords are exposed in a data breach
</message>
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_SETTINGS_ADD_PASSWORD_FOOTER_NON_SYNCING.png.sha1 b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_SETTINGS_ADD_PASSWORD_FOOTER_NON_SYNCING.png.sha1
new file mode 100644
index 0000000..e32f4a3
--- /dev/null
+++ b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_SETTINGS_ADD_PASSWORD_FOOTER_NON_SYNCING.png.sha1
@@ -0,0 +1 @@
+9af821bb86c86503565ca21c6365e2b886df82bc
\ No newline at end of file
diff --git a/ios/chrome/browser/ui/settings/password/password_details/BUILD.gn b/ios/chrome/browser/ui/settings/password/password_details/BUILD.gn
index f8c8343..aa46dc83 100644
--- a/ios/chrome/browser/ui/settings/password/password_details/BUILD.gn
+++ b/ios/chrome/browser/ui/settings/password/password_details/BUILD.gn
@@ -28,6 +28,8 @@
"//ios/chrome/browser",
"//ios/chrome/browser/main:public",
"//ios/chrome/browser/passwords",
+ "//ios/chrome/browser/signin",
+ "//ios/chrome/browser/sync",
"//ios/chrome/browser/ui:feature_flags",
"//ios/chrome/browser/ui/alert_coordinator",
"//ios/chrome/browser/ui/commands",
diff --git a/ios/chrome/browser/ui/settings/password/password_details/add_password_coordinator.mm b/ios/chrome/browser/ui/settings/password/password_details/add_password_coordinator.mm
index a41230e..4631ec9 100644
--- a/ios/chrome/browser/ui/settings/password/password_details/add_password_coordinator.mm
+++ b/ios/chrome/browser/ui/settings/password/password_details/add_password_coordinator.mm
@@ -9,6 +9,10 @@
#include "base/strings/sys_string_conversions.h"
#include "components/strings/grit/components_strings.h"
#import "ios/chrome/browser/main/browser.h"
+#import "ios/chrome/browser/signin/authentication_service.h"
+#import "ios/chrome/browser/signin/authentication_service_factory.h"
+#import "ios/chrome/browser/sync/sync_setup_service.h"
+#import "ios/chrome/browser/sync/sync_setup_service_factory.h"
#import "ios/chrome/browser/ui/alert_coordinator/alert_coordinator.h"
#import "ios/chrome/browser/ui/commands/application_commands.h"
#import "ios/chrome/browser/ui/commands/command_dispatcher.h"
@@ -74,8 +78,25 @@
}
- (void)start {
+ AuthenticationService* authenticationService =
+ AuthenticationServiceFactory::GetForBrowserState(
+ self.browser->GetBrowserState());
+ DCHECK(authenticationService);
+ NSString* syncingUserEmail = nil;
+ ChromeIdentity* chromeIdentity =
+ authenticationService->GetPrimaryIdentity(signin::ConsentLevel::kSync);
+ if (chromeIdentity) {
+ SyncSetupService* syncSetupService =
+ SyncSetupServiceFactory::GetForBrowserState(
+ self.browser->GetBrowserState());
+ if (syncSetupService->IsDataTypeActive(syncer::PASSWORDS)) {
+ syncingUserEmail = chromeIdentity.userEmail;
+ }
+ }
+
self.viewController = [[PasswordDetailsTableViewController alloc]
- initWithCredentialType:CredentialTypeNew];
+ initWithCredentialType:CredentialTypeNew
+ syncingUserEmail:syncingUserEmail];
self.mediator = [[AddPasswordMediator alloc] initWithDelegate:self
passwordCheckManager:_manager];
diff --git a/ios/chrome/browser/ui/settings/password/password_details/password_details_coordinator.mm b/ios/chrome/browser/ui/settings/password/password_details/password_details_coordinator.mm
index 2b69de9..3ca6a0a4 100644
--- a/ios/chrome/browser/ui/settings/password/password_details/password_details_coordinator.mm
+++ b/ios/chrome/browser/ui/settings/password/password_details/password_details_coordinator.mm
@@ -98,7 +98,8 @@
- (void)start {
self.viewController = [[PasswordDetailsTableViewController alloc]
- initWithCredentialType:_credentialType];
+ initWithCredentialType:_credentialType
+ syncingUserEmail:nil];
self.mediator = [[PasswordDetailsMediator alloc] initWithPassword:_password
passwordCheckManager:_manager];
diff --git a/ios/chrome/browser/ui/settings/password/password_details/password_details_table_view_controller.h b/ios/chrome/browser/ui/settings/password/password_details/password_details_table_view_controller.h
index 7c3ed35..a250e8d 100644
--- a/ios/chrome/browser/ui/settings/password/password_details/password_details_table_view_controller.h
+++ b/ios/chrome/browser/ui/settings/password/password_details/password_details_table_view_controller.h
@@ -29,7 +29,10 @@
PasswordDetailsConsumer>
// The designated initializer.
+// |syncingUserEmail| stores the user email if the user is authenticated amd
+// syncing passwords.
- (instancetype)initWithCredentialType:(CredentialType)credentialType
+ syncingUserEmail:(NSString*)syncingUserEmail
NS_DESIGNATED_INITIALIZER;
- (instancetype)initWithStyle:(UITableViewStyle)style NS_UNAVAILABLE;
diff --git a/ios/chrome/browser/ui/settings/password/password_details/password_details_table_view_controller.mm b/ios/chrome/browser/ui/settings/password/password_details/password_details_table_view_controller.mm
index 134d694..6772344 100644
--- a/ios/chrome/browser/ui/settings/password/password_details/password_details_table_view_controller.mm
+++ b/ios/chrome/browser/ui/settings/password/password_details/password_details_table_view_controller.mm
@@ -121,13 +121,17 @@
// If YES, the password details are shown without requiring any authentication.
@property(nonatomic, assign) BOOL showPasswordWithoutAuth;
+// Stores the user email if the user is authenticated amd syncing passwords.
+@property(nonatomic, readonly) NSString* syncingUserEmail;
+
@end
@implementation PasswordDetailsTableViewController
#pragma mark - ViewController Life Cycle.
-- (instancetype)initWithCredentialType:(CredentialType)credentialType {
+- (instancetype)initWithCredentialType:(CredentialType)credentialType
+ syncingUserEmail:(NSString*)syncingUserEmail {
self = [super initWithStyle:ChromeTableViewStyle()];
if (self) {
_credentialType = credentialType;
@@ -135,6 +139,7 @@
_shouldEnableSave = NO;
_showPasswordWithoutAuth = NO;
_isTLDMissingMessageShown = NO;
+ _syncingUserEmail = syncingUserEmail;
}
return self;
}
@@ -453,7 +458,11 @@
- (TableViewLinkHeaderFooterItem*)footerItem {
TableViewLinkHeaderFooterItem* item =
[[TableViewLinkHeaderFooterItem alloc] initWithType:ItemTypeFooter];
- item.text = l10n_util::GetNSString(IDS_IOS_SETTINGS_ADD_PASSWORD_DESCRIPTION);
+ item.text =
+ [NSString stringWithFormat:@"%@\n\n%@",
+ l10n_util::GetNSString(
+ IDS_IOS_SETTINGS_ADD_PASSWORD_DESCRIPTION),
+ [self footerText]];
return item;
}
@@ -467,6 +476,17 @@
return item;
}
+- (NSString*)footerText {
+ if (self.syncingUserEmail) {
+ return l10n_util::GetNSStringF(
+ IDS_IOS_SETTINGS_ADD_PASSWORD_FOOTER,
+ base::SysNSStringToUTF16(self.syncingUserEmail));
+ }
+
+ return l10n_util::GetNSString(
+ IDS_IOS_SETTINGS_ADD_PASSWORD_FOOTER_NON_SYNCING);
+}
+
#pragma mark - UITableViewDelegate
- (void)tableView:(UITableView*)tableView
diff --git a/ios/chrome/browser/ui/settings/password/password_details/password_details_table_view_controller_unittest.mm b/ios/chrome/browser/ui/settings/password/password_details/password_details_table_view_controller_unittest.mm
index 1f8d42c..a928162 100644
--- a/ios/chrome/browser/ui/settings/password/password_details/password_details_table_view_controller_unittest.mm
+++ b/ios/chrome/browser/ui/settings/password/password_details/password_details_table_view_controller_unittest.mm
@@ -165,13 +165,13 @@
reauthentication_module_ = [[MockReauthenticationModule alloc] init];
reauthentication_module_.expectedResult = ReauthenticationResult::kSuccess;
snack_bar_ = [[FakeSnackbarImplementation alloc] init];
- credential_type_ = CredentialTypeRegular;
}
ChromeTableViewController* InstantiateController() override {
PasswordDetailsTableViewController* controller =
[[PasswordDetailsTableViewController alloc]
- initWithCredentialType:credential_type_];
+ initWithCredentialType:credential_type_
+ syncingUserEmail:syncing_user_email_];
controller.handler = handler_;
controller.delegate = delegate_;
controller.reauthModule = reauthentication_module_;
@@ -262,12 +262,17 @@
credential_type_ = credentialType;
}
+ void SetUserSyncingEmail(NSString* syncing_user_email) {
+ syncing_user_email_ = syncing_user_email;
+ }
+
private:
id snack_bar_;
- FakePasswordDetailsHandler* handler_;
- FakePasswordDetailsDelegate* delegate_;
- MockReauthenticationModule* reauthentication_module_;
- CredentialType credential_type_;
+ FakePasswordDetailsHandler* handler_ = nil;
+ FakePasswordDetailsDelegate* delegate_ = nil;
+ MockReauthenticationModule* reauthentication_module_ = nil;
+ CredentialType credential_type_ = CredentialTypeRegular;
+ NSString* syncing_user_email_ = nil;
};
// Tests that password is displayed properly.
@@ -617,7 +622,13 @@
EXPECT_EQ(0, NumberOfItemsInSection(1));
EXPECT_EQ(2, NumberOfItemsInSection(2));
CheckSectionFooter(
- l10n_util::GetNSString(IDS_IOS_SETTINGS_ADD_PASSWORD_DESCRIPTION), 3);
+ [NSString
+ stringWithFormat:
+ @"%@\n\n%@",
+ l10n_util::GetNSString(IDS_IOS_SETTINGS_ADD_PASSWORD_DESCRIPTION),
+ l10n_util::GetNSString(
+ IDS_IOS_SETTINGS_ADD_PASSWORD_FOOTER_NON_SYNCING)],
+ 3);
}
// Tests the layout of the view controller when adding a new credential with
@@ -644,3 +655,26 @@
EXPECT_EQ(2, NumberOfItemsInSection(2));
EXPECT_EQ(2, NumberOfItemsInSection(3));
}
+
+// Tests the footer text of the view controller when adding a new credential and
+// the user syncing email address is provided.
+TEST_F(PasswordDetailsTableViewControllerTest, TestFooterTextWithSyncingEmail) {
+ base::test::ScopedFeatureList scoped_feature_list;
+ scoped_feature_list.InitAndEnableFeature(
+ password_manager::features::kSupportForAddPasswordsInSettings);
+ SetCredentialType(CredentialTypeNew);
+ SetUserSyncingEmail(@"[email protected]");
+
+ PasswordDetailsTableViewController* passwords_controller =
+ static_cast<PasswordDetailsTableViewController*>(controller());
+ [passwords_controller loadModel];
+
+ CheckSectionFooter(
+ [NSString stringWithFormat:@"%@\n\n%@",
+ l10n_util::GetNSString(
+ IDS_IOS_SETTINGS_ADD_PASSWORD_DESCRIPTION),
+ l10n_util::GetNSStringF(
+ IDS_IOS_SETTINGS_ADD_PASSWORD_FOOTER,
+ u"[email protected]")],
+ 3);
+}