PageRenderTime 48ms CodeModel.GetById 19ms RepoModel.GetById 1ms app.codeStats 0ms

/WHAMBUSH/wbVideoFeedTableView.m

https://gitlab.com/urbanjunglestudio/whambush-ios
Objective C | 396 lines | 271 code | 66 blank | 59 comment | 65 complexity | fdb5cfd9af005fc5a902dac505f44ff7 MD5 | raw file
  1. //
  2. // wbVideoFeedTableView.m
  3. // WHAMBUSH
  4. //
  5. // Created by Jari Kalinainen on 31/12/14.
  6. // Copyright (c) 2014 Jari Kalinainen. All rights reserved.
  7. //
  8. #import "wbVideoFeedTableView.h"
  9. @implementation wbVideoFeedTableView
  10. //@synthesize currentFeed;
  11. @synthesize isTv;
  12. //@synthesize hideHeader;
  13. @synthesize currentSelection;
  14. - (id)initWithFrame:(CGRect)frame
  15. {
  16. self = [super initWithFrame:frame];
  17. if (self) {
  18. [self setDelegate:self];
  19. [self setDataSource:self];
  20. [self setSeparatorStyle:UITableViewCellSeparatorStyleSingleLine];
  21. [self setSeparatorColor:kSEPRATORUICOLOR];
  22. [self setSeparatorInset:UIEdgeInsetsZero];
  23. [self setBackgroundColor:kBKGUICOLOR];
  24. //[self setCanCancelContentTouches:NO];
  25. [self setHidden:NO];
  26. //refresh = NO;
  27. // UIRefreshControl *refreshControler = [[UIRefreshControl alloc] initWithFrame:CGRectMake(0, 0, 0, 0)];
  28. // [refreshControler addTarget:self action:@selector(refresh:) forControlEvents:UIControlEventValueChanged];
  29. // [self addSubview:refreshControler];
  30. //gettingMoreResults = NO;
  31. isTv = NO;
  32. //hideHeader = NO;
  33. //deltaY = 0;
  34. //prevContentOffset = 0;
  35. //currentFeed = super.currentFeed;
  36. currentSelection = nil;
  37. }
  38. DPRINTCLASS;
  39. return self;
  40. }
  41. //-(NSDictionary*)currentFeed
  42. //{
  43. // return super.currentFeed;
  44. //}
  45. //-(void)setCurrentFeed:(NSDictionary *)_currentFeed
  46. //{
  47. // currentFeedType = [_currentFeed objectForKey:@"type"];
  48. // currentFeed = _currentFeed;
  49. // super.endpoint = [_currentFeed objectForKey:@"endpoint"];
  50. // refresh = NO;
  51. // [self setGAIViewName];
  52. //}
  53. -(void)setGAIViewName
  54. {
  55. // Google analytics
  56. NSString *gaString;
  57. if ([self currentFeed] != nil) {
  58. if ([[[self currentFeed] objectForKey:@"type"] isEqualToString:@"user"]) {
  59. gaString = [NSString stringWithFormat:@"UserFeed:user=%@",[[self currentFeed] objectForKey:@"userId"]];
  60. } else if ([[[self currentFeed] objectForKey:@"type"] isEqualToString:@"search"]) {
  61. gaString = [NSString stringWithFormat:@"SearchFeed:feed=%@",[[self currentFeed] objectForKey:@"name"]];
  62. } else if ([[[self currentFeed] objectForKey:@"type"] isEqualToString:@"mission"]) {
  63. gaString = [NSString stringWithFormat:@"MissionFeed:feed=%@",[[self currentFeed] objectForKey:@"missionId"]];
  64. } else {
  65. gaString = [NSString stringWithFormat:@"Main:feed=%@",[[self currentFeed] objectForKey:@"name"]];
  66. }
  67. [[wbAPI sharedAPI] registerGoogleAnalytics:gaString];
  68. }
  69. //DMSG;
  70. }
  71. -(void)forceRefresh
  72. {
  73. [ai setHidden:NO];
  74. [[self tableFooterView] setHidden:NO];
  75. [self refresh:nil];
  76. }
  77. -(void)afterDelete
  78. {
  79. dataArray = nil;
  80. [self setNeedsDisplay];
  81. }
  82. - (void)drawRect:(CGRect)rect
  83. {
  84. if (refreshController == nil) {
  85. refreshController = [[UIRefreshControl alloc] initWithFrame:CGRectMake(0, 0, 0, 0)];
  86. [refreshController addTarget:self action:@selector(refresh:) forControlEvents:UIControlEventValueChanged];
  87. [refreshController setBackgroundColor:[UIColor colorWithPatternImage:[UIImage ch_imageNamed:@"refresh_bg_image"]]];
  88. [self addSubview:refreshController];
  89. }
  90. if (isTv) {
  91. super.hideHeader = YES;
  92. }
  93. UIView *tableFooter =[[UIView alloc] initWithFrame:CGRectMake(0, 0, self.frame.size.width, 100)];
  94. [tableFooter setBackgroundColor:kBKGUICOLOR];
  95. if (/*super.hideHeader*/ai == nil) {
  96. ai = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhite];
  97. [ai startAnimating];
  98. [ai setHidesWhenStopped:NO];
  99. [ai setCenter:CGPointMake(self.frame.size.width/2,kFOLLOWLINEH/2)];
  100. [tableFooter addSubview:ai];
  101. }
  102. //tableHeader =[[UIView alloc] initWithFrame:CGRectMake(0, 0, self.frame.size.width, kTXTBOXH)];
  103. //[tableHeader setBackgroundColor:kBKGUICOLOR];
  104. if (noVideos == nil) {
  105. noVideos = [wbButton buttonWithType:UIButtonTypeSystem];
  106. }
  107. if ([[wbAPI sharedAPI] is_guest]) {
  108. [noVideos setTitle:[NSLocalizedString(@"MAIN_NO_VIDEOS_IN_FEED_GUEST", @"") uppercaseString] forState:UIControlStateNormal];
  109. } else {
  110. [noVideos setTitle:[NSLocalizedString(@"MAIN_NO_VIDEOS_IN_FEED", @"") uppercaseString] forState:UIControlStateNormal];
  111. [noVideos setEnabled:NO];
  112. }
  113. [[noVideos titleLabel] setNumberOfLines:2];
  114. [[noVideos titleLabel] setTextAlignment:NSTextAlignmentCenter];
  115. [[noVideos titleLabel] setFont:kFONTLeague(20)];
  116. [noVideos setTitleColor:kBOTTOMUICOLOR forState:UIControlStateNormal];
  117. [noVideos setBackgroundColor:kTRANSPARENTUICOLOR];
  118. [noVideos addTarget:self action:@selector(showAskToLoginRegisterOnView) forControlEvents:UIControlEventTouchUpInside];
  119. [noVideos sizeToFit];
  120. [noVideos setCenter:tableFooter.center];
  121. [noVideos setHidden:YES];
  122. [tableFooter addSubview:noVideos];
  123. //[tableFooter setHidden:YES];
  124. if (isTv) {
  125. [[wbHeader sharedHeader] setLogo:@"_tv_"];
  126. UIImageView *tvHeader = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, self.frame.size.width,kTVCELLH)];
  127. //NSLog(@"%@",super.currentFeed);
  128. [tvHeader setImageWithURL:[NSURL URLWithString:[[self currentFeed] objectForKey:@"picture_url"]] placeholderImage:[UIImage ch_imageNamed:@"placeholder_banner"]];
  129. if (tvHeaderLabel == nil) {
  130. tvHeaderLabel = [[UILabel alloc] init];
  131. }
  132. // [tvHeaderLabel setFont:kFONT(30)];
  133. // [tvHeaderLabel setText:[[tvHeaderLabel text] uppercaseString]];
  134. // [tvHeaderLabel setBackgroundColor:kTRANSPARENTUICOLOR];
  135. // [tvHeaderLabel sizeToFit];
  136. // [tvHeaderLabel setFrame:CGRectMake(10, tvHeader.frame.size.height-textLabel.frame.size.height, textLabel.frame.size.width, textLabel.frame.size.height)];
  137. [tvHeader addSubview:tvHeaderLabel];
  138. [self setTableHeaderView:tvHeader];
  139. }
  140. if(dataArray == nil) {
  141. if ([self currentFeed] != nil) {
  142. if ([currentFeedType isEqualToString:@"user"] || [currentFeedType isEqualToString:@"mission"] || [currentFeedType isEqualToString:@"tv"]) {
  143. [[wbAPI sharedAPI] getDataWithEndpoint:[[self currentFeed] objectForKey:@"endpoint"] delegate:self];
  144. if ([currentFeedType isEqualToString:@"user"]) {
  145. wbUser *_user = [[wbData sharedData] getWhambushUser:[[self currentFeed] objectForKey:@"userUrl"]];
  146. [[wbHeader sharedHeader] setLogo:[_user username]];
  147. }
  148. } else {
  149. [[wbData sharedData] getFeedData:[[self currentFeed] objectForKey:@"name"] delegate:self];
  150. }
  151. [[wbData sharedData] getFeedData:[[self currentFeed] objectForKey:@"name"] delegate:self];
  152. } else {
  153. [[wbData sharedData] getFeedData:@"default" delegate:self];
  154. }
  155. }
  156. [self setTableFooterView:tableFooter];
  157. }
  158. -(void)executeRefresh
  159. {
  160. deltaY = 0;
  161. if ([[[self currentFeed] objectForKey:@"type"] isEqualToString:@"normal"]) {
  162. [[wbData sharedData] refreshFeedData:[[self currentFeed] objectForKey:@"name"] delegate:self];
  163. } else {
  164. [self setCurrentFeed:[self currentFeed]];
  165. [[wbAPI sharedAPI] getDataWithEndpoint:[[self currentFeed] objectForKey:@"endpoint"] delegate:self];
  166. }
  167. }
  168. -(void)resultsReady
  169. {
  170. if (isTv) {
  171. NSMutableAttributedString *name = [[NSMutableAttributedString alloc] initWithString:[[[self currentFeed] objectForKey:@"name"] uppercaseString]];
  172. [name addAttribute:NSForegroundColorAttributeName value:kWHITEUICOLOR range:(NSRange){0,[name length]}];
  173. [name addAttribute:NSFontAttributeName value:kFONT(20) range:NSMakeRange(0, [name length])];
  174. NSMutableAttributedString *separator = [[NSMutableAttributedString alloc] initWithString:[NSLocalizedString(@"MAIN_TV_EPISODE_SEPARATOR", @"") uppercaseString]];
  175. [separator addAttribute:NSForegroundColorAttributeName value:kWHITEUICOLOR range:(NSRange){0,[separator length]}];
  176. [separator addAttribute:NSFontAttributeName value:kFONT(20) range:NSMakeRange(0, [separator length])];
  177. NSMutableAttributedString *count = [[NSMutableAttributedString alloc] initWithString:[[[dataArray valueForKey:@"count"] stringValue] uppercaseString]];
  178. [count addAttribute:NSForegroundColorAttributeName value:kGREENUICOLOR range:(NSRange){0,[count length]}];
  179. [count addAttribute:NSFontAttributeName value:kFONT(20) range:NSMakeRange(0, [count length])];
  180. NSMutableAttributedString *episodes = [[NSMutableAttributedString alloc] initWithString:[NSLocalizedString(@"MAIN_TV_EPISODE_STRING", @"") uppercaseString]];
  181. [episodes addAttribute:NSForegroundColorAttributeName value:kGREENUICOLOR range:(NSRange){0,[episodes length]}];
  182. [episodes addAttribute:NSFontAttributeName value:kFONT(20) range:NSMakeRange(0, [episodes length])];
  183. NSMutableAttributedString *space = [[NSMutableAttributedString alloc] initWithString:@" "];
  184. [space addAttribute:NSForegroundColorAttributeName value:kGREENUICOLOR range:(NSRange){0,[space length]}];
  185. [space addAttribute:NSFontAttributeName value:kFONT(20) range:NSMakeRange(0, [space length])];
  186. NSMutableAttributedString *text = [[NSMutableAttributedString alloc] init];
  187. [text appendAttributedString:name];
  188. [text appendAttributedString:space];
  189. [text appendAttributedString:separator];
  190. [text appendAttributedString:space];
  191. [text appendAttributedString:count];
  192. [text appendAttributedString:space];
  193. [text appendAttributedString:episodes];
  194. [tvHeaderLabel setAttributedText:text];
  195. // [tvHeaderLabel setText:[ NSString stringWithFormat:@"%@ %@ %@ %@",
  196. // [[self currentFeed] objectForKey:@"name"],
  197. // NSLocalizedString(@"MAIN_TV_EPISODE_SEPARATOR", @""),
  198. // [dataArray objectForKey:@"count"],
  199. // NSLocalizedString(@"MAIN_TV_EPISODE_STRING", @"")
  200. // ]];
  201. //[tvHeaderLabel setFont:kFONT(30)];
  202. //[tvHeaderLabel setTextColor:kWHITEUICOLOR];
  203. //[tvHeaderLabel setText:[[tvHeaderLabel text] uppercaseString]];
  204. [tvHeaderLabel setBackgroundColor:kTRANSPARENTUICOLOR];
  205. [tvHeaderLabel sizeToFit];
  206. [tvHeaderLabel setFrame:CGRectMake(10, [self tableHeaderView].frame.size.height-(tvHeaderLabel.frame.size.height+10), tvHeaderLabel.frame.size.width, tvHeaderLabel.frame.size.height)];
  207. }
  208. DCMSG([[wbData sharedData] feeds]);
  209. [super setAllFeeds:[[wbData sharedData] feeds]];
  210. [super setShowFeedSelectSearch:YES];
  211. DMSG;
  212. if ([[wbAPI sharedAPI] is_guest] && ([[[self currentFeed] objectForKey:@"name"] isEqualToString:@"MAIN_FEED_MY_VIDEOS"] || [[[self currentFeed] objectForKey:@"name"] isEqualToString:@"MAIN_FEED_FOLLOW"])) {
  213. totalNumberOfResults = 0;
  214. numberOfResults = 0;
  215. }
  216. NSMutableArray *newRows = [[NSMutableArray alloc] init];
  217. for (long i = [self numberOfRowsInSection:0]; i < numberOfResults; i++) {
  218. NSIndexPath *newReloadRows = [NSIndexPath indexPathForRow:i inSection:0];
  219. [newRows addObject:newReloadRows];
  220. newReloadRows = nil;
  221. }
  222. [self beginUpdates];
  223. [self insertRowsAtIndexPaths:newRows withRowAnimation:UITableViewRowAnimationFade];
  224. [self endUpdates];
  225. [self setHidden:NO];
  226. [self setSeparatorStyle:UITableViewCellSeparatorStyleSingleLine];
  227. if (totalNumberOfResults == 0 && !([currentFeedType isEqualToString:@"user"] || [currentFeedType isEqualToString:@"search"])) {
  228. [noVideos setHidden:NO];
  229. } else {
  230. [noVideos setHidden:YES];
  231. }
  232. [self setGAIViewName];
  233. DMSG;
  234. kHIDEWAIT;
  235. DCMSG([self tableFooterView]);
  236. [ai setHidden:YES];
  237. [[self tableFooterView] setHidden:NO];
  238. }
  239. // table methods
  240. -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
  241. {
  242. if (resultArray != nil) {
  243. return numberOfResults;
  244. } else {
  245. return 0;
  246. }
  247. }
  248. -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
  249. {
  250. wbBaseCell *cell;// = [tableView dequeueReusableCellWithIdentifier:identifier];
  251. if (cell == nil){
  252. cell = [[wbBaseCell alloc] init];//WithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier];
  253. }
  254. [cell setBackgroundColor:kTRANSPARENTUICOLOR];
  255. if ([resultArray count]-8 == [indexPath row] || [resultArray count] == [indexPath row]) {
  256. if (numberOfResults < totalNumberOfResults) {
  257. DMSG;
  258. [ai setHidden:NO];
  259. [self performSelectorInBackground:@selector(getMoreResults) withObject:nil];
  260. }
  261. }
  262. if ([resultArray count] > ([indexPath row])){
  263. //[ai removeFromSuperview];
  264. wbVideoCell *ccell;
  265. //NSNumber *videoid = [[resultArray objectAtIndex:([indexPath row])] objectForKey:@"id"];
  266. //if ([[[wbData sharedData] videoCells] objectForKey:videoid] == nil) {
  267. ccell = [[wbVideoCell alloc] initWithFrame:CGRectMake(0, 0, self.frame.size.width, 96)];
  268. // [[[wbData sharedData] videoCells] setObject:ccell forKey:videoid];
  269. if ([[[resultArray objectAtIndex:([indexPath row])] objectForKey:@"video_type"] integerValue] == 2 && ![[[self currentFeed] objectForKey:@"name" ] isEqualToString:@"WhambushTV"]) {
  270. [ccell setIsTV:YES];
  271. }
  272. [ccell setCellContent:[resultArray objectAtIndex:([indexPath row])]];
  273. //} else {
  274. // ccell = [[[wbData sharedData] videoCells] objectForKey:videoid];
  275. //}
  276. [cell addSubview:ccell];
  277. [cell bringSubviewToFront:ccell];
  278. [cell setSelectionStyle:UITableViewCellSelectionStyleGray];
  279. [cell setClipsToBounds:YES];
  280. if ([currentFeedType isEqualToString:@"mission"]) {
  281. if ([[[self currentFeed] objectForKey:@"is_ranked"] boolValue]) {
  282. [ccell setRankNumber:[indexPath row]+1];
  283. }
  284. }
  285. }
  286. return cell;
  287. }
  288. - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
  289. {
  290. currentSelection = indexPath;
  291. [[wbData sharedData] setSingleVideoData:[resultArray objectAtIndex:[indexPath row]]];
  292. NSBlockOperation *op = [NSBlockOperation blockOperationWithBlock:^(void){
  293. [[wbWaitView sharedWait] performSelectorOnMainThread:@selector(show) withObject:NULL waitUntilDone:YES];
  294. }];
  295. [op setCompletionBlock:^(void){
  296. [kROOTVC performSelectorOnMainThread:@selector(startSingleVideo:) withObject:self waitUntilDone:NO];
  297. }];
  298. [op start];
  299. DMSG;
  300. [self deselectRowAtIndexPath:indexPath animated:NO];
  301. }
  302. - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
  303. float height;
  304. if (numberOfResults > [indexPath row]) {
  305. height = 96;
  306. if ([indexPath row] < numberOfResults) {
  307. if ([[[resultArray objectAtIndex:[indexPath row]] valueForKey:@"deleted"] boolValue]) {
  308. height = 0;
  309. }
  310. }
  311. } else {
  312. height = 0;
  313. }
  314. return height;
  315. }
  316. -(void)refreshRow
  317. {
  318. DCMSG([self subviews]);
  319. if (currentSelection != nil) {
  320. [self beginUpdates];
  321. [self reloadRowsAtIndexPaths:[NSArray arrayWithObject:currentSelection] withRowAnimation:UITableViewRowAnimationFade];
  322. [self endUpdates];
  323. currentSelection = nil;
  324. }
  325. DCMSG([self subviews]);
  326. [self bringSubviewToFront:feedSelect];
  327. [self bringSubviewToFront:feedSelectButton];
  328. DCMSG([self subviews]);
  329. }
  330. @end