com.robwilliamson.healthyesther.fragment.edit.EditEventFragment.java Source code

Java tutorial

Introduction

Here is the source code for com.robwilliamson.healthyesther.fragment.edit.EditEventFragment.java

Source

/**
  *  Robert Williamson 2014-2016.
  * This program is distributed under the terms of the GNU General Public License.
  */
package com.robwilliamson.healthyesther.fragment.edit;

import android.os.Bundle;
import android.support.annotation.NonNull;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.View;
import android.widget.AutoCompleteTextView;
import android.widget.Button;

import com.robwilliamson.healthyesther.R;
import com.robwilliamson.healthyesther.db.Utils;
import com.robwilliamson.healthyesther.db.generated.EventTable;
import com.robwilliamson.healthyesther.fragment.dialog.DatePickerFragment;
import com.robwilliamson.healthyesther.fragment.dialog.DateTimePickerListener;
import com.robwilliamson.healthyesther.fragment.dialog.TimePickerFragment;

import org.joda.time.DateTime;
import org.joda.time.format.DateTimeFormat;

import javax.annotation.Nonnull;
import javax.annotation.Nullable;

/**
 * Allows the user to edit an event's name and when properties.
 */
public class EditEventFragment extends EditFragment<EventTable.Row> implements DateTimePickerListener {
    private boolean mUserEditedEventName;
    private boolean mSettingRowName;
    private boolean mRowNameSet;

    public static EditEventFragment getInstance(@Nonnull EventTable.Row row) {
        EditEventFragment fragment = new EditEventFragment();
        fragment.setRow(row);
        return fragment;
    }

    @Override
    public void setRow(@NonNull EventTable.Row row) {
        super.setRow(row);
        mRowNameSet = !Utils.Strings.nullOrEmpty(row.getName());
        updateUi();
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        if (savedInstanceState != null && savedInstanceState.containsKey(EventTable.NAME)) {
            EventTable.Row row = (EventTable.Row) savedInstanceState.getSerializable(EventTable.NAME);
            if (row != null) {
                setRow(row);
            }
        }

        updateUi();
    }

    @Override
    public void onResume() {
        super.onResume();

        getTimeButton().setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                TimePickerFragment dialog = new TimePickerFragment();
                dialog.setListener(EditEventFragment.this);
                dialog.show(getFragmentManager(), getWhen());
            }
        });

        getDateButton().setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                DatePickerFragment dialog = new DatePickerFragment();
                dialog.setListener(EditEventFragment.this);
                dialog.show(getFragmentManager(), getWhen());
            }
        });

        getNameView().setOnFocusChangeListener(createFocusChangeListener());

        getNameView().addTextChangedListener(createTextChangedListener());

        updateUi();
    }

    @Nonnull
    View.OnFocusChangeListener createFocusChangeListener() {
        return new View.OnFocusChangeListener() {
            @Override
            public void onFocusChange(View v, boolean hasFocus) {
                mUserEditedEventName = !getName().isEmpty();
                mRowNameSet = false;
            }
        };
    }

    @Nonnull
    TextWatcher createTextChangedListener() {
        return new 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) {
            }

            @Override
            public void afterTextChanged(Editable s) {
                if (mSettingRowName) {
                    return;
                }
                updateRowName(s.toString());
            }
        };
    }

    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putSerializable(EventTable.NAME, getRow());
    }

    @Override
    public void onDateTimeChange(DateTime dateTime) {
        if (getRow() != null) {
            getRow().setWhen(com.robwilliamson.healthyesther.db.includes.DateTime.from(dateTime));
        }
        updateUi();
    }

    @Override
    protected int getFragmentLayout() {
        return R.layout.fragment_edit_event;
    }

    @Nullable
    @Override
    protected EventTable.Row createRow() {
        throw new UnsupportedOperationException("The event has to be set by the owning activity.");
    }

    public void suggestEventName(String name) {
        if ((!getName().isEmpty() && mUserEditedEventName) || mRowNameSet) {
            return;
        }

        mUserEditedEventName = false;

        setName(name);
    }

    public String getName() {
        return getNameView().getText().toString();
    }

    public void setName(@Nullable String name) {
        updateRowName(name);

        updateUi();
    }

    private void updateRowName(@Nullable String name) {
        if (getRow() != null) {
            getRow().setName(name);
        }
    }

    public DateTime getWhen() {
        if (hasRow()) {
            //noinspection ConstantConditions
            return getRow().getWhen().as(DateTime.class);
        }

        return null;
    }

    public void setWhen(@Nonnull DateTime when) {
        if (hasRow()) {
            //noinspection ConstantConditions
            getRow().setWhen(com.robwilliamson.healthyesther.db.includes.DateTime.from(when));
        }
        updateUi();
    }

    public boolean isEventNameEditedByUser() {
        return mUserEditedEventName;
    }

    private void updateUi() {
        mSettingRowName = true;
        if (hasRow()) {
            @SuppressWarnings("ConstantConditions")
            @Nonnull
            EventTable.Row row = getRow();
            if (getNameView() != null) {
                String rowName = row.getName();
                Editable editable = getNameView().getEditableText();

                editable.clear();
                if (rowName != null) {
                    editable.append(rowName);
                }
            }

            if (getTimeButton() != null) {
                getTimeButton()
                        .setText(Utils.Time.toString(row.getWhen().as(DateTime.class), DateTimeFormat.shortTime()));
            }

            if (getDateButton() != null) {
                getDateButton().setText(
                        Utils.Time.toString(row.getWhen().as(DateTime.class), DateTimeFormat.mediumDate()));
            }
        }
        mSettingRowName = false;
    }

    protected Button getTimeButton() {
        return getButton(R.id.edit_event_time_button);
    }

    protected Button getDateButton() {
        return getButton(R.id.edit_event_date_button);
    }

    protected Button getButton(int id) {
        return getTypeSafeView(id, Button.class);
    }

    protected AutoCompleteTextView getNameView() {
        return getTypeSafeView(R.id.edit_event_name, AutoCompleteTextView.class);
    }
}