forked from lint/TFDidThatSay
Fix Apollo crash, add option to show button
This commit is contained in:
1
Makefile
1
Makefile
@ -6,6 +6,7 @@ TWEAK_NAME = tfdidthatsay
|
|||||||
tfdidthatsay_FILES = $(wildcard tweak/*.xm tweak/assets/*.m tweak/assets/MMMarkdown/*.m)
|
tfdidthatsay_FILES = $(wildcard tweak/*.xm tweak/assets/*.m tweak/assets/MMMarkdown/*.m)
|
||||||
tfdidthatsay_CFLAGS = -fobjc-arc
|
tfdidthatsay_CFLAGS = -fobjc-arc
|
||||||
tweak/Reddit.xm_CFLAGS = -fno-objc-arc
|
tweak/Reddit.xm_CFLAGS = -fno-objc-arc
|
||||||
|
tweak/Apollo.xm_CFLAGS = -fno-objc-arc
|
||||||
|
|
||||||
include $(THEOS_MAKE_PATH)/tweak.mk
|
include $(THEOS_MAKE_PATH)/tweak.mk
|
||||||
|
|
||||||
|
4
control
4
control
@ -1,7 +1,7 @@
|
|||||||
Package: com.lint.undelete
|
Package: com.lint.undelete
|
||||||
Name: TFDidThatSay?
|
Name: TFDidThatSay?
|
||||||
Depends: mobilesubstrate, ws.hbang.common
|
Depends: mobilesubstrate
|
||||||
Version: 1.3.0
|
Version: 1.3.1
|
||||||
Architecture: iphoneos-arm
|
Architecture: iphoneos-arm
|
||||||
Description: See "[deleted]" comments and posts without leaving Reddit!
|
Description: See "[deleted]" comments and posts without leaving Reddit!
|
||||||
Maintainer: lint <apieceoflint@protonmail.com>
|
Maintainer: lint <apieceoflint@protonmail.com>
|
||||||
|
@ -146,6 +146,26 @@
|
|||||||
<key>label</key>
|
<key>label</key>
|
||||||
<string>Deleted comments/posts only</string>
|
<string>Deleted comments/posts only</string>
|
||||||
</dict>
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>cell</key>
|
||||||
|
<string>PSGroupCell</string>
|
||||||
|
<key>footerText</key>
|
||||||
|
<string>In Apollo, show undelete option on the comment cell rather than in the action menu.</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>PostNotification</key>
|
||||||
|
<string>com.lint.undelete.prefs.changed</string>
|
||||||
|
<key>cell</key>
|
||||||
|
<string>PSSwitchCell</string>
|
||||||
|
<key>default</key>
|
||||||
|
<false/>
|
||||||
|
<key>defaults</key>
|
||||||
|
<string>com.lint.undelete.prefs</string>
|
||||||
|
<key>key</key>
|
||||||
|
<string>shouldApolloHaveButton</string>
|
||||||
|
<key>label</key>
|
||||||
|
<string>Show button in Apollo</string>
|
||||||
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
<key>cell</key>
|
<key>cell</key>
|
||||||
<string>PSGroupCell</string>
|
<string>PSGroupCell</string>
|
||||||
|
@ -16,6 +16,7 @@
|
|||||||
-(void) calculatedLayoutDidChange;
|
-(void) calculatedLayoutDidChange;
|
||||||
|
|
||||||
//custom elements
|
//custom elements
|
||||||
|
@property(strong,nonatomic) UIButton *undeleteButton;
|
||||||
-(void) undeleteCellWasSelected;
|
-(void) undeleteCellWasSelected;
|
||||||
@end
|
@end
|
||||||
|
|
||||||
|
106
tweak/Apollo.xm
106
tweak/Apollo.xm
@ -5,6 +5,7 @@
|
|||||||
static BOOL isTFDeletedOnly;
|
static BOOL isTFDeletedOnly;
|
||||||
static BOOL isApolloEnabled;
|
static BOOL isApolloEnabled;
|
||||||
static CGFloat pushshiftRequestTimeoutValue;
|
static CGFloat pushshiftRequestTimeoutValue;
|
||||||
|
static BOOL shouldApolloHaveButton;
|
||||||
|
|
||||||
%group Apollo
|
%group Apollo
|
||||||
|
|
||||||
@ -67,17 +68,19 @@ id apolloCommentController;
|
|||||||
if (shouldAddUndeleteCell){
|
if (shouldAddUndeleteCell){
|
||||||
if ([arg2 row] == [self tableView:arg1 numberOfRowsInSection:0] - 1){
|
if ([arg2 row] == [self tableView:arg1 numberOfRowsInSection:0] - 1){
|
||||||
|
|
||||||
id undeleteCell = [[objc_getClass("Apollo.IconActionTableViewCell") alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"IconActionCell"];
|
id undeleteCell = [arg1 dequeueReusableCellWithIdentifier:@"IconActionCell" forIndexPath:arg2];
|
||||||
NSArray *visibleCells = [arg1 visibleCells];
|
id prevCell = [arg1 dequeueReusableCellWithIdentifier:@"IconActionCell"];
|
||||||
id prevCell = visibleCells[[visibleCells count] - 2];
|
|
||||||
|
|
||||||
UIImageView *prevCellImageView = MSHookIvar<UIImageView *>(prevCell, "iconImageView");
|
UIImageView *prevCellImageView = MSHookIvar<UIImageView *>(prevCell, "iconImageView");
|
||||||
CGSize prevImageSize = [[prevCellImageView image] size];
|
CGSize prevImageSize = [[prevCellImageView image] size];
|
||||||
UIColor *menuColor = [prevCellImageView tintColor];
|
|
||||||
|
|
||||||
UIImage *undeleteImage = [UIImage imageWithContentsOfFile:@"/var/mobile/Library/Application Support/TFDidThatSay/eye160dark.png"];
|
UIImage *undeleteImage = [UIImage imageWithContentsOfFile:@"/var/mobile/Library/Application Support/TFDidThatSay/eye160dark.png"];
|
||||||
CGFloat undeleteImageSizeValue = prevImageSize.width > prevImageSize.height ? prevImageSize.width : prevImageSize.height;
|
CGFloat undeleteImageSizeValue = prevImageSize.width > prevImageSize.height ? prevImageSize.width : prevImageSize.height;
|
||||||
|
|
||||||
|
if (undeleteImageSizeValue == 0){
|
||||||
|
undeleteImageSizeValue = 25;
|
||||||
|
}
|
||||||
|
|
||||||
UIGraphicsBeginImageContextWithOptions(CGSizeMake(undeleteImageSizeValue, undeleteImageSizeValue), NO, 0);
|
UIGraphicsBeginImageContextWithOptions(CGSizeMake(undeleteImageSizeValue, undeleteImageSizeValue), NO, 0);
|
||||||
[undeleteImage drawInRect:CGRectMake(0, 0, undeleteImageSizeValue, undeleteImageSizeValue)];
|
[undeleteImage drawInRect:CGRectMake(0, 0, undeleteImageSizeValue, undeleteImageSizeValue)];
|
||||||
undeleteImage = [UIGraphicsGetImageFromCurrentImageContext() imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
|
undeleteImage = [UIGraphicsGetImageFromCurrentImageContext() imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
|
||||||
@ -87,10 +90,7 @@ id apolloCommentController;
|
|||||||
UIImageView *undeleteImageView = MSHookIvar<UIImageView *>(undeleteCell, "iconImageView");
|
UIImageView *undeleteImageView = MSHookIvar<UIImageView *>(undeleteCell, "iconImageView");
|
||||||
|
|
||||||
undeleteLabel.text = @"TF Did That Say?";
|
undeleteLabel.text = @"TF Did That Say?";
|
||||||
undeleteLabel.textColor = menuColor;
|
|
||||||
|
|
||||||
undeleteImageView.image = undeleteImage;
|
undeleteImageView.image = undeleteImage;
|
||||||
undeleteImageView.tintColor = menuColor;
|
|
||||||
|
|
||||||
return undeleteCell;
|
return undeleteCell;
|
||||||
}
|
}
|
||||||
@ -135,15 +135,19 @@ id apolloCommentController;
|
|||||||
|
|
||||||
|
|
||||||
%hook CommentCellNode
|
%hook CommentCellNode
|
||||||
|
%property(strong,nonatomic) UIButton *undeleteButton;
|
||||||
|
|
||||||
-(void) moreOptionsTappedWithSender:(id) arg1{
|
-(void) moreOptionsTappedWithSender:(id) arg1{
|
||||||
|
|
||||||
NSString *commentBody = [MSHookIvar<RKComment *>(self, "comment") body];
|
if (!shouldApolloHaveButton){
|
||||||
|
|
||||||
if ([%c(TFHelper) shouldShowUndeleteButtonWithInfo:commentBody isDeletedOnly:isTFDeletedOnly]){
|
NSString *commentBody = [MSHookIvar<RKComment *>(self, "comment") body];
|
||||||
shouldAddUndeleteCell = YES;
|
|
||||||
apolloCommentCell = self;
|
if ([%c(TFHelper) shouldShowUndeleteButtonWithInfo:commentBody isDeletedOnly:isTFDeletedOnly]){
|
||||||
apolloCommentController = nil;
|
shouldAddUndeleteCell = YES;
|
||||||
|
apolloCommentCell = self;
|
||||||
|
apolloCommentController = nil;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
%orig;
|
%orig;
|
||||||
@ -151,17 +155,74 @@ id apolloCommentController;
|
|||||||
|
|
||||||
-(void) longPressedWithGestureRecognizer:(id) arg1{
|
-(void) longPressedWithGestureRecognizer:(id) arg1{
|
||||||
|
|
||||||
NSString *commentBody = [MSHookIvar<RKComment *>(self, "comment") body];
|
if (!shouldApolloHaveButton){
|
||||||
|
|
||||||
if ([%c(TFHelper) shouldShowUndeleteButtonWithInfo:commentBody isDeletedOnly:isTFDeletedOnly]){
|
NSString *commentBody = [MSHookIvar<RKComment *>(self, "comment") body];
|
||||||
shouldAddUndeleteCell = YES;
|
|
||||||
apolloCommentCell = self;
|
if ([%c(TFHelper) shouldShowUndeleteButtonWithInfo:commentBody isDeletedOnly:isTFDeletedOnly]){
|
||||||
apolloCommentController = nil;
|
shouldAddUndeleteCell = YES;
|
||||||
|
apolloCommentCell = self;
|
||||||
|
apolloCommentController = nil;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
%orig;
|
%orig;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
-(void) didLoad {
|
||||||
|
%orig;
|
||||||
|
|
||||||
|
if (shouldApolloHaveButton){
|
||||||
|
|
||||||
|
NSString *commentBody = [MSHookIvar<RKComment *>(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];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
-(void) _layoutSublayouts{
|
||||||
|
%orig;
|
||||||
|
|
||||||
|
if (shouldApolloHaveButton){
|
||||||
|
if ([self undeleteButton]){
|
||||||
|
|
||||||
|
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)];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
%new
|
||||||
|
-(void) didTapUndeleteButton:(id) sender{
|
||||||
|
|
||||||
|
[sender setEnabled:NO];
|
||||||
|
|
||||||
|
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:)];
|
||||||
|
}
|
||||||
|
|
||||||
%new
|
%new
|
||||||
-(void) undeleteCellWasSelected{
|
-(void) undeleteCellWasSelected{
|
||||||
|
|
||||||
@ -189,6 +250,10 @@ id apolloCommentController;
|
|||||||
|
|
||||||
[authorNode setAttributedTitle:newAuthorAttributedString forState:UIControlStateNormal];
|
[authorNode setAttributedTitle:newAuthorAttributedString forState:UIControlStateNormal];
|
||||||
[bodyNode setAttributedString:[%c(MarkdownRenderer) attributedStringFromMarkdown:body withAttributes:apolloBodyAttributes]];
|
[bodyNode setAttributedString:[%c(MarkdownRenderer) attributedStringFromMarkdown:body withAttributes:apolloBodyAttributes]];
|
||||||
|
|
||||||
|
if ([data objectForKey:@"sender"]) {
|
||||||
|
[data[@"sender"] setEnabled:YES];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
%end
|
%end
|
||||||
@ -307,10 +372,17 @@ static void loadPrefs(){
|
|||||||
pushshiftRequestTimeoutValue = 10;
|
pushshiftRequestTimeoutValue = 10;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ([prefs objectForKey:@"shouldApolloHaveButton"] != nil){
|
||||||
|
shouldApolloHaveButton = [[prefs objectForKey:@"shouldApolloHaveButton"] boolValue];
|
||||||
|
} else {
|
||||||
|
shouldApolloHaveButton = NO;
|
||||||
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
isApolloEnabled = YES;
|
isApolloEnabled = YES;
|
||||||
isTFDeletedOnly = YES;
|
isTFDeletedOnly = YES;
|
||||||
pushshiftRequestTimeoutValue = 10;
|
pushshiftRequestTimeoutValue = 10;
|
||||||
|
shouldApolloHaveButton = NO;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user