Skip to content

Commit

Permalink
Revert "Merge pull request #3145 from wix/feature/fix-hitability-check"
Browse files Browse the repository at this point in the history
This reverts commit a30a9f4, reversing
changes made to a27fedb.
  • Loading branch information
asafkorem committed Dec 27, 2021
1 parent 1039d9d commit 57daa45
Show file tree
Hide file tree
Showing 4 changed files with 14 additions and 75 deletions.
1 change: 0 additions & 1 deletion detox/ios/Detox/Utilities/UIView+DetoxUtils.h
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@ NS_ASSUME_NONNULL_BEGIN

@property (nonatomic, readonly, weak) UIViewController* dtx_containingViewController;
- (UIImage*)dtx_imageFromView;
- (BOOL)isVisibleAroundPoint:(CGPoint)point;

@end

Expand Down
49 changes: 13 additions & 36 deletions detox/ios/Detox/Utilities/UIView+DetoxUtils.m
Original file line number Diff line number Diff line change
Expand Up @@ -349,11 +349,6 @@ - (UIViewController *)dtx_containingViewController
#pragma mark - Check Hitability

- (BOOL)dtx_isHittable {
// TODO: This workaround should be removed (`sleepForTimeInterval`).
// It was added because DetoxSync appears to ignore UI view controller transitions to be completed
// before the next action is taking place.
[NSThread sleepForTimeInterval:0.5];

CGPoint point = [self findVisiblePoint];
return [self dtx_isHittableAtPoint:point error:nil];
}
Expand All @@ -380,7 +375,8 @@ - (BOOL)dtx_isHittableAtPoint:(CGPoint)viewPoint
return NO;
}

