chromium/remoting/ios/app/view_utils.mm

// Copyright 2017 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "remoting/ios/app/view_utils.h"

namespace {
UIWindow* GetAnyKeyWindow() {
#if !defined(__IPHONE_13_0) || __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_13_0
  return [UIApplication sharedApplication].keyWindow;
#else
  NSArray<UIWindow*>* windows = [UIApplication sharedApplication].windows;
  for (UIWindow* window in windows) {
    if (window.isKeyWindow)
      return window;
  }
  return nil;
#endif
}
}  // namespace

namespace remoting {

UIViewController* TopPresentingVC() {
  UIViewController* topController = GetAnyKeyWindow().rootViewController;

  while (topController.presentedViewController) {
    topController = topController.presentedViewController;
  }

  return topController;
}

UILayoutGuide* SafeAreaLayoutGuideForView(UIView* view) {
  if (@available(iOS 11, *)) {
    return view.safeAreaLayoutGuide;
  } else {
    NSString* kChromeSafeAreaLayoutGuideShim =
        @"ChromotingSafeAreaLayoutGuideShim";
    // Search for an existing shim safe area layout guide:
    for (UILayoutGuide* guide in view.layoutGuides) {
      if ([guide.identifier isEqualToString:kChromeSafeAreaLayoutGuideShim]) {
        return guide;
      }
    }
    // If no existing shim exist, create and return a new one.
    UILayoutGuide* safeAreaLayoutShim = [[UILayoutGuide alloc] init];
    safeAreaLayoutShim.identifier = kChromeSafeAreaLayoutGuideShim;
    [view addLayoutGuide:safeAreaLayoutShim];
    [NSLayoutConstraint activateConstraints:@[
      [safeAreaLayoutShim.leadingAnchor
          constraintEqualToAnchor:view.leadingAnchor],
      [safeAreaLayoutShim.trailingAnchor
          constraintEqualToAnchor:view.trailingAnchor],
      [safeAreaLayoutShim.topAnchor constraintEqualToAnchor:view.topAnchor],
      [safeAreaLayoutShim.bottomAnchor
          constraintEqualToAnchor:view.bottomAnchor]
    ]];
    return safeAreaLayoutShim;
  }
}

UIEdgeInsets SafeAreaInsetsForView(UIView* view) {
  if (@available(iOS 11, *)) {
    return view.safeAreaInsets;
  }
  return UIEdgeInsetsZero;
}

void PostDelayedAccessibilityNotification(NSString* announcement) {
  dispatch_after(dispatch_time(DISPATCH_TIME_NOW, NSEC_PER_SEC),
                 dispatch_get_main_queue(), ^{
                   UIAccessibilityPostNotification(
                       UIAccessibilityAnnouncementNotification, announcement);
                 });
}

void SetAccessibilityInfoFromImage(UIBarButtonItem* button) {
  button.accessibilityLabel = button.image.accessibilityLabel;
}

void SetAccessibilityInfoFromImage(UIButton* button) {
  button.accessibilityLabel =
      [button imageForState:UIControlStateNormal].accessibilityLabel;
}

void SetAccessibilityFocusElement(id element) {
  UIAccessibilityPostNotification(UIAccessibilityLayoutChangedNotification,
                                  element);
}

}  // namespace remoting