/** * Odoo, Open Source Management Solution * Copyright (C) 2012-today Odoo SA (<http:www.odoo.com>) * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http:www.gnu.org/licenses/> * * Created on 7/1/15 5:10 PM */ package odoo.controls; import android.annotation.TargetApi; import android.content.Context; import android.graphics.Color; import android.os.Build; import android.text.TextUtils; import android.util.AttributeSet; import android.util.TypedValue; import android.view.View; import android.widget.LinearLayout; import android.widget.TextView; import android.widget.Toast; import com.odoo.core.orm.fields.OColumn; import com.odoo.core.utils.ODateUtils; import java.util.Date; import static odoo.controls.OField.FieldType; public class ODateTimeField extends LinearLayout implements IOControlData, DateTimePicker.PickerCallBack { public static final String TAG = ODateTimeField.class.getSimpleName(); private Context mContext; private Boolean mEditable = false; private OColumn mColumn; private String mLabel, mHint; private ValueUpdateListener mValueUpdateListener = null; private FieldType mFieldType; private TextView txvText; private Object mValue; private String mParsePattern = ODateUtils.DEFAULT_DATE_FORMAT; private DateTimePicker.Builder builder = null; private String mDate; private Boolean mReady = false; private float textSize = -1; private int appearance = -1; private int textColor = Color.BLACK; @TargetApi(Build.VERSION_CODES.LOLLIPOP) public ODateTimeField(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); init(context, attrs, defStyleAttr, defStyleRes); } public ODateTimeField(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(context, attrs, defStyleAttr, 0); } public ODateTimeField(Context context, AttributeSet attrs) { super(context, attrs); init(context, attrs, 0, 0); } public ODateTimeField(Context context) { super(context); init(context, null, 0, 0); } private void init(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { mContext = context; if (attrs != null) { } mReady = false; initControl(); } public void setFieldType(FieldType type) { mFieldType = type; if (mFieldType == FieldType.DateTime) { mParsePattern = ODateUtils.DEFAULT_FORMAT; } } @Override public void initControl() { LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT); removeAllViews(); setOrientation(VERTICAL); txvText = new TextView(mContext); txvText.setLayoutParams(params); txvText.setOnClickListener(null); if (isEditable()) { txvText.setOnClickListener(onClick); } if (mValue != null && !mValue.toString().equals("false")) { txvText.setText(getDate(mValue.toString(), mParsePattern)); } if (textSize > -1) { txvText.setTextSize(TypedValue.COMPLEX_UNIT_PX, textSize); } if (appearance > -1) { txvText.setTextAppearance(mContext, appearance); } txvText.setTextColor(textColor); addView(txvText); } @Override public void setValue(Object value) { mValue = value; if (value == null || value.toString().equals("false")) { txvText.setText("No Value"); return; } txvText.setText(getDate(mValue.toString(), mParsePattern)); if (mValueUpdateListener != null) { mValueUpdateListener.onValueUpdate(value); } } @Override public View getFieldView() { return null; } @Override public void setError(String error) { if (error != null) Toast.makeText(mContext, error, Toast.LENGTH_LONG).show(); } @Override public Object getValue() { if (mValue != null && !TextUtils.isEmpty(mValue.toString())) { if (mFieldType == FieldType.Date) return mValue.toString().replaceAll(" 00:00:00", ""); return mValue; } return null; } @Override public void setEditable(Boolean editable) { if (mEditable != editable) { mEditable = editable; } } @Override public Boolean isEditable() { return mEditable; } @Override public void setLabelText(String label) { mLabel = label; } @Override public void setColumn(OColumn column) { mColumn = column; } @Override public String getLabel() { if (mLabel != null) return mLabel; if (mColumn != null) return mColumn.getLabel(); if (mHint != null) return mHint; return "unknown"; } @Override public void setValueUpdateListener(ValueUpdateListener listener) { mValueUpdateListener = listener; } View.OnClickListener onClick = new OnClickListener() { @Override public void onClick(View v) { builder = new DateTimePicker.Builder(mContext); if (mFieldType == FieldType.Date) { if (getValue() != null && !getValue().toString().equals("false")) builder.setDate(getValue().toString()); builder.setType(DateTimePicker.Type.Date); } else if (mFieldType == FieldType.Time) { if (getValue() != null && !getValue().toString().equals("false")) builder.setTime(getValue().toString()); builder.setType(DateTimePicker.Type.Time); } else { if (getValue() != null && !getValue().toString().equals("false")) builder.setDateTime(getValue().toString()); builder.setType(DateTimePicker.Type.DateTime); } builder.setCallBack(ODateTimeField.this); builder.build().show(); } }; private String getDate(String date, String format) { if (date.contains("now()") || date.contains("NOW()")) { mValue = ODateUtils.getUTCDate((mFieldType == FieldType.Date) ? ODateUtils.DEFAULT_DATE_FORMAT : (mFieldType == FieldType.Time) ? ODateUtils.DEFAULT_TIME_FORMAT : ODateUtils.DEFAULT_FORMAT); return ODateUtils.getDate(format); } else { if (mFieldType == FieldType.Date) { date += " 00:00:00"; } String defaultFormat = ODateUtils.DEFAULT_FORMAT; if (mFieldType == FieldType.Time) { defaultFormat = ODateUtils.DEFAULT_TIME_FORMAT; } return ODateUtils.convertToDefault(date, defaultFormat, format); } } @Override public void onDatePick(String date) { mDate = date; if (mFieldType == FieldType.Date) { setValue(mDate + " 00:00:00"); } } @Override public void onTimePick(String time) { String date; String format; if (mFieldType == FieldType.Time) { date = time; format = ODateUtils.DEFAULT_TIME_FORMAT; } else { date = mDate + " " + time; format = ODateUtils.DEFAULT_FORMAT; } Date dt = ODateUtils.createDateObject(date, format, true); String utc_date = ODateUtils.getUTCDate(dt, format); setValue(utc_date); } public void setParsePattern(String parsePattern) { if (parsePattern != null) mParsePattern = parsePattern; } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); mReady = true; } @Override public Boolean isControlReady() { return mReady; } @Override public void resetData() { setValue(getValue()); } public void setResource(float textSize, int appearance, int color) { this.textSize = textSize; this.appearance = appearance; this.textColor = color; } }