blob: 8f14b0a4681a997ce11310efa2872d2725d191ec [file] [log] [blame] [edit]
// Copyright 2016-present the Material Components for iOS authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#import <UIKit/UIKit.h>
#import "supplemental/SnackbarExampleSupplemental.h"
#import "MDCCollectionViewTextCell.h"
#import "MDCCollectionViewController.h"
#import "MDCSnackbarManager.h"
#import "MDCSnackbarMessage.h"
#import "MDCSemanticColorScheme.h"
#import "MDCTypographyScheme.h"
NS_ASSUME_NONNULL_BEGIN
static NSString *const kCategoryA = @"CategoryA";
static NSString *const kCategoryB = @"CategoryB";
@interface SnackbarSuspensionExample : SnackbarExample
- (void)handleSuspendStateChanged:(UISwitch *)sender;
/** The current suspension token. */
@property(nullable, nonatomic) id<MDCSnackbarSuspensionToken> allMessagesToken;
/** Token held when suspending messages from Group A. */
@property(nullable, nonatomic) id<MDCSnackbarSuspensionToken> groupAToken;
/** Token held when suspending messages from Group B. */
@property(nullable, nonatomic) id<MDCSnackbarSuspensionToken> groupBToken;
@end
@implementation SnackbarSuspensionExample
- (void)viewDidLoad {
[super viewDidLoad];
if (!self.colorScheme) {
self.colorScheme =
[[MDCSemanticColorScheme alloc] initWithDefaults:MDCColorSchemeDefaultsMaterial201804];
}
if (!self.typographyScheme) {
self.typographyScheme =
[[MDCTypographyScheme alloc] initWithDefaults:MDCTypographySchemeDefaultsMaterial201804];
}
[self setupExampleViews:@[
@"Show Category A Message", @"Show Category B Message", @"Show Message with no category",
@"Suspend Category A", @"Suspend Category B", @"Suspend All"
]];
self.title = @"Message Suspension";
}
- (void)showMessageWithPrefix:(NSString *)prefix category:(nullable NSString *)category {
MDCSnackbarMessage *message = [[MDCSnackbarMessage alloc] init];
NSMutableAttributedString *attributedMessage = [[NSMutableAttributedString alloc] init];
NSString *formattedPrefix = [NSString stringWithFormat:@"%@ : ", prefix];
NSAttributedString *attributedString =
[[NSAttributedString alloc] initWithString:formattedPrefix
attributes:@{MDCSnackbarMessageBoldAttributeName : @YES}];
[attributedMessage appendAttributedString:attributedString];
NSAttributedString *attributedStringID =
[[NSAttributedString alloc] initWithString:[NSUUID UUID].UUIDString];
[attributedMessage appendAttributedString:attributedStringID];
message.attributedText = attributedMessage;
message.category = category;
[MDCSnackbarManager.defaultManager showMessage:message];
}
#pragma mark - Suspend/Resume
- (void)setSuspendedGroupA:(BOOL)suspended {
if (suspended && self.groupAToken == nil) {
self.groupAToken = [MDCSnackbarManager.defaultManager suspendMessagesWithCategory:kCategoryA];
} else if (!suspended && self.groupAToken != nil) {
[MDCSnackbarManager.defaultManager resumeMessagesWithToken:self.groupAToken];
self.groupAToken = nil;
}
}
- (void)setSuspendedGroupB:(BOOL)suspended {
if (suspended && self.groupBToken == nil) {
self.groupBToken = [MDCSnackbarManager.defaultManager suspendMessagesWithCategory:kCategoryB];
} else if (!suspended && self.groupBToken != nil) {
[MDCSnackbarManager.defaultManager resumeMessagesWithToken:self.groupBToken];
self.groupBToken = nil;
}
}
- (void)setSuspendedAllMessages:(BOOL)suspended {
if (suspended && self.allMessagesToken == nil) {
self.allMessagesToken = [MDCSnackbarManager.defaultManager suspendAllMessages];
} else if (!suspended && self.allMessagesToken != nil) {
[MDCSnackbarManager.defaultManager resumeMessagesWithToken:self.allMessagesToken];
self.allMessagesToken = nil;
}
}
#pragma mark - Event Handling
- (void)collectionView:(UICollectionView *)collectionView
didSelectItemAtIndexPath:(NSIndexPath *)indexPath {
[super collectionView:collectionView didSelectItemAtIndexPath:indexPath];
switch (indexPath.row) {
case 0:
[self showMessageWithPrefix:@"Category A Message" category:kCategoryA];
break;
case 1:
[self showMessageWithPrefix:@"Category B Message" category:kCategoryB];
break;
case 2:
[self showMessageWithPrefix:@"No Category Message" category:nil];
break;
case 3: {
UICollectionViewCell *cell = [collectionView cellForItemAtIndexPath:indexPath];
if ([cell isKindOfClass:[MDCCollectionViewTextCell class]]) {
MDCCollectionViewTextCell *mdcCell = (MDCCollectionViewTextCell *)cell;
UIView *accessoryView = mdcCell.accessoryView;
if ([accessoryView isKindOfClass:[UISwitch class]]) {
UISwitch *theSwitch = (UISwitch *)accessoryView;
[theSwitch setOn:!theSwitch.isOn animated:YES];
cell.accessibilityValue = theSwitch.isOn ? @"on" : @"off";
cell.accessibilityLabel = mdcCell.textLabel.text;
[self setSuspendedGroupA:theSwitch.isOn];
}
}
break;
}
case 4: {
UICollectionViewCell *cell = [collectionView cellForItemAtIndexPath:indexPath];
if ([cell isKindOfClass:[MDCCollectionViewTextCell class]]) {
MDCCollectionViewTextCell *mdcCell = (MDCCollectionViewTextCell *)cell;
UIView *accessoryView = mdcCell.accessoryView;
if ([accessoryView isKindOfClass:[UISwitch class]]) {
UISwitch *theSwitch = (UISwitch *)accessoryView;
[theSwitch setOn:!theSwitch.isOn animated:YES];
cell.accessibilityValue = theSwitch.isOn ? @"on" : @"off";
cell.accessibilityLabel = mdcCell.textLabel.text;
[self setSuspendedGroupB:theSwitch.isOn];
}
}
break;
}
case 5: {
UICollectionViewCell *cell = [collectionView cellForItemAtIndexPath:indexPath];
if ([cell isKindOfClass:[MDCCollectionViewTextCell class]]) {
MDCCollectionViewTextCell *mdcCell = (MDCCollectionViewTextCell *)cell;
UIView *accessoryView = mdcCell.accessoryView;
if ([accessoryView isKindOfClass:[UISwitch class]]) {
UISwitch *theSwitch = (UISwitch *)accessoryView;
[theSwitch setOn:!theSwitch.isOn animated:YES];
cell.accessibilityValue = theSwitch.isOn ? @"on" : @"off";
cell.accessibilityLabel = mdcCell.textLabel.text;
[self setSuspendedAllMessages:theSwitch.isOn];
}
}
break;
}
default:
break;
}
}
- (void)handleSuspendStateChanged:(UISwitch *)sender {
BOOL suspended = sender.on;
// Figure out which token we're dealing with based on which switch sent this message.
if (sender.tag == 3) {
[self setSuspendedGroupA:suspended];
} else if (sender.tag == 4) {
[self setSuspendedGroupB:suspended];
} else if (sender.tag == 5) {
[self setSuspendedAllMessages:suspended];
}
}
@end
@implementation SnackbarSuspensionExample (CollectionView)
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView
cellForItemAtIndexPath:(NSIndexPath *)indexPath {
MDCCollectionViewTextCell *cell =
[collectionView dequeueReusableCellWithReuseIdentifier:kSnackbarExamplesCellIdentifier
forIndexPath:indexPath];
cell.textLabel.text = self.choices[indexPath.row];
cell.isAccessibilityElement = YES;
cell.accessibilityTraits = cell.accessibilityTraits | UIAccessibilityTraitButton;
cell.accessibilityLabel = cell.textLabel.text;
if (indexPath.row > 2) {
UISwitch *editingSwitch = [[UISwitch alloc] initWithFrame:CGRectZero];
[editingSwitch setTag:indexPath.row];
[editingSwitch addTarget:self
action:@selector(handleSuspendStateChanged:)
forControlEvents:UIControlEventValueChanged];
cell.accessoryView = editingSwitch;
cell.accessibilityValue = editingSwitch.isOn ? @"on" : @"off";
} else {
cell.accessoryView = nil;
cell.accessibilityValue = nil;
}
return cell;
}
@end
@implementation SnackbarSuspensionExample (CatalogByConvention)
+ (NSDictionary *)catalogMetadata {
return @{
@"breadcrumbs" : @[ @"Snackbar", @"Snackbar Suspension" ],
@"primaryDemo" : @NO,
@"presentable" : @YES,
@"snapshotDelay" : @1.0,
};
}
@end
NS_ASSUME_NONNULL_END