Commit 13d15a6d authored by Chris Lu's avatar Chris Lu Committed by Commit Bot

[ios] Add BadgeState to BadgeItem

This replaces accepted state properties in badges with a new BadgeState
enum. This will allow for more states to be added that help the UI to
handle more complex arrangements such as temporarily showing a badge whose banner
is presenting when there are multiple badges. When BadgeItems are initialized,
they will take a BadgeStateNone state for now. It will likely change as
more states are added.

Bug: 976901
Change-Id: I0eb0755cbf4fd41cd883aecc10a767d781af70d7
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1810766
Commit-Queue: Chris Lu <thegreenfrog@chromium.org>
Reviewed-by: default avatarSergio Collazos <sczs@chromium.org>
Reviewed-by: default avatarPeter Lee <pkl@chromium.org>
Cr-Commit-Position: refs/heads/master@{#699812}
parent 6c9b19e4
...@@ -13,8 +13,7 @@ ...@@ -13,8 +13,7 @@
// A model object that represents a badge for an Infobar. // A model object that represents a badge for an Infobar.
@interface InfobarBadgeModel : NSObject <BadgeItem> @interface InfobarBadgeModel : NSObject <BadgeItem>
- (instancetype)initWithInfobarType:(InfobarType)type - (instancetype)initWithInfobarType:(InfobarType)type NS_DESIGNATED_INITIALIZER;
accepted:(BOOL)accepted NS_DESIGNATED_INITIALIZER;
- (instancetype)init NS_UNAVAILABLE; - (instancetype)init NS_UNAVAILABLE;
@end @end
......
...@@ -18,17 +18,17 @@ ...@@ -18,17 +18,17 @@
@end @end
@implementation InfobarBadgeModel @implementation InfobarBadgeModel
// Synthesized from protocol. // Synthesized from BadgeItem.
@synthesize tappable = _tappable; @synthesize tappable = _tappable;
// Synthesized from protocol. // Synthesized from BadgeItem.
@synthesize accepted = _accepted; @synthesize badgeState = _badgeState;
- (instancetype)initWithInfobarType:(InfobarType)type accepted:(BOOL)accepted { - (instancetype)initWithInfobarType:(InfobarType)type {
self = [super init]; self = [super init];
if (self) { if (self) {
_tappable = YES; _tappable = YES;
_infobarType = type; _infobarType = type;
_accepted = accepted; _badgeState = BadgeStateNone;
} }
return self; return self;
} }
......
...@@ -33,11 +33,8 @@ void InfobarBadgeTabHelper::SetDelegate( ...@@ -33,11 +33,8 @@ void InfobarBadgeTabHelper::SetDelegate(
void InfobarBadgeTabHelper::UpdateBadgeForInfobarAccepted( void InfobarBadgeTabHelper::UpdateBadgeForInfobarAccepted(
InfobarType infobar_type) { InfobarType infobar_type) {
InfobarBadgeModel* badgeModel = infobar_badge_models_[infobar_type].badgeState = BadgeStateAccepted;
[[InfobarBadgeModel alloc] initWithInfobarType:infobar_type [delegate_ updateInfobarBadge:infobar_badge_models_[infobar_type]];
accepted:YES];
[delegate_ updateInfobarBadge:badgeModel];
infobar_badge_models_[infobar_type] = badgeModel;
} }
void InfobarBadgeTabHelper::UpdateBadgeForInfobarBannerDismissed( void InfobarBadgeTabHelper::UpdateBadgeForInfobarBannerDismissed(
...@@ -91,8 +88,7 @@ void InfobarBadgeTabHelper::UpdateBadgeForInfobar(infobars::InfoBar* infobar, ...@@ -91,8 +88,7 @@ void InfobarBadgeTabHelper::UpdateBadgeForInfobar(infobars::InfoBar* infobar,
InfobarType infobar_type = controller_.infobarType; InfobarType infobar_type = controller_.infobarType;
if (display) { if (display) {
InfobarBadgeModel* new_badge = InfobarBadgeModel* new_badge =
[[InfobarBadgeModel alloc] initWithInfobarType:infobar_type [[InfobarBadgeModel alloc] initWithInfobarType:infobar_type];
accepted:NO];
infobar_badge_models_[infobar_type] = new_badge; infobar_badge_models_[infobar_type] = new_badge;
[delegate_ addInfobarBadge:new_badge]; [delegate_ addInfobarBadge:new_badge];
} else { } else {
......
...@@ -34,20 +34,20 @@ ...@@ -34,20 +34,20 @@
: NSObject <InfobarBadgeTabHelperDelegate> : NSObject <InfobarBadgeTabHelperDelegate>
@property(nonatomic, assign) BOOL displayingBadge; @property(nonatomic, assign) BOOL displayingBadge;
@property(nonatomic, assign) BOOL badgeIsTappable; @property(nonatomic, assign) BOOL badgeIsTappable;
@property(nonatomic, assign) BOOL badgeIsAccepted; @property(nonatomic, assign) BadgeState badgeState;
@property(nonatomic, assign) BadgeType badgeType; @property(nonatomic, assign) BadgeType badgeType;
@end @end
@implementation InfobarBadgeTabHelperTestDelegate @implementation InfobarBadgeTabHelperTestDelegate
- (void)updateInfobarBadge:(id<BadgeItem>)badgeItem { - (void)updateInfobarBadge:(id<BadgeItem>)badgeItem {
self.badgeIsTappable = badgeItem.isTappable; self.badgeIsTappable = badgeItem.isTappable;
self.badgeIsAccepted = badgeItem.isAccepted; self.badgeState = badgeItem.badgeState;
self.badgeType = badgeItem.badgeType; self.badgeType = badgeItem.badgeType;
} }
- (void)addInfobarBadge:(id<BadgeItem>)badgeItem { - (void)addInfobarBadge:(id<BadgeItem>)badgeItem {
self.displayingBadge = YES; self.displayingBadge = YES;
self.badgeIsTappable = badgeItem.isTappable; self.badgeIsTappable = badgeItem.isTappable;
self.badgeIsAccepted = badgeItem.isAccepted; self.badgeState = badgeItem.badgeState;
self.badgeType = badgeItem.badgeType; self.badgeType = badgeItem.badgeType;
} }
- (void)removeInfobarBadge:(id<BadgeItem>)badgeItem { - (void)removeInfobarBadge:(id<BadgeItem>)badgeItem {
...@@ -219,16 +219,16 @@ class InfobarBadgeTabHelperTest : public PlatformTest { ...@@ -219,16 +219,16 @@ class InfobarBadgeTabHelperTest : public PlatformTest {
TEST_F(InfobarBadgeTabHelperTest, TestInfobarBadgeState) { TEST_F(InfobarBadgeTabHelperTest, TestInfobarBadgeState) {
EXPECT_FALSE(infobar_badge_tab_delegate_.displayingBadge); EXPECT_FALSE(infobar_badge_tab_delegate_.displayingBadge);
EXPECT_FALSE(infobar_badge_tab_delegate_.badgeIsTappable); EXPECT_FALSE(infobar_badge_tab_delegate_.badgeIsTappable);
EXPECT_FALSE(infobar_badge_tab_delegate_.badgeIsAccepted); EXPECT_NE(infobar_badge_tab_delegate_.badgeState, BadgeStateAccepted);
AddInfoBar(/*has_badge=*/true); AddInfoBar(/*has_badge=*/true);
EXPECT_TRUE(infobar_badge_tab_delegate_.displayingBadge); EXPECT_TRUE(infobar_badge_tab_delegate_.displayingBadge);
EXPECT_TRUE(infobar_badge_tab_delegate_.badgeIsTappable); EXPECT_TRUE(infobar_badge_tab_delegate_.badgeIsTappable);
EXPECT_FALSE(infobar_badge_tab_delegate_.badgeIsAccepted); EXPECT_NE(infobar_badge_tab_delegate_.badgeState, BadgeStateAccepted);
// Test that accepting the Infobar sets the badge to accepted state. // Test that accepting the Infobar sets the badge to accepted state.
tab_helper()->UpdateBadgeForInfobarAccepted( tab_helper()->UpdateBadgeForInfobarAccepted(
InfobarType::kInfobarTypePasswordSave); InfobarType::kInfobarTypePasswordSave);
EXPECT_TRUE(infobar_badge_tab_delegate_.badgeIsTappable); EXPECT_TRUE(infobar_badge_tab_delegate_.badgeIsTappable);
EXPECT_TRUE(infobar_badge_tab_delegate_.badgeIsAccepted); EXPECT_EQ(infobar_badge_tab_delegate_.badgeState, BadgeStateAccepted);
} }
// Test the badge state after doesn't change after adding an Infobar with no // Test the badge state after doesn't change after adding an Infobar with no
...@@ -236,11 +236,11 @@ TEST_F(InfobarBadgeTabHelperTest, TestInfobarBadgeState) { ...@@ -236,11 +236,11 @@ TEST_F(InfobarBadgeTabHelperTest, TestInfobarBadgeState) {
TEST_F(InfobarBadgeTabHelperTest, TestInfobarBadgeStateNoBadge) { TEST_F(InfobarBadgeTabHelperTest, TestInfobarBadgeStateNoBadge) {
EXPECT_FALSE(infobar_badge_tab_delegate_.displayingBadge); EXPECT_FALSE(infobar_badge_tab_delegate_.displayingBadge);
EXPECT_FALSE(infobar_badge_tab_delegate_.badgeIsTappable); EXPECT_FALSE(infobar_badge_tab_delegate_.badgeIsTappable);
EXPECT_FALSE(infobar_badge_tab_delegate_.badgeIsAccepted); EXPECT_NE(infobar_badge_tab_delegate_.badgeState, BadgeStateAccepted);
AddInfoBar(/*has_badge=*/false); AddInfoBar(/*has_badge=*/false);
EXPECT_FALSE(infobar_badge_tab_delegate_.displayingBadge); EXPECT_FALSE(infobar_badge_tab_delegate_.displayingBadge);
EXPECT_FALSE(infobar_badge_tab_delegate_.badgeIsTappable); EXPECT_FALSE(infobar_badge_tab_delegate_.badgeIsTappable);
EXPECT_FALSE(infobar_badge_tab_delegate_.badgeIsAccepted); EXPECT_NE(infobar_badge_tab_delegate_.badgeState, BadgeStateAccepted);
} }
// Tests that the InfobarBadge has not been removed after dismissing the // Tests that the InfobarBadge has not been removed after dismissing the
...@@ -259,7 +259,7 @@ TEST_F(InfobarBadgeTabHelperTest, TestInfobarBadgeOnBannerDismissal) { ...@@ -259,7 +259,7 @@ TEST_F(InfobarBadgeTabHelperTest, TestInfobarBadgeOnBannerDismissal) {
// InfobarBanner. // InfobarBanner.
TEST_F(InfobarBadgeTabHelperTest, TestInfobarBadgeOnBannerAccepted) { TEST_F(InfobarBadgeTabHelperTest, TestInfobarBadgeOnBannerAccepted) {
AddInfoBar(/*has_badge=*/true); AddInfoBar(/*has_badge=*/true);
EXPECT_FALSE(infobar_badge_tab_delegate_.badgeIsAccepted); EXPECT_NE(infobar_badge_tab_delegate_.badgeState, BadgeStateAccepted);
tab_helper()->UpdateBadgeForInfobarAccepted( tab_helper()->UpdateBadgeForInfobarAccepted(
InfobarType::kInfobarTypePasswordSave); InfobarType::kInfobarTypePasswordSave);
[infobar_container_coordinator_ dismissBanner]; [infobar_container_coordinator_ dismissBanner];
...@@ -267,7 +267,7 @@ TEST_F(InfobarBadgeTabHelperTest, TestInfobarBadgeOnBannerAccepted) { ...@@ -267,7 +267,7 @@ TEST_F(InfobarBadgeTabHelperTest, TestInfobarBadgeOnBannerAccepted) {
base::test::ios::kWaitForUIElementTimeout, ^bool { base::test::ios::kWaitForUIElementTimeout, ^bool {
return !infobar_container_coordinator_.bannerIsPresenting; return !infobar_container_coordinator_.bannerIsPresenting;
})); }));
EXPECT_TRUE(infobar_badge_tab_delegate_.badgeIsAccepted); EXPECT_EQ(infobar_badge_tab_delegate_.badgeState, BadgeStateAccepted);
} }
// Test that removing the InfobarView doesn't stop displaying the badge. // Test that removing the InfobarView doesn't stop displaying the badge.
......
...@@ -9,6 +9,15 @@ ...@@ -9,6 +9,15 @@
#import "ios/chrome/browser/ui/badges/badge_type.h" #import "ios/chrome/browser/ui/badges/badge_type.h"
// States for the InfobarBadge.
typedef NS_ENUM(NSInteger, BadgeState) {
// The badge is not accepted.
BadgeStateNone = 0,
// The Infobar Badge is accepted. e.g. The Infobar was accepted/confirmed, and
// the Infobar action has taken place.
BadgeStateAccepted,
};
// Holds properties and values the UI needs to configure a badge button. // Holds properties and values the UI needs to configure a badge button.
@protocol BadgeItem @protocol BadgeItem
...@@ -19,8 +28,8 @@ ...@@ -19,8 +28,8 @@
- (BOOL)isFullScreen; - (BOOL)isFullScreen;
// Some badges may not be tappable if there is no action associated with it. // Some badges may not be tappable if there is no action associated with it.
@property(nonatomic, assign, readonly, getter=isTappable) BOOL tappable; @property(nonatomic, assign, readonly, getter=isTappable) BOOL tappable;
// Whether this badge is in an accepted state. // The BadgeState of the badge.
@property(nonatomic, assign, getter=isAccepted) BOOL accepted; @property(nonatomic, assign) BadgeState badgeState;
@end @end
......
...@@ -89,7 +89,7 @@ ...@@ -89,7 +89,7 @@
- (void)updateInfobarBadge:(id<BadgeItem>)badgeItem { - (void)updateInfobarBadge:(id<BadgeItem>)badgeItem {
for (id<BadgeItem> item in self.badges) { for (id<BadgeItem> item in self.badges) {
if (item.badgeType == badgeItem.badgeType) { if (item.badgeType == badgeItem.badgeType) {
item.accepted = badgeItem.accepted; item.badgeState = badgeItem.badgeState;
[self updateBadgesShown]; [self updateBadgesShown];
return; return;
} }
......
...@@ -39,8 +39,7 @@ class FakeInfobarBadgeTabHelper : public InfobarBadgeTabHelper { ...@@ -39,8 +39,7 @@ class FakeInfobarBadgeTabHelper : public InfobarBadgeTabHelper {
void AddInfobar(InfobarType infobar_type) { void AddInfobar(InfobarType infobar_type) {
InfobarBadgeModel* new_badge = InfobarBadgeModel* new_badge =
[[InfobarBadgeModel alloc] initWithInfobarType:infobar_type [[InfobarBadgeModel alloc] initWithInfobarType:infobar_type];
accepted:NO];
infobar_badge_models_[infobar_type] = new_badge; infobar_badge_models_[infobar_type] = new_badge;
[delegate_ addInfobarBadge:new_badge]; [delegate_ addInfobarBadge:new_badge];
} }
...@@ -183,11 +182,11 @@ TEST_F(BadgeMediatorTest, BadgeMediatorTestAcceptedBadge) { ...@@ -183,11 +182,11 @@ TEST_F(BadgeMediatorTest, BadgeMediatorTestAcceptedBadge) {
AddAndActivateWebState(0, false); AddAndActivateWebState(0, false);
AddInfobar(); AddInfobar();
ASSERT_TRUE(badge_consumer_.displayedBadge); ASSERT_TRUE(badge_consumer_.displayedBadge);
EXPECT_FALSE(badge_consumer_.displayedBadge.accepted); EXPECT_NE(badge_consumer_.displayedBadge.badgeState, BadgeStateAccepted);
GetFakeInfobarBadgeTabHelper()->UpdateBadgeForInfobarAccepted( GetFakeInfobarBadgeTabHelper()->UpdateBadgeForInfobarAccepted(
InfobarType::kInfobarTypePasswordSave); InfobarType::kInfobarTypePasswordSave);
EXPECT_TRUE(badge_consumer_.displayedBadge.accepted); EXPECT_EQ(badge_consumer_.displayedBadge.badgeState, BadgeStateAccepted);
} }
// Test that the BadgeMediator adds an incognito badge when the webstatelist // Test that the BadgeMediator adds an incognito badge when the webstatelist
......
...@@ -21,14 +21,14 @@ ...@@ -21,14 +21,14 @@
// Synthesized from protocol. // Synthesized from protocol.
@synthesize tappable = _tappable; @synthesize tappable = _tappable;
// Sythesized from protocol. // Sythesized from protocol.
@synthesize accepted = _accepted; @synthesize badgeState = _badgeState;
- (instancetype)initWithBadgeType:(BadgeType)badgeType { - (instancetype)initWithBadgeType:(BadgeType)badgeType {
self = [super init]; self = [super init];
if (self) { if (self) {
_badgeType = badgeType; _badgeType = badgeType;
_tappable = NO; _tappable = NO;
_accepted = NO; _badgeState = BadgeStateNone;
} }
return self; return self;
} }
......
...@@ -21,14 +21,14 @@ ...@@ -21,14 +21,14 @@
// Synthesized from protocol. // Synthesized from protocol.
@synthesize tappable = _tappable; @synthesize tappable = _tappable;
// Synthesized from protocol. // Synthesized from protocol.
@synthesize accepted = _accepted; @synthesize badgeState = _badgeState;
- (instancetype)initWithBadgeType:(BadgeType)badgeType { - (instancetype)initWithBadgeType:(BadgeType)badgeType {
self = [super init]; self = [super init];
if (self) { if (self) {
_badgeType = badgeType; _badgeType = badgeType;
_tappable = YES; _tappable = YES;
_accepted = NO; _badgeState = BadgeStateNone;
} }
return self; return self;
} }
......
...@@ -76,7 +76,8 @@ const double kFullScreenProgressThreshold = 0.85; ...@@ -76,7 +76,8 @@ const double kFullScreenProgressThreshold = 0.85;
if (displayedBadgeItem) { if (displayedBadgeItem) {
BadgeButton* newButton = [self.buttonFactory BadgeButton* newButton = [self.buttonFactory
getBadgeButtonForBadgeType:displayedBadgeItem.badgeType]; getBadgeButtonForBadgeType:displayedBadgeItem.badgeType];
[newButton setAccepted:displayedBadgeItem.accepted animated:NO]; [newButton setAccepted:displayedBadgeItem.badgeState == BadgeStateAccepted
animated:NO];
self.displayedBadge = newButton; self.displayedBadge = newButton;
} }
if (fullscreenBadgeItem) { if (fullscreenBadgeItem) {
...@@ -101,12 +102,14 @@ const double kFullScreenProgressThreshold = 0.85; ...@@ -101,12 +102,14 @@ const double kFullScreenProgressThreshold = 0.85;
if (displayedBadgeItem) { if (displayedBadgeItem) {
if (self.displayedBadge && if (self.displayedBadge &&
self.displayedBadge.badgeType == displayedBadgeItem.badgeType) { self.displayedBadge.badgeType == displayedBadgeItem.badgeType) {
[self.displayedBadge setAccepted:displayedBadgeItem.accepted [self.displayedBadge
animated:YES]; setAccepted:displayedBadgeItem.badgeState == BadgeStateAccepted
animated:YES];
} else { } else {
BadgeButton* newButton = [self.buttonFactory BadgeButton* newButton = [self.buttonFactory
getBadgeButtonForBadgeType:displayedBadgeItem.badgeType]; getBadgeButtonForBadgeType:displayedBadgeItem.badgeType];
[newButton setAccepted:displayedBadgeItem.accepted animated:NO]; [newButton setAccepted:displayedBadgeItem.badgeState == BadgeStateAccepted
animated:NO];
self.displayedBadge = newButton; self.displayedBadge = newButton;
} }
} else { } else {
......
...@@ -65,8 +65,7 @@ ...@@ -65,8 +65,7 @@
BadgeStaticItem* incognitoItem = [[BadgeStaticItem alloc] BadgeStaticItem* incognitoItem = [[BadgeStaticItem alloc]
initWithBadgeType:BadgeType::kBadgeTypeIncognito]; initWithBadgeType:BadgeType::kBadgeTypeIncognito];
InfobarBadgeModel* passwordBadgeItem = [[InfobarBadgeModel alloc] InfobarBadgeModel* passwordBadgeItem = [[InfobarBadgeModel alloc]
initWithInfobarType:InfobarType::kInfobarTypePasswordSave initWithInfobarType:InfobarType::kInfobarTypePasswordSave];
accepted:NO];
[self.consumer setupWithDisplayedBadge:passwordBadgeItem [self.consumer setupWithDisplayedBadge:passwordBadgeItem
fullScreenBadge:incognitoItem]; fullScreenBadge:incognitoItem];
} }
......
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