blob: 73079353fb61097f1084096a6436102c043eda77 [file] [log] [blame]
Aurimas Liutikasdc3f8852024-07-11 10:07:48 -07001/* GENERATED SOURCE. DO NOT MODIFY. */
2// © 2016 and later: Unicode, Inc. and others.
3// License & terms of use: http://www.unicode.org/copyright.html
4/*
5 *******************************************************************************
6 * Copyright (C) 2009,2016 International Business Machines Corporation and
7 * others. All Rights Reserved.
8 *******************************************************************************
9 */
10package android.icu.impl;
11
12import java.util.Locale;
13import java.util.Map;
14import java.util.MissingResourceException;
15import java.util.TreeMap;
16
17import android.icu.util.ULocale;
18import android.icu.util.UResourceBundle;
19
20/**
21 * Calendar utilities.
22 *
23 * Date/time format service classes in android.icu.text packages
24 * sometimes need to access calendar internal APIs. But calendar
25 * classes are in android.icu.util package, so the package local
26 * cannot be used. This class is added in android.icu.impl
27 * package for sharing some calendar internal code for calendar
28 * and date format.
29 * @hide Only a subset of ICU is exposed in Android
30 */
31public final class CalendarUtil {
32 private static final String CALKEY = "calendar";
33 private static final String DEFCAL = "gregorian";
34
35 /**
36 * Returns a calendar type for the given locale.
37 * When the given locale has calendar keyword, the
38 * value of calendar keyword is returned. Otherwise,
39 * the default calendar type for the locale is returned.
40 * @param loc The locale
41 * @return Calendar type string, such as "gregorian"
42 */
43 public static String getCalendarType(ULocale loc) {
44 String calType = loc.getKeywordValue(CALKEY);
45 if (calType != null) {
46 // Convert to lower case, because getKeywordValue does not
47 // canonicalize keyword value.
48 return calType.toLowerCase(Locale.ROOT);
49 }
50
51 // Canonicalize, so that an old-style variant will be transformed to keywords.
52 ULocale canonical = ULocale.createCanonical(loc.toString());
53 calType = canonical.getKeywordValue(CALKEY);
54 if (calType != null) {
55 return calType;
56 }
57
58 // When calendar keyword is not available, use the locale's
59 // region to get the default calendar type
60 String region = ULocale.getRegionForSupplementalData(canonical, true);
61 return CalendarPreferences.INSTANCE.getCalendarTypeForRegion(region);
62 }
63
64 private static final class CalendarPreferences extends UResource.Sink {
65 private static final CalendarPreferences INSTANCE = new CalendarPreferences();
66 // A TreeMap should be good because we expect very few entries.
67 Map<String, String> prefs = new TreeMap<String, String>();
68
69 CalendarPreferences() {
70 try {
71 ICUResourceBundle rb = (ICUResourceBundle)UResourceBundle.getBundleInstance(
72 ICUData.ICU_BASE_NAME, "supplementalData");
73 rb.getAllItemsWithFallback("calendarPreferenceData", this);
74 } catch (MissingResourceException mre) {
75 // Always use "gregorian".
76 }
77 }
78
79 String getCalendarTypeForRegion(String region) {
80 String type = prefs.get(region);
81 return type == null ? DEFCAL : type;
82 }
83
84 @Override
85 public void put(UResource.Key key, UResource.Value value, boolean noFallback) {
86 UResource.Table calendarPreferenceData = value.getTable();
87 for (int i = 0; calendarPreferenceData.getKeyAndValue(i, key, value); ++i) {
88 UResource.Array types = value.getArray();
89 // The first calendar type is the default for the region.
90 if (types.getValue(0, value)) {
91 String type = value.getString();
92 if (!type.equals(DEFCAL)) {
93 prefs.put(key.toString(), type);
94 }
95 }
96 }
97 }
98 }
99}