// // TFComicDownloadViewController.m // TFReader // // Created by 谢腾飞 on 2020/12/15. // Copyright © 2020 xtfei_2011@126.com. All rights reserved. // #import "TFComicDownloadViewController.h" #import "TFComicDownloadViewCell.h" #import "WXYZ_ChapterBottomPayBar.h" #import "TFComicDownloadModel.h" #import "WXYZ_ComicDownloadManager.h" #import "TFReadRecordManager.h" @interface TFComicDownloadViewController () { UIView *toolBarView; YYLabel *toolBarLeftLabel; UILabel *toolBarRightLabel; UIButton *selectAllButton; } @property (nonatomic, strong) WXYZ_ComicDownloadManager *comicDownloadManager; @property (nonatomic, strong) UIButton *downloadButton; @property (nonatomic, strong) UIActivityIndicatorView *downloadIndicatorView; @property (nonatomic, assign) BOOL payBarShowing; @end @implementation TFComicDownloadViewController - (void)viewDidLoad { [super viewDidLoad]; [self initialize]; [self createSubviews]; [self initDownloadManager]; [self netRequest]; } - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; [self setStatusBarDefaultStyle]; } - (void)initialize { [self setNavigationBarTitle:TFLocalizedString(@"选择章节")]; self.view.backgroundColor = kGrayViewColor; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(netRequest) name:Notification_Login_Success object:nil]; } - (void)createSubviews { CGFloat width = [TFViewHelper getDynamicWidthWithLabelFont:kFont11 labelHeight:30.0 labelText:TFLocalizedString(@"正序") maxWidth:240]; width += kLabelHeight; TFButton *sortButton = [[TFButton alloc] initWithFrame:CGRectMake(SCREEN_WIDTH - kHalfMargin - width, PUB_NAVBAR_HEIGHT - 30 - kQuarterMargin, width, 30) buttonTitle:TFLocalizedString(@"正序") buttonImageName:@"comic_positive_order" buttonIndicator:TFButtonIndicatorImageRightBothRight]; sortButton.selected = NO; sortButton.buttonImageScale = 0.4; sortButton.buttonTitleFont = kFont11; sortButton.graphicDistance = 5; sortButton.buttonTitleColor = kGrayTextColor; [sortButton addTarget:self action:@selector(sortClick:) forControlEvents:UIControlEventTouchUpInside]; [self.navigationBar addSubview:sortButton]; self.mainCollectionViewFlowLayout.minimumLineSpacing = kHalfMargin; self.mainCollectionViewFlowLayout.minimumInteritemSpacing = kHalfMargin; self.mainCollectionViewFlowLayout.itemSize = CGSizeMake((SCREEN_WIDTH - 5 * kHalfMargin) / 4, 40); self.mainCollectionViewFlowLayout.sectionInset = UIEdgeInsetsMake(kHalfMargin, kHalfMargin, kHalfMargin, kHalfMargin); self.mainCollectionView.delegate = self; self.mainCollectionView.dataSource = self; self.mainCollectionView.alwaysBounceVertical = YES; [self.mainCollectionView registerClass:[TFComicDownloadViewCell class] forCellWithReuseIdentifier:@"TFComicDownloadViewCell"]; [self.view addSubview:self.mainCollectionView]; [self.mainCollectionView mas_makeConstraints:^(MASConstraintMaker *make) { make.left.mas_equalTo(0); make.top.mas_equalTo(PUB_NAVBAR_HEIGHT); make.width.mas_equalTo(self.view.mas_width); make.height.mas_equalTo(self.view.mas_height).with.offset(- PUB_NAVBAR_HEIGHT - PUB_TABBAR_HEIGHT - 20); }]; toolBarView = [[UIView alloc] init]; toolBarView.backgroundColor = kWhiteColor; [self.view addSubview:toolBarView]; [toolBarView mas_makeConstraints:^(MASConstraintMaker *make) { make.left.mas_equalTo(0); make.bottom.mas_equalTo(self.view.mas_bottom); make.width.mas_equalTo(self.view.mas_width); make.height.mas_equalTo(PUB_TABBAR_HEIGHT + 20); }]; toolBarLeftLabel = [[YYLabel alloc] init]; toolBarLeftLabel.textColor = kGrayTextColor; toolBarLeftLabel.textContainerInset = UIEdgeInsetsMake(3, kHalfMargin, 0, 0); toolBarLeftLabel.textAlignment = NSTextAlignmentLeft; toolBarLeftLabel.font = kFont10; toolBarLeftLabel.backgroundColor = kGrayDeepViewColor; [toolBarView addSubview:toolBarLeftLabel]; [toolBarLeftLabel mas_makeConstraints:^(MASConstraintMaker *make) { make.left.mas_equalTo(0); make.top.mas_equalTo(0); make.width.mas_equalTo(toolBarView.mas_width); make.height.mas_equalTo(20); }]; toolBarRightLabel = [[UILabel alloc] init]; toolBarRightLabel.text = TFLocalizedString(@"已选0话"); toolBarRightLabel.textColor = kGrayTextColor; toolBarRightLabel.textAlignment = NSTextAlignmentRight; toolBarRightLabel.font = kFont10; toolBarRightLabel.backgroundColor = [UIColor clearColor]; toolBarRightLabel.hidden = YES; [toolBarView addSubview:toolBarRightLabel]; [toolBarRightLabel mas_makeConstraints:^(MASConstraintMaker *make) { make.right.mas_equalTo(toolBarView.mas_right).with.offset(- kHalfMargin); make.top.mas_equalTo(0); make.width.mas_equalTo(toolBarView.mas_width).with.multipliedBy(0.5); make.height.mas_equalTo(20); }]; selectAllButton = [UIButton buttonWithType:UIButtonTypeCustom]; [selectAllButton setTitle:TFLocalizedString(@"全选") forState:UIControlStateNormal]; [selectAllButton setTitleColor:kBlackColor forState:UIControlStateNormal]; [selectAllButton.titleLabel setFont:kMainFont]; [selectAllButton addTarget:self action:@selector(checkallClick:) forControlEvents:UIControlEventTouchUpInside]; [toolBarView addSubview:selectAllButton]; [selectAllButton mas_makeConstraints:^(MASConstraintMaker *make) { make.left.mas_equalTo(toolBarView.mas_left); make.top.mas_equalTo(toolBarRightLabel.mas_bottom); make.width.mas_equalTo(SCREEN_WIDTH / 2); make.height.mas_equalTo(PUB_TABBAR_HEIGHT - PUB_TABBAR_OFFSET); }]; self.downloadButton = [UIButton buttonWithType:UIButtonTypeCustom]; self.downloadButton.enabled = NO; [self.downloadButton setTitle:TFLocalizedString(@"下载") forState:UIControlStateNormal]; [self.downloadButton setTitleColor:kGrayTextLightColor forState:UIControlStateNormal]; [self.downloadButton.titleLabel setFont:kMainFont]; [self.downloadButton addTarget:self action:@selector(downloadClick) forControlEvents:UIControlEventTouchUpInside]; [toolBarView addSubview:self.downloadButton]; [self.downloadButton mas_makeConstraints:^(MASConstraintMaker *make) { make.left.mas_equalTo(selectAllButton.mas_right); make.top.mas_equalTo(toolBarRightLabel.mas_bottom); make.right.mas_equalTo(toolBarView.mas_right); make.height.mas_equalTo(PUB_TABBAR_HEIGHT - PUB_TABBAR_OFFSET); }]; self.downloadIndicatorView = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:(UIActivityIndicatorViewStyleGray)]; self.downloadIndicatorView.hidesWhenStopped = YES; [toolBarView addSubview:self.downloadIndicatorView]; [self.downloadIndicatorView mas_makeConstraints:^(MASConstraintMaker *make) { make.centerX.mas_equalTo(self.downloadButton.mas_centerX); make.centerY.mas_equalTo(self.downloadButton.mas_centerY); make.width.height.mas_equalTo(self.downloadButton.mas_height); }]; } - (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section { return self.dataSourceArray.count; } - (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { TFProductionChapterModel *chapterModel = [self.dataSourceArray objectOrNilAtIndex:indexPath.row]; static NSString *cellIdentifier = @"TFComicDownloadViewCell"; TFComicDownloadViewCell __weak *cell = [collectionView dequeueReusableCellWithReuseIdentifier:cellIdentifier forIndexPath:indexPath]; cell.chapterModel = chapterModel; cell.cellDownloadState = [[self.selectSourceDictionary objectForKey:[TFUtilsHelper formatStringWithInteger:chapterModel.chapter_id]] integerValue]; return cell; } - (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath { TFProductionChapterModel *chapterModel = [self.dataSourceArray objectOrNilAtIndex:indexPath.row]; TFComicDownloadViewCell *cell = (TFComicDownloadViewCell *)[collectionView cellForItemAtIndexPath:indexPath]; switch (cell.cellDownloadState) { case WXYZ_ProductionDownloadStateNormal: case WXYZ_ProductionDownloadStateFail: [self setCollectionCellDownloadStateWithChapter_id:chapterModel.chapter_id downloadState:WXYZ_ProductionDownloadStateSelected]; [self reloadToolBar]; break; case WXYZ_ProductionDownloadStateSelected: [self setCollectionCellDownloadStateWithChapter_id:chapterModel.chapter_id downloadState:WXYZ_ProductionDownloadStateNormal]; [self reloadToolBar]; break; default: break; } } #pragma mark - 点击事件 - (void)sortClick:(TFButton *)sender { if (sender.selected) { sender.buttonImageName = @"comic_positive_order"; sender.buttonTitle = TFLocalizedString(@"正序"); } else { sender.buttonImageName = @"comic_reverse_order"; sender.buttonTitle = TFLocalizedString(@"倒序"); } sender.selected = !sender.selected; self.dataSourceArray = [[[self.dataSourceArray reverseObjectEnumerator] allObjects] mutableCopy]; [self.mainCollectionView reloadData]; } - (void)checkallClick:(UIButton *)sender { for (NSString *t_chapter_id in self.selectSourceDictionary.allKeys) { if (!sender.selected) { // 全选状态 if ([[self.selectSourceDictionary objectForKey:t_chapter_id] integerValue] == WXYZ_ProductionDownloadStateNormal || [[self.selectSourceDictionary objectForKey:t_chapter_id] integerValue] == WXYZ_ProductionDownloadStateFail) { [self setCollectionCellDownloadStateWithChapter_id:[t_chapter_id integerValue] downloadState:WXYZ_ProductionDownloadStateSelected]; } } else { if ([[self.selectSourceDictionary objectForKey:t_chapter_id] integerValue] == WXYZ_ProductionDownloadStateSelected) { [self setCollectionCellDownloadStateWithChapter_id:[t_chapter_id integerValue] downloadState:WXYZ_ProductionDownloadStateNormal]; } } } sender.selected = !sender.selected; [self reloadToolBar]; } - (void)initDownloadManager { WS(weakSelf) self.comicDownloadManager = [WXYZ_ComicDownloadManager sharedManager]; self.comicDownloadManager.downloadChapterStateChangeBlock = ^(WXYZ_DownloadChapterState state, NSInteger production_id, NSInteger chapter_id) { dispatch_async(dispatch_get_main_queue(), ^{ switch (state) { case WXYZ_DownloadStateChapterDownloadFinished: // 章节下载完成 { [weakSelf setCollectionCellDownloadStateWithChapter_id:chapter_id downloadState:WXYZ_ProductionDownloadStateDownloaded]; } break; case WXYZ_DownloadStateChapterDownloadFail: // 下载失败 { [weakSelf setCollectionCellDownloadStateWithChapter_id:chapter_id downloadState:WXYZ_ProductionDownloadStateFail]; } break; case WXYZ_DownloadStateChapterDownloadStart: // 开始下载 { [weakSelf setCollectionCellDownloadStateWithChapter_id:chapter_id downloadState:WXYZ_ProductionDownloadStateDownloading]; } break; default: break; } [weakSelf reloadToolBar]; }); }; self.comicDownloadManager.downloadMissionStateChangeBlock = ^(WXYZ_DownloadMissionState state, NSInteger production_id, NSArray * _Nonnull chapter_ids) { switch (state) { // 任务开始 case WXYZ_DownloadStateMissionStart: { [weakSelf.downloadIndicatorView stopAnimating]; weakSelf.downloadButton.hidden = NO; for (NSString *t_chapter_id in chapter_ids) { [weakSelf setCollectionCellDownloadStateWithChapter_id:[t_chapter_id integerValue] downloadState:WXYZ_ProductionDownloadStateDownloading]; } } break; // 任务失败 case WXYZ_DownloadStateMissionFail: { [weakSelf.downloadIndicatorView stopAnimating]; weakSelf.downloadButton.hidden = NO; for (NSString *t_chapter_id in chapter_ids) { [weakSelf setCollectionCellDownloadStateWithChapter_id:[t_chapter_id integerValue] downloadState:WXYZ_ProductionDownloadStateFail]; } } break; // 需要支付 case WXYZ_DownloadStateMissionShouldPay: { [weakSelf.downloadIndicatorView stopAnimating]; weakSelf.downloadButton.hidden = NO; if (!weakSelf.payBarShowing) { weakSelf.payBarShowing = YES; TFProductionChapterModel *chapterModel = [[TFProductionChapterModel alloc] init]; chapterModel.production_id = production_id; chapterModel.chapter_ids = chapter_ids; WXYZ_ChapterBottomPayBar *payBar = [[WXYZ_ChapterBottomPayBar alloc] initWithChapterModel:chapterModel barType:WXYZ_BottomPayBarTypeDownload productionType:TFProductionTypeComic]; payBar.paySuccessChaptersBlock = ^(NSArray * _Nonnull success_chapter_ids) { [weakSelf downloadClick]; }; payBar.payFailChaptersBlock = ^(NSArray * _Nonnull fail_chapter_ids) { for (NSString *t_chapter_id in fail_chapter_ids) { [weakSelf setCollectionCellDownloadStateWithChapter_id:[t_chapter_id integerValue] downloadState:WXYZ_ProductionDownloadStateNormal]; } [weakSelf reloadToolBar]; [TFPromptManager showPromptViewWithStatus:TFPromptStatusError promptTitle:TFLocalizedString(@"购买失败")]; }; payBar.payCancleChapterBlock = ^(NSArray * _Nonnull fail_chapter_ids) { for (NSString *t_chapter_id in fail_chapter_ids) { [weakSelf setCollectionCellDownloadStateWithChapter_id:[t_chapter_id integerValue] downloadState:WXYZ_ProductionDownloadStateNormal]; } [weakSelf reloadToolBar]; }; SS(strongSelf) payBar.bottomPayBarHiddenBlock = ^{ strongSelf.payBarShowing = NO; }; [payBar showBottomPayBar]; } } break; case WXYZ_DownloadStateMissionFinished: [TFPromptManager showPromptViewWithStatus:TFPromptStatusSuccess promptTitle:TFLocalizedString(@"下载完成")]; break; default: break; } weakSelf.downloadButton.userInteractionEnabled = YES; }; } - (void)downloadClick { self.downloadButton.userInteractionEnabled = NO; NSMutableArray *chapter_ids = [NSMutableArray array]; for (NSString *t_chapter_id in self.selectSourceDictionary.allKeys) { if ([[self.selectSourceDictionary objectForKey:t_chapter_id] integerValue] == WXYZ_ProductionDownloadStateSelected) { [chapter_ids addObject:t_chapter_id]; } } [self.downloadIndicatorView startAnimating]; self.downloadButton.hidden = YES; [self reloadToolBar]; [self.comicDownloadManager downloadChaptersWithProductionModel:self.comicModel production_id:self.comicModel.production_id chapter_ids:chapter_ids]; } - (void)reloadToolBar { NSInteger normalIndex = 0; NSInteger selectIndex = 0; NSInteger downloadedIndex = 0; for (NSString *t_key in self.selectSourceDictionary) { switch ([[self.selectSourceDictionary objectForKey:t_key] integerValue]) { case WXYZ_ProductionDownloadStateNormal: normalIndex ++; break; case WXYZ_ProductionDownloadStateDownloaded: downloadedIndex ++; break; case WXYZ_ProductionDownloadStateSelected: selectIndex ++; break; default: break; } } toolBarRightLabel.text = [NSString stringWithFormat:TFLocalizedString(@"已选%@话"), [TFUtilsHelper formatStringWithInteger:selectIndex]]; toolBarRightLabel.hidden = (selectIndex == 0); if (downloadedIndex == self.dataSourceArray.count) { toolBarRightLabel.text = @""; selectAllButton.enabled = NO; selectAllButton.selected = NO; [selectAllButton setTitle:TFLocalizedString(@"已全部下载") forState:UIControlStateNormal]; [selectAllButton setTitleColor:kGrayTextLightColor forState:UIControlStateNormal]; [selectAllButton mas_updateConstraints:^(MASConstraintMaker *make) { make.width.mas_equalTo(SCREEN_WIDTH); }]; return; } self.downloadButton.enabled = NO; [self.downloadButton setTitleColor:kGrayTextLightColor forState:UIControlStateNormal]; selectAllButton.enabled = YES; selectAllButton.selected = NO; [selectAllButton setTitle:TFLocalizedString(@"全选") forState:UIControlStateNormal]; [selectAllButton mas_updateConstraints:^(MASConstraintMaker *make) { make.width.mas_equalTo(SCREEN_WIDTH / 2); }]; if (selectIndex > 0 && normalIndex == 0) { // 有选中的文件并且没有未选中的文件 self.downloadButton.enabled = YES; [self.downloadButton setTitleColor:kBlackColor forState:UIControlStateNormal]; selectAllButton.selected = YES; [selectAllButton setTitle:TFLocalizedString(@"取消全选") forState:UIControlStateNormal]; [selectAllButton setTitleColor:kBlackColor forState:UIControlStateNormal]; } else if (normalIndex > 0 && selectIndex > 0) { // 有未选中的文件 self.downloadButton.enabled = YES; [self.downloadButton setTitleColor:kBlackColor forState:UIControlStateNormal]; } } - (void)setCollectionCellDownloadStateWithChapter_id:(NSInteger)chapter_id downloadState:(WXYZ_ProductionDownloadState)downloadState { TFComicDownloadViewCell *cell = (TFComicDownloadViewCell *)[self.mainCollectionView cellForItemAtIndexPath:(NSIndexPath *)[self.cellIndexDictionary objectForKey:[TFUtilsHelper formatStringWithInteger:chapter_id]]]; cell.cellDownloadState = downloadState; [self.selectSourceDictionary setObject:[TFUtilsHelper formatStringWithInteger:downloadState] forKey:[TFUtilsHelper formatStringWithInteger:chapter_id]]; } - (void)netRequest { WS(weakSelf) [TFNetworkTools POSTQuick:Comic_DownloadOption parameters:@{@"comic_id":[TFUtilsHelper formatStringWithInteger:self.comicModel.production_id]} model:TFComicDownloadModel.class success:^(BOOL isSuccess, TFComicDownloadModel *_Nullable t_model, BOOL isCache, TFNetworkRequestModel *requestModel) { if (isSuccess) { toolBarLeftLabel.text = t_model.display_label?:@""; if (t_model.down_list.count > 0) { weakSelf.dataSourceArray = [NSMutableArray arrayWithArray:t_model.down_list]; [weakSelf resetSelectSourceDicWithDataSourceArray:t_model.down_list productionType:TFProductionTypeComic]; } } else { [TFPromptManager showPromptViewWithStatus:TFPromptStatusError promptTitle:requestModel.msg]; } [weakSelf.mainCollectionView reloadData]; [weakSelf reloadToolBar]; } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { [weakSelf.mainCollectionView reloadData]; }]; } @end