forked from lint/TFDidThatSay
		
	Move Apollo button to action menu
This commit is contained in:
		| @ -2,36 +2,42 @@ | ||||
| /* -- Comment Interfaces -- */ | ||||
|  | ||||
| @interface RKComment | ||||
| @property(assign,nonatomic) NSString* body; | ||||
| @property(assign,nonatomic) NSString* bodyHTML; | ||||
| @property(assign,nonatomic) NSString* author; | ||||
| @property(assign,nonatomic) NSString* fullName; | ||||
| @property(assign,nonatomic) NSString *body; | ||||
| @property(assign,nonatomic) NSString *bodyHTML; | ||||
| @property(assign,nonatomic) NSString *author; | ||||
| @property(assign,nonatomic) NSString *fullName; | ||||
| @end | ||||
|  | ||||
| @interface ApolloCommentCellNode | ||||
| @interface CommentCellNode | ||||
| @property(assign,nonatomic)id view; | ||||
| -(BOOL) isSelected; | ||||
| -(void) _layoutSublayouts; | ||||
| -(void) didLoad; | ||||
| -(void) calculatedLayoutDidChange; | ||||
|  | ||||
| //custom element | ||||
| @property(strong,nonatomic) id undeleteButton; | ||||
|  | ||||
| //custom elements | ||||
| -(void) undeleteCellWasSelected; | ||||
| @end | ||||
|  | ||||
| /* -- Post Interfaces -- */ | ||||
|  | ||||
| @interface RKLink | ||||
| @property(assign,nonatomic) NSString* selfText; | ||||
| @property(assign,nonatomic) NSString* author; | ||||
| @property(assign,nonatomic) NSString* fullName; | ||||
|  | ||||
| @property(assign,nonatomic) NSString *selfText; | ||||
| @property(assign,nonatomic) NSString *author; | ||||
| @property(assign,nonatomic) NSString *fullName; | ||||
| -(BOOL) isSelfPost; | ||||
| @end | ||||
|  | ||||
| @interface ApolloCommentsHeaderCellNode | ||||
| @interface CommentsHeaderCellNode | ||||
| @property(strong, nonatomic) id undeleteButton; | ||||
| @property(strong, nonatomic) id closestViewController; | ||||
| @end | ||||
|  | ||||
| @interface CommentsViewController | ||||
|  | ||||
| //custom elements | ||||
| @property(strong, nonatomic) id headerCellNode; | ||||
| -(void) undeleteCellWasSelected; | ||||
| @end | ||||
|  | ||||
| /* -- Other Interfaces -- */ | ||||
| @ -40,6 +46,14 @@ | ||||
| +(id) attributedStringFromMarkdown:(id) arg1 withAttributes:(id) arg2; | ||||
| @end | ||||
|  | ||||
| @interface ActionController | ||||
| -(id) tableView:(id) arg1 cellForRowAtIndexPath:(NSIndexPath *)arg2; | ||||
| -(NSInteger) tableView:(id) arg1 numberOfRowsInSection:(NSInteger) arg2; | ||||
| @end | ||||
|  | ||||
| @interface IconActionTableViewCell : UITableViewCell | ||||
| @end | ||||
|  | ||||
| /* -- ASyncDisplayKit Interfaces -- */ | ||||
|  | ||||
| @interface _ASDisplayView : UIView | ||||
| @ -58,9 +72,6 @@ | ||||
| @property(assign,nonatomic) id attributedText; | ||||
| @end | ||||
|  | ||||
| @interface ApolloApolloButtonNode | ||||
| @property(assign,nonatomic) NSArray* subnodes; | ||||
| @interface ApolloButtonNode | ||||
| @property(assign,nonatomic) NSArray *subnodes; | ||||
| @end | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
							
								
								
									
										238
									
								
								tweak/Apollo.xm
									
									
									
									
									
								
							
							
						
						
									
										238
									
								
								tweak/Apollo.xm
									
									
									
									
									
								
							| @ -9,10 +9,17 @@ static CGFloat pushshiftRequestTimeoutValue; | ||||
