/* * Copyright (C) 2016 Álinson Santos Xavier <isoron@gmail.com> * * This file is part of Loop Habit Tracker. * * Loop Habit Tracker is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by the * Free Software Foundation, either version 3 of the License, or (at your * option) any later version. * * Loop Habit Tracker 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 General Public License for * more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see <http://www.gnu.org/licenses/>. */ package org.isoron.uhabits.activities.habits.edit; import android.os.*; import android.support.annotation.*; import android.support.v7.app.*; import android.text.format.*; import android.view.*; import com.android.datetimepicker.time.*; import org.isoron.uhabits.*; import org.isoron.uhabits.R; import org.isoron.uhabits.activities.*; import org.isoron.uhabits.activities.common.dialogs.*; import org.isoron.uhabits.commands.*; import org.isoron.uhabits.models.*; import org.isoron.uhabits.preferences.*; import java.util.*; import butterknife.*; public abstract class BaseDialog extends AppCompatDialogFragment { @Nullable protected Habit originalHabit; @Nullable protected Habit modifiedHabit; @Nullable protected BaseDialogHelper helper; protected Preferences prefs; protected CommandRunner commandRunner; protected HabitList habitList; protected AppComponent appComponent; protected ModelFactory modelFactory; private ColorPickerDialogFactory colorPickerDialogFactory; @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); BaseActivity activity = (BaseActivity) getActivity(); colorPickerDialogFactory = activity.getComponent().getColorPickerDialogFactory(); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.edit_habit, container, false); HabitsApplication app = (HabitsApplication) getContext().getApplicationContext(); appComponent = app.getComponent(); prefs = appComponent.getPreferences(); habitList = appComponent.getHabitList(); commandRunner = appComponent.getCommandRunner(); modelFactory = appComponent.getModelFactory(); ButterKnife.bind(this, view); helper = new BaseDialogHelper(this, view); getDialog().setTitle(getTitle()); initializeHabits(); restoreSavedInstance(savedInstanceState); helper.populateForm(modifiedHabit); return view; } @OnItemSelected(R.id.sFrequency) public void onFrequencySelected(int position) { if (position < 0 || position > 4) throw new IllegalArgumentException(); int freqNums[] = { 1, 1, 2, 5, 3 }; int freqDens[] = { 1, 7, 7, 7, 7 }; modifiedHabit.setFrequency( new Frequency(freqNums[position], freqDens[position])); helper.populateFrequencyFields(modifiedHabit); } @Override @SuppressWarnings("ConstantConditions") public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putInt("color", modifiedHabit.getColor()); if (modifiedHabit.hasReminder()) { Reminder reminder = modifiedHabit.getReminder(); outState.putInt("reminderMin", reminder.getMinute()); outState.putInt("reminderHour", reminder.getHour()); outState.putInt("reminderDays", reminder.getDays().toInteger()); } } protected abstract int getTitle(); protected abstract void initializeHabits(); protected void restoreSavedInstance(@Nullable Bundle bundle) { if (bundle == null) return; modifiedHabit.setColor( bundle.getInt("color", modifiedHabit.getColor())); modifiedHabit.setReminder(null); int hour = (bundle.getInt("reminderHour", -1)); int minute = (bundle.getInt("reminderMin", -1)); int days = (bundle.getInt("reminderDays", -1)); if (hour >= 0 && minute >= 0) { Reminder reminder = new Reminder(hour, minute, new WeekdayList(days)); modifiedHabit.setReminder(reminder); } } protected abstract void saveHabit(); @OnClick(R.id.buttonDiscard) void onButtonDiscardClick() { dismiss(); } @OnClick(R.id.tvReminderTime) @SuppressWarnings("ConstantConditions") void onDateSpinnerClick() { int defaultHour = 8; int defaultMin = 0; if (modifiedHabit.hasReminder()) { Reminder reminder = modifiedHabit.getReminder(); defaultHour = reminder.getHour(); defaultMin = reminder.getMinute(); } showTimePicker(defaultHour, defaultMin); } @OnClick(R.id.buttonSave) void onSaveButtonClick() { helper.parseFormIntoHabit(modifiedHabit); if (!helper.validate(modifiedHabit)) return; saveHabit(); dismiss(); } @OnClick(R.id.tvReminderDays) @SuppressWarnings("ConstantConditions") void onWeekdayClick() { if (!modifiedHabit.hasReminder()) return; Reminder reminder = modifiedHabit.getReminder(); WeekdayPickerDialog dialog = new WeekdayPickerDialog(); dialog.setListener(new OnWeekdaysPickedListener()); dialog.setSelectedDays(reminder.getDays().toArray()); dialog.show(getFragmentManager(), "weekdayPicker"); } @OnClick(R.id.buttonPickColor) void showColorPicker() { int color = modifiedHabit.getColor(); ColorPickerDialog picker = colorPickerDialogFactory.create(color); picker.setListener(c -> { prefs.setDefaultHabitColor(c); modifiedHabit.setColor(c); helper.populateColor(c); }); picker.show(getFragmentManager(), "picker"); } private void showTimePicker(int defaultHour, int defaultMin) { boolean is24HourMode = DateFormat.is24HourFormat(getContext()); TimePickerDialog timePicker = TimePickerDialog.newInstance(new OnTimeSetListener(), defaultHour, defaultMin, is24HourMode); timePicker.show(getFragmentManager(), "timePicker"); } private class OnTimeSetListener implements TimePickerDialog.OnTimeSetListener { @Override public void onTimeCleared(RadialPickerLayout view) { modifiedHabit.clearReminder(); helper.populateReminderFields(modifiedHabit); } @Override public void onTimeSet(RadialPickerLayout view, int hour, int minute) { Reminder reminder = new Reminder(hour, minute, WeekdayList.EVERY_DAY); modifiedHabit.setReminder(reminder); helper.populateReminderFields(modifiedHabit); } } private class OnWeekdaysPickedListener implements WeekdayPickerDialog.OnWeekdaysPickedListener { @Override public void onWeekdaysPicked(boolean[] selectedDays) { if (isSelectionEmpty(selectedDays)) Arrays.fill(selectedDays, true); Reminder oldReminder = modifiedHabit.getReminder(); modifiedHabit.setReminder( new Reminder(oldReminder.getHour(), oldReminder.getMinute(), new WeekdayList(selectedDays))); helper.populateReminderFields(modifiedHabit); } private boolean isSelectionEmpty(boolean[] selectedDays) { for (boolean d : selectedDays) if (d) return false; return true; } } }