/* * 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.common.dialogs; import android.app.*; import android.content.*; import android.os.*; import android.support.annotation.*; import android.support.v7.app.AlertDialog; import android.support.v7.app.*; import android.util.*; import org.isoron.uhabits.*; import org.isoron.uhabits.activities.common.views.*; import org.isoron.uhabits.models.*; import org.isoron.uhabits.tasks.*; import org.isoron.uhabits.utils.*; public class HistoryEditorDialog extends AppCompatDialogFragment implements DialogInterface.OnClickListener, ModelObservable.Listener { @Nullable private Habit habit; @Nullable HistoryChart historyChart; @NonNull private Controller controller; private HabitList habitList; private TaskRunner taskRunner; public HistoryEditorDialog() { this.controller = new Controller() {}; } @Override public void onClick(DialogInterface dialog, int which) { dismiss(); } @NonNull @Override public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) { Context context = getActivity(); HabitsApplication app = (HabitsApplication) getActivity().getApplicationContext(); habitList = app.getComponent().getHabitList(); taskRunner = app.getComponent().getTaskRunner(); historyChart = new HistoryChart(context); historyChart.setController(controller); if (savedInstanceState != null) { long id = savedInstanceState.getLong("habit", -1); if (id > 0) this.habit = habitList.getById(id); historyChart.onRestoreInstanceState( savedInstanceState.getParcelable("historyChart")); } int padding = (int) getResources().getDimension(R.dimen.history_editor_padding); historyChart.setPadding(padding, 0, padding, 0); historyChart.setIsEditable(true); AlertDialog.Builder builder = new AlertDialog.Builder(context); builder .setTitle(R.string.history) .setView(historyChart) .setPositiveButton(android.R.string.ok, this); return builder.create(); } @Override public void onModelChange() { refreshData(); } @Override public void onPause() { habit.getCheckmarks().observable.removeListener(this); super.onPause(); } @Override public void onResume() { super.onResume(); DisplayMetrics metrics = getResources().getDisplayMetrics(); int maxHeight = getResources().getDimensionPixelSize( R.dimen.history_editor_max_height); int width = metrics.widthPixels; int height = Math.min(metrics.heightPixels, maxHeight); getDialog().getWindow().setLayout(width, height); refreshData(); habit.getCheckmarks().observable.addListener(this); } @Override public void onSaveInstanceState(Bundle outState) { outState.putLong("habit", habit.getId()); outState.putParcelable("historyChart", historyChart.onSaveInstanceState()); } public void setController(@NonNull Controller controller) { this.controller = controller; if (historyChart != null) historyChart.setController(controller); } public void setHabit(@Nullable Habit habit) { this.habit = habit; } private void refreshData() { if (habit == null) return; taskRunner.execute(new RefreshTask()); } public interface Controller extends HistoryChart.Controller {} private class RefreshTask implements Task { public int[] checkmarks; @Override public void doInBackground() { checkmarks = habit.getCheckmarks().getAllValues(); } @Override public void onPostExecute() { if (getContext() == null || habit == null || historyChart == null) return; int color = ColorUtils.getColor(getContext(), habit.getColor()); historyChart.setColor(color); historyChart.setCheckmarks(checkmarks); } } }