| %group Apollo | ||||
|  | ||||
| NSDictionary* apolloBodyAttributes = nil; | ||||
| BOOL shouldAddUndeleteCell = NO; | ||||
| id apolloCommentCell; | ||||
| id apolloCommentController; | ||||
|  | ||||
| %hook ApolloApolloButtonNode | ||||
| %hook ApolloButtonNode | ||||
| %end | ||||
|  | ||||
| %hook IconActionTableViewCell | ||||
| %end | ||||
|  | ||||
|  | ||||
| %hook RKComment | ||||
|  | ||||
| -(BOOL) isDeleted{ | ||||
| @ -22,6 +29,7 @@ NSDictionary* apolloBodyAttributes = nil; | ||||
| -(BOOL) isModeratorRemoved{ | ||||
| 	return NO; | ||||
| } | ||||
|  | ||||
| %end | ||||
|  | ||||
|  | ||||
| @ -33,60 +41,118 @@ NSDictionary* apolloBodyAttributes = nil; | ||||
| 	 | ||||
| 	return %orig; | ||||
| } | ||||
|  | ||||
| %end | ||||
|  | ||||
|  | ||||
| %hook ApolloCommentCellNode | ||||
| %property(strong,nonatomic) id undeleteButton; | ||||
| %hook ActionController | ||||
|  | ||||
| -(void) didLoad { | ||||
| -(id) tableView:(id) arg1 cellForRowAtIndexPath:(NSIndexPath *) arg2{ | ||||
| 	 | ||||
| 	if (shouldAddUndeleteCell){ | ||||
| 		if ([arg2 row] == [self tableView:arg1 numberOfRowsInSection:0] - 1){ | ||||
| 			 | ||||
| 			id undeleteCell = [[objc_getClass("Apollo.IconActionTableViewCell") alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"IconActionCell"]; | ||||
| 			NSArray *visibleCells = [arg1 visibleCells]; | ||||
| 			id prevCell = visibleCells[[visibleCells count] - 2]; | ||||
| 			 | ||||
| 			UIImageView *prevCellImageView = MSHookIvar<UIImageView *>(prevCell, "iconImageView"); | ||||
| 			CGSize prevImageSize = [[prevCellImageView image] size]; | ||||
| 			UIColor *menuColor = [prevCellImageView tintColor]; | ||||
| 			 | ||||
| 			UIImage *undeleteImage = [UIImage imageWithContentsOfFile:@"/var/mobile/Library/Application Support/TFDidThatSay/eye160dark.png"]; | ||||
| 			CGFloat undeleteImageSizeValue = prevImageSize.width > prevImageSize.height ? prevImageSize.width : prevImageSize.height; | ||||
| 			 | ||||
| 			UIGraphicsBeginImageContextWithOptions(CGSizeMake(undeleteImageSizeValue, undeleteImageSizeValue), NO, 0); | ||||
| 			[undeleteImage drawInRect:CGRectMake(0, 0, undeleteImageSizeValue, undeleteImageSizeValue)]; | ||||
| 			undeleteImage = [UIGraphicsGetImageFromCurrentImageContext() imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]; | ||||
| 			UIGraphicsEndImageContext(); | ||||
| 			 | ||||
| 			UILabel *undeleteLabel = MSHookIvar<UILabel *>(undeleteCell, "actionTitleLabel"); | ||||
| 			UIImageView *undeleteImageView = MSHookIvar<UIImageView *>(undeleteCell, "iconImageView"); | ||||
| 			 | ||||
| 			undeleteLabel.text = @"TF Did That Say?"; | ||||
| 			undeleteLabel.textColor = menuColor; | ||||
| 			 | ||||
| 			undeleteImageView.image = undeleteImage; | ||||
| 			undeleteImageView.tintColor = menuColor; | ||||
| 			 | ||||
| 			return undeleteCell; | ||||
| 		} | ||||
| 	} | ||||
| 	 | ||||
| 	return %orig;	 | ||||
| } | ||||
|  | ||||
| -(void) tableView:(id) arg1 didSelectRowAtIndexPath:(NSIndexPath *)arg2{ | ||||
| 	 | ||||
| 	if (shouldAddUndeleteCell){ | ||||
| 		if ([arg2 row] == [self tableView:arg1 numberOfRowsInSection:0] - 1){ | ||||
|  | ||||
| 			if (apolloCommentCell){ | ||||
| 				[apolloCommentCell undeleteCellWasSelected]; | ||||
| 			} else { | ||||
| 				[apolloCommentController undeleteCellWasSelected]; | ||||
| 			} | ||||
| 		} | ||||
| 	}  | ||||
| 	 | ||||
| 	%orig; | ||||
| } | ||||
|  | ||||
| -(NSInteger) tableView:(id) arg1 numberOfRowsInSection:(NSInteger) arg2{ | ||||
| 	 | ||||
| 	if (shouldAddUndeleteCell){ | ||||
| 		return %orig + 1; | ||||
| 	} else { | ||||
| 		return %orig; | ||||
| 	} | ||||
| } | ||||
|  | ||||
| -(id) animationControllerForDismissedController:(id) arg1{ | ||||
| 	 | ||||
| 	shouldAddUndeleteCell = NO; | ||||
| 	 | ||||
| 	return %orig; | ||||
| } | ||||
|  | ||||
| %end | ||||
|  | ||||
|  | ||||
| %hook CommentCellNode | ||||
|  | ||||
| -(void) moreOptionsTappedWithSender:(id) arg1{ | ||||
| 	 | ||||
| 	id commentBody = [MSHookIvar<id>(self, "comment") body]; | ||||
| 	 | ||||
| 	if ([%c(TFHelper) shouldShowUndeleteButtonWithInfo:commentBody isDeletedOnly:isTFDeletedOnly]){ | ||||
| 	 | ||||
| 		CGFloat imageSize = 20.0f; | ||||
|  | ||||
| 		UIButton *undeleteButton = [UIButton buttonWithType:UIButtonTypeCustom]; | ||||
| 		[undeleteButton addTarget:self action:@selector(didTapUndeleteButton:) forControlEvents:UIControlEventTouchUpInside]; | ||||
| 		undeleteButton.frame = CGRectMake(0, 0, imageSize, imageSize); | ||||
| 		 | ||||
| 		UIImage* undeleteImage = [UIImage imageWithContentsOfFile:@"/var/mobile/Library/Application Support/TFDidThatSay/eye160dark.png"]; | ||||
| 		[undeleteButton setImage:undeleteImage forState:UIControlStateNormal]; | ||||
|  | ||||
| 		[[self view] addSubview:undeleteButton]; | ||||
| 		[self setUndeleteButton:undeleteButton]; | ||||
| 	 | ||||
| 		shouldAddUndeleteCell = YES; | ||||
| 		apolloCommentCell = self; | ||||
| 		apolloCommentController = nil; | ||||
| 	} | ||||
| 	 | ||||
| 	%orig; | ||||
| } | ||||
|  | ||||
| -(void) _layoutSublayouts{ | ||||
| 	%orig; | ||||
| -(void) longPressedWithGestureRecognizer:(id) arg1{ | ||||
| 	 | ||||
| 	if ([self undeleteButton]){ | ||||
| 	id commentBody = [MSHookIvar<id>(self, "comment") body]; | ||||
| 	 | ||||
| 		CGFloat imageSize = 20.0f; | ||||
|  | ||||
| 		id moreNode = MSHookIvar<id>(self, "moreOptionsNode"); | ||||
| 		id ageNode = MSHookIvar<id>(self, "ageNode"); | ||||
|  | ||||
| 		CGRect nodeFrame = [moreNode frame]; | ||||
| 		CGFloat centerHeight = (nodeFrame.size.height + nodeFrame.origin.y * 2) / 2.0f; | ||||
| 		CGFloat nodeSpacing =[ageNode frame].origin.x - nodeFrame.origin.x - nodeFrame.size.width; | ||||
|  | ||||
| 		[[self undeleteButton] setFrame:CGRectMake(nodeFrame.origin.x - imageSize - nodeSpacing, centerHeight - (imageSize / 2), imageSize, imageSize)]; | ||||
| 	if ([%c(TFHelper) shouldShowUndeleteButtonWithInfo:commentBody isDeletedOnly:isTFDeletedOnly]){ | ||||
| 		shouldAddUndeleteCell = YES; | ||||
| 		apolloCommentCell = self; | ||||
| 		apolloCommentController = nil; | ||||
| 	} | ||||
| 	 | ||||
| 	%orig; | ||||
| } | ||||
|  | ||||
| %new | ||||
| -(void) didTapUndeleteButton:(id) sender{ | ||||
| 	 | ||||
| 	[sender setEnabled:NO]; | ||||
| -(void) undeleteCellWasSelected{ | ||||
|  | ||||
| 	id comment = MSHookIvar<id>(self, "comment"); | ||||
| 	 | ||||
| 	[%c(TFHelper) getUndeleteDataWithID:[[comment fullName] componentsSeparatedByString:@"_"][1] isComment:YES timeout:pushshiftRequestTimeoutValue extraData:@{@"sender" : sender} completionTarget:self completionSelector:@selector(completeUndeleteCommentAction:)]; | ||||
| 	[%c(TFHelper) getUndeleteDataWithID:[[comment fullName] componentsSeparatedByString:@"_"][1] isComment:YES timeout:pushshiftRequestTimeoutValue extraData:nil completionTarget:self completionSelector:@selector(completeUndeleteCommentAction:)]; | ||||
| } | ||||
|  | ||||
| %new | ||||
| @ -111,92 +177,96 @@ NSDictionary* apolloBodyAttributes = nil; | ||||
| 	 | ||||
| 	[comment setAuthor:author]; | ||||
| 	[comment setBody:body]; | ||||
|  | ||||
| 	[data[@"sender"] setEnabled:YES]; | ||||
| } | ||||
|  | ||||
| %end | ||||
|  | ||||
|  | ||||
| %hook ApolloCommentsHeaderCellNode | ||||
| %property(strong, nonatomic) id undeleteButton; | ||||
| %hook CommentsViewController | ||||
| %property(strong, nonatomic) id headerCellNode;  | ||||
|  | ||||
| -(void) didLoad{ | ||||
| 	%orig; | ||||
| -(void) moreOptionsBarButtonItemTappedWithSender:(id) arg1{ | ||||
| 	 | ||||
| 	RKLink *post = MSHookIvar<RKLink *>(self, "link"); | ||||
| 	NSString *postBody = [post selfText]; | ||||
| 	 | ||||
| 	id post = MSHookIvar<id>(self, "link"); | ||||
| 	id postBody = [post selfText]; | ||||
|  | ||||
| 	if ([post isSelfPost]){ | ||||
| 		if ([%c(TFHelper) shouldShowUndeleteButtonWithInfo:postBody isDeletedOnly:isTFDeletedOnly]){ | ||||
|  | ||||
| 			CGFloat imageSize = 20.0f; | ||||
|  | ||||
| 			UIButton *undeleteButton = [UIButton buttonWithType:UIButtonTypeCustom]; | ||||
| 			[undeleteButton addTarget:self action:@selector(didTapUndeleteButton:) forControlEvents:UIControlEventTouchUpInside]; | ||||
| 			 | ||||
| 			UIImage* undeleteImage = [UIImage imageWithContentsOfFile:@"/var/mobile/Library/Application Support/TFDidThatSay/eye160dark.png"]; | ||||
| 			[undeleteButton setImage:undeleteImage forState:UIControlStateNormal]; | ||||
| 			undeleteButton.frame = CGRectMake(0, 0, imageSize, imageSize); | ||||
|  | ||||
| 			[[self view] addSubview:undeleteButton]; | ||||
| 			[self setUndeleteButton:undeleteButton]; | ||||
| 			shouldAddUndeleteCell = YES; | ||||
| 			apolloCommentCell = nil; | ||||
| 			apolloCommentController = self; | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| -(void) _layoutSublayouts{ | ||||
| 	%orig; | ||||
| 	 | ||||
| 	if ([self undeleteButton]){ | ||||
| 		 | ||||
| 		CGFloat imageSize = 20.0f; | ||||
| 		 | ||||
| 		id postInfoNode = MSHookIvar<id>(self, "postInfoNode"); | ||||
| 		id ageNode = MSHookIvar<id>(postInfoNode, "ageButtonNode"); | ||||
|  | ||||
| 		CGFloat centerHeight = [postInfoNode frame].origin.y + ([ageNode frame].size.height + [ageNode frame].origin.y * 2) / 2.0f; | ||||
| 		CGFloat buttonXPos = [postInfoNode frame].origin.x + [postInfoNode frame].size.width - imageSize; | ||||
| 		 | ||||
| 		[[self undeleteButton] setFrame:CGRectMake(buttonXPos, centerHeight - (imageSize / 2), imageSize, imageSize)]; | ||||
| 	} | ||||
| 	%orig; | ||||
| } | ||||
|  | ||||
| %new | ||||
| -(void) didTapUndeleteButton:(id) sender{ | ||||
| 	 | ||||
| 	[sender setEnabled:NO]; | ||||
| -(void) undeleteCellWasSelected{ | ||||
| 	 | ||||
| 	id post = MSHookIvar<id>(self, "link"); | ||||
| 	 | ||||
| 	[%c(TFHelper) getUndeleteDataWithID:[[post fullName] componentsSeparatedByString:@"_"][1] isComment:NO timeout:pushshiftRequestTimeoutValue extraData:@{@"sender" : sender} completionTarget:self completionSelector:@selector(completeUndeletePostAction:)]; | ||||
| 	[%c(TFHelper) getUndeleteDataWithID:[[post fullName] componentsSeparatedByString:@"_"][1] isComment:NO timeout:pushshiftRequestTimeoutValue extraData:nil completionTarget:self completionSelector:@selector(completeUndeletePostAction:)]; | ||||
| } | ||||
|  | ||||
| %new | ||||
| -(void) completeUndeletePostAction:(NSDictionary *) data{ | ||||
| 	 | ||||
| 	id bodyNode = MSHookIvar<id>(self, "bodyNode"); | ||||
| 	id postInfoNode = MSHookIvar<id>(self, "postInfoNode"); | ||||
| 	id headerCellNode = [self headerCellNode]; | ||||
| 	id bodyNode = MSHookIvar<id>(headerCellNode, "bodyNode"); | ||||
| 	id postInfoNode = MSHookIvar<id>(headerCellNode, "postInfoNode"); | ||||
| 	id authorNode = MSHookIvar<id>(postInfoNode, "authorButtonNode"); | ||||
| 	id authorTextNode = [authorNode subnodes][0]; | ||||
| 	 | ||||
| 	NSString *author = data[@"author"]; | ||||
| 	NSString *authorTextString = [NSString stringWithFormat:@"by %@", author]; | ||||
| 	NSString *body = data[@"body"]; | ||||
| 	 | ||||
| 	//id post = MSHookIvar<id>(self, "link"); | ||||
| 	id post = MSHookIvar<id>(self, "link"); | ||||
| 	//MSHookIvar<NSString*>(post, "_author") = author; //Crashes when clicking on author name. You will have to search the author name to go find the profile. | ||||
|  | ||||
| 	author = [NSString stringWithFormat:@"by %@", author]; | ||||
|  | ||||
| 	id prevAuthorAttributedString = [authorTextNode attributedString]; | ||||
| 	NSDictionary *authorStringAttributes = [prevAuthorAttributedString attributesAtIndex:0 longestEffectiveRange:nil inRange:NSMakeRange(0, [prevAuthorAttributedString length])]; | ||||
| 	NSAttributedString* newAuthorAttributedString = [[NSAttributedString alloc] initWithString:author attributes:authorStringAttributes]; | ||||
| 	NSAttributedString* newAuthorAttributedString = [[NSAttributedString alloc] initWithString:authorTextString attributes:authorStringAttributes]; | ||||
|  | ||||
| 	[authorTextNode setAttributedText:newAuthorAttributedString]; | ||||
| 	[authorTextNode setAttributedString:newAuthorAttributedString]; | ||||
| 	 | ||||
| 	[bodyNode setAttributedString:[%c(MarkdownRenderer) attributedStringFromMarkdown:data[@"body"] withAttributes:apolloBodyAttributes]]; | ||||
| 	[bodyNode setAttributedString:[%c(MarkdownRenderer) attributedStringFromMarkdown:body withAttributes:apolloBodyAttributes]]; | ||||
| 	[post setSelfText:body]; | ||||
| } | ||||
|  | ||||
| %end | ||||
|  | ||||
|  | ||||
| %hook CommentsHeaderCellNode | ||||
|  | ||||
| -(void) didLoad{ | ||||
| 	%orig; | ||||
| 	 | ||||
| 	[data[@"sender"] setEnabled:YES]; | ||||
| 	[[self closestViewController] setHeaderCellNode:self]; | ||||
| } | ||||
|  | ||||
| -(void) _layoutSublayouts{ | ||||
| 	%orig; | ||||
| 	 | ||||
| 	[[self closestViewController] setHeaderCellNode:self]; | ||||
| } | ||||
|  | ||||
| -(void) longPressedWithGestureRecognizer:(id) arg1{ | ||||
| 	 | ||||
| 	RKLink *post = MSHookIvar<RKLink *>(self, "link"); | ||||
| 	NSString *postBody = [post selfText]; | ||||
| 	 | ||||
| 	if ([post isSelfPost]){ | ||||
| 		if ([%c(TFHelper) shouldShowUndeleteButtonWithInfo:postBody isDeletedOnly:isTFDeletedOnly]){ | ||||
| 			shouldAddUndeleteCell = YES; | ||||
| 			apolloCommentCell = nil; | ||||
| 			apolloCommentController = self; | ||||
| 		} | ||||
| 	} | ||||
| 	 | ||||
| 	%orig; | ||||
| } | ||||
|  | ||||
| %end | ||||
| @ -249,7 +319,7 @@ static void prefsChanged(CFNotificationCenterRef center, void *observer, CFStrin | ||||
| 			 | ||||
| 			CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(), NULL, prefsChanged, CFSTR("com.lint.undelete.prefs.changed"), NULL, CFNotificationSuspensionBehaviorDeliverImmediately); | ||||
| 			 | ||||
| 			%init(Apollo, ApolloCommentsHeaderCellNode = objc_getClass("Apollo.CommentsHeaderCellNode"), ApolloCommentCellNode = objc_getClass("Apollo.CommentCellNode"), ApolloApolloButtonNode = objc_getClass("Apollo.ApolloButtonNode")); | ||||
| 			%init(Apollo, CommentsHeaderCellNode = objc_getClass("Apollo.CommentsHeaderCellNode"), CommentCellNode = objc_getClass("Apollo.CommentCellNode"), ApolloButtonNode = objc_getClass("Apollo.ApolloButtonNode"), ActionController = objc_getClass("Apollo.ActionController"), IconActionTableViewCell = objc_getClass("Apollo.IconActionTableViewCell"), CommentsViewController = objc_getClass("Apollo.CommentsViewController")); | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
		Reference in New Issue
	
	Block a user