Index: content/public/android/java/src/org/chromium/content/browser/input/InputDialogContainer.java |
diff --git a/content/public/android/java/src/org/chromium/content/browser/input/InputDialogContainer.java b/content/public/android/java/src/org/chromium/content/browser/input/InputDialogContainer.java |
index 7ec81cb2b8d0c9fcb94736fe6d0ad9974c2ea873..22ebfef8fc66e26ed2f1146fdebbb5ee7c7e56e2 100644 |
--- a/content/public/android/java/src/org/chromium/content/browser/input/InputDialogContainer.java |
+++ b/content/public/android/java/src/org/chromium/content/browser/input/InputDialogContainer.java |
@@ -13,13 +13,19 @@ import android.content.DialogInterface; |
import android.content.DialogInterface.OnDismissListener; |
import android.text.format.DateFormat; |
import android.text.format.Time; |
+import android.view.View; |
+import android.widget.AdapterView; |
import android.widget.DatePicker; |
+import android.widget.ListView; |
+import android.widget.SimpleAdapter; |
+import android.widget.TextView; |
import android.widget.TimePicker; |
import org.chromium.content.R; |
import org.chromium.content.browser.input.DateTimePickerDialog.OnDateTimeSetListener; |
import org.chromium.content.browser.input.MultiFieldTimePickerDialog.OnMultiFieldTimeSetListener; |
+import java.util.Arrays; |
import java.util.Calendar; |
import java.util.Date; |
import java.util.GregorianCalendar; |
@@ -71,7 +77,7 @@ public class InputDialogContainer { |
mInputActionDelegate = inputActionDelegate; |
} |
- void showDialog(final int dialogType, double dialogValue, |
+ void showPickerDialog(final int dialogType, double dialogValue, |
double min, double max, double step) { |
Calendar cal; |
// |dialogValue|, |min|, |max| mean different things depending on the |dialogType|. |
@@ -98,19 +104,19 @@ public class InputDialogContainer { |
} |
} |
if (dialogType == sTextInputTypeDate) { |
- showDialog(dialogType, |
+ showPickerDialog(dialogType, |
cal.get(Calendar.YEAR), |
cal.get(Calendar.MONTH), |
cal.get(Calendar.DAY_OF_MONTH), |
0, 0, 0, 0, 0, min, max, step); |
} else if (dialogType == sTextInputTypeTime) { |
- showDialog(dialogType, 0, 0, 0, |
+ showPickerDialog(dialogType, 0, 0, 0, |
cal.get(Calendar.HOUR_OF_DAY), |
cal.get(Calendar.MINUTE), |
0, 0, 0, min, max, step); |
} else if (dialogType == sTextInputTypeDateTime || |
dialogType == sTextInputTypeDateTimeLocal) { |
- showDialog(dialogType, |
+ showPickerDialog(dialogType, |
cal.get(Calendar.YEAR), |
cal.get(Calendar.MONTH), |
cal.get(Calendar.DAY_OF_MONTH), |
@@ -120,16 +126,89 @@ public class InputDialogContainer { |
cal.get(Calendar.MILLISECOND), |
0, min, max, step); |
} else if (dialogType == sTextInputTypeMonth) { |
- showDialog(dialogType, cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), 0, |
+ showPickerDialog(dialogType, cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), 0, |
0, 0, 0, 0, 0, min, max, step); |
} else if (dialogType == sTextInputTypeWeek) { |
int year = WeekPicker.getISOWeekYearForDate(cal); |
int week = WeekPicker.getWeekForDate(cal); |
- showDialog(dialogType, year, 0, 0, 0, 0, 0, 0, week, min, max, step); |
+ showPickerDialog(dialogType, year, 0, 0, 0, 0, 0, 0, week, min, max, step); |
} |
} |
- void showDialog(final int dialogType, |
+ void showSuggestionDialog(final int dialogType, |
+ final double dialogValue, |
+ final double min, final double max, final double step, |
+ DateTimeSuggestion[] suggestions) { |
+ ListView suggestionListView = new ListView(mContext); |
+ final DateTimeSuggestionListAdapter adapter = |
+ new DateTimeSuggestionListAdapter(mContext, Arrays.asList(suggestions)); |
+ suggestionListView.setAdapter(adapter); |
+ suggestionListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { |
+ @Override |
+ public void onItemClick(AdapterView<?> parent, View view, int position, long id) { |
+ if (position == adapter.getCount() - 1) { |
+ dismissDialog(); |
+ showPickerDialog(dialogType, dialogValue, min, max, step); |
+ } else { |
+ double suggestionValue = adapter.getItem(position).value(); |
+ mInputActionDelegate.replaceDateTime(suggestionValue); |
+ dismissDialog(); |
+ mDialogAlreadyDismissed = true; |
+ } |
+ } |
+ }); |
+ |
+ int dialogTitleId = R.string.date_picker_dialog_title; |
+ if (dialogType == sTextInputTypeTime) { |
+ dialogTitleId = R.string.time_picker_dialog_title; |
+ } else if (dialogType == sTextInputTypeDateTime || |
+ dialogType == sTextInputTypeDateTimeLocal) { |
+ dialogTitleId = R.string.date_time_picker_dialog_title; |
+ } else if (dialogType == sTextInputTypeMonth) { |
+ dialogTitleId = R.string.month_picker_dialog_title; |
+ } else if (dialogType == sTextInputTypeWeek) { |
+ dialogTitleId = R.string.week_picker_dialog_title; |
+ } |
+ |
+ mDialog = new AlertDialog.Builder(mContext) |
+ .setTitle(dialogTitleId) |
+ .setView(suggestionListView) |
+ .setOnDismissListener(new DialogInterface.OnDismissListener() { |
+ @Override |
+ public void onDismiss(DialogInterface dialog) { |
+ if (mDialog == dialog && !mDialogAlreadyDismissed) { |
+ mDialogAlreadyDismissed = true; |
+ mInputActionDelegate.cancelDateTimeDialog(); |
+ } |
+ } |
+ }) |
+ .setNegativeButton(mContext.getText(android.R.string.cancel), |
+ new DialogInterface.OnClickListener() { |
+ @Override |
+ public void onClick(DialogInterface dialog, int which) { |
+ dismissDialog(); |
+ } |
+ }) |
+ .create(); |
+ |
+ mDialogAlreadyDismissed = false; |
+ mDialog.show(); |
+ } |
+ |
+ void showDialog(final int type, final double value, |
+ double min, double max, double step, |
+ DateTimeSuggestion[] suggestions) { |
+ // When the web page asks to show a dialog while there is one already open, |
+ // dismiss the old one. |
+ dismissDialog(); |
+ if (suggestions == null) { |
+ showPickerDialog(type, value, min, max, step); |
+ } else { |
+ showSuggestionDialog(type, value, min, max, step, suggestions); |
+ } |
+ } |
+ |
+ void showPickerDialog(final int dialogType, |
int year, int month, int monthDay, |
int hourOfDay, int minute, int second, int millis, int week, |
double min, double max, double step) { |
@@ -293,14 +372,14 @@ public class InputDialogContainer { |
millis); |
} else { |
Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("UTC")); |
- cal.clear(); |
- cal.set(Calendar.YEAR, year); |
- cal.set(Calendar.MONTH, month); |
- cal.set(Calendar.DAY_OF_MONTH, monthDay); |
- cal.set(Calendar.HOUR_OF_DAY, hourOfDay); |
- cal.set(Calendar.MINUTE, minute); |
- cal.set(Calendar.SECOND, second); |
- cal.set(Calendar.MILLISECOND, millis); |
+ cal.clear(); |
+ cal.set(Calendar.YEAR, year); |
+ cal.set(Calendar.MONTH, month); |
+ cal.set(Calendar.DAY_OF_MONTH, monthDay); |
+ cal.set(Calendar.HOUR_OF_DAY, hourOfDay); |
+ cal.set(Calendar.MINUTE, minute); |
+ cal.set(Calendar.SECOND, second); |
+ cal.set(Calendar.MILLISECOND, millis); |
mInputActionDelegate.replaceDateTime((double) cal.getTimeInMillis()); |
} |
} |