[go: nahoru, domu]

blob: 9fedf22d72fc2888ddc6f54a9cbafba68e6353e9 [file] [log] [blame]
// Copyright 2022 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#import "ios/chrome/browser/ui/settings/notifications/notifications_mediator.h"
#import "base/apple/foundation_util.h"
#import "base/notreached.h"
#import "components/prefs/pref_service.h"
#import "ios/chrome/browser/push_notification/push_notification_client_id.h"
#import "ios/chrome/browser/shared/ui/list_model/list_model.h"
#import "ios/chrome/browser/shared/ui/symbols/symbols.h"
#import "ios/chrome/browser/shared/ui/table_view/cells/table_view_detail_icon_item.h"
#import "ios/chrome/browser/ui/settings/notifications/notifications_constants.h"
#import "ios/chrome/browser/ui/settings/notifications/notifications_consumer.h"
#import "ios/chrome/browser/ui/settings/notifications/notifications_navigation_commands.h"
#import "ios/chrome/browser/ui/settings/notifications/notifications_settings_observer.h"
#import "ios/chrome/browser/ui/settings/notifications/notifications_settings_util.h"
#import "ios/chrome/common/ui/colors/semantic_color_names.h"
#import "ios/chrome/grit/ios_strings.h"
#import "ui/base/l10n/l10n_util.h"
// List of items.
typedef NS_ENUM(NSInteger, ItemType) {
ItemTypeTrackingPrice = kItemTypeEnumZero,
};
@interface NotificationsMediator ()
// All the items for the price notifications section.
@property(nonatomic, strong, readonly) TableViewItem* priceTrackingItem;
// Pref Service object.
@property(nonatomic, assign) PrefService* prefService;
@end
@implementation NotificationsMediator {
// Identity object that contains the user's account details.
std::string _gaiaID;
}
@synthesize priceTrackingItem = _priceTrackingItem;
- (instancetype)initWithPrefService:(PrefService*)prefs
gaiaID:(const std::string&)gaiaID {
self = [super init];
if (self) {
DCHECK(prefs);
_prefService = prefs;
_gaiaID = gaiaID;
}
return self;
}
#pragma mark - Properties
- (TableViewItem*)priceTrackingItem {
if (!_priceTrackingItem) {
_priceTrackingItem = [self
detailItemWithType:ItemTypeTrackingPrice
text:
l10n_util::GetNSString(
IDS_IOS_PRICE_NOTIFICATIONS_PRICE_TRACKING_TITLE)
detailText:nil
symbol:kDownTrendSymbol
symbolBackgroundColor:[UIColor colorNamed:kPink500Color]
accessibilityIdentifier:kSettingsNotificationsPriceTrackingCellId];
[self updateDetailTextForItem:_priceTrackingItem
withClientID:PushNotificationClientId::kCommerce];
}
return _priceTrackingItem;
}
- (void)setConsumer:(id<NotificationsConsumer>)consumer {
if (_consumer == consumer) {
return;
}
_consumer = consumer;
[_consumer setPriceTrackingItem:self.priceTrackingItem];
}
#pragma mark - Private methods
// Creates item with details and icon image.
- (TableViewDetailIconItem*)detailItemWithType:(NSInteger)type
text:(NSString*)text
detailText:(NSString*)detailText
symbol:(NSString*)symbol
symbolBackgroundColor:(UIColor*)backgroundColor
accessibilityIdentifier:
(NSString*)accessibilityIdentifier {
TableViewDetailIconItem* detailItem =
[[TableViewDetailIconItem alloc] initWithType:type];
detailItem.text = text;
detailItem.detailText = detailText;
detailItem.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
detailItem.accessibilityTraits |= UIAccessibilityTraitButton;
detailItem.accessibilityIdentifier = accessibilityIdentifier;
detailItem.iconImage = CustomSettingsRootSymbol(symbol);
detailItem.iconTintColor = UIColor.whiteColor;
detailItem.iconCornerRadius = kColorfulBackgroundSymbolCornerRadius;
detailItem.iconBackgroundColor = backgroundColor;
return detailItem;
}
// Updates the detail text for the TableViewItem located in
// PriceNotificationsTableViewController on the previous screen to read either
// 'On/Off' to match the change to the client's push notification permission
// state.
- (void)updateDetailTextForItem:(TableViewItem*)item
withClientID:(PushNotificationClientId)clientID {
DCHECK(item);
TableViewDetailIconItem* iconItem =
base::apple::ObjCCastStrict<TableViewDetailIconItem>(item);
notifications_settings::ClientPermissionState permissionState =
notifications_settings::GetClientPermissionState(clientID, _gaiaID,
_prefService);
NSString* detailText = nil;
if (permissionState ==
notifications_settings::ClientPermissionState::ENABLED) {
detailText = l10n_util::GetNSString(IDS_IOS_SETTING_ON);
} else if (permissionState ==
notifications_settings::ClientPermissionState::DISABLED) {
detailText = l10n_util::GetNSString(IDS_IOS_SETTING_OFF);
}
iconItem.detailText = detailText;
[self.consumer reconfigureCellsForItems:@[ iconItem ]];
}
#pragma mark - PriceNotificationsViewControllerDelegate
- (void)didSelectItem:(TableViewItem*)item {
ItemType type = static_cast<ItemType>(item.type);
switch (type) {
case ItemTypeTrackingPrice:
[self.handler showTrackingPrice];
break;
default:
NOTREACHED();
break;
}
}
#pragma mark - NotificationsSettingsObserverDelegate
- (void)notificationsSettingsDidChangeForClient:
(PushNotificationClientId)clientID {
switch (clientID) {
case PushNotificationClientId::kCommerce: {
[self updateDetailTextForItem:_priceTrackingItem withClientID:clientID];
break;
}
}
}
@end