am 3c226bf6
: Merge "Fix old remaining i18n bugs on TimePicker:" into klp-dev
* commit '3c226bf6acea0b8dff34a2113009b6d918a3af65': Fix old remaining i18n bugs on TimePicker:
This commit is contained in:
@ -22,10 +22,12 @@ import android.content.res.Configuration;
|
||||
import android.content.res.TypedArray;
|
||||
import android.os.Parcel;
|
||||
import android.os.Parcelable;
|
||||
import android.text.format.DateFormat;
|
||||
import android.text.format.DateUtils;
|
||||
import android.util.AttributeSet;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.view.accessibility.AccessibilityEvent;
|
||||
import android.view.accessibility.AccessibilityNodeInfo;
|
||||
import android.view.inputmethod.EditorInfo;
|
||||
@ -105,6 +107,9 @@ public class TimePicker extends FrameLayout {
|
||||
|
||||
private Locale mCurrentLocale;
|
||||
|
||||
private boolean mHourWithTwoDigit;
|
||||
private char mHourFormat;
|
||||
|
||||
/**
|
||||
* The callback interface used to indicate the time has been adjusted.
|
||||
*/
|
||||
@ -164,7 +169,7 @@ public class TimePicker extends FrameLayout {
|
||||
// divider (only for the new widget style)
|
||||
mDivider = (TextView) findViewById(R.id.divider);
|
||||
if (mDivider != null) {
|
||||
mDivider.setText(R.string.time_picker_separator);
|
||||
setDividerText();
|
||||
}
|
||||
|
||||
// minute
|
||||
@ -235,6 +240,24 @@ public class TimePicker extends FrameLayout {
|
||||
mAmPmSpinnerInput.setImeOptions(EditorInfo.IME_ACTION_DONE);
|
||||
}
|
||||
|
||||
if (isAmPmAtStart()) {
|
||||
// Move the am/pm view to the beginning
|
||||
ViewGroup amPmParent = (ViewGroup) findViewById(R.id.timePickerLayout);
|
||||
amPmParent.removeView(amPmView);
|
||||
amPmParent.addView(amPmView, 0);
|
||||
// Swap layout margins if needed. They may be not symmetrical (Old Standard Theme for
|
||||
// example and not for Holo Theme)
|
||||
ViewGroup.MarginLayoutParams lp = (ViewGroup.MarginLayoutParams) amPmView.getLayoutParams();
|
||||
final int startMargin = lp.getMarginStart();
|
||||
final int endMargin = lp.getMarginEnd();
|
||||
if (startMargin != endMargin) {
|
||||
lp.setMarginStart(endMargin);
|
||||
lp.setMarginEnd(startMargin);
|
||||
}
|
||||
}
|
||||
|
||||
getHourFormatData();
|
||||
|
||||
// update controls to initial state
|
||||
updateHourControl();
|
||||
updateMinuteControl();
|
||||
@ -259,6 +282,35 @@ public class TimePicker extends FrameLayout {
|
||||
}
|
||||
}
|
||||
|
||||
private void getHourFormatData() {
|
||||
final Locale defaultLocale = Locale.getDefault();
|
||||
final String bestDateTimePattern = DateFormat.getBestDateTimePattern(defaultLocale,
|
||||
(mIs24HourView) ? "Hm" : "hm");
|
||||
final int lengthPattern = bestDateTimePattern.length();
|
||||
mHourWithTwoDigit = false;
|
||||
char hourFormat = '\0';
|
||||
// Check if the returned pattern is single or double 'H', 'h', 'K', 'k'. We also save
|
||||
// the hour format that we found.
|
||||
for (int i = 0; i < lengthPattern; i++) {
|
||||
final char c = bestDateTimePattern.charAt(i);
|
||||
if (c == 'H' || c == 'h' || c == 'K' || c == 'k') {
|
||||
mHourFormat = c;
|
||||
if (i + 1 < lengthPattern && c == bestDateTimePattern.charAt(i + 1)) {
|
||||
mHourWithTwoDigit = true;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private boolean isAmPmAtStart() {
|
||||
final Locale defaultLocale = Locale.getDefault();
|
||||
final String bestDateTimePattern = DateFormat.getBestDateTimePattern(defaultLocale,
|
||||
"hm" /* skeleton */);
|
||||
|
||||
return bestDateTimePattern.startsWith("a");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setEnabled(boolean enabled) {
|
||||
if (mIsEnabled == enabled) {
|
||||
@ -423,9 +475,11 @@ public class TimePicker extends FrameLayout {
|
||||
if (mIs24HourView == is24HourView) {
|
||||
return;
|
||||
}
|
||||
mIs24HourView = is24HourView;
|
||||
// cache the current hour since spinner range changes
|
||||
// cache the current hour since spinner range changes and BEFORE changing mIs24HourView!!
|
||||
int currentHour = getCurrentHour();
|
||||
// Order is important here.
|
||||
mIs24HourView = is24HourView;
|
||||
getHourFormatData();
|
||||
updateHourControl();
|
||||
// set value after spinner range is updated
|
||||
setCurrentHour(currentHour);
|
||||
@ -458,6 +512,38 @@ public class TimePicker extends FrameLayout {
|
||||
onTimeChanged();
|
||||
}
|
||||
|
||||
/**
|
||||
* The time separator is defined in the Unicode CLDR and cannot be supposed to be ":".
|
||||
*
|
||||
* See http://unicode.org/cldr/trac/browser/trunk/common/main
|
||||
*
|
||||
* We pass the correct "skeleton" depending on 12 or 24 hours view and then extract the
|
||||
* separator as the character which is just after the hour marker in the returned pattern.
|
||||
*/
|
||||
private void setDividerText() {
|
||||
final Locale defaultLocale = Locale.getDefault();
|
||||
final String skeleton = (mIs24HourView) ? "Hm" : "hm";
|
||||
final String bestDateTimePattern = DateFormat.getBestDateTimePattern(defaultLocale,
|
||||
skeleton);
|
||||
final String separatorText;
|
||||
int hourIndex = bestDateTimePattern.lastIndexOf('H');
|
||||
if (hourIndex == -1) {
|
||||
hourIndex = bestDateTimePattern.lastIndexOf('h');
|
||||
}
|
||||
if (hourIndex == -1) {
|
||||
// Default case
|
||||
separatorText = ":";
|
||||
} else {
|
||||
int minuteIndex = bestDateTimePattern.indexOf('m', hourIndex + 1);
|
||||
if (minuteIndex == -1) {
|
||||
separatorText = Character.toString(bestDateTimePattern.charAt(hourIndex + 1));
|
||||
} else {
|
||||
separatorText = bestDateTimePattern.substring(hourIndex + 1, minuteIndex);
|
||||
}
|
||||
}
|
||||
mDivider.setText(separatorText);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getBaseline() {
|
||||
return mHourSpinner.getBaseline();
|
||||
@ -500,15 +586,26 @@ public class TimePicker extends FrameLayout {
|
||||
|
||||
private void updateHourControl() {
|
||||
if (is24HourView()) {
|
||||
// 'k' means 1-24 hour
|
||||
if (mHourFormat == 'k') {
|
||||
mHourSpinner.setMinValue(1);
|
||||
mHourSpinner.setMaxValue(24);
|
||||
} else {
|
||||
mHourSpinner.setMinValue(0);
|
||||
mHourSpinner.setMaxValue(23);
|
||||
mHourSpinner.setFormatter(NumberPicker.getTwoDigitFormatter());
|
||||
}
|
||||
} else {
|
||||
// 'K' means 0-11 hour
|
||||
if (mHourFormat == 'K') {
|
||||
mHourSpinner.setMinValue(0);
|
||||
mHourSpinner.setMaxValue(11);
|
||||
} else {
|
||||
mHourSpinner.setMinValue(1);
|
||||
mHourSpinner.setMaxValue(12);
|
||||
mHourSpinner.setFormatter(null);
|
||||
}
|
||||
}
|
||||
mHourSpinner.setFormatter(mHourWithTwoDigit ? NumberPicker.getTwoDigitFormatter() : null);
|
||||
}
|
||||
|
||||
private void updateMinuteControl() {
|
||||
if (is24HourView()) {
|
||||
|
@ -20,6 +20,7 @@
|
||||
<!-- Layout of time picker-->
|
||||
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:id="@+id/timePickerLayout"
|
||||
android:orientation="horizontal"
|
||||
android:layout_gravity="center_horizontal"
|
||||
android:layout_width="wrap_content"
|
||||
|
@ -20,14 +20,19 @@
|
||||
<!-- Layout of time picker -->
|
||||
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:id="@+id/timePickerLayout"
|
||||
android:orientation="horizontal"
|
||||
android:layout_gravity="center_horizontal"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content">
|
||||
android:layout_height="wrap_content"
|
||||
android:paddingStart="8dip"
|
||||
android:paddingEnd="8dip">
|
||||
|
||||
<LinearLayout android:orientation="horizontal"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:paddingStart="8dip"
|
||||
android:paddingEnd="8dip"
|
||||
android:layoutDirection="ltr">
|
||||
|
||||
<!-- hour -->
|
||||
@ -37,8 +42,6 @@
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="16dip"
|
||||
android:layout_marginBottom="16dip"
|
||||
android:layout_marginStart="16dip"
|
||||
android:layout_marginEnd="6dip"
|
||||
android:focusable="true"
|
||||
android:focusableInTouchMode="true"
|
||||
/>
|
||||
@ -48,6 +51,8 @@
|
||||
android:id="@+id/divider"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="6dip"
|
||||
android:layout_marginEnd="6dip"
|
||||
android:layout_gravity="center_vertical"
|
||||
android:importantForAccessibility="no"
|
||||
/>
|
||||
@ -59,8 +64,6 @@
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="16dip"
|
||||
android:layout_marginBottom="16dip"
|
||||
android:layout_marginStart="6dip"
|
||||
android:layout_marginEnd="8dip"
|
||||
android:focusable="true"
|
||||
android:focusableInTouchMode="true"
|
||||
/>
|
||||
@ -75,7 +78,7 @@
|
||||
android:layout_marginTop="16dip"
|
||||
android:layout_marginBottom="16dip"
|
||||
android:layout_marginStart="8dip"
|
||||
android:layout_marginEnd="16dip"
|
||||
android:layout_marginEnd="8dip"
|
||||
android:focusable="true"
|
||||
android:focusableInTouchMode="true"
|
||||
/>
|
||||
|
@ -24,8 +24,6 @@
|
||||
<bool name="lockscreen_isPortrait">true</bool>
|
||||
<!-- @hide DO NOT TRANSLATE. Control aspect ratio of lock pattern -->
|
||||
<string name="lock_pattern_view_aspect">square</string>
|
||||
<!-- @hide DO NOT TRANSLATE. Separator between the hour and minute elements in a TimePicker widget -->
|
||||
<string name="time_picker_separator">:</string>
|
||||
<!-- @hide DO NOT TRANSLATE. ICU pattern for "Mon, 14 January" -->
|
||||
<string name="icu_abbrev_wday_month_day_no_year">eeeMMMMd</string>
|
||||
<!-- @hide DO NOT TRANSLATE. date formatting pattern for system ui.-->
|
||||
|
@ -217,6 +217,7 @@
|
||||
<java-symbol type="id" name="pin_new_text" />
|
||||
<java-symbol type="id" name="pin_confirm_text" />
|
||||
<java-symbol type="id" name="pin_error_message" />
|
||||
<java-symbol type="id" name="timePickerLayout" />
|
||||
|
||||
<java-symbol type="attr" name="actionModeShareDrawable" />
|
||||
<java-symbol type="attr" name="alertDialogCenterButtons" />
|
||||
@ -773,7 +774,6 @@
|
||||
<java-symbol type="string" name="time_picker_increment_hour_button" />
|
||||
<java-symbol type="string" name="time_picker_increment_minute_button" />
|
||||
<java-symbol type="string" name="time_picker_increment_set_pm_button" />
|
||||
<java-symbol type="string" name="time_picker_separator" />
|
||||
<java-symbol type="string" name="upload_file" />
|
||||
<java-symbol type="string" name="user_switched" />
|
||||
<java-symbol type="string" name="volume_alarm" />
|
||||
|
Reference in New Issue
Block a user