Skip to content

Commit e49c3fa

Browse files
committed
Fix: crash when user has no account, mitigate crash when presenting Details too fast
1 parent 380cb3d commit e49c3fa

3 files changed

Lines changed: 38 additions & 15 deletions

File tree

Natives/LauncherNavigationController.m

Lines changed: 24 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
#import "ios_uikit_bridge.h"
1919
#import "utils.h"
2020

21+
#import <objc/runtime.h>
2122
#include <sys/time.h>
2223

2324
#define AUTORESIZE_MASKS UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin
@@ -28,7 +29,7 @@ @interface LauncherNavigationController () <UIDocumentPickerDelegate, UIPickerVi
2829
}
2930

3031
@property(nonatomic) MinecraftResourceDownloadTask* task;
31-
@property(nonatomic) DownloadProgressViewController* progressVC;
32+
@property(nonatomic) UINavigationController* progressVC;
3233
@property(nonatomic) NSArray* globalToolbarItems;
3334
@property(nonatomic) PLPickerView* versionPickerView;
3435
@property(nonatomic) UITextField* versionTextField;
@@ -85,7 +86,7 @@ - (void)viewDidLoad
8586
action:@selector(performInstallOrShowDetails:)];
8687
self.buttonInstallItem.enabled = NO;
8788
dispatch_async(dispatch_get_main_queue(), ^{
88-
self.buttonInstallItem.view.superview.superview.superview.superview.backgroundColor = [UIColor colorWithRed:121/255.0 green:56/255.0 blue:162/255.0 alpha:0.5];
89+
self.buttonInstallItem.buttonGlassView.backgroundColor = [UIColor colorWithRed:121/255.0 green:56/255.0 blue:162/255.0 alpha:0.5];
8990
});
9091
[textFieldContainer addSubview:self.versionTextField];
9192
UIBarButtonItem *textFieldItem = [[UIBarButtonItem alloc] initWithCustomView:textFieldContainer];
@@ -257,12 +258,6 @@ - (void)documentPicker:(UIDocumentPickerViewController *)controller didPickDocum
257258
}
258259

259260
- (void)setInteractionEnabled:(BOOL)enabled forDownloading:(BOOL)downloading {
260-
for (UIControl *view in self.toolbar.subviews) {
261-
if ([view isKindOfClass:UIControl.class]) {
262-
view.alpha = enabled ? 1 : 0.2;
263-
view.enabled = enabled;
264-
}
265-
}
266261
self.versionTextField.alpha = enabled ? 1 : 0.2;
267262
self.versionTextField.enabled = enabled;
268263
self.progressViewMain.hidden = enabled;
@@ -276,6 +271,7 @@ - (void)setInteractionEnabled:(BOOL)enabled forDownloading:(BOOL)downloading {
276271
self.buttonInstallItem.enabled = YES;
277272
}
278273
} else {
274+
self.buttonInstall.enabled = enabled;
279275
self.buttonInstallItem.enabled = enabled;
280276
}
281277
UIApplication.sharedApplication.idleTimerDisabled = !enabled;
@@ -327,18 +323,31 @@ - (void)launchMinecraft:(UIButton *)sender {
327323
});
328324
}
329325

330-
- (void)performInstallOrShowDetails:(UIBarButtonItem *)sender {
326+
- (void)performInstallOrShowDetails:(id)sender {
327+
BOOL usesBarButtonItem = [sender isKindOfClass:UIBarButtonItem.class];
331328
if (self.task) {
332329
if (!self.progressVC) {
333-
self.progressVC = [[DownloadProgressViewController alloc] initWithTask:self.task];
330+
UIViewController *vc = [[DownloadProgressViewController alloc] initWithTask:self.task];
331+
self.progressVC = [[UINavigationController alloc] initWithRootViewController:vc];
332+
self.progressVC.modalPresentationStyle = UIModalPresentationPopover;
333+
} else if (self.progressVC.popoverPresentationController._isDismissing) {
334+
// FIXME: stock bug? it crashes when users dismisses and presents this vc too fast
335+
// "UIPopoverPresentationController () should have a non-nil sourceView or barButtonItem set before the presentation occurs."
336+
return;
334337
}
335-
UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:self.progressVC];
336-
nav.modalPresentationStyle = UIModalPresentationPopover;
337-
nav.popoverPresentationController.sourceView = sender.view;
338-
[self presentViewController:nav animated:YES completion:nil];
338+
339+
if (usesBarButtonItem) {
340+
self.progressVC.popoverPresentationController.barButtonItem = sender;
341+
} else {
342+
self.progressVC.popoverPresentationController.sourceView = sender;
343+
}
344+
[self presentViewController:self.progressVC animated:YES completion:nil];
339345
} else {
346+
if (usesBarButtonItem) {
347+
sender = ((UIBarButtonItem *)sender).buttonGlassView;
348+
}
340349
[self launchMinecraft:sender];
341-
}
350+
}
342351
}
343352

344353
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {

Natives/UIKit+hook.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,10 @@ extern NSNotificationName UIPresentationControllerPresentationTransitionWillBegi
1515
- (UIImage *)hook_imageWithSize:(CGSize)size;
1616
@end
1717

18+
@interface UIBarButtonItem(addition)
19+
- (UIView *)buttonGlassView;
20+
@end
21+
1822
// private functions
1923
extern BOOL _UISolariumEnabled(void) __attribute__((weak_import));
2024

@@ -65,6 +69,10 @@ extern BOOL _UISolariumEnabled(void) __attribute__((weak_import));
6569
- (id<_UIPointerInteractionDriver>)driver;
6670
@end
6771

72+
@interface UIPopoverPresentationController(private)
73+
- (BOOL)_isDismissing;
74+
@end
75+
6876
/*
6977
@interface WFTextTokenTextView : UITextField
7078
@property(nonatomic) NSString* placeholder

Natives/UIKit+hook.m

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,12 @@ void init_hookUIKitConstructor(void) {
5555
}
5656
}
5757

58+
@implementation UIBarButtonItem(addition)
59+
- (UIView *)buttonGlassView {
60+
return self.view.superview.superview.superview.superview;
61+
}
62+
@end
63+
5864
@implementation UIDevice(hook)
5965

6066
- (NSString *)completeOSVersion {

0 commit comments

Comments
 (0)