Java tutorial
/* * Copyright 2017 Nafundi * * Licensed 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 org.odk.collect.android.widgets; import android.content.Context; import android.widget.Button; import android.widget.LinearLayout; import android.widget.TextView; import org.javarosa.core.model.data.DateData; import org.javarosa.core.model.data.IAnswerData; import org.javarosa.form.api.FormEntryPrompt; import org.joda.time.LocalDateTime; import org.odk.collect.android.R; import org.odk.collect.android.logic.DatePickerDetails; import org.odk.collect.android.utilities.DateTimeUtils; import org.odk.collect.android.widgets.interfaces.BinaryWidget; import java.util.Date; /** * @author Grzegorz Orczykowski (gorczykowski@soldevelo.com) */ public abstract class AbstractDateWidget extends QuestionWidget implements BinaryWidget { protected Button dateButton; protected TextView dateTextView; protected boolean isNullAnswer; protected LocalDateTime date; protected DatePickerDetails datePickerDetails; public AbstractDateWidget(Context context, FormEntryPrompt prompt) { super(context, prompt); createWidget(); } protected void createWidget() { datePickerDetails = DateTimeUtils .getDatePickerDetails(getFormEntryPrompt().getQuestion().getAppearanceAttr()); createDateButton(); dateTextView = getAnswerTextView(); addViews(); if (getFormEntryPrompt().getAnswerValue() == null) { clearAnswer(); setDateToCurrent(); } else { date = new LocalDateTime(getFormEntryPrompt().getAnswerValue().getValue()); setDateLabel(); } } @Override public void setOnLongClickListener(OnLongClickListener l) { dateButton.setOnLongClickListener(l); dateTextView.setOnLongClickListener(l); } @Override public void cancelLongPress() { super.cancelLongPress(); dateButton.cancelLongPress(); dateTextView.cancelLongPress(); } @Override public void clearAnswer() { isNullAnswer = true; dateTextView.setText(R.string.no_date_selected); setDateToCurrent(); } @Override public IAnswerData getAnswer() { clearFocus(); return isNullAnswer ? null : new DateData(date.toDate()); } @Override public void setBinaryData(Object answer) { if (answer instanceof LocalDateTime) { date = (LocalDateTime) answer; setDateLabel(); } } @Override public void onButtonClick(int buttonId) { showDatePickerDialog(); } public boolean isDayHidden() { return datePickerDetails.isMonthYearMode() || datePickerDetails.isYearMode(); } public LocalDateTime getDate() { return date; } public boolean isNullAnswer() { return isNullAnswer; } private void createDateButton() { dateButton = getSimpleButton(getContext().getString(R.string.select_date)); } private void addViews() { LinearLayout linearLayout = new LinearLayout(getContext()); linearLayout.setOrientation(LinearLayout.VERTICAL); linearLayout.addView(dateButton); linearLayout.addView(dateTextView); addAnswerView(linearLayout); } protected void setDateToCurrent() { date = LocalDateTime.now().withHourOfDay(0).withMinuteOfHour(0).withSecondOfMinute(0).withMillisOfSecond(0); } protected void setDateLabel() { isNullAnswer = false; dateTextView.setText(DateTimeUtils.getDateTimeLabel((Date) getAnswer().getValue(), datePickerDetails, false, getContext())); } protected abstract void showDatePickerDialog(); }