/*
* Copyright © 2016 TIBCO Software,Inc.All rights reserved.
* http://community.jaspersoft.com/project/jaspermobile-android
*
* Unless you have purchased a commercial license agreement from TIBCO Jaspersoft,
* the following license terms apply:
*
* This program is part of TIBCO Jaspersoft Mobile for Android.
*
* TIBCO Jaspersoft Mobile is free software:you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation,either version 3of the License,or
* (at your option)any later version.
*
* TIBCO Jaspersoft Mobile 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 Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with TIBCO Jaspersoft Mobile for Android.If not,see
* <http://www.gnu.org/licenses/lgpl>.
*/
package com.jaspersoft.android.jaspermobile.widget;
import android.content.Context;
import android.support.annotation.NonNull;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.jaspersoft.android.jaspermobile.R;
import com.jaspersoft.android.sdk.client.ic.InputControlWrapper;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;
/**
* @author Andrew Tivodar
* @since 2.3
*/
public class DateTimeView extends LinearLayout {
private static final String DEFAULT_DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
private static final String DEFAULT_DATE_FORMAT = "yyyy-MM-dd";
private static final String DEFAULT_TIME_FORMAT = "HH:mm:ss";
private TextView label;
private TextView selectedDateTime;
private TextView errorText;
protected ImageButton btnDate;
protected ImageButton btnTime;
private ImageButton btnClear;
private View clearDivider;
protected View dateTimeDivider;
protected SimpleDateFormat mUserDateFormat;
private boolean mClearVisible;
private int mRequestCode;
private DateType mDateType;
private DateTimeClickListener mDateTimeClickListener;
private final Watcher dateTextWatcher = new Watcher();
public DateTimeView(Context context) {
super(context);
init(context);
}
public DateTimeView(Context context, AttributeSet attrs) {
super(context, attrs);
init(context);
}
public DateTimeView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(context);
}
private void init(Context context) {
View itemView = LayoutInflater.from(context).inflate(R.layout.item_input_control_date, this);
mDateType = DateType.DATE_TIME;
mClearVisible = true;
selectedDateTime = (TextView) itemView.findViewById(R.id.ic_datetime_text);
errorText = (TextView) itemView.findViewById(R.id.ic_error_text);
label = (TextView) itemView.findViewById(R.id.ic_text_label);
btnDate = (ImageButton) itemView.findViewById(R.id.ic_date);
btnTime = (ImageButton) itemView.findViewById(R.id.ic_time);
btnClear = (ImageButton) itemView.findViewById(R.id.ic_clear);
clearDivider = itemView.findViewById(R.id.ic_clear_divider);
dateTimeDivider = itemView.findViewById(R.id.ic_datetime_divider);
btnDate.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mDateTimeClickListener != null) {
mDateTimeClickListener.onDateClick(mRequestCode);
}
}
});
btnTime.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mDateTimeClickListener != null) {
mDateTimeClickListener.onTimeClick(mRequestCode);
}
}
});
btnClear.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mDateTimeClickListener != null) {
mDateTimeClickListener.onClear(mRequestCode);
}
}
});
selectedDateTime.addTextChangedListener(dateTextWatcher);
updateViews();
}
public void setRequestCode(int requestCode) {
mRequestCode = requestCode;
}
public void setDateTimeClickListener(DateTimeClickListener dateTimeClickListener) {
this.mDateTimeClickListener = dateTimeClickListener;
}
public void enableViews(Boolean enabled) {
selectedDateTime.setEnabled(enabled);
btnDate.setEnabled(enabled);
btnDate.setAlpha(enabled ? 1f : .5f);
btnTime.setEnabled(enabled);
btnTime.setAlpha(enabled ? 1f : .5f);
btnClear.setEnabled(enabled);
btnClear.setAlpha(enabled ? 1f : .5f);
}
public void enableClearButton(boolean enabled) {
mClearVisible = enabled;
setClearButtonVisibility(selectedDateTime.getText().length() > 0);
}
public void setDateType(DateType dateType) {
mDateType = dateType;
updateViews();
}
public void setLabel(String title) {
label.setText(title);
}
public void setPreview(String preview) {
selectedDateTime.setText(preview);
}
public void setDate(Calendar date) {
String dateText = null;
if (date != null) {
dateText = mUserDateFormat.format(date.getTime());
}
selectedDateTime.setText(dateText != null ? dateText : getContext().getString(R.string.empty_text_place_holder));
}
@NonNull
public Calendar getDate() {
Calendar calendar = Calendar.getInstance();
String date = selectedDateTime.getText().toString();
try {
Date parsedDate = mUserDateFormat.parse(date);
calendar.setTime(parsedDate);
} catch (ParseException e) {
return calendar;
}
return calendar;
}
private void setClearButtonVisibility(boolean visible) {
btnClear.setVisibility(visible && mClearVisible ? View.VISIBLE : View.GONE);
clearDivider.setVisibility(visible && mClearVisible ? View.VISIBLE : View.GONE);
}
private void updateViews() {
switch (mDateType) {
case DATE:
btnTime.setVisibility(View.GONE);
dateTimeDivider.setVisibility(View.GONE);
mUserDateFormat = new SimpleDateFormat(DEFAULT_DATE_FORMAT, Locale.getDefault());
break;
case TIME:
btnDate.setVisibility(View.GONE);
dateTimeDivider.setVisibility(View.GONE);
mUserDateFormat = new SimpleDateFormat(DEFAULT_TIME_FORMAT, Locale.getDefault());
break;
default:
mUserDateFormat = new SimpleDateFormat(DEFAULT_DATE_TIME_FORMAT, Locale.getDefault());
btnTime.setVisibility(View.VISIBLE);
dateTimeDivider.setVisibility(View.VISIBLE);
btnDate.setVisibility(View.VISIBLE);
dateTimeDivider.setVisibility(View.VISIBLE);
}
}
public TextView getErrorView() {
return errorText;
}
public enum DateType {
DATE,
TIME,
DATE_TIME
}
public interface DateTimeClickListener {
void onDateClick(int position);
void onTimeClick(int position);
void onClear(int position);
}
@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
selectedDateTime.removeTextChangedListener(dateTextWatcher);
}
private class Watcher implements TextWatcher {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
if (mClearVisible) {
setClearButtonVisibility(!s.toString().equals(InputControlWrapper.NOTHING_SUBSTITUTE_LABEL));
}
}
@Override
public void afterTextChanged(Editable s) {
}
}
}