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 ¤t_version_[0], ¤t_version_[1], ¤t_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