Skip to content

Commit 99e1099

Browse files
sganovAndroid (Google) Code Review
authored andcommitted
Merge "The time and data pickers did not support IME editor action correctly."
2 parents 5b60d38 + a53efe9 commit 99e1099

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)