com.kccomy.orgar.ui.editor.NodeEditorFragment.java Source code

Java tutorial

Introduction

Here is the source code for com.kccomy.orgar.ui.editor.NodeEditorFragment.java

Source

/*
 * Copyright (C) 2016. kccomy, Orgar
 *
 * 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 com.kccomy.orgar.ui.editor;

import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.util.Log;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.Spinner;

import com.kccomy.orgar.R;
import com.kccomy.orgar.data.OrgRepository;
import com.kccomy.orgar.di.component.FileListActivityComponent;
import com.kccomy.orgar.module.SerializedOrgFile;
import com.kccomy.orgar.module.TreeNode;
import com.kccomy.orgar.ui.base.BaseFragment;
import com.wdullaer.materialdatetimepicker.date.DatePickerDialog;
import com.wdullaer.materialdatetimepicker.time.RadialPickerLayout;
import com.wdullaer.materialdatetimepicker.time.TimePickerDialog;

import org.cowboyprogrammer.org.OrgFile;
import org.cowboyprogrammer.org.OrgNode;
import org.cowboyprogrammer.org.OrgTimestamp;
import org.cowboyprogrammer.org.parser.RegexParser;
import org.joda.time.LocalDateTime;
import org.joda.time.LocalTime;

import java.util.Arrays;
import java.util.Calendar;

import javax.inject.Inject;

import butterknife.BindArray;
import butterknife.BindView;
import butterknife.OnClick;
import rx.android.schedulers.AndroidSchedulers;
import rx.schedulers.Schedulers;

public class NodeEditorFragment extends BaseFragment
        implements com.wdullaer.materialdatetimepicker.time.TimePickerDialog.OnTimeSetListener,
        com.wdullaer.materialdatetimepicker.date.DatePickerDialog.OnDateSetListener,
        AdapterView.OnItemSelectedListener, MenuItem.OnMenuItemClickListener {

    @Inject
    OrgRepository repository;

    @BindView(R.id.fragment_note_editor_spinner_todo)
    Spinner todoSpinner;

    @BindView(R.id.fragment_note_editor_spinner_priority)
    Spinner prioritySpinner;

    @BindView(R.id.fragment_note_editor_edt_header)
    EditText headerEdt;

    @BindView(R.id.fragment_note_editor_edt_body)
    EditText bodyEdt;

    @BindView(R.id.fragment_note_editor_btn_sceduled_date_picker)
    Button scheduledDateBtn;

    @BindView(R.id.fragment_note_editor_btn_sceduled_time_picker)
    Button scheduledTimeBtn;

    @BindView(R.id.fragment_note_editor_btn_deadline_date_picker)
    Button deadlineDateBtn;

    @BindView(R.id.fragment_note_editor_btn_deadline_time_picker)
    Button deadlineTimeBtn;

    @BindView(R.id.fragment_note_editor_img_closed)
    ImageView closedImg;

    @BindView(R.id.fragment_note_editor_btn_closed_date_picker)
    Button closedDateBtn;

    @BindView(R.id.fragment_note_editor_btn_closed_time_picker)
    Button closedTimeBtn;

    @BindArray(R.array.todo)
    String[] todoArray;

    @BindArray(R.array.priority)
    String[] priorityArray;

    private static final String DATE_FORMAT = "yyyy-MM-dd";
    private static final String TIME_FORMAT = "HH:mm";

    public enum EditAction {
        NEW, EDIT, ADD, ADD_SUB,
    }

    private EditAction action;

    private TreeNode treeNode;
    private OrgFile orgFile;

    private LocalDateTime scheduledDate;
    private LocalTime scheduledTime;
    private LocalDateTime deadlineDate;
    private LocalTime deadlineTime;

    @Override
    protected int getLayoutResId() {
        return R.layout.fragment_node_editor;
    }

    @Override
    protected void initVariables() {
        getComponent(FileListActivityComponent.class).inject(this);

        Bundle args = getArguments();
        action = EditAction.valueOf(args.getString("action"));
        orgFile = ((SerializedOrgFile) args.getSerializable("serialized_org_file")).get();
        treeNode = (TreeNode) args.getSerializable("node");

    }

    @Override
    protected void initViews(View view, Bundle savedInstanceState) {
        setHasOptionsMenu(true);

        FloatingActionButton fab = (FloatingActionButton) getActivity().findViewById(R.id.fab);
        fab.hide();

        if (treeNode != null && action.equals(EditAction.EDIT)) {
            //??

            headerEdt.setText(treeNode.getHeader());
            bodyEdt.setText(treeNode.getBody());

            LocalDateTime scheduled = treeNode.getTimestamp(OrgTimestamp.Type.SCHEDULED);

            if (scheduled != null) {
                scheduledDate = scheduled;
                scheduledTime = scheduled.toLocalTime();
                scheduledDateBtn.setText(scheduledDate.toString(DATE_FORMAT));
                scheduledTimeBtn.setText(scheduledTime.toString(TIME_FORMAT));
            }

            LocalDateTime deadline = treeNode.getTimestamp(OrgTimestamp.Type.DEADLINE);

            if (deadline != null) {
                deadlineDate = deadline;
                deadlineTime = deadline.toLocalTime();
                deadlineDateBtn.setText(deadlineDate.toString(DATE_FORMAT));
                deadlineTimeBtn.setText(deadlineTime.toString(TIME_FORMAT));
            }
        }

        ArrayAdapter<String> dataAdapter = new ArrayAdapter<>(getContext(), android.R.layout.simple_spinner_item,
                Arrays.asList(todoArray));
        dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

        todoSpinner.setAdapter(dataAdapter);
        todoSpinner.setOnItemSelectedListener(this);

        prioritySpinner.setOnItemSelectedListener(this);

        closedImg.setVisibility(View.GONE);
        closedDateBtn.setVisibility(View.GONE);
        closedTimeBtn.setVisibility(View.GONE);
    }

    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        inflater.inflate(R.menu.toolbar_node_editor, menu);
        menu.getItem(0).setOnMenuItemClickListener(this);
        menu.getItem(1).setOnMenuItemClickListener(this);
        super.onCreateOptionsMenu(menu, inflater);
    }

    @Override
    public boolean onMenuItemClick(MenuItem menuItem) {
        int id = menuItem.getItemId();

        if (id == R.id.action_cancel) {
            getFragmentManager().popBackStack();
        }

        if (id == R.id.actoin_save) {
            if (EditAction.NEW.equals(action)) {
                /**
                 * 
                 * 1. OrgNode?
                 * 2. OrgFile
                 * 3. ?OrgFile
                 */
                OrgNode node = new OrgNode(new RegexParser());
                node.setTitle(headerEdt.getText().toString());
                node.setBody(bodyEdt.getText().toString());
                node.setLevel(1);
                orgFile.getSubNodes().add(node);

            } else if (EditAction.EDIT.equals(action)) {

                treeNode.setHeader(headerEdt.getText().toString());
                treeNode.setBody(bodyEdt.getText().toString());
                if (scheduledDate != null) {
                    Log.d(TAG, scheduledDate.toString());
                    treeNode.setTimestamp(scheduledDate, OrgTimestamp.Type.SCHEDULED);
                }
                if (deadlineDate != null) {
                    treeNode.setTimestamp(deadlineDate, OrgTimestamp.Type.DEADLINE);
                }

            } else if (EditAction.ADD.equals(action)) {

                /**
                 * ??
                 * 1. OrgNode?
                 * 2. ?OrgNodeparent
                 * 3. OrgNodeparent?
                 */
                OrgNode node = new OrgNode(new RegexParser());
                node.setTitle(headerEdt.getText().toString());
                node.setBody(bodyEdt.getText().toString());
                node.setLevel(this.treeNode.getLevel());

                Log.d(TAG, "treeNode.getLevel() = " + treeNode.getLevel());
                OrgNode parent = this.treeNode.getParent().getOrgNode();
                node.setParent(parent);
                parent.getSubNodes().add(node);
            } else if (EditAction.ADD_SUB.equals(action)) {

                /**
                 * ?
                 * 1. OrgNode?
                 * 2. OrgNodeOrgNode
                 */

                OrgNode node = new OrgNode(new RegexParser());
                node.setTitle(headerEdt.getText().toString());
                node.setBody(bodyEdt.getText().toString());
                node.setLevel(treeNode.getLevel() + 1);
                node.setParent(treeNode.getOrgNode());
                treeNode.getOrgNode().getSubNodes().add(node);
            }

            repository.upload(orgFile).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread())
                    .subscribe();

            getFragmentManager().popBackStack();
        }

        return true;
    }

    @Override
    public void onItemSelected(AdapterView<?> parent, View view, int pos, long l) {
        Log.d(TAG, "spinner select: " + parent.getItemAtPosition(pos).toString());
        String item = parent.getItemAtPosition(pos).toString();

        if ("-".equals(item)) {
            return;
        }

        if (Arrays.asList(todoArray).contains(item)) {
            Log.d(TAG, "todo spinner selected");
            treeNode.setTodo(item);
        } else if (Arrays.asList(priorityArray).contains(item)) {
            Log.d(TAG, "priority spinner selected");
            treeNode.setPriority(item);
        }
    }

    @Override
    public void onNothingSelected(AdapterView<?> adapterView) {

    }

    @OnClick(R.id.fragment_note_editor_btn_sceduled_date_picker)
    public void showScheduledDatePicker() {
        showDatePickerDialog(OrgTimestamp.Type.SCHEDULED);
    }

    @OnClick(R.id.fragment_note_editor_btn_sceduled_time_picker)
    public void showScheduledTimePicker() {
        showTimePickerDialog(OrgTimestamp.Type.SCHEDULED);
    }

    @OnClick(R.id.fragment_note_editor_btn_deadline_date_picker)
    public void showDeadlineDatePicker() {
        showDatePickerDialog(OrgTimestamp.Type.DEADLINE);
    }

    @OnClick(R.id.fragment_note_editor_btn_deadline_time_picker)
    public void showDeadlineTimePicker() {
        showTimePickerDialog(OrgTimestamp.Type.DEADLINE);
    }

    private void showDatePickerDialog(OrgTimestamp.Type type) {

        LocalDateTime src = null;

        if (OrgTimestamp.Type.SCHEDULED.equals(type)) {
            src = scheduledDate;
        } else if (OrgTimestamp.Type.DEADLINE.equals(type)) {
            src = deadlineDate;
        }
        LocalDateTime date = src != null ? src : LocalDateTime.now();

        DatePickerDialog picker = DatePickerDialog.newInstance(this, date.getYear(), date.getMonthOfYear(),
                date.getDayOfMonth());
        picker.setAccentColor(getResources().getColor(R.color.colorAccent));
        picker.show(getActivity().getFragmentManager(), type.toString());
    }

    private void showTimePickerDialog(OrgTimestamp.Type type) {

        LocalTime src = null;

        if (OrgTimestamp.Type.SCHEDULED.equals(type)) {
            src = scheduledTime;
        } else if (OrgTimestamp.Type.DEADLINE.equals(type)) {
            src = deadlineTime;
        }

        LocalTime time = src != null ? src : LocalTime.now();

        TimePickerDialog picker = TimePickerDialog.newInstance(this, time.getHourOfDay(), time.getMinuteOfHour(),
                true);
        picker.setAccentColor(getResources().getColor(R.color.colorAccent));
        picker.show(getActivity().getFragmentManager(), type.toString());
    }

    @Override
    public void onDateSet(com.wdullaer.materialdatetimepicker.date.DatePickerDialog view, int year, int month,
            int day) {
        Calendar calendar = Calendar.getInstance();
        calendar.set(year, month, day);
        LocalDateTime date = LocalDateTime.fromCalendarFields(calendar);

        String tag = view.getTag();

        if (OrgTimestamp.Type.SCHEDULED.toString().equals(tag)) {

            scheduledDateBtn.setText(date.toString(DATE_FORMAT));
            scheduledDate = date;

            if (scheduledTime != null) {
                scheduledDate.withTime(scheduledTime.getHourOfDay(), scheduledTime.getMinuteOfHour(), 0, 0);
            }

        } else if (OrgTimestamp.Type.DEADLINE.toString().equals(tag)) {

            deadlineDateBtn.setText(date.toString(DATE_FORMAT));
            deadlineDate = date;

            if (deadlineTime != null) {
                deadlineDate.withTime(deadlineTime.getHourOfDay(), deadlineTime.getMinuteOfHour(), 0, 0);
            }
        }

    }

    @Override
    public void onTimeSet(RadialPickerLayout view, int hourOfDay, int minute, int second) {
        Calendar calendar = Calendar.getInstance();
        calendar.set(0, 0, 0, hourOfDay, minute, second);
        LocalTime time = LocalTime.fromCalendarFields(calendar);
        scheduledTimeBtn.setText(time.toString(TIME_FORMAT));
        scheduledTime = time;
        scheduledDate.withTime(time.getHourOfDay(), time.getMinuteOfHour(), 0, 0);
    }
}