Skip to content

Commit a53efe9

Browse files
committed
The time and data pickers did not support IME editor action correctly.
1. Updated TextView to traverse all focusable items. It was searching focus down and up and was missing right and left focusabled. Updated the focus seach to use FOCUS_FORWARD and FOCUS_BACKWARD - now all focusable views are visited. 2. TimePicker and DatePicker were not specifying the IME options for the next and done editor actions. bug:5264046 Change-Id: Ief80863fc312582f2f76928bf6e915f620c427e5
1 parent 5e87525 commit a53efe9

File tree

4 files changed

+64
-32
lines changed

4 files changed

+64
-32
lines changed

core/java/android/widget/DatePicker.java

Lines changed: 44 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import android.view.LayoutInflater;
3232
import android.view.accessibility.AccessibilityEvent;
3333
import android.view.accessibility.AccessibilityManager;
34+
import android.view.inputmethod.EditorInfo;
3435
import android.widget.NumberPicker.OnValueChangeListener;
3536

3637
import com.android.internal.R;
@@ -81,10 +82,10 @@ public class DatePicker extends FrameLayout {
8182

8283
private static final boolean DEFAULT_ENABLED_STATE = true;
8384

84-
private final NumberPicker mDaySpinner;
85-
8685
private final LinearLayout mSpinners;
8786

87+
private final NumberPicker mDaySpinner;
88+
8889
private final NumberPicker mMonthSpinner;
8990

9091
private final NumberPicker mYearSpinner;
@@ -481,16 +482,20 @@ private Calendar getCalendarForLocale(Calendar oldCalendar, Locale locale) {
481482
private void reorderSpinners() {
482483
mSpinners.removeAllViews();
483484
char[] order = DateFormat.getDateFormatOrder(getContext());
484-
for (int i = 0; i < order.length; i++) {
485+
final int spinnerCount = order.length;
486+
for (int i = 0; i < spinnerCount; i++) {
485487
switch (order[i]) {
486488
case DateFormat.DATE:
487489
mSpinners.addView(mDaySpinner);
490+
setImeOptions(mDaySpinner, spinnerCount, i);
488491
break;
489492
case DateFormat.MONTH:
490493
mSpinners.addView(mMonthSpinner);
494+
setImeOptions(mMonthSpinner, spinnerCount, i);
491495
break;
492496
case DateFormat.YEAR:
493497
mSpinners.addView(mYearSpinner);
498+
setImeOptions(mYearSpinner, spinnerCount, i);
494499
break;
495500
default:
496501
throw new IllegalArgumentException();
@@ -668,6 +673,42 @@ private void notifyDateChanged() {
668673
}
669674
}
670675

676+
/**
677+
* Sets the IME options for a spinner based on its ordering.
678+
*
679+
* @param spinner The spinner.
680+
* @param spinnerCount The total spinner count.
681+
* @param spinnerIndex The index of the given spinner.
682+
*/
683+
private void setImeOptions(NumberPicker spinner, int spinnerCount, int spinnerIndex) {
684+
final int imeOptions;
685+
if (spinnerIndex < spinnerCount - 1) {
686+
imeOptions = EditorInfo.IME_ACTION_NEXT;
687+
} else {
688+
imeOptions = EditorInfo.IME_ACTION_DONE;
689+
}
690+
TextView input = (TextView) spinner.findViewById(R.id.numberpicker_input);
691+
input.setImeOptions(imeOptions);
692+
}
693+
694+
private void setContentDescriptions() {
695+
// Day
696+
String text = mContext.getString(R.string.date_picker_increment_day_button);
697+
mDaySpinner.findViewById(R.id.increment).setContentDescription(text);
698+
text = mContext.getString(R.string.date_picker_decrement_day_button);
699+
mDaySpinner.findViewById(R.id.decrement).setContentDescription(text);
700+
// Month
701+
text = mContext.getString(R.string.date_picker_increment_month_button);
702+
mMonthSpinner.findViewById(R.id.increment).setContentDescription(text);
703+
text = mContext.getString(R.string.date_picker_decrement_month_button);
704+
mMonthSpinner.findViewById(R.id.decrement).setContentDescription(text);
705+
// Year
706+
text = mContext.getString(R.string.date_picker_increment_year_button);
707+
mYearSpinner.findViewById(R.id.increment).setContentDescription(text);
708+
text = mContext.getString(R.string.date_picker_decrement_year_button);
709+
mYearSpinner.findViewById(R.id.decrement).setContentDescription(text);
710+
}
711+
671712
/**
672713
* Class for managing state storing/restoring.
673714
*/
@@ -720,22 +761,4 @@ public SavedState[] newArray(int size) {
720761
}
721762
};
722763
}
723-
724-
private void setContentDescriptions() {
725-
// Day
726-
String text = mContext.getString(R.string.date_picker_increment_day_button);
727-
mDaySpinner.findViewById(R.id.increment).setContentDescription(text);
728-
text = mContext.getString(R.string.date_picker_decrement_day_button);
729-
mDaySpinner.findViewById(R.id.decrement).setContentDescription(text);
730-
// Month
731-
text = mContext.getString(R.string.date_picker_increment_month_button);
732-
mMonthSpinner.findViewById(R.id.increment).setContentDescription(text);
733-
text = mContext.getString(R.string.date_picker_decrement_month_button);
734-
mMonthSpinner.findViewById(R.id.decrement).setContentDescription(text);
735-
// Year
736-
text = mContext.getString(R.string.date_picker_increment_year_button);
737-
mYearSpinner.findViewById(R.id.increment).setContentDescription(text);
738-
text = mContext.getString(R.string.date_picker_decrement_year_button);
739-
mYearSpinner.findViewById(R.id.decrement).setContentDescription(text);
740-
}
741764
}

core/java/android/widget/NumberPicker.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@
3333
import android.graphics.Rect;
3434
import android.graphics.Paint.Align;
3535
import android.graphics.drawable.Drawable;
36-
import android.os.SystemClock;
3736
import android.text.InputFilter;
3837
import android.text.InputType;
3938
import android.text.Spanned;
@@ -517,7 +516,10 @@ public boolean onLongClick(View v) {
517516
mInputText = (EditText) findViewById(R.id.numberpicker_input);
518517
mInputText.setOnFocusChangeListener(new OnFocusChangeListener() {
519518
public void onFocusChange(View v, boolean hasFocus) {
520-
if (!hasFocus) {
519+
if (hasFocus) {
520+
mInputText.selectAll();
521+
} else {
522+
mInputText.setSelection(0, 0);
521523
validateInputTextView(v);
522524
}
523525
}
@@ -687,7 +689,6 @@ public boolean onTouchEvent(MotionEvent ev) {
687689
InputMethodManager imm = (InputMethodManager) getContext().getSystemService(
688690
Context.INPUT_METHOD_SERVICE);
689691
imm.showSoftInput(mInputText, 0);
690-
mInputText.setSelection(0, mInputText.getText().length());
691692
return true;
692693
}
693694
VelocityTracker velocityTracker = mVelocityTracker;

core/java/android/widget/TextView.java

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3726,19 +3726,19 @@ public void onEditorAction(int actionCode) {
37263726
// instead turning this into the normal enter key codes that an
37273727
// app may be expecting.
37283728
if (actionCode == EditorInfo.IME_ACTION_NEXT) {
3729-
View v = focusSearch(FOCUS_DOWN);
3729+
View v = focusSearch(FOCUS_FORWARD);
37303730
if (v != null) {
3731-
if (!v.requestFocus(FOCUS_DOWN)) {
3731+
if (!v.requestFocus(FOCUS_FORWARD)) {
37323732
throw new IllegalStateException("focus search returned a view " +
37333733
"that wasn't able to take focus!");
37343734
}
37353735
}
37363736
return;
3737-
3737+
37383738
} else if (actionCode == EditorInfo.IME_ACTION_PREVIOUS) {
3739-
View v = focusSearch(FOCUS_UP);
3739+
View v = focusSearch(FOCUS_BACKWARD);
37403740
if (v != null) {
3741-
if (!v.requestFocus(FOCUS_UP)) {
3741+
if (!v.requestFocus(FOCUS_BACKWARD)) {
37423742
throw new IllegalStateException("focus search returned a view " +
37433743
"that wasn't able to take focus!");
37443744
}
@@ -3750,10 +3750,11 @@ public void onEditorAction(int actionCode) {
37503750
if (imm != null && imm.isActive(this)) {
37513751
imm.hideSoftInputFromWindow(getWindowToken(), 0);
37523752
}
3753+
clearFocus();
37533754
return;
37543755
}
37553756
}
3756-
3757+
37573758
Handler h = getHandler();
37583759
if (h != null) {
37593760
long eventTime = SystemClock.uptimeMillis();

core/java/android/widget/TimePicker.java

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,6 @@
1616

1717
package android.widget;
1818

19-
import com.android.internal.R;
20-
2119
import android.annotation.Widget;
2220
import android.content.Context;
2321
import android.content.res.Configuration;
@@ -30,8 +28,11 @@
3028
import android.view.View;
3129
import android.view.accessibility.AccessibilityEvent;
3230
import android.view.accessibility.AccessibilityManager;
31+
import android.view.inputmethod.EditorInfo;
3332
import android.widget.NumberPicker.OnValueChangeListener;
3433

34+
import com.android.internal.R;
35+
3536
import java.text.DateFormatSymbols;
3637
import java.util.Calendar;
3738
import java.util.Locale;
@@ -149,6 +150,8 @@ public void onValueChange(NumberPicker spinner, int oldVal, int newVal) {
149150
onTimeChanged();
150151
}
151152
});
153+
EditText hourInput = (EditText) mHourSpinner.findViewById(R.id.numberpicker_input);
154+
hourInput.setImeOptions(EditorInfo.IME_ACTION_NEXT);
152155

153156
// divider (only for the new widget style)
154157
mDivider = (TextView) findViewById(R.id.divider);
@@ -184,6 +187,8 @@ public void onValueChange(NumberPicker spinner, int oldVal, int newVal) {
184187
onTimeChanged();
185188
}
186189
});
190+
EditText minuteInput = (EditText) mMinuteSpinner.findViewById(R.id.numberpicker_input);
191+
minuteInput.setImeOptions(EditorInfo.IME_ACTION_NEXT);
187192

188193
/* Get the localized am/pm strings and use them in the spinner */
189194
mAmPmStrings = new DateFormatSymbols().getAmPmStrings();
@@ -214,6 +219,8 @@ public void onValueChange(NumberPicker picker, int oldVal, int newVal) {
214219
}
215220
});
216221
}
222+
EditText amPmInput = (EditText) mAmPmSpinner.findViewById(R.id.numberpicker_input);
223+
amPmInput.setImeOptions(EditorInfo.IME_ACTION_DONE);
217224

218225
// update controls to initial state
219226
updateHourControl();

0 commit comments

Comments
 (0)