FLEXShortcutsFactory+Defaults.m 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. //
  2. // FLEXShortcutsFactory+Defaults.m
  3. // FLEX
  4. //
  5. // Created by Tanner Bennett on 8/29/19.
  6. // Copyright © 2019 Flipboard. All rights reserved.
  7. //
  8. #import "FLEXShortcutsFactory+Defaults.h"
  9. #import "FLEXShortcut.h"
  10. #import <objc/runtime.h>
  11. // Don't load pre-registered shortcuts in a test environment
  12. #define FLEX_EXIT_IF_TESTING() if (NSClassFromString(@"XCTest")) return;
  13. #pragma mark - Views
  14. @implementation FLEXShortcutsFactory (Views)
  15. + (void)load { FLEX_EXIT_IF_TESTING()
  16. // Only available since iOS 3.2, but we never supported iOS 3, so who cares
  17. NSArray *ivars = @[@"_gestureRecognizers"];
  18. NSArray *methods = @[@"sizeToFit", @"setNeedsLayout", @"removeFromSuperview"];
  19. // UIView
  20. self.append.ivars(ivars).methods(methods).properties(@[
  21. @"frame", @"bounds", @"center", @"transform",
  22. @"backgroundColor", @"alpha", @"opaque", @"hidden",
  23. @"clipsToBounds", @"userInteractionEnabled", @"layer",
  24. @"superview", @"subviews"
  25. ]).forClass(UIView.class);
  26. // UILabel
  27. self.append.ivars(ivars).methods(methods).properties(@[
  28. @"text", @"attributedText", @"font", @"frame",
  29. @"textColor", @"textAlignment", @"numberOfLines",
  30. @"lineBreakMode", @"enabled", @"backgroundColor",
  31. @"alpha", @"hidden", @"preferredMaxLayoutWidth",
  32. @"superview", @"subviews"
  33. ]).forClass(UILabel.class);
  34. // UIWindow
  35. self.append.ivars(ivars).properties(@[
  36. @"rootViewController", @"windowLevel", @"keyWindow",
  37. @"frame", @"bounds", @"center", @"transform",
  38. @"backgroundColor", @"alpha", @"opaque", @"hidden",
  39. @"clipsToBounds", @"userInteractionEnabled", @"layer",
  40. @"subviews"
  41. ]).forClass(UIWindow.class);
  42. if (@available(iOS 13, *)) {
  43. self.append.properties(@[@"windowScene"]).forClass(UIWindow.class);
  44. }
  45. ivars = @[@"_targetActions", @"_gestureRecognizers"];
  46. // UIControl
  47. self.append.ivars(ivars).methods(methods).properties(@[
  48. @"enabled", @"allTargets", @"frame",
  49. @"backgroundColor", @"hidden", @"clipsToBounds",
  50. @"userInteractionEnabled", @"superview", @"subviews"
  51. ]).forClass(UIControl.class);
  52. // UIButton
  53. self.append.ivars(ivars).properties(@[
  54. @"titleLabel", @"font", @"imageView", @"tintColor",
  55. @"currentTitle", @"currentImage", @"enabled", @"frame",
  56. @"superview", @"subviews"
  57. ]).forClass(UIButton.class);
  58. }
  59. @end
  60. #pragma mark - View Controllers
  61. @implementation FLEXShortcutsFactory (ViewControllers)
  62. + (void)load { FLEX_EXIT_IF_TESTING()
  63. // UIViewController
  64. self.append
  65. .properties(@[
  66. @"viewIfLoaded", @"title", @"navigationItem", @"toolbarItems", @"tabBarItem",
  67. @"childViewControllers", @"navigationController", @"tabBarController", @"splitViewController",
  68. @"parentViewController", @"presentedViewController", @"presentingViewController",
  69. ]).methods(@[@"view"]).forClass(UIViewController.class);
  70. }
  71. @end
  72. #pragma mark - UIImage
  73. @implementation FLEXShortcutsFactory (UIImage)
  74. + (void)load { FLEX_EXIT_IF_TESTING()
  75. self.append.methods(@[
  76. @"CGImage", @"CIImage"
  77. ]).properties(@[
  78. @"scale", @"size", @"capInsets",
  79. @"alignmentRectInsets", @"duration", @"images"
  80. ]).forClass(UIImage.class);
  81. if (@available(iOS 13, *)) {
  82. self.append.properties(@[@"symbolImage"]);
  83. }
  84. }
  85. @end
  86. #pragma mark - NSBundle
  87. @implementation FLEXShortcutsFactory (NSBundle)
  88. + (void)load { FLEX_EXIT_IF_TESTING()
  89. self.append.properties(@[
  90. @"bundleIdentifier", @"principalClass",
  91. @"infoDictionary", @"bundlePath",
  92. @"executablePath", @"loaded"
  93. ]).forClass(NSBundle.class);
  94. }
  95. @end
  96. #pragma mark - Classes
  97. @implementation FLEXShortcutsFactory (Classes)
  98. + (void)load { FLEX_EXIT_IF_TESTING()
  99. self.append.methods(@[@"new", @"alloc"]).forClass(objc_getMetaClass("NSObject"));
  100. }
  101. @end
  102. #pragma mark - Activities
  103. @implementation FLEXShortcutsFactory (Activities)
  104. + (void)load { FLEX_EXIT_IF_TESTING()
  105. self.append.properties(@[
  106. @"item", @"placeholderItem", @"activityType"
  107. ]).forClass(UIActivityItemProvider.class);
  108. self.append.properties(@[
  109. @"activityItems", @"applicationActivities", @"excludedActivityTypes", @"completionHandler"
  110. ]).forClass(UIActivityViewController.class);
  111. }
  112. @end
  113. #pragma mark - Activities
  114. @implementation FLEXShortcutsFactory (Blocks)
  115. + (void)load { FLEX_EXIT_IF_TESTING()
  116. self.append.methods(@[@"invoke"]).forClass(NSClassFromString(@"NSBlock"));
  117. }
  118. @end