]> git.saurik.com Git - safemode-ios.git/blobdiff - Tweak.xm
Support iOS 10+, which lost alertSheet (ashikase).
[safemode-ios.git] / Tweak.xm
index f3b74e49b6c79125463c8c75510fe168997ee5e0..7c7c20a047c8983edbc13eded51c1a9a5a104601 100644 (file)
--- a/Tweak.xm
+++ b/Tweak.xm
 
 Class $SafeModeAlertItem;
 
 
 Class $SafeModeAlertItem;
 
+#define UIAlertActionStyleDefault 0
+
+@interface UIAlertAction
++ (UIAlertAction *) actionWithTitle:(NSString *)title style:(NSUInteger)style handler:(void (^)(UIAlertAction *action))handler;
+@end
+
+@interface UIAlertController : UIViewController
+- (void) addAction:(UIAlertAction *)action;
+- (void) setMessage:(NSString *)message;
+- (void) setTitle:(NSString *)title;
+@end
+
 @interface SBAlertItem : NSObject {
 }
 @interface SBAlertItem : NSObject {
 }
+- (UIAlertController *) alertController;
 - (UIAlertView *) alertSheet;
 - (UIAlertView *) alertSheet;
+- (void) deactivateForButton;
 - (void) dismiss;
 @end
 
 - (void) dismiss;
 @end
 
@@ -75,6 +89,11 @@ void SafeModeButtonClicked(int button) {
     }
 }
 
     }
 }
 
+void SafeModeButtonClicked(id self, int button) {
+    SafeModeButtonClicked(button);
+    [self deactivateForButton];
+}
+
 void SafeModeAlertItem$alertSheet$buttonClicked$(id self, SEL sel, id sheet, int button) {
     SafeModeButtonClicked(button);
     [self dismiss];
 void SafeModeAlertItem$alertSheet$buttonClicked$(id self, SEL sel, id sheet, int button) {
     SafeModeButtonClicked(button);
     [self dismiss];
@@ -86,16 +105,36 @@ void SafeModeAlertItem$alertView$clickedButtonAtIndex$(id self, SEL sel, id shee
 }
 
 void SafeModeAlertItem$configure$requirePasscodeForActions$(id self, SEL sel, BOOL configure, BOOL require) {
 }
 
 void SafeModeAlertItem$configure$requirePasscodeForActions$(id self, SEL sel, BOOL configure, BOOL require) {
-    UIAlertView *sheet([self alertSheet]);
+    NSString *text(@"We apologize for the inconvenience, but SpringBoard has just crashed.\n\nMobileSubstrate /did not/ cause this problem: it has protected you from it.\n\nSpringBoard is now running in Safe Mode. All extensions that support this safety system are disabled.\n\nReboot (or restart SpringBoard) to return to the normal mode. To return to this dialog touch the status bar.\n\nTap \"Help\" below for more tips.");
+
+#ifdef __arm64__
+    if ([self respondsToSelector:@selector(alertController)]) {
+        UIAlertController *alert([self alertController]);
 
 
+        [alert setTitle:@""];
+        [alert setMessage:text];
+
+        [alert addAction:[%c(UIAlertAction) actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) { SafeModeButtonClicked(self, 1); }]];
+        [alert addAction:[%c(UIAlertAction) actionWithTitle:@"Restart" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) { SafeModeButtonClicked(self, 2); }]];
+        [alert addAction:[%c(UIAlertAction) actionWithTitle:@"Help" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) { SafeModeButtonClicked(self, 3); }]];
+
+        return;
+    }
+#else
+    if (false) %c(UIAlertAction);
+#endif
+
+    UIAlertView *sheet([self alertSheet]);
     [sheet setDelegate:self];
     [sheet setDelegate:self];
+
     [sheet setTitle:@""];
     [sheet setTitle:@""];
-    [sheet setBodyText:@"We apologize for the inconvenience, but SpringBoard has just crashed.\n\nMobileSubstrate /did not/ cause this problem: it has protected you from it.\n\nYour device is now running in Safe Mode. All extensions that support this safety system are disabled.\n\nReboot (or restart SpringBoard) to return to the normal mode. To return to this dialog touch the status bar.\n\nTap \"Help\" below for more tips."];
+    [sheet setBodyText:text];
+
     [sheet addButtonWithTitle:@"OK"];
     [sheet addButtonWithTitle:@"Restart"];
     [sheet addButtonWithTitle:@"Help"];
     [sheet addButtonWithTitle:@"OK"];
     [sheet addButtonWithTitle:@"Restart"];
     [sheet addButtonWithTitle:@"Help"];
-    [sheet setNumberOfRows:1];
 
 
+    [sheet setNumberOfRows:1];
     if ([sheet respondsToSelector:@selector(setForceHorizontalButtonsLayout:)])
         [sheet setForceHorizontalButtonsLayout:YES];
 }
     if ([sheet respondsToSelector:@selector(setForceHorizontalButtonsLayout:)])
         [sheet setForceHorizontalButtonsLayout:YES];
 }