blob: 7aca328c12a0e9392463684eed7c6dcf3e07c3d7 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package com.taobao.weex.appfram.pickers;
import android.app.AlertDialog;
import android.app.DatePickerDialog;
import android.app.TimePickerDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.text.TextUtils;
import android.widget.Button;
import android.widget.DatePicker;
import android.widget.TimePicker;
import com.taobao.weex.common.WXThread;
import com.taobao.weex.utils.WXLogUtils;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;
import java.util.Map;
/**
* Created by moxun on 16/11/23.
*/
public class DatePickerImpl {
private static final int DEFAULT_START_YEAR = 1900;
private static final int DEFAULT_END_YEAR = 2100;
private static SimpleDateFormat timeFormatter;
private static SimpleDateFormat dateFormatter;
public static void pickDate(@NonNull Context context, String value, String max, String min, @NonNull final OnPickListener listener, @Nullable Map<String, Object> extras) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(parseDate(value));
final DatePickerDialog dialog = new DatePickerDialog(
context,
new DatePickerDialog.OnDateSetListener() {
@Override
public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
int realMonth = monthOfYear + 1;
String realMonthString = realMonth < 10 ? "0" + realMonth : String.valueOf(realMonth);
String realDayString = dayOfMonth < 10 ? "0" + dayOfMonth : String.valueOf(dayOfMonth);
String result = year + "-" + realMonthString + "-" + realDayString;
listener.onPick(true, result);
}
},
calendar.get(Calendar.YEAR),
calendar.get(Calendar.MONTH),
calendar.get(Calendar.DAY_OF_MONTH)
);
final DatePicker datePicker = dialog.getDatePicker();
final Calendar defaultMinDate = Calendar.getInstance(Locale.getDefault());
final Calendar defaultMaxDate = Calendar.getInstance(Locale.getDefault());
defaultMinDate.set(DEFAULT_START_YEAR, Calendar.JANUARY, 1);
defaultMaxDate.set(DEFAULT_END_YEAR, Calendar.DECEMBER, 31);
if (!TextUtils.isEmpty(min)) {
long minDate = parseDate(min).getTime();
if (datePicker.getMaxDate() >= minDate) {
datePicker.setMinDate(parseDate(min).getTime());
} else {
datePicker.setMinDate(defaultMinDate.getTimeInMillis());
datePicker.setMaxDate(defaultMaxDate.getTimeInMillis());
}
}
if (!TextUtils.isEmpty(max)) {
long maxDate = parseDate(max).getTime();
if (datePicker.getMinDate() <= maxDate) {
datePicker.setMaxDate(parseDate(max).getTime());
} else {
datePicker.setMinDate(defaultMinDate.getTimeInMillis());
datePicker.setMaxDate(defaultMaxDate.getTimeInMillis());
}
}
dialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
listener.onPick(false, null);
}
});
setButtonText(dialog, DialogInterface.BUTTON_NEGATIVE, String.valueOf(extras != null ? extras.get("cancelTitle") : null));
setButtonText(dialog, DialogInterface.BUTTON_POSITIVE, String.valueOf(extras != null ? extras.get("confirmTitle") : null));
dialog.show();
}
public static void pickTime(@NonNull Context context, String value, @NonNull final OnPickListener listener, @Nullable Map<String, Object> extras) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(parseTime(value));
TimePickerDialog dialog = new TimePickerDialog(
context,
new TimePickerDialog.OnTimeSetListener() {
@Override
public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
String h = hourOfDay < 10 ? "0" + hourOfDay : String.valueOf(hourOfDay);
String m = minute < 10 ? "0" + minute : String.valueOf(minute);
String result = h + ":" + m;
listener.onPick(true, result);
}
},
calendar.get(Calendar.HOUR_OF_DAY),
calendar.get(Calendar.MINUTE),
false
);
dialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
listener.onPick(false, null);
}
});
setButtonText(dialog, DialogInterface.BUTTON_NEGATIVE, String.valueOf(extras != null ? extras.get("cancelTitle") : null));
setButtonText(dialog, DialogInterface.BUTTON_POSITIVE, String.valueOf(extras != null ? extras.get("confirmTitle") : null));
dialog.show();
}
public interface OnPickListener {
void onPick(boolean set, @Nullable String result);
}
private static Date parseDate(String s) {
if (dateFormatter == null) {
dateFormatter = new SimpleDateFormat("yyyy-MM-dd", Locale.getDefault());
}
try {
return dateFormatter.parse(s);
} catch (ParseException e) {
//don't worry
WXLogUtils.w("[DatePickerImpl] " + e.toString());
}
return new Date();
}
private static Date parseTime(String s) {
if (timeFormatter == null) {
timeFormatter = new SimpleDateFormat("HH:mm", Locale.getDefault());
}
try {
return timeFormatter.parse(s);
} catch (ParseException e) {
//don't worry
WXLogUtils.w("[DatePickerImpl] " + e.toString());
}
return new Date();
}
private static void setButtonText(final AlertDialog dialog, final int which, final CharSequence text) {
if (TextUtils.isEmpty(text) || "null".equals(text)) {
return;
}
try {
dialog.getWindow().getDecorView().post(WXThread.secure(new Runnable() {
@Override
public void run() {
Button button = dialog.getButton(which);
if (button != null) {
button.setAllCaps(false);
button.setText(text);
}
}
}));
} catch (Throwable t) {
t.printStackTrace();
}
}
}