Fix HistoryEditorDialog

pull/145/head
Alinson S. Xavier 9 years ago
parent f0c62a5908
commit a90e26691f

@ -19,30 +19,18 @@
package org.isoron.uhabits;
import org.isoron.uhabits.commands.ArchiveHabitsCommand;
import org.isoron.uhabits.commands.ChangeHabitColorCommand;
import org.isoron.uhabits.commands.CreateHabitCommand;
import org.isoron.uhabits.commands.DeleteHabitsCommand;
import org.isoron.uhabits.commands.EditHabitCommand;
import org.isoron.uhabits.commands.UnarchiveHabitsCommand;
import org.isoron.uhabits.io.AbstractImporter;
import org.isoron.uhabits.io.HabitsCSVExporter;
import org.isoron.uhabits.models.Habit;
import org.isoron.uhabits.tasks.ToggleRepetitionTask;
import org.isoron.uhabits.ui.BaseSystem;
import org.isoron.uhabits.ui.habits.edit.BaseDialogFragment;
import org.isoron.uhabits.ui.habits.edit.HistoryEditorDialog;
import org.isoron.uhabits.ui.habits.list.ListHabitsActivity;
import org.isoron.uhabits.ui.habits.list.ListHabitsController;
import org.isoron.uhabits.ui.habits.list.ListHabitsSelectionMenu;
import org.isoron.uhabits.ui.habits.list.controllers.CheckmarkButtonController;
import org.isoron.uhabits.ui.habits.list.model.HabitCardListAdapter;
import org.isoron.uhabits.ui.habits.list.model.HabitCardListCache;
import org.isoron.uhabits.ui.habits.list.model.HintList;
import org.isoron.uhabits.ui.habits.list.views.CheckmarkPanelView;
import org.isoron.uhabits.ui.habits.show.ShowHabitActivity;
import org.isoron.uhabits.widgets.BaseWidgetProvider;
import org.isoron.uhabits.widgets.HabitPickerDialog;
import org.isoron.uhabits.commands.*;
import org.isoron.uhabits.io.*;
import org.isoron.uhabits.models.*;
import org.isoron.uhabits.tasks.*;
import org.isoron.uhabits.ui.*;
import org.isoron.uhabits.ui.habits.edit.*;
import org.isoron.uhabits.ui.habits.list.*;
import org.isoron.uhabits.ui.habits.list.controllers.*;
import org.isoron.uhabits.ui.habits.list.model.*;
import org.isoron.uhabits.ui.habits.list.views.*;
import org.isoron.uhabits.ui.habits.show.*;
import org.isoron.uhabits.widgets.*;
/**
* Base component for dependency injection.
@ -100,4 +88,6 @@ public interface BaseComponent
void inject(HabitsCSVExporter habitsCSVExporter);
void inject(BaseDialogFragment baseDialogFragment);
void inject(ShowHabitController showHabitController);
}

@ -21,6 +21,7 @@ package org.isoron.uhabits.tasks;
import android.os.AsyncTask;
import android.os.Build;
import android.support.annotation.*;
import java.util.concurrent.TimeoutException;
@ -28,6 +29,7 @@ public abstract class BaseTask extends AsyncTask<Void, Integer, Void>
{
private static int activeTaskCount;
@CallSuper
@Override
protected void onPreExecute()
{
@ -35,6 +37,7 @@ public abstract class BaseTask extends AsyncTask<Void, Integer, Void>
activeTaskCount++;
}
@CallSuper
@Override
protected void onPostExecute(Void aVoid)
{

@ -0,0 +1,42 @@
/*
* 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.tasks;
public class SimpleTask
{
private final BaseTask baseTask;
public SimpleTask(Runnable runnable)
{
this.baseTask = new BaseTask()
{
@Override
protected void doInBackground()
{
runnable.run();
}
};
}
public void execute()
{
baseTask.execute();
}
}

@ -234,17 +234,19 @@ public abstract class BaseScreen
{
if (rootView == null) return;
Toolbar toolbar = rootView.getToolbar();
activity.setSupportActionBar(toolbar);
ActionBar actionBar = activity.getSupportActionBar();
if (actionBar == null) return;
actionBar.setDisplayHomeAsUpEnabled(rootView.getDisplayHomeAsUp());
int color = rootView.getToolbarColor();
setActionBarColor(actionBar, color);
setStatusBarColor(color);
setupToolbarElevation(toolbar);
activity.runOnUiThread(() -> {
Toolbar toolbar = rootView.getToolbar();
activity.setSupportActionBar(toolbar);
ActionBar actionBar = activity.getSupportActionBar();
if (actionBar == null) return;
actionBar.setDisplayHomeAsUpEnabled(rootView.getDisplayHomeAsUp());
int color = rootView.getToolbarColor();
setActionBarColor(actionBar, color);
setStatusBarColor(color);
setupToolbarElevation(toolbar);
});
}
private void setActionBarColor(@NonNull ActionBar actionBar, int color)

@ -22,6 +22,7 @@ package org.isoron.uhabits.ui.common.views;
import android.content.*;
import android.graphics.*;
import android.graphics.Paint.*;
import android.support.annotation.*;
import android.util.*;
import android.view.*;
@ -82,6 +83,9 @@ public class HistoryChart extends ScrollableChart
private float headerOverflow = 0;
@NonNull
private Controller controller;
public HistoryChart(Context context)
{
super(context);
@ -114,13 +118,12 @@ public class HistoryChart extends ScrollableChart
final Long timestamp = positionToTimestamp(x, y);
if (timestamp == null) return false;
// ToggleRepetitionTask task = new ToggleRepetitionTask(habit, timestamp);
// task.setListener(this);
// task.execute();
controller.onToggleCheckmark(timestamp);
return true;
}
public void populateWithRandomData()
{
Random random = new Random();
@ -152,6 +155,11 @@ public class HistoryChart extends ScrollableChart
postInvalidate();
}
public void setController(@NonNull Controller controller)
{
this.controller = controller;
}
public void setIsBackgroundTransparent(boolean isBackgroundTransparent)
{
this.isBackgroundTransparent = isBackgroundTransparent;
@ -330,6 +338,7 @@ public class HistoryChart extends ScrollableChart
{
isEditable = false;
checkmarks = new int[0];
controller = new Controller() {};
initColors();
initPaints();
@ -412,4 +421,9 @@ public class HistoryChart extends ScrollableChart
baseDate.add(Calendar.DAY_OF_YEAR, -nDays);
baseDate.add(Calendar.DAY_OF_YEAR, -todayPositionInColumn);
}
public interface Controller
{
default void onToggleCheckmark(long timestamp) {}
}
}

@ -19,42 +19,56 @@
package org.isoron.uhabits.ui.habits.edit;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.os.Bundle;
import android.app.*;
import android.content.*;
import android.os.*;
import android.support.annotation.*;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatDialogFragment;
import android.util.DisplayMetrics;
import android.support.v7.app.*;
import android.util.*;
import org.apache.commons.lang3.*;
import org.isoron.uhabits.HabitsApplication;
import org.isoron.uhabits.R;
import org.isoron.uhabits.models.Habit;
import org.isoron.uhabits.models.HabitList;
import org.isoron.uhabits.tasks.BaseTask;
import org.isoron.uhabits.ui.common.views.HistoryChart;
import org.isoron.uhabits.*;
import org.isoron.uhabits.models.*;
import org.isoron.uhabits.tasks.*;
import org.isoron.uhabits.ui.common.views.*;
import org.isoron.uhabits.utils.*;
import javax.inject.Inject;
import javax.inject.*;
public class HistoryEditorDialog extends AppCompatDialogFragment
implements DialogInterface.OnClickListener
implements DialogInterface.OnClickListener, ModelObservable.Listener
{
@Nullable
private Habit habit;
private Listener listener;
@Nullable
HistoryChart historyChart;
@Inject
HabitList habitList;
@NonNull
private Controller controller;
public HistoryEditorDialog()
{
this.controller = new Controller() {};
}
@Override
public void onClick(DialogInterface dialog, int which)
{
dismiss();
}
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState)
public Dialog onCreateDialog(@Nullable Bundle savedInstanceState)
{
Context context = getActivity();
HabitsApplication.getComponent().inject(this);
historyChart = new HistoryChart(context, null);
historyChart = new HistoryChart(context);
historyChart.setController(controller);
if (savedInstanceState != null)
{
@ -65,9 +79,7 @@ public class HistoryEditorDialog extends AppCompatDialogFragment
int padding =
(int) getResources().getDimension(R.dimen.history_editor_padding);
if(true) throw new NotImplementedException("");
historyChart.setPadding(padding, 0, padding, 0);
// historyChart.setHabit(habit);
historyChart.setIsEditable(true);
AlertDialog.Builder builder = new AlertDialog.Builder(context);
@ -76,21 +88,13 @@ public class HistoryEditorDialog extends AppCompatDialogFragment
.setView(historyChart)
.setPositiveButton(android.R.string.ok, this);
refreshData();
return builder.create();
}
private void refreshData()
@Override
public void onModelChange()
{
new BaseTask()
{
@Override
protected void doInBackground()
{
// historyChart.refreshData();
}
}.execute();
refreshData();
}
@Override
@ -105,25 +109,16 @@ public class HistoryEditorDialog extends AppCompatDialogFragment
int height = Math.min(metrics.heightPixels, maxHeight);
getDialog().getWindow().setLayout(width, height);
}
@Override
public void onClick(DialogInterface dialog, int which)
{
dismiss();
}
public void setHabit(Habit habit)
{
// this.habit = habit;
// if (historyChart != null) historyChart.setHabit(habit);
refreshData();
habit.getCheckmarks().observable.addListener(this);
}
@Override
public void onPause()
{
habit.getCheckmarks().observable.removeListener(this);
super.onPause();
if (listener != null) listener.onHistoryEditorClosed();
}
@Override
@ -132,13 +127,42 @@ public class HistoryEditorDialog extends AppCompatDialogFragment
outState.putLong("habit", habit.getId());
}
public void setListener(Listener listener)
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()
{
this.listener = listener;
if (habit == null) return;
new RefreshTask().execute();
}
public interface Listener
public interface Controller extends HistoryChart.Controller {}
private class RefreshTask extends BaseTask
{
void onHistoryEditorClosed();
public int[] checkmarks;
@Override
protected void doInBackground()
{
checkmarks = habit.getCheckmarks().getAllValues();
}
@Override
protected void onPostExecute(Void aVoid)
{
int color = ColorUtils.getColor(getContext(), habit.getColor());
historyChart.setColor(color);
historyChart.setCheckmarks(checkmarks);
super.onPostExecute(aVoid);
}
}
}

@ -48,7 +48,14 @@ public class ShowHabitActivity extends BaseActivity
Habit habit = getHabitFromIntent();
ShowHabitScreen screen = new ShowHabitScreen(this, habit);
setScreen(screen);
ShowHabitRootView view = new ShowHabitRootView(this, habit);
screen.setRootView(view);
this.setScreen(screen);
ShowHabitsMenu menu = new ShowHabitsMenu(this, screen);
ShowHabitController controller = new ShowHabitController(screen, habit);
screen.setMenu(menu);
view.setController(controller);
}
@NonNull

@ -0,0 +1,73 @@
/*
* 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.ui.habits.show;
import android.support.annotation.*;
import org.isoron.uhabits.*;
import org.isoron.uhabits.commands.*;
import org.isoron.uhabits.models.*;
import org.isoron.uhabits.tasks.*;
import org.isoron.uhabits.ui.habits.edit.*;
import javax.inject.*;
public class ShowHabitController implements ShowHabitRootView.Controller,
HistoryEditorDialog.Controller
{
@NonNull
private final ShowHabitScreen screen;
@NonNull
private final Habit habit;
@Inject
CommandRunner commandRunner;
public ShowHabitController(@NonNull ShowHabitScreen screen,
@NonNull Habit habit)
{
HabitsApplication.getComponent().inject(this);
this.screen = screen;
this.habit = habit;
}
@Override
public void onToolbarChanged()
{
screen.invalidateToolbar();
}
@Override
public void onEditHistoryButtonClick()
{
screen.showEditHistoryDialog(this);
}
@Override
public void onToggleCheckmark(long timestamp)
{
new SimpleTask(() -> {
ToggleRepetitionCommand command;
command = new ToggleRepetitionCommand(habit, timestamp);
commandRunner.execute(command, null);
}).execute();
}
}

@ -33,7 +33,8 @@ import butterknife.*;
import static org.isoron.uhabits.utils.InterfaceUtils.*;
public class ShowHabitRootView extends BaseRootView implements ModelObservable.Listener
public class ShowHabitRootView extends BaseRootView
implements ModelObservable.Listener
{
@NonNull
private Habit habit;
@ -59,43 +60,24 @@ public class ShowHabitRootView extends BaseRootView implements ModelObservable.L
@BindView(R.id.toolbar)
Toolbar toolbar;
private final ShowHabitScreen screen;
@NonNull
private Controller controller;
public ShowHabitRootView(@NonNull Context context,
@NonNull Habit habit,
@NonNull ShowHabitScreen screen)
@NonNull Habit habit)
{
super(context);
this.habit = habit;
this.screen = screen;
addView(inflate(getContext(), R.layout.show_habit, null));
ButterKnife.bind(this);
controller = new Controller() {};
initCards();
initToolbar();
}
@Override
public void onModelChange()
{
post(() -> screen.invalidateToolbar());
}
@Override
protected void onAttachedToWindow()
{
super.onAttachedToWindow();
habit.getObservable().addListener(this);
}
@Override
protected void onDetachedFromWindow()
{
habit.getObservable().removeListener(this);
super.onDetachedFromWindow();
}
@Override
public boolean getDisplayHomeAsUp()
{
@ -109,6 +91,12 @@ public class ShowHabitRootView extends BaseRootView implements ModelObservable.L
return toolbar;
}
public void setController(@NonNull Controller controller)
{
this.controller = controller;
historyCard.setController(controller);
}
@Override
public int getToolbarColor()
{
@ -118,6 +106,12 @@ public class ShowHabitRootView extends BaseRootView implements ModelObservable.L
return ColorUtils.getColor(getContext(), habit.getColor());
}
@Override
public void onModelChange()
{
controller.onToolbarChanged();
}
@Override
protected void initToolbar()
{
@ -125,6 +119,20 @@ public class ShowHabitRootView extends BaseRootView implements ModelObservable.L
toolbar.setTitle(habit.getName());
}
@Override
protected void onAttachedToWindow()
{
super.onAttachedToWindow();
habit.getObservable().addListener(this);
}
@Override
protected void onDetachedFromWindow()
{
habit.getObservable().removeListener(this);
super.onDetachedFromWindow();
}
private void initCards()
{
subtitleCard.setHabit(habit);
@ -134,4 +142,9 @@ public class ShowHabitRootView extends BaseRootView implements ModelObservable.L
streakCard.setHabit(habit);
frequencyCard.setHabit(habit);
}
public interface Controller extends HistoryCard.Controller
{
default void onToolbarChanged(){}
}
}

@ -35,19 +35,23 @@ public class ShowHabitScreen extends BaseScreen
{
super(activity);
this.habit = habit;
ShowHabitRootView view = new ShowHabitRootView(activity, habit, this);
ShowHabitsMenu menu = new ShowHabitsMenu(activity, this);
setRootView(view);
setMenu(menu);
}
public void showEditHabitDialog()
{
Long id = habit.getId();
if (id == null) throw new RuntimeException("habit not saved");
FragmentManager manager = activity.getSupportFragmentManager();
EditHabitDialogFragment
.newInstance(habit.getId())
.show(manager, "editHabit");
EditHabitDialogFragment.newInstance(id).show(manager, "editHabit");
}
public void showEditHistoryDialog(
@NonNull HistoryEditorDialog.Controller controller)
{
HistoryEditorDialog dialog = new HistoryEditorDialog();
dialog.setHabit(habit);
dialog.setController(controller);
dialog.show(activity.getSupportFragmentManager(), "historyEditor");
}
}

@ -20,6 +20,7 @@
package org.isoron.uhabits.ui.habits.show.views;
import android.content.*;
import android.support.annotation.*;
import android.util.*;
import android.widget.*;
@ -39,6 +40,9 @@ public class HistoryCard extends HabitCard
@BindView(R.id.title)
TextView title;
@NonNull
private Controller controller;
public HistoryCard(Context context)
{
super(context);
@ -55,10 +59,13 @@ public class HistoryCard extends HabitCard
public void onClickEditButton()
{
Log.d("HistoryCard", "onClickEditButton");
controller.onEditHistoryButtonClick();
}
// HistoryEditorDialog frag = new HistoryEditorDialog();
// frag.setHabit(habit);
// frag.show(getContext().getFragmentManager(), "historyEditor");
public void setController(@NonNull Controller controller)
{
this.controller = controller;
chart.setController(controller);
}
@Override
@ -90,7 +97,7 @@ public class HistoryCard extends HabitCard
{
inflate(getContext(), R.layout.show_habit_history, this);
ButterKnife.bind(this);
controller = new Controller() {};
if (isInEditMode()) initEditMode();
}
@ -101,4 +108,9 @@ public class HistoryCard extends HabitCard
chart.setColor(color);
chart.populateWithRandomData();
}
public interface Controller extends HistoryChart.Controller
{
default void onEditHistoryButtonClick() {}
}
}

@ -58,7 +58,7 @@ public class StreakCard extends HabitCard
@Override
protected void refreshData()
{
new MyBaseTask().execute();
new RefreshTask().execute();
}
private void init()
@ -77,20 +77,21 @@ public class StreakCard extends HabitCard
streakChart.populateWithRandomData();
}
private class MyBaseTask extends BaseTask
private class RefreshTask extends BaseTask
{
public List<Streak> streaks;
public List<Streak> bestStreaks;
@Override
protected void doInBackground()
{
streaks = getHabit().getStreaks().getBest(NUM_STREAKS);
StreakList streaks = getHabit().getStreaks();
bestStreaks = streaks.getBest(NUM_STREAKS);
}
@Override
protected void onPostExecute(Void aVoid)
{
streakChart.setStreaks(streaks);
streakChart.setStreaks(bestStreaks);
super.onPostExecute(aVoid);
}

Loading…
Cancel
Save