Settings -> Date and Time -> Use 24-hour format 을 Default로 설정하는 방법에 대해서
정리해 보았습니다.
일단 Use 24-hour format 기능은 onResume에서 아래와 같이 동작을 합니다.
@Override
protected void onResume() {
super.onResume();
...
((CheckBoxPreference)mTime24Pref).setChecked(is24Hour());
...
}
private boolean is24Hour() {
return
DateFormat.is24HourFormat(this);
}
|
위의 소스를 보시면 is24HourFormat 함수를 통해서 24시간인지 아닌지를 Return해줍니다.
여기서 is24HourFormat 함수를 보면 다음과 같은데 여기서 Settings.System.TIME_12_24란 Key값을 가진 Systemproperty의 값을 받아오는 것을 확인 하실수 있습니다.
하지만 최초 부팅시 또는 초기화후 부팅시에는 value값이 존재하지 않음으로 null이 됩니다.
/**
* Returns true if user preference is set to 24-hour format.
*
@param context the context to use for the content resolver
* @return true if
24 hour time format is selected, false otherwise.
*/
public static boolean
is24HourFormat(Context context) {
String value =
Settings.System.getString(context.getContentResolver(),
Settings.System.TIME_12_24);
if (value == null)
{
Locale locale =
context.getResources().getConfiguration().locale;
synchronized
(sLocaleLock) {
if (sIs24HourLocale != null &&
sIs24HourLocale.equals(locale)) {
return
sIs24Hour;
}
}
java.text.DateFormat
natural =
java.text.DateFormat.getTimeInstance(
java.text.DateFormat.LONG,
locale);
if (natural instanceof SimpleDateFormat)
{
SimpleDateFormat sdf = (SimpleDateFormat) natural;
String pattern =
sdf.toPattern();
if (pattern.indexOf('H')
>= 0) {
value = "24";
} else {
value =
"12";
}
} else {
value = "12";
}
synchronized
(sLocaleLock) {
sIs24HourLocale = locale;
sIs24Hour =
!value.equals("12");
}
}
boolean b24 = !(value == null ||
value.equals("12"));
return b24;
}
|
value 값이 null이므로 시스템으로 부터 Locale의 값을 가지고 와서 Time format을 확인한 후 value값이 12인지 24인지에 따라서 True or False를 리턴하게 됩니다.
Format의 확인 형식은 다음과 같습니다.
yyyy MM dd HH:mm : 24시간을 표시
yyyy MM dd hh:mm a : 12시간을 표시
|
여기서 "h"란 pattern을 확인 한 후 시간을 구분하게 됩니다.
하지만 여기서 한가지 의문이 생기게 됩니다.
왜 Locale을 불러오는지 말입니다.
그래서 확인한 결과 각각의 나라별 시간 표시 형식이 구분되어 있기 때문에 Locale을 사용하는 것을 확인하였습니다.
예를 들면 en_US같은 경우는 12시간을 표시하고, de_DE 같은 경우는 24시간을 표시하게 됩니다.
그래서 Locale을 사용하게 되는 것입니다.
그리고 시간의 패턴을 표시하기 위해서는 is24HourFormat 란 함수를 사용하여 확인한 후 12시간을 표시할 것인지 24시간을 표시할
것인지를 소스상에서
구분하는 것을 확인 하실수 있을것입니다.
여기까지가 24시간인지 아닌지를 체크하는 프로세스입니다.
그러면 이제 Locale을 변경을 해야되는데 이 값의 변경은 보통 SetupWizard에서 처리를 해줍니다.
하지만 SetupWizard가 없을 경우에는 Default Locale로 설정을 해주는데, 이 값은 다음과 같은 경로의 MakeFile에서
설정을 해줍니다.
Android\device\samsung\YP-GS1\Product.mk
Android\device\samsung\YP-GS1\full_YP-GS1.mk
|
이 파일을 열어보면, 여러 설정들이 존재하는데 그 중에서 다음과 같은 부분을 확인 할 수 있습니다.
# Overrides
PRODUCT_MANUFACTURER:=samsung
PRODUCT_BRAND:=samsung
PRODUCT_NAME:=YP-GS1
PRODUCT_DEVICE:=YP-GS1
PRODUCT_LOCALES := en_GB \
en_US en_AU en_IE en_NZ en_ZA \
de_AT de_CH de_DE \
fr_FR fr_CH \
it_IT \
es_ES \
es_US \
nl_NL \
pt_PT \
pl_PL \
tr_TR \
ko_KR \
ru_RU \
bg_BG hr_HR cs_CZ da_DK nl_BE et_EE fi_FI el_GR \
hu_HU is_IS ga_IE kk_KZ lv_LV lt_LT mk_MK no_NO \
pt_PT ro_RO sr_RS sk_SK sl_SI sv_SE
uk_UA
|
여기서 Product_locales부분을 확인 할 수 있는데 여기의 첫번째 값이 en_GB이냐 ko_KR이냐에 따라 최초 부팅시
Locale의 값이 바뀌게 됩니다.
그래서 만약 영국식 영어로 설정하고 싶을 경우에는 위와 같이 en_GB를 첫번째로 넣으시면 됩니다.
Locale Default 24 hour을 설정하는 방법은 다음과 같습니다.
Android/external/ICU4C/data/locales/en_GB.txt를 열어보면 다음과 같습니다.
// ***************************************************************************
// *
// * Copyright (C) 2007 International Business Machines
// * Corporation and others. All Rights Reserved.
// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java
// * Source File:<path>/common/main/en_GB.xml
// *
// ***************************************************************************
en_GB{
NumberPatterns{
"#,##0.###",
"¤#,##0.00",
"#,##0%",
"#E0",
}
Version{"1.54"}
calendar{
gregorian{
DateTimePatterns{
"HH:mm:ss v",
"HH:mm:ss z",
"HH:mm:ss",
"HH:mm",
"EEEE, d MMMM yyyy",
"d MMMM yyyy",
"d MMM yyyy",
"dd/MM/yyyy",
"{1} {0}",
}
}
}
delimiters{
alternateQuotationEnd{"”"}
alternateQuotationStart{"“"}
quotationEnd{"’"}
quotationStart{"‘"}
}
zoneStrings{
"meta:Europe_Central"{
cu:int{1}
}
"meta:Europe_Eastern"{
cu:int{1}
}
"meta:Europe_Western"{
cu:int{1}
}
}
}
여기서 gregorian영역안에서 Format에 해당하는 부분들을 추가해야 합니다.
예를 들면, dayNames, monthNames, quarters 등을 추가하여야 하며, 이를 적용한 부분의 예는 다음과 같습니다.
// ***************************************************************************
// *
// * Copyright (C) 2007 International Business Machines
// * Corporation and others. All Rights Reserved.
// * Tool: com.ibm.icu.dev.tool.cldr.LDML2ICUConverter.java
// * Source File:<path>/common/main/en_GB.xml
// *
// ***************************************************************************
en_GB{
NumberPatterns{
"#,##0.###",
"¤#,##0.00",
"#,##0%",
"#E0",
}
Version{"1.54"}
calendar{
gregorian{
DateTimePatterns{
"HH:mm:ss v",
"HH:mm:ss z",
"HH:mm:ss",
"HH:mm",
"EEEE, d MMMM yyyy",
"d MMMM yyyy",
"d MMM yyyy",
"dd/MM/yyyy",
"{1} {0}",
}
dayNames{
format{
abbreviated{
"Sun",
"Mon",
"Tue",
"Wed",
"Thu",
"Fri",
"Sat",
}
wide{
"Sunday",
"Monday",
"Tuesday",
"Wednesday",
"Thursday",
"Friday",
"Saturday",
}
}
stand-alone{
narrow{
"S",
"M",
"T",
"W",
"T",
"F",
"S",
}
}
}
monthNames{
format{
abbreviated{
"Jan",
"Feb",
"Mar",
"Apr",
"May",
"Jun",
"Jul",
"Aug",
"Sep",
"Oct",
"Nov",
"Dec",
}
wide{
"January",
"February",
"March",
"April",
"May",
"June",
"July",
"August",
"September",
"October",
"November",
"December",
}
}
stand-alone{
narrow{
"J",
"F",
"M",
"A",
"M",
"J",
"J",
"A",
"S",
"O",
"N",
"D",
}
}
}
quarters{
format{
abbreviated{
"Q1",
"Q2",
"Q3",
"Q4",
}
wide{
"1st quarter",
"2nd quarter",
"3rd quarter",
"4th quarter",
}
}
stand-alone{
narrow{
"1",
"2",
"3",
"4",
}
}
}
}
}
delimiters{
alternateQuotationEnd{"”"}
alternateQuotationStart{"“"}
quotationEnd{"’"}
quotationStart{"‘"}
}
zoneStrings{
"meta:Europe_Central"{
cu:int{1}
}
"meta:Europe_Eastern"{
cu:int{1}
}
"meta:Europe_Western"{
cu:int{1}
}
}
}
gregorian 영역안에 Format 영역을 추가 한 후 icudt44l.dat 파일을 생성한 후 stubdata 폴더에 복사하면 됩니다.