Java tutorial
/* * 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); } }