Commit d57630a6 authored by Chris Lu's avatar Chris Lu Committed by Commit Bot

[ios] Add addition configurations for Inforbar Translate Modal

- Add "Show Original" button in Infobar Translate Modal, separating
the revert action from the "Translate" action button. This new button
will be enabled if the TranslateStep is AFTER_TRANSLATE. A new
InfobarTranslateModalDelegate method is added and implemented in the
coordinator.
- The "Never Translate Language" and "Never Translate Site" buttons
will be enabled only if the TranslateStep is BEFORE_TRANSLATE to remove
these options when a Translate has finished.
- TranslateStep property is added to mediator so that it can check
the current state to send the consumer the right button enable prefs.
- |translateInfoBarDelegate| in InfobarTranslateCoordinator is renamed to
translateInfobarDelegate to set the right precedent.

Bug: 1014959
Change-Id: I75c59124431d89963830176bb9866a4bf80e98b8
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1919829
Commit-Queue: Chris Lu <thegreenfrog@chromium.org>
Reviewed-by: default avatarSergio Collazos <sczs@chromium.org>
Cr-Commit-Position: refs/heads/master@{#721232}
parent e78f425a
......@@ -41,7 +41,7 @@
// Delegate that holds the Translate Infobar information and actions.
@property(nonatomic, readonly)
translate::TranslateInfoBarDelegate* translateInfoBarDelegate;
translate::TranslateInfoBarDelegate* translateInfobarDelegate;
// InfobarBannerViewController owned by this Coordinator.
@property(nonatomic, strong) InfobarBannerViewController* bannerViewController;
......@@ -73,7 +73,7 @@
badgeSupport:YES
type:InfobarType::kInfobarTypeTranslate];
if (self) {
_translateInfoBarDelegate = infoBarDelegate;
_translateInfobarDelegate = infoBarDelegate;
_translateInfobarDelegateObserver =
std::make_unique<TranslateInfobarDelegateObserverBridge>(
infoBarDelegate, self);
......@@ -92,6 +92,7 @@
withErrorType:(translate::TranslateErrors::Type)errorType {
DCHECK(self.currentStep != step);
self.currentStep = step;
self.mediator.currentStep = step;
switch (self.currentStep) {
case translate::TranslateStep::TRANSLATE_STEP_TRANSLATING:
self.translateInProgress = YES;
......@@ -131,7 +132,8 @@
if (!self.started) {
self.started = YES;
self.mediator = [[InfobarTranslateMediator alloc]
initWithInfoBarDelegate:self.translateInfoBarDelegate];
initWithInfoBarDelegate:self.translateInfobarDelegate];
self.mediator.currentStep = self.currentStep;
[self createBannerViewController];
}
}
......@@ -157,29 +159,31 @@
- (void)performInfobarAction {
switch (self.currentStep) {
case translate::TranslateStep::TRANSLATE_STEP_BEFORE_TRANSLATE:
case translate::TranslateStep::TRANSLATE_STEP_BEFORE_TRANSLATE: {
self.userAction |= UserActionTranslate;
// TODO(crbug.com/1014959): Add metrics
if (self.translateInfoBarDelegate->ShouldAutoAlwaysTranslate()) {
if (self.translateInfobarDelegate->ShouldAutoAlwaysTranslate()) {
// TODO(crbug.com/1014959): Figure out if we should prompt user with
// snackbar to auto always translate.
self.translateInfoBarDelegate->ToggleAlwaysTranslate();
self.translateInfobarDelegate->ToggleAlwaysTranslate();
}
self.translateInfoBarDelegate->Translate();
self.translateInfobarDelegate->Translate();
break;
}
case translate::TranslateStep::TRANSLATE_STEP_AFTER_TRANSLATE: {
self.userAction |= UserActionRevert;
// TODO(crbug.com/1014959): Add metrics
self.translateInfoBarDelegate->RevertWithoutClosingInfobar();
self.translateInfobarDelegate->RevertWithoutClosingInfobar();
// There is no completion signal (i.e. change of TranslateStep) in
// translateInfoBarDelegate:didChangeTranslateStep:withErrorType: in
// response to RevertWithoutClosingInfobar(), so revert Infobar badge
// accepted state here.
self.currentStep =
translate::TranslateStep::TRANSLATE_STEP_BEFORE_TRANSLATE;
self.mediator.currentStep = self.currentStep;
[self.badgeDelegate infobarWasReverted:self.infobarType
forWebState:self.webState];
break;
......@@ -216,8 +220,8 @@
}
- (void)infobarBannerWillBeDismissed:(BOOL)userInitiated {
if (userInitiated && self.translateInfoBarDelegate)
self.translateInfoBarDelegate->InfoBarDismissed();
if (userInitiated && self.translateInfobarDelegate)
self.translateInfobarDelegate->InfoBarDismissed();
}
#pragma mark - Modal
......@@ -226,14 +230,13 @@
// Return early if there's no delegate. e.g. A Modal presentation has been
// triggered after the Infobar was destroyed, but before the badge/banner
// were dismissed.
if (!self.translateInfoBarDelegate)
if (!self.translateInfobarDelegate)
return NO;
self.modalViewController =
[[InfobarTranslateTableViewController alloc] initWithDelegate:self];
self.modalViewController.title =
l10n_util::GetNSString(IDS_IOS_TRANSLATE_INFOBAR_MODAL_TITLE);
self.modalViewController.translateButtonText = [self infobarButtonText];
self.mediator.modalConsumer = self.modalViewController;
// TODO(crbug.com/1014959): Need to be able to toggle the modal button for
// when translate is in progress.
......@@ -261,6 +264,13 @@
#pragma mark - InfobarTranslateModalDelegate
- (void)showOriginalLanguage {
DCHECK(self.currentStep ==
translate::TranslateStep::TRANSLATE_STEP_AFTER_TRANSLATE);
[self performInfobarAction];
[self dismissInfobarModal:self animated:YES completion:nil];
}
- (void)showChangeSourceLanguageOptions {
InfobarTranslateLanguageSelectionTableViewController* languageSelectionTVC =
[[InfobarTranslateLanguageSelectionTableViewController alloc]
......@@ -279,7 +289,7 @@
InfobarTranslateLanguageSelectionTableViewController* languageSelectionTVC =
[[InfobarTranslateLanguageSelectionTableViewController alloc]
initWithDelegate:self
selectingSourceLanguage:YES];
selectingSourceLanguage:NO];
languageSelectionTVC.title = l10n_util::GetNSString(
IDS_IOS_TRANSLATE_INFOBAR_SELECT_LANGUAGE_MODAL_TITLE);
self.mediator.targetLanguageSelectionConsumer = languageSelectionTVC;
......@@ -290,31 +300,31 @@
}
- (void)alwaysTranslateSourceLanguage {
DCHECK(!self.translateInfoBarDelegate->ShouldAlwaysTranslate());
DCHECK(!self.translateInfobarDelegate->ShouldAlwaysTranslate());
self.userAction |= UserActionAlwaysTranslate;
// TODO(crbug.com/1014959): Add metrics
self.translateInfoBarDelegate->ToggleAlwaysTranslate();
self.translateInfobarDelegate->ToggleAlwaysTranslate();
// Since toggle turned on always translate, translate now.
// This doesn't call performInfobarAction, because its implementation checks
// ShouldAutoAlwaysTranslate(), which modifies the Translate state. There is
// also no need update the badge state since it will be updated by
// translateInfoBarDelegate:didChangeTranslateStep:
self.translateInfoBarDelegate->Translate();
self.translateInfobarDelegate->Translate();
[self dismissInfobarModal:self animated:YES completion:nil];
}
- (void)undoAlwaysTranslateSourceLanguage {
DCHECK(self.translateInfoBarDelegate->ShouldAlwaysTranslate());
DCHECK(self.translateInfobarDelegate->ShouldAlwaysTranslate());
// TODO(crbug.com/1014959): Add metrics and new user action?
self.translateInfoBarDelegate->ToggleAlwaysTranslate();
self.translateInfobarDelegate->ToggleAlwaysTranslate();
[self dismissInfobarModal:self animated:YES completion:nil];
}
- (void)neverTranslateSourceLanguage {
DCHECK(self.translateInfoBarDelegate->IsTranslatableLanguageByPrefs());
DCHECK(self.translateInfobarDelegate->IsTranslatableLanguageByPrefs());
self.userAction |= UserActionNeverTranslateLanguage;
// TODO(crbug.com/1014959): Add metrics
self.translateInfoBarDelegate->ToggleTranslatableLanguageByPrefs();
self.translateInfobarDelegate->ToggleTranslatableLanguageByPrefs();
[self dismissInfobarModal:self
animated:YES
completion:^{
......@@ -325,16 +335,16 @@
}
- (void)undoNeverTranslateSourceLanguage {
DCHECK(!self.translateInfoBarDelegate->IsTranslatableLanguageByPrefs());
self.translateInfoBarDelegate->ToggleTranslatableLanguageByPrefs();
DCHECK(!self.translateInfobarDelegate->IsTranslatableLanguageByPrefs());
self.translateInfobarDelegate->ToggleTranslatableLanguageByPrefs();
[self dismissInfobarModal:self animated:YES completion:nil];
// TODO(crbug.com/1014959): implement else logic. Should anything be done?
}
- (void)neverTranslateSite {
DCHECK(!self.translateInfoBarDelegate->IsSiteBlacklisted());
DCHECK(!self.translateInfobarDelegate->IsSiteBlacklisted());
self.userAction |= UserActionNeverTranslateSite;
self.translateInfoBarDelegate->ToggleSiteBlacklist();
self.translateInfobarDelegate->ToggleSiteBlacklist();
// TODO(crbug.com/1014959): Add metrics
[self dismissInfobarModal:self
animated:YES
......@@ -346,8 +356,8 @@
}
- (void)undoNeverTranslateSite {
DCHECK(self.translateInfoBarDelegate->IsSiteBlacklisted());
self.translateInfoBarDelegate->ToggleSiteBlacklist();
DCHECK(self.translateInfobarDelegate->IsSiteBlacklisted());
self.translateInfobarDelegate->ToggleSiteBlacklist();
[self dismissInfobarModal:self animated:YES completion:nil];
// TODO(crbug.com/1014959): implement else logic. Should aything be done?
}
......@@ -411,8 +421,8 @@
// Formatted as "[source] to [target]".
return l10n_util::GetNSStringF(
IDS_IOS_TRANSLATE_INFOBAR_TRANSLATE_BANNER_SUBTITLE,
self.translateInfoBarDelegate->original_language_name(),
self.translateInfoBarDelegate->target_language_name());
self.translateInfobarDelegate->original_language_name(),
self.translateInfobarDelegate->target_language_name());
}
// Returns the text of the banner and modal action button depending on the
......
......@@ -7,6 +7,8 @@
#import <UIKit/UIKit.h>
#include "components/translate/core/browser/translate_step.h"
namespace translate {
class TranslateInfoBarDelegate;
} // namespace translate
......@@ -35,6 +37,9 @@ class TranslateInfoBarDelegate;
@property(nonatomic, weak) id<InfobarTranslateLanguageSelectionConsumer>
targetLanguageSelectionConsumer;
// The current state of translate.
@property(nonatomic, assign) translate::TranslateStep currentStep;
@end
#endif // IOS_CHROME_BROWSER_UI_INFOBARS_COORDINATORS_INFOBAR_TRANSLATE_MEDIATOR_H_
......@@ -42,13 +42,24 @@ const int kInvalidLanguageIndex = -1;
- (void)setModalConsumer:(id<InfobarTranslateModalConsumer>)modalConsumer {
_modalConsumer = modalConsumer;
BOOL currentStepBeforeTranslate =
self.currentStep ==
translate::TranslateStep::TRANSLATE_STEP_BEFORE_TRANSLATE;
BOOL currentStepAfterTranslate =
self.currentStep ==
translate::TranslateStep::TRANSLATE_STEP_AFTER_TRANSLATE;
NSDictionary* prefs = @{
kSourceLanguagePrefKey : base::SysUTF16ToNSString(
self.translateInfobarDelegate->original_language_name()),
kTargetLanguagePrefKey : base::SysUTF16ToNSString(
self.translateInfobarDelegate->target_language_name()),
kEnableTranslateButtonPrefKey : @(currentStepBeforeTranslate),
kEnableAndDisplayShowOriginalButtonPrefKey : @(currentStepAfterTranslate),
kShouldAlwaysTranslatePrefKey :
@(self.translateInfobarDelegate->ShouldAlwaysTranslate()),
kDisplayNeverTranslateLanguagePrefKey : @(currentStepBeforeTranslate),
kDisplayNeverTranslateSiteButtonPrefKey : @(currentStepBeforeTranslate),
kIsTranslatableLanguagePrefKey :
@(self.translateInfobarDelegate->IsTranslatableLanguageByPrefs()),
kIsSiteBlacklistedPrefKey :
......
......@@ -9,8 +9,15 @@ namespace {
// Pref keys passed through setupModalViewControllerWithPrefs:.
NSString* kSourceLanguagePrefKey = @"sourceLanguage";
NSString* kTargetLanguagePrefKey = @"targetLanguage";
NSString* kEnableTranslateButtonPrefKey = @"enableTranslateButton";
NSString* kEnableAndDisplayShowOriginalButtonPrefKey =
@"enableAndDisplayShowOriginalButton";
NSString* kShouldAlwaysTranslatePrefKey = @"shouldAlwaysTranslate";
NSString* kDisplayNeverTranslateLanguagePrefKey =
@"displayNeverTranslateLanguage";
NSString* kIsTranslatableLanguagePrefKey = @"isTranslatableLanguage";
NSString* kDisplayNeverTranslateSiteButtonPrefKey =
@"displayNeverTranslateSite";
NSString* kIsSiteBlacklistedPrefKey = @"isSiteBlacklisted";
}
......
......@@ -12,6 +12,10 @@
// Delegate to handle Translate Infobar Modal actions.
@protocol InfobarTranslateModalDelegate <InfobarModalDelegate>
// Indicates the user chose to undo the translation (i.e. show the page in its
// original language).
- (void)showOriginalLanguage;
// Indicates the user chose to show options to change the source target
// language.
- (void)showChangeSourceLanguageOptions;
......
......@@ -23,10 +23,6 @@
(ChromeTableViewControllerStyle)appBarStyle
NS_UNAVAILABLE;
// The text for the Infobar action button (i.e. translate or show
// original)
@property(nonatomic, copy) NSString* translateButtonText;
@end
#endif // IOS_CHROME_BROWSER_UI_INFOBARS_MODALS_INFOBAR_TRANSLATE_TABLE_VIEW_CONTROLLER_H_
......@@ -32,6 +32,7 @@ typedef NS_ENUM(NSInteger, ItemType) {
ItemTypeNeverTranslateSource,
ItemTypeNeverTranslateSite,
ItemTypeTranslateButton,
ItemTypeShowOriginalButton,
};
@interface InfobarTranslateTableViewController ()
......@@ -45,10 +46,19 @@ typedef NS_ENUM(NSInteger, ItemType) {
@property(nonatomic, copy) NSString* sourceLanguage;
// The target language to which to translate.
@property(nonatomic, copy) NSString* targetLanguage;
// YES if the pref is set to enable the Translate button.
@property(nonatomic, assign) BOOL enableTranslateActionButton;
// YES if the pref is set to enable and display the "Show Original" Button.
// Otherwise, hide it.
@property(nonatomic, assign) BOOL enableAndDisplayShowOriginalButton;
// YES if the pref is set to always translate for the source language.
@property(nonatomic, assign) BOOL shouldAlwaysTranslate;
// YES if the pref is set to show the "Never Translate language" button.
@property(nonatomic, assign) BOOL shouldDisplayNeverTranslateLanguageButton;
// NO if the current pref is set to never translate the source language.
@property(nonatomic, assign) BOOL isTranslatableLanguage;
// YES if the pref is set to show the "Never Translate Site" button.
@property(nonatomic, assign) BOOL shouldDisplayNeverTranslateSiteButton;
// YES if the pref is set to never translate the current site.
@property(nonatomic, assign) BOOL isSiteBlacklisted;
......@@ -124,13 +134,30 @@ typedef NS_ENUM(NSInteger, ItemType) {
[model addItem:targetLanguageItem
toSectionWithIdentifier:SectionIdentifierContent];
TableViewTextButtonItem* translateButtonItem =
[self textButtonItemForType:ItemTypeTranslateButton
buttonText:self.translateButtonText];
TableViewTextButtonItem* translateButtonItem = [self
textButtonItemForType:ItemTypeTranslateButton
buttonText:l10n_util::GetNSString(
IDS_IOS_TRANSLATE_INFOBAR_TRANSLATE_ACTION)];
translateButtonItem.disableButtonIntrinsicWidth = YES;
if (!self.enableTranslateActionButton) {
translateButtonItem.buttonBackgroundColor =
[UIColor colorNamed:kDisabledTintColor];
}
[model addItem:translateButtonItem
toSectionWithIdentifier:SectionIdentifierContent];
if (self.enableAndDisplayShowOriginalButton) {
TableViewTextButtonItem* showOriginalButtonItem = [self
textButtonItemForType:ItemTypeShowOriginalButton
buttonText:
l10n_util::GetNSString(
IDS_IOS_TRANSLATE_INFOBAR_TRANSLATE_UNDO_ACTION)];
showOriginalButtonItem.buttonTextColor = [UIColor colorNamed:kBlueColor];
showOriginalButtonItem.buttonBackgroundColor = [UIColor clearColor];
[model addItem:showOriginalButtonItem
toSectionWithIdentifier:SectionIdentifierContent];
}
TableViewTextButtonItem* alwaysTranslateSourceItem =
[self textButtonItemForType:ItemTypeAlwaysTranslateSource
buttonText:[self shouldAlwaysTranslateButtonText]];
......@@ -139,21 +166,25 @@ typedef NS_ENUM(NSInteger, ItemType) {
[model addItem:alwaysTranslateSourceItem
toSectionWithIdentifier:SectionIdentifierContent];
TableViewTextButtonItem* neverTranslateSourceItem =
[self textButtonItemForType:ItemTypeNeverTranslateSource
buttonText:[self shouldNeverTranslateSourceButtonText]];
neverTranslateSourceItem.buttonTextColor = [UIColor colorNamed:kBlueColor];
neverTranslateSourceItem.buttonBackgroundColor = [UIColor clearColor];
[model addItem:neverTranslateSourceItem
toSectionWithIdentifier:SectionIdentifierContent];
if (self.shouldDisplayNeverTranslateLanguageButton) {
TableViewTextButtonItem* neverTranslateSourceItem = [self
textButtonItemForType:ItemTypeNeverTranslateSource
buttonText:[self shouldNeverTranslateSourceButtonText]];
neverTranslateSourceItem.buttonTextColor = [UIColor colorNamed:kBlueColor];
neverTranslateSourceItem.buttonBackgroundColor = [UIColor clearColor];
[model addItem:neverTranslateSourceItem
toSectionWithIdentifier:SectionIdentifierContent];
}
TableViewTextButtonItem* neverTranslateSiteItem =
[self textButtonItemForType:ItemTypeNeverTranslateSite
buttonText:[self shouldNeverTranslateSiteButtonText]];
neverTranslateSiteItem.buttonTextColor = [UIColor colorNamed:kBlueColor];
neverTranslateSiteItem.buttonBackgroundColor = [UIColor clearColor];
[model addItem:neverTranslateSiteItem
toSectionWithIdentifier:SectionIdentifierContent];
if (self.shouldDisplayNeverTranslateSiteButton) {
TableViewTextButtonItem* neverTranslateSiteItem =
[self textButtonItemForType:ItemTypeNeverTranslateSite
buttonText:[self shouldNeverTranslateSiteButtonText]];
neverTranslateSiteItem.buttonTextColor = [UIColor colorNamed:kBlueColor];
neverTranslateSiteItem.buttonBackgroundColor = [UIColor clearColor];
[model addItem:neverTranslateSiteItem
toSectionWithIdentifier:SectionIdentifierContent];
}
}
#pragma mark - InfobarTranslateModalConsumer
......@@ -161,7 +192,15 @@ typedef NS_ENUM(NSInteger, ItemType) {
- (void)setupModalViewControllerWithPrefs:(NSDictionary*)prefs {
self.sourceLanguage = prefs[kSourceLanguagePrefKey];
self.targetLanguage = prefs[kTargetLanguagePrefKey];
self.enableTranslateActionButton =
[prefs[kEnableTranslateButtonPrefKey] boolValue];
self.enableAndDisplayShowOriginalButton =
[prefs[kEnableAndDisplayShowOriginalButtonPrefKey] boolValue];
self.shouldAlwaysTranslate = [prefs[kShouldAlwaysTranslatePrefKey] boolValue];
self.shouldDisplayNeverTranslateLanguageButton =
[prefs[kDisplayNeverTranslateLanguagePrefKey] boolValue];
self.shouldDisplayNeverTranslateSiteButton =
[prefs[kDisplayNeverTranslateSiteButtonPrefKey] boolValue];
self.isTranslatableLanguage =
[prefs[kIsTranslatableLanguagePrefKey] boolValue];
self.isSiteBlacklisted = [prefs[kIsSiteBlacklistedPrefKey] boolValue];
......@@ -187,6 +226,17 @@ typedef NS_ENUM(NSInteger, ItemType) {
addTarget:self.infobarModalDelegate
action:@selector(modalInfobarButtonWasAccepted:)
forControlEvents:UIControlEventTouchUpInside];
tableViewTextButtonCell.button.enabled = self.enableTranslateActionButton;
break;
}
case ItemTypeShowOriginalButton: {
TableViewTextButtonCell* tableViewTextButtonCell =
base::mac::ObjCCastStrict<TableViewTextButtonCell>(cell);
tableViewTextButtonCell.selectionStyle =
UITableViewCellSelectionStyleNone;
[tableViewTextButtonCell.button addTarget:self.infobarModalDelegate
action:@selector(showOriginalLanguage)
forControlEvents:UIControlEventTouchUpInside];
break;
}
case ItemTypeAlwaysTranslateSource: {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment