blob: 12689d2c5d8bc07dd686e6b7209e51e6d612ed9a [file] [log] [blame]
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#import "ios/components/ui_util/dynamic_type_util.h"
#include "base/metrics/histogram_macros.h"
#if !defined(__has_feature) || !__has_feature(objc_arc)
#error "This file requires ARC support."
#endif
namespace ui_util {
float SystemSuggestedFontSizeMultiplier() {
return SystemSuggestedFontSizeMultiplier(
UIApplication.sharedApplication.preferredContentSizeCategory);
}
float SystemSuggestedFontSizeMultiplier(UIContentSizeCategory category) {
// Scaling numbers are calculated by [UIFont
// preferredFontForTextStyle:UIFontTextStyleBody].pointSize, which are [14,
// 15, 16, 17(default), 19, 21, 23, 28, 33, 40, 47, 53].
static NSDictionary* font_size_map = @{
UIContentSizeCategoryUnspecified : @1,
UIContentSizeCategoryExtraSmall : @0.82,
UIContentSizeCategorySmall : @0.88,
UIContentSizeCategoryMedium : @0.94,
UIContentSizeCategoryLarge : @1, // system default
UIContentSizeCategoryExtraLarge : @1.12,
UIContentSizeCategoryExtraExtraLarge : @1.24,
UIContentSizeCategoryExtraExtraExtraLarge : @1.35,
UIContentSizeCategoryAccessibilityMedium : @1.65,
UIContentSizeCategoryAccessibilityLarge : @1.94,
UIContentSizeCategoryAccessibilityExtraLarge : @2.35,
UIContentSizeCategoryAccessibilityExtraExtraLarge : @2.76,
UIContentSizeCategoryAccessibilityExtraExtraExtraLarge : @3.12,
};
NSNumber* font_size = font_size_map[category];
static dispatch_once_t once_token;
dispatch_once(&once_token, ^{
// In case there is a new accessibility value, log if there is a value we
// are missing. Use the sharedApplication value as this method can be called
// with an explicit value for the first time.
UMA_HISTOGRAM_BOOLEAN("Accessibility.iOS.NewLargerTextCategory",
!font_size_map[UIApplication.sharedApplication
.preferredContentSizeCategory]);
});
return font_size ? font_size.floatValue : 1;
}
float SystemSuggestedFontSizeMultiplier(UIContentSizeCategory category,
UIContentSizeCategory min_category,
UIContentSizeCategory max_category) {
float min_multiplier = SystemSuggestedFontSizeMultiplier(min_category);
float max_multiplier = SystemSuggestedFontSizeMultiplier(max_category);
DCHECK(min_multiplier < max_multiplier);
return std::min(
max_multiplier,
std::max(min_multiplier, SystemSuggestedFontSizeMultiplier(category)));
}
} // namespace ui_util