xref: /aosp_15_r20/external/cronet/base/ios/ios_util.mm (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker// Copyright 2012 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker// Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker// found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker
5*6777b538SAndroid Build Coastguard Worker#include "base/ios/ios_util.h"
6*6777b538SAndroid Build Coastguard Worker
7*6777b538SAndroid Build Coastguard Worker#import <Foundation/Foundation.h>
8*6777b538SAndroid Build Coastguard Worker#import <UIKit/UIKit.h>
9*6777b538SAndroid Build Coastguard Worker#include <stddef.h>
10*6777b538SAndroid Build Coastguard Worker
11*6777b538SAndroid Build Coastguard Worker#include "base/apple/foundation_util.h"
12*6777b538SAndroid Build Coastguard Worker#include "base/system/sys_info.h"
13*6777b538SAndroid Build Coastguard Worker
14*6777b538SAndroid Build Coastguard Workernamespace {
15*6777b538SAndroid Build Coastguard Worker
16*6777b538SAndroid Build Coastguard Workerstd::string* g_icudtl_path_override = nullptr;
17*6777b538SAndroid Build Coastguard Worker
18*6777b538SAndroid Build Coastguard Worker}  // namespace
19*6777b538SAndroid Build Coastguard Worker
20*6777b538SAndroid Build Coastguard Workernamespace base::ios {
21*6777b538SAndroid Build Coastguard Worker
22*6777b538SAndroid Build Coastguard Workerbool IsRunningOnIOS16OrLater() {
23*6777b538SAndroid Build Coastguard Worker  static const bool is_running_on_or_later = IsRunningOnOrLater(16, 0, 0);
24*6777b538SAndroid Build Coastguard Worker  return is_running_on_or_later;
25*6777b538SAndroid Build Coastguard Worker}
26*6777b538SAndroid Build Coastguard Worker
27*6777b538SAndroid Build Coastguard Workerbool IsRunningOnIOS17OrLater() {
28*6777b538SAndroid Build Coastguard Worker  static const bool is_running_on_or_later = IsRunningOnOrLater(17, 0, 0);
29*6777b538SAndroid Build Coastguard Worker  return is_running_on_or_later;
30*6777b538SAndroid Build Coastguard Worker}
31*6777b538SAndroid Build Coastguard Worker
32*6777b538SAndroid Build Coastguard Workerbool IsRunningOnOrLater(int32_t major, int32_t minor, int32_t bug_fix) {
33*6777b538SAndroid Build Coastguard Worker  static const class OSVersion {
34*6777b538SAndroid Build Coastguard Worker   public:
35*6777b538SAndroid Build Coastguard Worker    OSVersion() {
36*6777b538SAndroid Build Coastguard Worker      SysInfo::OperatingSystemVersionNumbers(
37*6777b538SAndroid Build Coastguard Worker          &current_version_[0], &current_version_[1], &current_version_[2]);
38*6777b538SAndroid Build Coastguard Worker    }
39*6777b538SAndroid Build Coastguard Worker
40*6777b538SAndroid Build Coastguard Worker    bool IsRunningOnOrLater(int32_t version[3]) const {
41*6777b538SAndroid Build Coastguard Worker      for (size_t i = 0; i < std::size(current_version_); ++i) {
42*6777b538SAndroid Build Coastguard Worker        if (current_version_[i] != version[i])
43*6777b538SAndroid Build Coastguard Worker          return current_version_[i] > version[i];
44*6777b538SAndroid Build Coastguard Worker      }
45*6777b538SAndroid Build Coastguard Worker      return true;
46*6777b538SAndroid Build Coastguard Worker    }
47*6777b538SAndroid Build Coastguard Worker
48*6777b538SAndroid Build Coastguard Worker   private:
49*6777b538SAndroid Build Coastguard Worker    int32_t current_version_[3];
50*6777b538SAndroid Build Coastguard Worker  } kOSVersion;
51*6777b538SAndroid Build Coastguard Worker
52*6777b538SAndroid Build Coastguard Worker  int32_t version[3] = {major, minor, bug_fix};
53*6777b538SAndroid Build Coastguard Worker  return kOSVersion.IsRunningOnOrLater(version);
54*6777b538SAndroid Build Coastguard Worker}
55*6777b538SAndroid Build Coastguard Worker
56*6777b538SAndroid Build Coastguard Workerbool IsInForcedRTL() {
57*6777b538SAndroid Build Coastguard Worker  NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];
58*6777b538SAndroid Build Coastguard Worker  return [defaults boolForKey:@"NSForceRightToLeftWritingDirection"];
59*6777b538SAndroid Build Coastguard Worker}
60*6777b538SAndroid Build Coastguard Worker
61*6777b538SAndroid Build Coastguard Workervoid OverridePathOfEmbeddedICU(const char* path) {
62*6777b538SAndroid Build Coastguard Worker  DCHECK(!g_icudtl_path_override);
63*6777b538SAndroid Build Coastguard Worker  g_icudtl_path_override = new std::string(path);
64*6777b538SAndroid Build Coastguard Worker}
65*6777b538SAndroid Build Coastguard Worker
66*6777b538SAndroid Build Coastguard WorkerFilePath FilePathOfEmbeddedICU() {
67*6777b538SAndroid Build Coastguard Worker  if (g_icudtl_path_override) {
68*6777b538SAndroid Build Coastguard Worker    return FilePath(*g_icudtl_path_override);
69*6777b538SAndroid Build Coastguard Worker  }
70*6777b538SAndroid Build Coastguard Worker  return FilePath();
71*6777b538SAndroid Build Coastguard Worker}
72*6777b538SAndroid Build Coastguard Worker
73*6777b538SAndroid Build Coastguard Worker#if !BUILDFLAG(IS_IOS_APP_EXTENSION)
74*6777b538SAndroid Build Coastguard Workerbool IsMultipleScenesSupported() {
75*6777b538SAndroid Build Coastguard Worker  if (@available(iOS 13, *)) {
76*6777b538SAndroid Build Coastguard Worker    return UIApplication.sharedApplication.supportsMultipleScenes;
77*6777b538SAndroid Build Coastguard Worker  }
78*6777b538SAndroid Build Coastguard Worker  return false;
79*6777b538SAndroid Build Coastguard Worker}
80*6777b538SAndroid Build Coastguard Worker#endif
81*6777b538SAndroid Build Coastguard Worker
82*6777b538SAndroid Build Coastguard Workerbool IsApplicationPreWarmed() {
83*6777b538SAndroid Build Coastguard Worker  return [NSProcessInfo.processInfo.environment objectForKey:@"ActivePrewarm"];
84*6777b538SAndroid Build Coastguard Worker}
85*6777b538SAndroid Build Coastguard Worker
86*6777b538SAndroid Build Coastguard Worker}  // namespace base::ios
87