Commit 4447e9f6 authored by Chris Lu's avatar Chris Lu Committed by Commit Bot

[ios] Implement BannerViewController presentation for Translate Messages

This change implements presenting InfobarBannerViewController when
InfobarTranslateCoordinator starts and the button action. Some constants
from TranslateInfobarController are moved to a constants so that they
can be shared.

Screenshot of what it will look like when activated: https://drive.google.com/open?id=11W6HznODlJduMCZgNOSR1b8Gi_crfQl0

Bug: 1014959
Change-Id: I4e5e2859d20e3f04cd477f65e23889d2aa5b37e3
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1872013
Commit-Queue: Chris Lu <thegreenfrog@chromium.org>
Reviewed-by: default avatarPeter Lee <pkl@chromium.org>
Reviewed-by: default avatarSergio Collazos <sczs@chromium.org>
Cr-Commit-Position: refs/heads/master@{#708878}
parent 6348fba7
......@@ -1954,6 +1954,9 @@ New Search
<message name="IDS_IOS_TRANSLATE_INFOBAR_DEFAULT_ACCESSIBILITY_ANNOUNCEMENT" desc="The accessibility announcement read by Voice Over when the Translate Infobar UI is shown in default mode. [Length: unlimited] [iOS only]">
Translate is available. Options available near bottom of the screen.
</message>
<message name="IDS_IOS_TRANSLATE_INFOBAR_TRANSLATE_ACTION" desc="The button text for the action to translate the page. [iOS only]">
Translate
</message>
<message name="IDS_IOS_TRANSLATE_INFOBAR_TRANSLATING_ACCESSIBILITY_ANNOUNCEMENT" desc="The accessibility announcement read by Voice Over when the Translate Infobar UI is shown in translating mode. [Length: unlimited] [iOS only]">
Translating the page to <ph name="language">$1<ex>French</ex></ph>. Options available near bottom of the screen.
</message>
......
......@@ -5,6 +5,7 @@
source_set("public") {
configs += [ "//build/config/compiler:enable_arc" ]
sources = [
"translate_constants.h",
"translate_infobar_delegate_observer_bridge.h",
"translate_infobar_delegate_observer_bridge.mm",
]
......
// Copyright 2019 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 IOS_CHROME_BROWSER_TRANSLATE_TRANSLATE_CONSTANTS_H_
#define IOS_CHROME_BROWSER_TRANSLATE_TRANSLATE_CONSTANTS_H_
#import <UIKit/UIKit.h>
// Track the usage of Translate over its lifetime to log metrics of whether the
// user closed the infobar without interacting with it.
typedef NS_OPTIONS(NSUInteger, UserAction) {
UserActionNone = 0,
UserActionTranslate = 1 << 0,
UserActionRevert = 1 << 1,
UserActionAlwaysTranslate = 1 << 2,
UserActionNeverTranslateLanguage = 1 << 3,
UserActionNeverTranslateSite = 1 << 4,
UserActionExpandMenu = 1 << 5,
};
// Enum for the Translate.CompactInfobar.Event UMA histogram.
// Note: These values are repeated as constants in TranslateCompactInfoBar.java.
// Note: This enum is used to back an UMA histogram, and should be treated as
// append-only.
// TODO(crbug.com/933371): Share these enums with Java.
enum class InfobarEvent {
INFOBAR_IMPRESSION = 0,
INFOBAR_TARGET_TAB_TRANSLATE = 1,
INFOBAR_DECLINE = 2,
INFOBAR_OPTIONS = 3,
INFOBAR_MORE_LANGUAGES = 4,
INFOBAR_MORE_LANGUAGES_TRANSLATE = 5,
INFOBAR_PAGE_NOT_IN = 6,
INFOBAR_ALWAYS_TRANSLATE = 7,
INFOBAR_NEVER_TRANSLATE = 8,
INFOBAR_NEVER_TRANSLATE_SITE = 9,
INFOBAR_SCROLL_HIDE = 10,
INFOBAR_SCROLL_SHOW = 11,
INFOBAR_REVERT = 12,
INFOBAR_SNACKBAR_ALWAYS_TRANSLATE_IMPRESSION = 13,
INFOBAR_SNACKBAR_NEVER_TRANSLATE_IMPRESSION = 14,
INFOBAR_SNACKBAR_NEVER_TRANSLATE_SITE_IMPRESSION = 15,
INFOBAR_SNACKBAR_CANCEL_ALWAYS = 16,
INFOBAR_SNACKBAR_CANCEL_NEVER_SITE = 17,
INFOBAR_SNACKBAR_CANCEL_NEVER = 18,
INFOBAR_ALWAYS_TRANSLATE_UNDO = 19,
INFOBAR_CLOSE_DEPRECATED = 20,
INFOBAR_SNACKBAR_AUTO_ALWAYS_IMPRESSION = 21,
INFOBAR_SNACKBAR_AUTO_NEVER_IMPRESSION = 22,
INFOBAR_SNACKBAR_CANCEL_AUTO_ALWAYS = 23,
INFOBAR_SNACKBAR_CANCEL_AUTO_NEVER = 24,
INFOBAR_HISTOGRAM_BOUNDARY = 25,
kMaxValue = INFOBAR_HISTOGRAM_BOUNDARY,
};
#endif // IOS_CHROME_BROWSER_TRANSLATE_TRANSLATE_CONSTANTS_H_
......@@ -23,6 +23,7 @@
#include "ios/chrome/browser/translate/language_selection_context.h"
#include "ios/chrome/browser/translate/language_selection_delegate.h"
#include "ios/chrome/browser/translate/language_selection_handler.h"
#import "ios/chrome/browser/translate/translate_constants.h"
#import "ios/chrome/browser/translate/translate_infobar_delegate_observer_bridge.h"
#include "ios/chrome/browser/translate/translate_option_selection_delegate.h"
#include "ios/chrome/browser/translate/translate_option_selection_handler.h"
......@@ -47,17 +48,6 @@ typedef NS_ENUM(NSInteger, LanguageSelectionState) {
LanguageSelectionStateTarget,
};
// Various user actions to keep track of.
typedef NS_OPTIONS(NSUInteger, UserAction) {
UserActionNone = 0,
UserActionTranslate = 1 << 0,
UserActionRevert = 1 << 1,
UserActionAlwaysTranslate = 1 << 2,
UserActionNeverTranslateLanguage = 1 << 3,
UserActionNeverTranslateSite = 1 << 4,
UserActionExpandMenu = 1 << 5,
};
// UMA histogram names.
// Note: These string constants are repeated in TranslateCompactInfoBar.java.
const char kLanguageHistogramTranslate[] =
......@@ -74,41 +64,6 @@ const char kEventHistogram[] = "Translate.CompactInfobar.Event";
const char kTranslationCountHistogram[] =
"Translate.CompactInfobar.TranslationsPerPage";
// Enum for the Translate.CompactInfobar.Event UMA histogram.
// Note: These values are repeated as constants in TranslateCompactInfoBar.java.
// Note: This enum is used to back an UMA histogram, and should be treated as
// append-only.
// TODO(crbug.com/933371): Share these enums with Java.
enum class InfobarEvent {
INFOBAR_IMPRESSION = 0,
INFOBAR_TARGET_TAB_TRANSLATE = 1,
INFOBAR_DECLINE = 2,
INFOBAR_OPTIONS = 3,
INFOBAR_MORE_LANGUAGES = 4,
INFOBAR_MORE_LANGUAGES_TRANSLATE = 5,
INFOBAR_PAGE_NOT_IN = 6,
INFOBAR_ALWAYS_TRANSLATE = 7,
INFOBAR_NEVER_TRANSLATE = 8,
INFOBAR_NEVER_TRANSLATE_SITE = 9,
INFOBAR_SCROLL_HIDE = 10,
INFOBAR_SCROLL_SHOW = 11,
INFOBAR_REVERT = 12,
INFOBAR_SNACKBAR_ALWAYS_TRANSLATE_IMPRESSION = 13,
INFOBAR_SNACKBAR_NEVER_TRANSLATE_IMPRESSION = 14,
INFOBAR_SNACKBAR_NEVER_TRANSLATE_SITE_IMPRESSION = 15,
INFOBAR_SNACKBAR_CANCEL_ALWAYS = 16,
INFOBAR_SNACKBAR_CANCEL_NEVER_SITE = 17,
INFOBAR_SNACKBAR_CANCEL_NEVER = 18,
INFOBAR_ALWAYS_TRANSLATE_UNDO = 19,
INFOBAR_CLOSE_DEPRECATED = 20,
INFOBAR_SNACKBAR_AUTO_ALWAYS_IMPRESSION = 21,
INFOBAR_SNACKBAR_AUTO_NEVER_IMPRESSION = 22,
INFOBAR_SNACKBAR_CANCEL_AUTO_ALWAYS = 23,
INFOBAR_SNACKBAR_CANCEL_AUTO_NEVER = 24,
INFOBAR_HISTOGRAM_BOUNDARY = 25,
kMaxValue = INFOBAR_HISTOGRAM_BOUNDARY,
};
} // namespace
@interface TranslateInfoBarController () <LanguageSelectionDelegate,
......
......@@ -76,6 +76,7 @@ source_set("infobars_ui") {
"resources:infobar_reveal_password_icon",
"resources:infobar_save_card_icon",
"resources:infobar_settings_icon",
"resources:infobar_translate_icon",
"resources:infobar_warning",
"//base",
"//base:i18n",
......
......@@ -4,12 +4,16 @@
#import "ios/chrome/browser/ui/infobars/coordinators/infobar_translate_coordinator.h"
#include "base/strings/sys_string_conversions.h"
#include "components/translate/core/browser/translate_infobar_delegate.h"
#include "ios/chrome/browser/infobars/infobar_controller_delegate.h"
#import "ios/chrome/browser/infobars/infobar_type.h"
#import "ios/chrome/browser/translate/translate_constants.h"
#import "ios/chrome/browser/translate/translate_infobar_delegate_observer_bridge.h"
#import "ios/chrome/browser/ui/infobars/banners/infobar_banner_view_controller.h"
#import "ios/chrome/browser/ui/infobars/infobar_container.h"
#include "ios/chrome/grit/ios_strings.h"
#include "ui/base/l10n/l10n_util.h"
#if !defined(__has_feature) || !__has_feature(objc_arc)
#error "This file requires ARC support."
......@@ -25,9 +29,17 @@
@property(nonatomic, readonly)
translate::TranslateInfoBarDelegate* translateInfoBarDelegate;
// InfobarBannerViewController owned by this Coordinator.
@property(nonatomic, strong) InfobarBannerViewController* bannerViewController;
// Tracks user actions taken throughout Translate lifetime.
@property(nonatomic, assign) UserAction userAction;
@end
@implementation TranslateInfobarCoordinator
// Synthesize since readonly property from superclass is changed to readwrite.
@synthesize bannerViewController = _bannerViewController;
- (instancetype)initWithInfoBarDelegate:
(translate::TranslateInfoBarDelegate*)infoBarDelegate {
......@@ -39,6 +51,7 @@
_translateInfobarDelegateObserver =
std::make_unique<TranslateInfobarDelegateObserverBridge>(
infoBarDelegate, self);
_userAction = UserActionNone;
}
return self;
}
......@@ -53,8 +66,7 @@
- (BOOL)translateInfoBarDelegateDidDismissWithoutInteraction:
(translate::TranslateInfoBarDelegate*)delegate {
// TODO(crbug.com/1014959): implement
return YES;
return self.userAction == UserActionNone;
}
#pragma mark - ChromeCoordinator
......@@ -62,7 +74,16 @@
- (void)start {
if (!self.started) {
self.started = YES;
// TODO(crbug.com/1014959): Configure BannerViewController.
self.bannerViewController = [[InfobarBannerViewController alloc]
initWithDelegate:self
presentsModal:self.hasBadge
type:InfobarType::kInfobarTypeTranslate];
self.bannerViewController.titleText = [self titleText];
self.bannerViewController.buttonText = [self buttonText];
self.bannerViewController.iconImage =
[UIImage imageNamed:@"infobar_translate_icon"];
self.bannerViewController.optionalAccessibilityLabel =
self.bannerViewController.titleText;
}
}
......@@ -80,11 +101,18 @@
#pragma mark - InfobarCoordinatorImplementation
- (void)performInfobarAction {
// TODO(crbug.com/1014959): implement
self.userAction |= UserActionTranslate;
// TODO(crbug.com/1014959): Add metrics
if (self.translateInfoBarDelegate->ShouldAutoAlwaysTranslate()) {
self.translateInfoBarDelegate->ToggleAlwaysTranslate();
}
self.translateInfoBarDelegate->Translate();
}
- (void)infobarWasDismissed {
// TODO(crbug.com/1014959): implement
// Release these strong ViewControllers at the time of infobar dismissal.
self.bannerViewController = nil;
}
#pragma mark - Banner
......@@ -94,7 +122,7 @@
}
- (void)dismissBannerWhenInteractionIsFinished {
// TODO(crbug.com/1014959): implement
[self.bannerViewController dismissWhenInteractionIsFinished];
}
- (void)infobarBannerWillBeDismissed:(BOOL)userInitiated {
......@@ -117,4 +145,23 @@
return 0.0;
}
#pragma mark - Private
- (NSString*)titleText {
// TODO(crbug.com/1014959): Return different strings depending on
// TranslateStep. Also, consider looking into base::i18n::MessageFormatter to
// ensure the dstring can be translated properly with a dynamic variable
// inserted.
return [NSString
stringWithFormat:@"%@ %@?", @"Translate",
base::SysUTF16ToNSString(self.translateInfoBarDelegate
->target_language_name())];
}
- (NSString*)buttonText {
// TODO(crbug.com/1014959): Return different strings depending on
// TranslateStep.
return l10n_util::GetNSString(IDS_IOS_TRANSLATE_INFOBAR_TRANSLATE_ACTION);
}
@end
......@@ -56,6 +56,14 @@ imageset("infobar_hide_password_icon") {
]
}
imageset("infobar_translate_icon") {
sources = [
"infobar_translate_icon.imageset/Contents.json",
"infobar_translate_icon.imageset/infobar_translate_icon@2x.png",
"infobar_translate_icon.imageset/infobar_translate_icon@3x.png",
]
}
imageset("infobar_settings_icon") {
sources = [
"infobar_settings_icon.imageset/Contents.json",
......
{
"images": [
{
"idiom": "universal",
"scale": "2x",
"filename": "infobar_translate_icon@2x.png"
},
{
"idiom": "universal",
"scale": "3x",
"filename": "infobar_translate_icon@3x.png"
}
],
"info": {
"version": 1,
"author": "xcode"
}
}
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