if (![self _isVisibleAroundPoint:viewPoint error:error]) {
if (![self _isVisibleAroundPoint:viewPoint visibleBounds:self.dtx_visibleBounds
error:error]) {
if (error) {
NSString *description = [NSString stringWithFormat:@"View is not visible around" \
" point.\n- view point: %@\n- visible bounds: %@" \
Expand All @@ -397,23 +393,11 @@ - (BOOL)dtx_isHittableAtPoint:(CGPoint)viewPoint
return NO;
}

CGPoint absPoint = [self calcAbsPointFromLocalPoint:viewPoint];

UIViewController * _Nullable topMostViewController = [self _topMostViewControllerAtPoint:absPoint];
if (!topMostViewController) {
if (error) {
NSString *description = [NSString stringWithFormat:@"Failed to interact with the screen "
"at point: %@.", NSStringFromCGPoint(viewPoint)];
*error = [NSError
errorWithDomain:@"Detox" code:0
userInfo:@{NSLocalizedDescriptionKey:description}];
}

return NO;
}

UIViewController *topMostViewController = [self _findTopMostViewController];
UIView *visibleContainer = topMostViewController.view;

CGPoint absPoint = [self calcAbsPointFromLocalPoint:viewPoint];

if ([self isDescendantOfView:visibleContainer]) {
return [self _canHitFromView:self atAbsPoint:absPoint error:error];
}
Expand All @@ -426,13 +410,10 @@ - (BOOL)dtx_isHittableAtPoint:(CGPoint)viewPoint
return [self _canHitFromView:visibleContainer atAbsPoint:absPoint error:error];
}

- (BOOL)isVisibleAroundPoint:(CGPoint)point {
return [self _isVisibleAroundPoint:point error:nil];
}

- (BOOL)_isVisibleAroundPoint:(CGPoint)point error:(NSError* __strong __nullable * __nullable)error {
- (BOOL)_isVisibleAroundPoint:(CGPoint)point visibleBounds:(CGRect)visibleBounds
error:(NSError* __strong __nullable * __nullable)error {
CGRect intersection = CGRectIntersection(
self.dtx_visibleBounds, CGRectMake(point.x - 0.5, point.y - 0.5, 1, 1));
visibleBounds, CGRectMake(point.x - 0.5, point.y - 0.5, 1, 1));
return [self _dtx_testVisibilityInRect:intersection percent:100 error:error];
}

Expand Down Expand Up @@ -465,18 +446,14 @@ - (BOOL)_canHitFromView:(UIView *)originView atAbsPoint:(CGPoint)point
return NO;
}

- (nullable UIViewController *)_topMostViewControllerAtPoint:(CGPoint)point {
UIWindow * _Nullable topMostWindow = [UIWindow dtx_topMostWindowAtPoint:point];
if (!topMostWindow) {
return nil;
}

return [self _topMostViewControllerForViewController:topMostWindow.rootViewController];
- (UIViewController *)_findTopMostViewController {
UIWindow *topMostWindow = UIWindow.dtx_keyWindow;
return [self _findTopMostViewControllerForViewController:topMostWindow.rootViewController];
}

- (UIViewController *)_topMostViewControllerForViewController:(UIViewController *)viewController {
- (UIViewController *)_findTopMostViewControllerForViewController:(UIViewController *)viewController {
if (viewController.presentedViewController) {
return [self _topMostViewControllerForViewController:viewController.presentedViewController];
return [self _findTopMostViewControllerForViewController:viewController.presentedViewController];
}

return viewController;
Expand Down
1 change: 0 additions & 1 deletion detox/ios/Detox/Utilities/UIWindow+DetoxUtils.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,6 @@ NS_ASSUME_NONNULL_BEGIN
+ (void)dtx_enumerateAllWindowsUsingBlock:(void (NS_NOESCAPE ^)(UIWindow* obj, NSUInteger idx, BOOL *stop))block;
+ (void)dtx_enumerateKeyWindowSceneWindowsUsingBlock:(void (NS_NOESCAPE ^)(UIWindow* obj, NSUInteger idx, BOOL *stop))block;
+ (void)dtx_enumerateWindowsInScene:(nullable UIWindowScene*)scene usingBlock:(void (NS_NOESCAPE ^)(UIWindow* obj, NSUInteger idx, BOOL *stop))block;
+ (nullable UIWindow *)dtx_topMostWindowAtPoint:(CGPoint)point;

@end

Expand Down
38 changes: 1 addition & 37 deletions detox/ios/Detox/Utilities/UIWindow+DetoxUtils.m
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,8 @@
//

#import "UIWindow+DetoxUtils.h"

#import "DTXAppleInternals.h"
#import "NSObject+DetoxUtils.h"
#import "UIView+DetoxUtils.h"
#import "DTXAppleInternals.h"

extern NSArray* DTXChildElements(id element);

Expand Down Expand Up @@ -223,38 +221,4 @@ - (NSString *)dtx_shortDescription
return [NSString stringWithFormat:@"<%@: %p; frame = (%@ %@; %@ %@);>", self.class, self, @(frame.origin.x), @(frame.origin.y), @(frame.size.width), @(frame.size.height)];
}

+ (nullable UIWindow *)dtx_topMostWindowAtPoint:(CGPoint)point {
NSArray<UIWindow *> *windows = UIApplication.sharedApplication.windows;

NSArray<UIWindow *> *visibleWindowsAtPoint = [windows
filteredArrayUsingPredicate:[NSPredicate
predicateWithBlock:^BOOL(UIWindow *window, NSDictionary<NSString *, id> * _Nullable __unused bindings) {
if (!CGRectContainsPoint(window.frame, point)) {
return NO;
}

if (![window isVisibleAroundPoint:point]) {
return NO;
}

UIView * _Nullable hitten = [window hitTest:point withEvent:nil];
if (!hitten) {
// The point lies completely outside the windos's hierarchy.
return NO;
}

return YES;
}]];

if (!visibleWindowsAtPoint) {
return nil;
}

return [[visibleWindowsAtPoint
sortedArrayUsingComparator:^NSComparisonResult(UIWindow *window1, UIWindow *window2) {
return window1.windowLevel - window2.windowLevel;
}]
lastObject];
}

@end

0 comments on commit 57daa45

Please sign in to comment.