| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 package org.chromium.content.browser; | 5 package org.chromium.content.browser; |
| 6 | 6 |
| 7 import android.app.AlertDialog; | 7 import android.app.AlertDialog; |
| 8 import android.app.DatePickerDialog; | 8 import android.app.DatePickerDialog; |
| 9 import android.app.TimePickerDialog; | 9 import android.app.TimePickerDialog; |
| 10 import android.app.DatePickerDialog.OnDateSetListener; | 10 import android.app.DatePickerDialog.OnDateSetListener; |
| (...skipping 11 matching lines...) Expand all Loading... |
| 22 import org.chromium.content.browser.MonthPickerDialog.OnMonthSetListener; | 22 import org.chromium.content.browser.MonthPickerDialog.OnMonthSetListener; |
| 23 import org.chromium.content.R; | 23 import org.chromium.content.R; |
| 24 | 24 |
| 25 import java.text.ParseException; | 25 import java.text.ParseException; |
| 26 import java.text.SimpleDateFormat; | 26 import java.text.SimpleDateFormat; |
| 27 import java.util.Date; | 27 import java.util.Date; |
| 28 | 28 |
| 29 class InputDialogContainer { | 29 class InputDialogContainer { |
| 30 | 30 |
| 31 interface InputActionDelegate { | 31 interface InputActionDelegate { |
| 32 void clearFocus(); | 32 void cancelDateTimeDialog(); |
| 33 void replaceText(String text); | 33 void replaceDateTime(String dateTime); |
| 34 } | 34 } |
| 35 | 35 |
| 36 // Default values used in Time representations of selected date/time before
formatting. | 36 // Default values used in Time representations of selected date/time before
formatting. |
| 37 // They are never displayed to the user. | 37 // They are never displayed to the user. |
| 38 private static final int YEAR_DEFAULT = 1970; | 38 private static final int YEAR_DEFAULT = 1970; |
| 39 private static final int MONTH_DEFAULT = 0; | 39 private static final int MONTH_DEFAULT = 0; |
| 40 private static final int MONTHDAY_DEFAULT = 1; | 40 private static final int MONTHDAY_DEFAULT = 1; |
| 41 private static final int HOUR_DEFAULT = 0; | 41 private static final int HOUR_DEFAULT = 0; |
| 42 private static final int MINUTE_DEFAULT = 0; | 42 private static final int MINUTE_DEFAULT = 0; |
| 43 | 43 |
| (...skipping 13 matching lines...) Expand all Loading... |
| 57 private static final String PARSE_DATE_TIME_LOCAL_FORMAT = "yyyy-MM-dd'T'HH:
mm"; | 57 private static final String PARSE_DATE_TIME_LOCAL_FORMAT = "yyyy-MM-dd'T'HH:
mm"; |
| 58 private static final String PARSE_MONTH_FORMAT = "yyyy-MM"; | 58 private static final String PARSE_MONTH_FORMAT = "yyyy-MM"; |
| 59 | 59 |
| 60 private static int sTextInputTypeDate; | 60 private static int sTextInputTypeDate; |
| 61 private static int sTextInputTypeDateTime; | 61 private static int sTextInputTypeDateTime; |
| 62 private static int sTextInputTypeDateTimeLocal; | 62 private static int sTextInputTypeDateTimeLocal; |
| 63 private static int sTextInputTypeMonth; | 63 private static int sTextInputTypeMonth; |
| 64 private static int sTextInputTypeTime; | 64 private static int sTextInputTypeTime; |
| 65 | 65 |
| 66 private Context mContext; | 66 private Context mContext; |
| 67 private boolean mDialogCanceled; | 67 |
| 68 // Prevents sending two notifications (from onClick and from onDismiss) |
| 69 private boolean mDialogAlreadyDismissed; |
| 70 |
| 68 private AlertDialog mDialog; | 71 private AlertDialog mDialog; |
| 69 private InputActionDelegate mInputActionDelegate; | 72 private InputActionDelegate mInputActionDelegate; |
| 70 | 73 |
| 71 static void initializeInputTypes(int textInputTypeDate, int textInputTypeDat
eTime, | 74 static void initializeInputTypes(int textInputTypeDate, int textInputTypeDat
eTime, |
| 72 int textInputTypeDateTimeLocal, int textInputTypeMonth, int textInpu
tTypeTime) { | 75 int textInputTypeDateTimeLocal, int textInputTypeMonth, int textInpu
tTypeTime) { |
| 73 sTextInputTypeDate = textInputTypeDate; | 76 sTextInputTypeDate = textInputTypeDate; |
| 74 sTextInputTypeDateTime = textInputTypeDateTime; | 77 sTextInputTypeDateTime = textInputTypeDateTime; |
| 75 sTextInputTypeDateTimeLocal = textInputTypeDateTimeLocal; | 78 sTextInputTypeDateTimeLocal = textInputTypeDateTimeLocal; |
| 76 sTextInputTypeMonth = textInputTypeMonth; | 79 sTextInputTypeMonth = textInputTypeMonth; |
| 77 sTextInputTypeTime = textInputTypeTime; | 80 sTextInputTypeTime = textInputTypeTime; |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 111 | 114 |
| 112 mDialog.setButton(DialogInterface.BUTTON_POSITIVE, | 115 mDialog.setButton(DialogInterface.BUTTON_POSITIVE, |
| 113 mContext.getText(R.string.date_picker_dialog_set), | 116 mContext.getText(R.string.date_picker_dialog_set), |
| 114 (DialogInterface.OnClickListener) mDialog); | 117 (DialogInterface.OnClickListener) mDialog); |
| 115 | 118 |
| 116 mDialog.setButton(DialogInterface.BUTTON_NEGATIVE, | 119 mDialog.setButton(DialogInterface.BUTTON_NEGATIVE, |
| 117 mContext.getText(android.R.string.cancel), | 120 mContext.getText(android.R.string.cancel), |
| 118 new DialogInterface.OnClickListener() { | 121 new DialogInterface.OnClickListener() { |
| 119 @Override | 122 @Override |
| 120 public void onClick(DialogInterface dialog, int which) { | 123 public void onClick(DialogInterface dialog, int which) { |
| 121 mDialogCanceled = true; | 124 mDialogAlreadyDismissed = true; |
| 125 mInputActionDelegate.cancelDateTimeDialog(); |
| 122 } | 126 } |
| 123 }); | 127 }); |
| 124 | 128 |
| 125 mDialog.setButton(DialogInterface.BUTTON_NEUTRAL, | 129 mDialog.setButton(DialogInterface.BUTTON_NEUTRAL, |
| 126 mContext.getText(R.string.date_picker_dialog_clear), | 130 mContext.getText(R.string.date_picker_dialog_clear), |
| 127 new DialogInterface.OnClickListener() { | 131 new DialogInterface.OnClickListener() { |
| 128 @Override | 132 @Override |
| 129 public void onClick(DialogInterface dialog, int which) { | 133 public void onClick(DialogInterface dialog, int which) { |
| 130 mDialogCanceled = true; | 134 mDialogAlreadyDismissed = true; |
| 131 mInputActionDelegate.replaceText(""); | 135 mInputActionDelegate.replaceDateTime(""); |
| 132 } | 136 } |
| 133 }); | 137 }); |
| 134 | 138 |
| 135 mDialog.setOnDismissListener(new OnDismissListener() { | 139 mDialogAlreadyDismissed = false; |
| 136 @Override | |
| 137 public void onDismiss(DialogInterface dialog) { | |
| 138 mInputActionDelegate.clearFocus(); | |
| 139 } | |
| 140 }); | |
| 141 mDialogCanceled = false; | |
| 142 mDialog.show(); | 140 mDialog.show(); |
| 143 } | 141 } |
| 144 | 142 |
| 145 boolean isDialogShowing() { | 143 boolean isDialogShowing() { |
| 146 return mDialog != null && mDialog.isShowing(); | 144 return mDialog != null && mDialog.isShowing(); |
| 147 } | 145 } |
| 148 | 146 |
| 149 void dismissDialog() { | 147 void dismissDialog() { |
| 150 if (isDialogShowing()) mDialog.dismiss(); | 148 if (isDialogShowing()) mDialog.dismiss(); |
| 151 } | 149 } |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 193 result = new Time(); | 191 result = new Time(); |
| 194 result.setToNow(); | 192 result.setToNow(); |
| 195 } | 193 } |
| 196 | 194 |
| 197 return result; | 195 return result; |
| 198 } | 196 } |
| 199 | 197 |
| 200 private class DateListener implements OnDateSetListener { | 198 private class DateListener implements OnDateSetListener { |
| 201 @Override | 199 @Override |
| 202 public void onDateSet(DatePicker view, int year, int month, int monthDay
) { | 200 public void onDateSet(DatePicker view, int year, int month, int monthDay
) { |
| 203 if (!mDialogCanceled) { | 201 if (!mDialogAlreadyDismissed) { |
| 204 setFieldDateTimeValue(year, month, monthDay, HOUR_DEFAULT, MINUT
E_DEFAULT, | 202 setFieldDateTimeValue(year, month, monthDay, HOUR_DEFAULT, MINUT
E_DEFAULT, |
| 205 HTML_DATE_FORMAT); | 203 HTML_DATE_FORMAT); |
| 206 } | 204 } |
| 207 } | 205 } |
| 208 } | 206 } |
| 209 | 207 |
| 210 private class TimeListener implements OnTimeSetListener { | 208 private class TimeListener implements OnTimeSetListener { |
| 211 @Override | 209 @Override |
| 212 public void onTimeSet(TimePicker view, int hourOfDay, int minute) { | 210 public void onTimeSet(TimePicker view, int hourOfDay, int minute) { |
| 213 if (!mDialogCanceled) { | 211 if (!mDialogAlreadyDismissed) { |
| 214 setFieldDateTimeValue(YEAR_DEFAULT, MONTH_DEFAULT, MONTHDAY_DEFA
ULT, | 212 setFieldDateTimeValue(YEAR_DEFAULT, MONTH_DEFAULT, MONTHDAY_DEFA
ULT, |
| 215 hourOfDay, minute, HTML_TIME_FORMAT); | 213 hourOfDay, minute, HTML_TIME_FORMAT); |
| 216 } | 214 } |
| 217 } | 215 } |
| 218 } | 216 } |
| 219 | 217 |
| 220 private class DateTimeListener implements OnDateTimeSetListener { | 218 private class DateTimeListener implements OnDateTimeSetListener { |
| 221 private boolean mLocal; | 219 private boolean mLocal; |
| 222 | 220 |
| 223 public DateTimeListener(boolean local) { | 221 public DateTimeListener(boolean local) { |
| 224 mLocal = local; | 222 mLocal = local; |
| 225 } | 223 } |
| 226 | 224 |
| 227 @Override | 225 @Override |
| 228 public void onDateTimeSet(DatePicker dateView, TimePicker timeView, | 226 public void onDateTimeSet(DatePicker dateView, TimePicker timeView, |
| 229 int year, int month, int monthDay, | 227 int year, int month, int monthDay, |
| 230 int hourOfDay, int minute) { | 228 int hourOfDay, int minute) { |
| 231 if (!mDialogCanceled) { | 229 if (!mDialogAlreadyDismissed) { |
| 232 setFieldDateTimeValue(year, month, monthDay, hourOfDay, minute, | 230 setFieldDateTimeValue(year, month, monthDay, hourOfDay, minute, |
| 233 mLocal ? HTML_DATE_TIME_LOCAL_FORMAT : HTML_DATE_TIME_FO
RMAT); | 231 mLocal ? HTML_DATE_TIME_LOCAL_FORMAT : HTML_DATE_TIME_FO
RMAT); |
| 234 } | 232 } |
| 235 } | 233 } |
| 236 } | 234 } |
| 237 | 235 |
| 238 private class MonthListener implements OnMonthSetListener { | 236 private class MonthListener implements OnMonthSetListener { |
| 239 @Override | 237 @Override |
| 240 public void onMonthSet(MonthPicker view, int year, int month) { | 238 public void onMonthSet(MonthPicker view, int year, int month) { |
| 241 if (!mDialogCanceled) { | 239 if (!mDialogAlreadyDismissed) { |
| 242 setFieldDateTimeValue(year, month, MONTHDAY_DEFAULT, | 240 setFieldDateTimeValue(year, month, MONTHDAY_DEFAULT, |
| 243 HOUR_DEFAULT, MINUTE_DEFAULT, HTML_MONTH_FORMAT); | 241 HOUR_DEFAULT, MINUTE_DEFAULT, HTML_MONTH_FORMAT); |
| 244 } | 242 } |
| 245 } | 243 } |
| 246 } | 244 } |
| 247 | 245 |
| 248 private void setFieldDateTimeValue(int year, int month, int monthDay, int ho
urOfDay, | 246 private void setFieldDateTimeValue(int year, int month, int monthDay, int ho
urOfDay, |
| 249 int minute, String dateFormat) { | 247 int minute, String dateFormat) { |
| 248 // Prevents more than one callback being sent to the native |
| 249 // side when the dialog triggers multiple events. |
| 250 mDialogAlreadyDismissed = true; |
| 251 |
| 250 Time time = new Time(); | 252 Time time = new Time(); |
| 251 time.year = year; | 253 time.year = year; |
| 252 time.month = month; | 254 time.month = month; |
| 253 time.monthDay = monthDay; | 255 time.monthDay = monthDay; |
| 254 time.hour = hourOfDay; | 256 time.hour = hourOfDay; |
| 255 time.minute = minute; | 257 time.minute = minute; |
| 256 mInputActionDelegate.replaceText(time.format(dateFormat)); | 258 mInputActionDelegate.replaceDateTime(time.format(dateFormat)); |
| 257 } | 259 } |
| 258 } | 260 } |
| OLD | NEW |