diff --git a/app/src/main/java/org/isoron/uhabits/activities/common/dialogs/HistoryEditorDialog.java b/app/src/main/java/org/isoron/uhabits/activities/common/dialogs/HistoryEditorDialog.java index a3b313413..f8a44b0f3 100644 --- a/app/src/main/java/org/isoron/uhabits/activities/common/dialogs/HistoryEditorDialog.java +++ b/app/src/main/java/org/isoron/uhabits/activities/common/dialogs/HistoryEditorDialog.java @@ -52,11 +52,6 @@ public class HistoryEditorDialog extends AppCompatDialogFragment public HistoryEditorDialog() { this.controller = new Controller() {}; - - HabitsApplication app = - (HabitsApplication) getContext().getApplicationContext(); - habitList = app.getComponent().getHabitList(); - taskRunner = app.getComponent().getTaskRunner(); } @Override @@ -70,6 +65,12 @@ public class HistoryEditorDialog extends AppCompatDialogFragment 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); diff --git a/app/src/main/java/org/isoron/uhabits/activities/common/views/HistoryChart.java b/app/src/main/java/org/isoron/uhabits/activities/common/views/HistoryChart.java index 680315b3d..620a2d59f 100644 --- a/app/src/main/java/org/isoron/uhabits/activities/common/views/HistoryChart.java +++ b/app/src/main/java/org/isoron/uhabits/activities/common/views/HistoryChart.java @@ -121,8 +121,11 @@ public class HistoryChart extends ScrollableChart if (timestamp == null) return false; int offset = timestampToOffset(timestamp); - boolean isChecked = checkmarks[offset] == CHECKED_EXPLICITLY; - checkmarks[offset] = (isChecked ? UNCHECKED : CHECKED_EXPLICITLY); + if (offset < checkmarks.length) + { + boolean isChecked = checkmarks[offset] == CHECKED_EXPLICITLY; + checkmarks[offset] = (isChecked ? UNCHECKED : CHECKED_EXPLICITLY); + } controller.onToggleCheckmark(timestamp); postInvalidate(); diff --git a/app/src/main/java/org/isoron/uhabits/activities/habits/edit/BaseDialog.java b/app/src/main/java/org/isoron/uhabits/activities/habits/edit/BaseDialog.java index e12bd9bc7..794f7350f 100644 --- a/app/src/main/java/org/isoron/uhabits/activities/habits/edit/BaseDialog.java +++ b/app/src/main/java/org/isoron/uhabits/activities/habits/edit/BaseDialog.java @@ -19,7 +19,6 @@ package org.isoron.uhabits.activities.habits.edit; -import android.app.*; import android.os.*; import android.support.annotation.*; import android.support.v7.app.*; @@ -27,13 +26,12 @@ import android.text.format.*; import android.view.*; import com.android.datetimepicker.time.*; -import com.android.datetimepicker.time.TimePickerDialog; import org.isoron.uhabits.*; -import org.isoron.uhabits.commands.*; -import org.isoron.uhabits.models.*; 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.utils.*; import java.util.*; @@ -88,11 +86,11 @@ public abstract class BaseDialog extends AppCompatDialogFragment } @Override - public void onAttach(Activity activity) + public void onActivityCreated(Bundle savedInstanceState) { - super.onAttach(activity); + super.onActivityCreated(savedInstanceState); - BaseActivity baseActivity = (BaseActivity) activity; + BaseActivity baseActivity = (BaseActivity) getActivity(); ActivityComponent component = baseActivity.getComponent(); dialogFactory = component.getDialogFactory(); } @@ -133,7 +131,6 @@ public abstract class BaseDialog extends AppCompatDialogFragment modifiedHabit.setColor( bundle.getInt("color", modifiedHabit.getColor())); - modifiedHabit.setReminder(null); int hour = (bundle.getInt("reminderHour", -1)); diff --git a/app/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardView.java b/app/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardView.java index b06ec0d60..a86b9ba8e 100644 --- a/app/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardView.java +++ b/app/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardView.java @@ -21,15 +21,16 @@ package org.isoron.uhabits.activities.habits.list.views; import android.annotation.*; import android.content.*; +import android.graphics.*; import android.graphics.drawable.*; import android.os.*; +import android.support.annotation.*; import android.util.*; -import android.view.*; import android.widget.*; import org.isoron.uhabits.*; -import org.isoron.uhabits.models.*; import org.isoron.uhabits.activities.common.views.*; +import org.isoron.uhabits.models.*; import org.isoron.uhabits.utils.*; import java.util.*; @@ -40,6 +41,7 @@ import static android.os.Build.VERSION.*; import static android.os.Build.VERSION_CODES.*; public class HabitCardView extends FrameLayout + implements ModelObservable.Listener { @BindView(R.id.checkmarkPanel) @@ -58,6 +60,9 @@ public class HabitCardView extends FrameLayout private StyledResources res; + @Nullable + private Habit habit; + public HabitCardView(Context context) { super(context); @@ -70,6 +75,12 @@ public class HabitCardView extends FrameLayout init(); } + @Override + public void onModelChange() + { + postInvalidate(); + } + public void setCheckmarkValues(int checkmarks[]) { checkmarkPanel.setCheckmarkValues(checkmarks); @@ -83,16 +94,14 @@ public class HabitCardView extends FrameLayout checkmarkPanel.setController(controller); } - public void setHabit(Habit habit) + public void setHabit(@NonNull Habit habit) { - int color = getActiveColor(habit); + if (this.habit != null) detachFromHabit(); - label.setText(habit.getName()); - label.setTextColor(color); - scoreRing.setColor(color); - checkmarkPanel.setColor(color); + this.habit = habit; checkmarkPanel.setHabit(habit); + attachToHabit(); postInvalidate(); } @@ -123,6 +132,38 @@ public class HabitCardView extends FrameLayout triggerRipple(x, y); } + protected void detachFromHabit() + { + if (habit != null) habit.getObservable().removeListener(this); + } + + @Override + protected void onDetachedFromWindow() + { + if (habit != null) detachFromHabit(); + super.onDetachedFromWindow(); + } + + @Override + protected void onDraw(Canvas canvas) + { + if (habit != null) + { + int color = getActiveColor(habit); + label.setText(habit.getName()); + label.setTextColor(color); + scoreRing.setColor(color); + checkmarkPanel.setColor(color); + } + + super.onDraw(canvas); + } + + private void attachToHabit() + { + if (habit != null) habit.getObservable().addListener(this); + } + private int getActiveColor(Habit habit) { int mediumContrastColor = res.getColor(R.attr.mediumContrastTextColor); @@ -134,14 +175,16 @@ public class HabitCardView extends FrameLayout private void init() { - setLayoutParams(new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, - ViewGroup.LayoutParams.WRAP_CONTENT)); + setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, + LayoutParams.WRAP_CONTENT)); res = new StyledResources(getContext()); inflate(context, R.layout.list_habits_card, this); ButterKnife.bind(this); + setWillNotDraw(false); + innerFrame.setOnTouchListener((v, event) -> { if (SDK_INT >= LOLLIPOP) v.getBackground().setHotspot(event.getX(), event.getY()); diff --git a/app/src/main/java/org/isoron/uhabits/activities/habits/show/ShowHabitActivity.java b/app/src/main/java/org/isoron/uhabits/activities/habits/show/ShowHabitActivity.java index 3755bcc37..7d9a90eef 100644 --- a/app/src/main/java/org/isoron/uhabits/activities/habits/show/ShowHabitActivity.java +++ b/app/src/main/java/org/isoron/uhabits/activities/habits/show/ShowHabitActivity.java @@ -57,7 +57,10 @@ public class ShowHabitActivity extends BaseActivity setScreen(screen); screen.setMenu(component.getMenu()); + screen.setController(component.getController()); rootView.setController(component.getController()); + + screen.reattachDialogs(); } @NonNull diff --git a/app/src/main/java/org/isoron/uhabits/activities/habits/show/ShowHabitController.java b/app/src/main/java/org/isoron/uhabits/activities/habits/show/ShowHabitController.java index 8104a4ffe..c4a463199 100644 --- a/app/src/main/java/org/isoron/uhabits/activities/habits/show/ShowHabitController.java +++ b/app/src/main/java/org/isoron/uhabits/activities/habits/show/ShowHabitController.java @@ -21,12 +21,14 @@ package org.isoron.uhabits.activities.habits.show; import android.support.annotation.*; +import org.isoron.uhabits.activities.*; import org.isoron.uhabits.activities.common.dialogs.*; import org.isoron.uhabits.commands.*; import org.isoron.uhabits.models.*; import javax.inject.*; +@ActivityScope public class ShowHabitController implements ShowHabitRootView.Controller, HistoryEditorDialog.Controller { @@ -52,7 +54,7 @@ public class ShowHabitController @Override public void onEditHistoryButtonClick() { - screen.showEditHistoryDialog(this); + screen.showEditHistoryDialog(); } @Override diff --git a/app/src/main/java/org/isoron/uhabits/activities/habits/show/ShowHabitRootView.java b/app/src/main/java/org/isoron/uhabits/activities/habits/show/ShowHabitRootView.java index 36194dcaf..7bf1b4e2c 100644 --- a/app/src/main/java/org/isoron/uhabits/activities/habits/show/ShowHabitRootView.java +++ b/app/src/main/java/org/isoron/uhabits/activities/habits/show/ShowHabitRootView.java @@ -33,6 +33,7 @@ import javax.inject.*; import butterknife.*; +@ActivityScope public class ShowHabitRootView extends BaseRootView implements ModelObservable.Listener { diff --git a/app/src/main/java/org/isoron/uhabits/activities/habits/show/ShowHabitScreen.java b/app/src/main/java/org/isoron/uhabits/activities/habits/show/ShowHabitScreen.java index 209470160..3df50bb10 100644 --- a/app/src/main/java/org/isoron/uhabits/activities/habits/show/ShowHabitScreen.java +++ b/app/src/main/java/org/isoron/uhabits/activities/habits/show/ShowHabitScreen.java @@ -21,13 +21,14 @@ package org.isoron.uhabits.activities.habits.show; import android.support.annotation.*; -import org.isoron.uhabits.models.*; import org.isoron.uhabits.activities.*; import org.isoron.uhabits.activities.common.dialogs.*; import org.isoron.uhabits.activities.habits.edit.*; +import org.isoron.uhabits.models.*; import javax.inject.*; +@ActivityScope public class ShowHabitScreen extends BaseScreen { @NonNull @@ -35,6 +36,9 @@ public class ShowHabitScreen extends BaseScreen private DialogFactory dialogFactory; + @Nullable + private ShowHabitController controller; + @Inject public ShowHabitScreen(@NonNull BaseActivity activity, @NonNull Habit habit, @@ -47,15 +51,33 @@ public class ShowHabitScreen extends BaseScreen this.dialogFactory = dialogFactory; } + public void setController(@NonNull ShowHabitController controller) + { + this.controller = controller; + } + + public void reattachDialogs() + { + if(controller == null) throw new IllegalStateException(); + + HistoryEditorDialog historyEditor = (HistoryEditorDialog) activity + .getSupportFragmentManager() + .findFragmentByTag("historyEditor"); + + if (historyEditor != null) + historyEditor.setController(controller); + } + public void showEditHabitDialog() { EditHabitDialog dialog = dialogFactory.buildEditHabitDialog(habit); activity.showDialog(dialog, "editHabit"); } - public void showEditHistoryDialog( - @NonNull HistoryEditorDialog.Controller controller) + public void showEditHistoryDialog() { + if(controller == null) throw new IllegalStateException(); + HistoryEditorDialog dialog = new HistoryEditorDialog(); dialog.setHabit(habit); dialog.setController(controller); diff --git a/app/src/main/java/org/isoron/uhabits/activities/habits/show/ShowHabitsMenu.java b/app/src/main/java/org/isoron/uhabits/activities/habits/show/ShowHabitsMenu.java index 75461cfcd..92e5af582 100644 --- a/app/src/main/java/org/isoron/uhabits/activities/habits/show/ShowHabitsMenu.java +++ b/app/src/main/java/org/isoron/uhabits/activities/habits/show/ShowHabitsMenu.java @@ -27,6 +27,7 @@ import org.isoron.uhabits.activities.*; import javax.inject.*; +@ActivityScope public class ShowHabitsMenu extends BaseMenu { @NonNull