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.
346 lines
14 KiB
346 lines
14 KiB
// |
|
// TFNovelDownloadMenuView.m |
|
// TFReader |
|
// |
|
// Created by 谢腾飞 on 2020/12/16. |
|
// Copyright © 2020 xtfei_2011@126.com. All rights reserved. |
|
// |
|
|
|
#import "TFNovelDownloadMenuView.h" |
|
#import "WXYZ_BookDownloadManager.h" |
|
#import "TFNovelDownloadTaskListModel.h" |
|
#import "TFNovelDownloadMenuCell.h" |
|
#import "WXYZ_ChapterBottomPayBar.h" |
|
|
|
#define DefaultBar_H 6 * Cell_Height + PUB_NAVBAR_OFFSET + 10 |
|
|
|
#define Cell_Height 40 |
|
|
|
#define animateDuration 0.4f |
|
|
|
@interface TFNovelDownloadMenuView ()<UITableViewDelegate, UITableViewDataSource> |
|
{ |
|
UIView *menuView; |
|
} |
|
|
|
@property (nonatomic ,strong) TFNovelDownloadTaskListModel *downloadModel; |
|
|
|
@property (nonatomic ,strong) WXYZ_BookDownloadManager *bookDownloadManager; |
|
|
|
@property (nonatomic ,strong) UIActivityIndicatorView *activityIndicator; |
|
|
|
@property (nonatomic ,weak) UITableView *mainTableView; |
|
|
|
@end |
|
|
|
@implementation TFNovelDownloadMenuView |
|
|
|
- (instancetype)init |
|
{ |
|
if (self = [super init]) { |
|
[self initialize]; |
|
} |
|
return self; |
|
} |
|
|
|
- (void)initialize |
|
{ |
|
self.backgroundColor = kColorRGBA(0, 0, 0, 0.0); |
|
self.frame = CGRectMake(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT); |
|
|
|
self.bookDownloadManager = [WXYZ_BookDownloadManager sharedManager]; |
|
} |
|
|
|
- (void)showDownloadPayView |
|
{ |
|
[self.activityIndicator startAnimating]; |
|
[self netRequest]; |
|
} |
|
|
|
- (void)hiddenDownloadPayView |
|
{ |
|
if (self.menuBarDidHiddenBlock) { |
|
self.menuBarDidHiddenBlock(); |
|
} |
|
[self removeAllSubviews]; |
|
[self removeFromSuperview]; |
|
} |
|
|
|
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event |
|
{ |
|
UIView *touchView = [[touches anyObject] view]; |
|
if (![touchView isEqual:menuView] && ![touchView isEqual:self.mainTableView] && ![touchView isKindOfClass:[NSClassFromString(@"UITableViewCellContentView") class]]) { |
|
[self hiddenDownloadPayView]; |
|
} |
|
} |
|
|
|
- (void)createSubViews |
|
{ |
|
self.backgroundColor = kBlackTransparentColor; |
|
|
|
menuView = [[UIView alloc] init]; |
|
menuView.backgroundColor = [UIColor whiteColor]; |
|
[self addSubview:menuView]; |
|
|
|
[menuView mas_makeConstraints:^(MASConstraintMaker *make) { |
|
make.left.mas_equalTo(0); |
|
make.top.mas_equalTo(self.mas_bottom); |
|
make.width.mas_equalTo(self.mas_width); |
|
make.height.mas_equalTo(DefaultBar_H); |
|
}]; |
|
|
|
self.activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:(UIActivityIndicatorViewStyleGray)]; |
|
self.activityIndicator.hidesWhenStopped = YES; |
|
[menuView addSubview:self.activityIndicator]; |
|
//设置小菊花的frame |
|
[self.activityIndicator mas_makeConstraints:^(MASConstraintMaker *make) { |
|
make.centerX.mas_equalTo(menuView.mas_centerX); |
|
make.centerY.mas_equalTo(menuView.mas_centerY); |
|
make.height.width.mas_equalTo(20); |
|
}]; |
|
} |
|
|
|
- (void)reloadViewData |
|
{ |
|
[UIView animateWithDuration:animateDuration animations:^{ |
|
[self->menuView mas_remakeConstraints:^(MASConstraintMaker *make) { |
|
make.left.mas_equalTo(0); |
|
make.bottom.mas_equalTo(self.mas_bottom); |
|
make.width.mas_equalTo(self.mas_width); |
|
make.height.mas_equalTo(DefaultBar_H); |
|
}]; |
|
}]; |
|
|
|
UITableView *mainTableView = [[UITableView alloc] initWithFrame:CGRectZero style:UITableViewStylePlain]; |
|
self.mainTableView = mainTableView; |
|
mainTableView.delegate = self; |
|
mainTableView.dataSource = self; |
|
mainTableView.scrollEnabled = NO; |
|
mainTableView.backgroundColor = [UIColor whiteColor]; |
|
mainTableView.showsVerticalScrollIndicator = NO; |
|
mainTableView.showsHorizontalScrollIndicator = NO; |
|
mainTableView.separatorStyle = UITableViewCellSeparatorStyleNone; |
|
[self addSubview:mainTableView]; |
|
|
|
[mainTableView mas_makeConstraints:^(MASConstraintMaker *make) { |
|
make.left.mas_equalTo(0); |
|
make.bottom.mas_equalTo(self.mas_bottom); |
|
make.width.mas_equalTo(self.mas_width); |
|
make.height.mas_equalTo(Cell_Height * (1 + self.downloadModel.task_list.count) + Cell_Height + PUB_TABBAR_OFFSET + 10); |
|
}]; |
|
|
|
if (@available(iOS 11.0, *)) { |
|
mainTableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever; |
|
} else { |
|
// Fallback on earlier versions |
|
} |
|
|
|
[menuView mas_updateConstraints:^(MASConstraintMaker *make) { |
|
make.height.mas_equalTo(Cell_Height * (1 + self.downloadModel.task_list.count) + Cell_Height + PUB_TABBAR_OFFSET + 10); |
|
}]; |
|
} |
|
|
|
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section |
|
{ |
|
return self.downloadModel.task_list.count; |
|
} |
|
|
|
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath |
|
{ |
|
TFNovelDownloadMenuCell *cell = [tableView dequeueReusableCellWithIdentifier:@"TFNovelDownloadMenuCell"]; |
|
|
|
if (!cell) { |
|
cell = [[TFNovelDownloadMenuCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"TFNovelDownloadMenuCell"]; |
|
} |
|
cell.book_id = [self.book_id integerValue]; |
|
cell.optionModel = [self.downloadModel.task_list objectOrNilAtIndex:indexPath.row]; |
|
cell.hiddenEndLine = (self.downloadModel.task_list.count - 1 == indexPath.row); |
|
|
|
return cell; |
|
} |
|
|
|
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath |
|
{ |
|
self.mainTableView.userInteractionEnabled = NO; |
|
TFNovelDownloadMenuCell *cell = [tableView cellForRowAtIndexPath:indexPath]; |
|
[cell startDownloadLoading]; |
|
|
|
NSString *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject; |
|
path = [path stringByAppendingPathComponent:[TFUtilsHelper stringToMD5:@"book_catalog"]]; |
|
NSString *catalogName = [NSString stringWithFormat:@"%@_%@", self.book_id, @"catalog"]; |
|
NSString *fullPath = [path stringByAppendingFormat:@"/%@.plist", [TFUtilsHelper stringToMD5:catalogName]]; |
|
if ([[NSFileManager defaultManager] fileExistsAtPath:fullPath]) { |
|
NSDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:fullPath]; |
|
TFProductionModel *t_model = [TFProductionModel modelWithDictionary:dict]; |
|
self.downloadModel.productionModel = t_model; |
|
[self downloadChapterWithTaskModel:[self.downloadModel.task_list objectAtIndex:indexPath.row]]; |
|
} else { |
|
WS(weakSelf) |
|
[TFNetworkTools POST:Book_Catalog parameters:@{@"book_id":self.book_id} model:TFProductionModel.class success:^(BOOL isSuccess, TFProductionModel * _Nullable t_model, TFNetworkRequestModel * _Nonnull requestModel) { |
|
if (isSuccess) { |
|
weakSelf.downloadModel.productionModel = t_model; |
|
[weakSelf downloadChapterWithTaskModel:[self.downloadModel.task_list objectAtIndex:indexPath.row]]; |
|
[weakSelf hiddenDownloadPayView]; |
|
} |
|
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { |
|
|
|
}]; |
|
} |
|
} |
|
|
|
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath |
|
{ |
|
return Cell_Height; |
|
} |
|
|
|
//section头部间距 |
|
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section |
|
{ |
|
return Cell_Height; |
|
} |
|
//section头部视图 |
|
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section |
|
{ |
|
UILabel *titleLabel = [[UILabel alloc] init]; |
|
titleLabel.backgroundColor = [UIColor whiteColor]; |
|
titleLabel.frame = CGRectMake(0, 0, SCREEN_WIDTH, Cell_Height); |
|
titleLabel.text = TFLocalizedString(@"选择需要下载的章节"); |
|
titleLabel.textColor = kBlackColor; |
|
titleLabel.font = kMainFont; |
|
titleLabel.textAlignment = NSTextAlignmentCenter; |
|
return titleLabel; |
|
} |
|
|
|
//section底部间距 |
|
- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section |
|
{ |
|
return Cell_Height + PUB_TABBAR_OFFSET + 10; |
|
} |
|
//section底部视图 |
|
- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section |
|
{ |
|
UIView *view = [[UIView alloc] init]; |
|
view.frame = CGRectMake(0, 0, SCREEN_WIDTH, Cell_Height + PUB_TABBAR_OFFSET + 10); |
|
view.backgroundColor = kColorRGBA(235, 235, 241, 1); |
|
|
|
UIButton *downloadButton = [UIButton buttonWithType:UIButtonTypeCustom]; |
|
downloadButton.frame = CGRectMake(0, 10, SCREEN_WIDTH, Cell_Height + PUB_TABBAR_OFFSET); |
|
downloadButton.backgroundColor = [UIColor whiteColor]; |
|
[downloadButton setTitle:TFLocalizedString(@"下载缓存") forState:UIControlStateNormal]; |
|
[downloadButton setTitleColor:kBlackColor forState:UIControlStateNormal]; |
|
[downloadButton setTitleEdgeInsets:UIEdgeInsetsMake(0, 0, PUB_TABBAR_OFFSET / 2, 0)]; |
|
[downloadButton.titleLabel setFont:kMainFont]; |
|
[downloadButton addTarget:self action:@selector(downloadClick) forControlEvents:UIControlEventTouchUpInside]; |
|
[view addSubview:downloadButton]; |
|
|
|
return view; |
|
} |
|
|
|
- (void)downloadClick |
|
{ |
|
[[NSNotificationCenter defaultCenter] postNotificationName:Notification_Push_To_Download object:nil]; |
|
[self hiddenDownloadPayView]; |
|
} |
|
|
|
- (void)netRequest |
|
{ |
|
WS(weakSelf) |
|
[TFNetworkTools POST:Book_Chapter_Download_Option parameters:@{@"book_id":self.book_id, @"chapter_id":self.chapter_id} model:nil success:^(BOOL isSuccess, NSDictionary * _Nullable t_model, TFNetworkRequestModel * _Nonnull requestModel) { |
|
if (isSuccess) { |
|
TFNovelDownloadTaskListModel *t_downloadModel = [TFNovelDownloadTaskListModel modelWithDictionary:[t_model objectForKey:@"data"]]; |
|
|
|
weakSelf.downloadModel = t_downloadModel; |
|
|
|
[weakSelf.activityIndicator stopAnimating]; |
|
[weakSelf createSubViews]; |
|
[weakSelf reloadViewData]; |
|
} else if (Compare_Json_isEqualTo(requestModel.code, 703)) { |
|
[TFPromptManager showPromptViewWithStatus:TFPromptStatusError promptTitle:requestModel.msg]; |
|
[weakSelf hiddenDownloadPayView]; |
|
} |
|
} failure:nil]; |
|
} |
|
|
|
- (void)downloadChapterWithTaskModel:(TFDownloadTaskModel *)taskModel |
|
{ |
|
WS(weakSelf) |
|
taskModel.dateString = [TFUtilsHelper currentDateStringWithFormat:@"yyyy-MM-dd"]; |
|
taskModel.download_title = [NSString stringWithFormat:@"%@ - %@%@", [TFUtilsHelper formatStringWithInteger:taskModel.start_order], [TFUtilsHelper formatStringWithInteger:taskModel.end_order], TFLocalizedString(@"章")]; |
|
|
|
[self.bookDownloadManager downloadChaptersWithProductionModel:self.downloadModel.productionModel downloadTaskModel:taskModel production_id:[self.book_id integerValue] start_chapter_id:[taskModel.start_chapter_id integerValue] downloadNum:taskModel.down_num]; |
|
self.bookDownloadManager.downloadMissionStateChangeBlock = ^(WXYZ_DownloadMissionState state, NSInteger production_id, TFDownloadTaskModel * _Nonnull downloadTaskModel, NSArray<NSNumber *> * _Nullable chapterIDArray) { |
|
switch (state) { |
|
case WXYZ_DownloadStateMissionStart: |
|
{ |
|
for (UIView *view in weakSelf.mainTableView.subviews) { |
|
if ([view isKindOfClass:[TFNovelDownloadMenuCell class]]) { |
|
TFNovelDownloadMenuCell *cell = (TFNovelDownloadMenuCell *)view; |
|
if (cell.optionModel.label == downloadTaskModel.label) { |
|
cell.missionState = state; |
|
[weakSelf hiddenDownloadPayView]; |
|
} |
|
} |
|
} |
|
} |
|
break; |
|
case WXYZ_DownloadStateMissionFinished: |
|
{ |
|
[TFPromptManager showPromptViewWithStatus:TFPromptStatusSuccess promptTitle:TFLocalizedString(@"下载完成")]; |
|
// 更新本地目录 |
|
[TFNovelDownloadMenuView updateLocalCatalog:chapterIDArray]; |
|
for (UIView *view in weakSelf.mainTableView.subviews) { |
|
if ([view isKindOfClass:[TFNovelDownloadMenuCell class]]) { |
|
TFNovelDownloadMenuCell *cell = (TFNovelDownloadMenuCell *)view; |
|
cell.optionModel = cell.optionModel; |
|
} |
|
} |
|
} |
|
break; |
|
case WXYZ_DownloadStateMissionShouldPay: |
|
{ |
|
SS(strongSelf) |
|
|
|
[weakSelf hiddenDownloadPayView]; |
|
|
|
TFProductionChapterModel *t_model = [[TFProductionChapterModel alloc] init]; |
|
t_model.production_id = production_id; |
|
t_model.chapter_id = [downloadTaskModel.start_chapter_id integerValue]; |
|
|
|
WXYZ_ChapterBottomPayBar *payBar = [[WXYZ_ChapterBottomPayBar alloc] initWithChapterModel:t_model barType:WXYZ_BottomPayBarTypeDownload productionType:TFProductionTypeNovel buyChapterNum:[[TFUtilsHelper formatStringWithInteger:taskModel.down_num] integerValue]]; |
|
payBar.paySuccessChaptersBlock = ^(NSArray<NSString *> * _Nonnull success_chapter_ids) { |
|
[strongSelf downloadChapterWithTaskModel:taskModel]; |
|
}; |
|
[payBar showBottomPayBar]; |
|
} |
|
break; |
|
default: |
|
break; |
|
} |
|
weakSelf.mainTableView.userInteractionEnabled = YES; |
|
}; |
|
} |
|
|
|
static NSString *_bookID; |
|
- (void)setBook_id:(NSString *)book_id { |
|
_book_id = book_id; |
|
_bookID = book_id; |
|
} |
|
|
|
// 下载成功后请求目录并更新本地目录 |
|
+ (void)updateLocalCatalog:(NSArray<NSNumber *> *)catalogArr { |
|
[TFNetworkTools POST:Book_Catalog parameters:@{@"book_id" : _bookID} model:TFProductionModel.class success:^(BOOL isSuccess, TFProductionModel * _Nullable t_model, TFNetworkRequestModel * _Nonnull requestModel) { |
|
if (isSuccess) { |
|
NSString *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject; |
|
|
|
path = [path stringByAppendingPathComponent:[TFUtilsHelper stringToMD5:@"book_catalog"]]; |
|
if (![[NSFileManager defaultManager] fileExistsAtPath:path]) { |
|
[[NSFileManager defaultManager] createDirectoryAtPath:path withIntermediateDirectories:YES attributes:@{} error:nil]; |
|
} |
|
NSString *catalogName = [NSString stringWithFormat:@"%@_%@", _bookID, @"catalog"]; |
|
NSString *fullPath = [path stringByAppendingFormat:@"/%@.plist", [TFUtilsHelper stringToMD5:catalogName]]; |
|
[requestModel.data writeToFile:fullPath atomically:YES]; |
|
} |
|
} failure:nil]; |
|
} |
|
|
|
@end
|
|
|