You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

184 lines
7.0 KiB

//
// FLEXNetworkSettingsTableViewController.m
// FLEXInjected
//
// Created by Ryan Olson on 2/20/15.
//
//
#import "FLEXNetworkSettingsTableViewController.h"
#import "FLEXNetworkObserver.h"
#import "FLEXNetworkRecorder.h"
#import "FLEXUtility.h"
@interface FLEXNetworkSettingsTableViewController () <UIActionSheetDelegate>
@property (nonatomic, copy) NSArray<UITableViewCell *> *cells;
@property (nonatomic) UITableViewCell *cacheLimitCell;
@end
@implementation FLEXNetworkSettingsTableViewController
- (instancetype)initWithStyle:(UITableViewStyle)style
{
self = [super initWithStyle:UITableViewStyleGrouped];
if (self) {
}
return self;
}
- (void)viewDidLoad
{
[super viewDidLoad];
NSMutableArray<UITableViewCell *> *mutableCells = [NSMutableArray array];
UITableViewCell *networkDebuggingCell = [self switchCellWithTitle:@"Network Debugging" toggleAction:@selector(networkDebuggingToggled:) isOn:[FLEXNetworkObserver isEnabled]];
[mutableCells addObject:networkDebuggingCell];
UITableViewCell *cacheMediaResponsesCell = [self switchCellWithTitle:@"Cache Media Responses" toggleAction:@selector(cacheMediaResponsesToggled:) isOn:NO];
[mutableCells addObject:cacheMediaResponsesCell];
NSUInteger currentCacheLimit = [[FLEXNetworkRecorder defaultRecorder] responseCacheByteLimit];
const NSUInteger fiftyMega = 50 * 1024 * 1024;
NSString *cacheLimitTitle = [self titleForCacheLimitCellWithValue:currentCacheLimit];
self.cacheLimitCell = [self sliderCellWithTitle:cacheLimitTitle changedAction:@selector(cacheLimitAdjusted:) minimum:0.0 maximum:fiftyMega initialValue:currentCacheLimit];
[mutableCells addObject:self.cacheLimitCell];
UITableViewCell *clearRecordedRequestsCell = [self buttonCellWithTitle:@"❌ Clear Recorded Requests" touchUpAction:@selector(clearRequestsTapped:) isDestructive:YES];
[mutableCells addObject:clearRecordedRequestsCell];
self.cells = mutableCells;
}
#pragma mark - Settings Actions
- (void)networkDebuggingToggled:(UISwitch *)sender
{
[FLEXNetworkObserver setEnabled:sender.isOn];
}
- (void)cacheMediaResponsesToggled:(UISwitch *)sender
{
[[FLEXNetworkRecorder defaultRecorder] setShouldCacheMediaResponses:sender.isOn];
}
- (void)cacheLimitAdjusted:(UISlider *)sender
{
[[FLEXNetworkRecorder defaultRecorder] setResponseCacheByteLimit:sender.value];
self.cacheLimitCell.textLabel.text = [self titleForCacheLimitCellWithValue:sender.value];
}
- (void)clearRequestsTapped:(UIButton *)sender
{
[FLEXAlert makeSheet:^(FLEXAlert *make) {
make.button(@"Cancel").cancelStyle();
make.button(@"Clear Recorded Requests").destructiveStyle().handler(^(NSArray *strings) {
[[FLEXNetworkRecorder defaultRecorder] clearRecordedActivity];
});
} showFrom:self];
self.popoverPresentationController.sourceView = sender;
self.popoverPresentationController.sourceRect = sender.bounds;
}
#pragma mark - Table view data source
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return self.cells.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
return self.cells[indexPath.row];
}
#pragma mark - Helpers
- (UITableViewCell *)switchCellWithTitle:(NSString *)title toggleAction:(SEL)toggleAction isOn:(BOOL)isOn
{
UITableViewCell *cell = [UITableViewCell new];
cell.selectionStyle = UITableViewCellSelectionStyleNone;
cell.textLabel.text = title;
cell.textLabel.font = [[self class] cellTitleFont];
UISwitch *theSwitch = [UISwitch new];
theSwitch.on = isOn;
[theSwitch addTarget:self action:toggleAction forControlEvents:UIControlEventValueChanged];
CGFloat switchOriginY = round((cell.contentView.frame.size.height - theSwitch.frame.size.height) / 2.0);
CGFloat switchOriginX = CGRectGetMaxX(cell.contentView.frame) - theSwitch.frame.size.width - self.tableView.separatorInset.left;
theSwitch.frame = CGRectMake(switchOriginX, switchOriginY, theSwitch.frame.size.width, theSwitch.frame.size.height);
theSwitch.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleBottomMargin;
[cell.contentView addSubview:theSwitch];
return cell;
}
- (UITableViewCell *)buttonCellWithTitle:(NSString *)title touchUpAction:(SEL)action isDestructive:(BOOL)isDestructive
{
UITableViewCell *buttonCell = [UITableViewCell new];
buttonCell.selectionStyle = UITableViewCellSelectionStyleNone;
UIButton *actionButton = [UIButton buttonWithType:UIButtonTypeSystem];
[actionButton setTitle:title forState:UIControlStateNormal];
if (isDestructive) {
actionButton.tintColor = UIColor.redColor;
}
actionButton.titleLabel.font = [[self class] cellTitleFont];
[actionButton addTarget:self action:@selector(clearRequestsTapped:) forControlEvents:UIControlEventTouchUpInside];
[buttonCell.contentView addSubview:actionButton];
actionButton.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
actionButton.frame = buttonCell.contentView.frame;
actionButton.contentEdgeInsets = UIEdgeInsetsMake(0.0, self.tableView.separatorInset.left, 0.0, self.tableView.separatorInset.left);
actionButton.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft;
return buttonCell;
}
- (NSString *)titleForCacheLimitCellWithValue:(long long)cacheLimit
{
NSInteger limitInMB = round(cacheLimit / (1024 * 1024));
return [NSString stringWithFormat:@"Cache Limit (%ld MB)", (long)limitInMB];
}
- (UITableViewCell *)sliderCellWithTitle:(NSString *)title changedAction:(SEL)changedAction minimum:(CGFloat)minimum maximum:(CGFloat)maximum initialValue:(CGFloat)initialValue
{
UITableViewCell *sliderCell = [UITableViewCell new];
sliderCell.selectionStyle = UITableViewCellSelectionStyleNone;
sliderCell.textLabel.text = title;
sliderCell.textLabel.font = [[self class] cellTitleFont];
UISlider *slider = [UISlider new];
slider.minimumValue = minimum;
slider.maximumValue = maximum;
slider.value = initialValue;
[slider addTarget:self action:changedAction forControlEvents:UIControlEventValueChanged];
[slider sizeToFit];
CGFloat sliderWidth = round(sliderCell.contentView.frame.size.width * 2.0 / 5.0);
CGFloat sliderOriginY = round((sliderCell.contentView.frame.size.height - slider.frame.size.height) / 2.0);
CGFloat sliderOriginX = CGRectGetMaxX(sliderCell.contentView.frame) - sliderWidth - self.tableView.separatorInset.left;
slider.frame = CGRectMake(sliderOriginX, sliderOriginY, sliderWidth, slider.frame.size.height);
slider.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleBottomMargin;
[sliderCell.contentView addSubview:slider];
return sliderCell;
}
+ (UIFont *)cellTitleFont
{
return [FLEXUtility defaultFontOfSize:14.0];
}
@end