diff --git a/app/src/androidTest/java/org/isoron/uhabits/ui/habits/show/views/HabitFrequencyViewTest.java b/app/src/androidTest/java/org/isoron/uhabits/ui/habits/show/views/FrequencyChartTest.java similarity index 93% rename from app/src/androidTest/java/org/isoron/uhabits/ui/habits/show/views/HabitFrequencyViewTest.java rename to app/src/androidTest/java/org/isoron/uhabits/ui/habits/show/views/FrequencyChartTest.java index a315ee3fb..a1ebb663d 100644 --- a/app/src/androidTest/java/org/isoron/uhabits/ui/habits/show/views/HabitFrequencyViewTest.java +++ b/app/src/androidTest/java/org/isoron/uhabits/ui/habits/show/views/FrequencyChartTest.java @@ -30,9 +30,9 @@ import org.junit.runner.RunWith; @RunWith(AndroidJUnit4.class) @SmallTest -public class HabitFrequencyViewTest extends BaseViewTest +public class FrequencyChartTest extends BaseViewTest { - private HabitFrequencyView view; + private FrequencyChart view; @Before public void setUp() @@ -42,7 +42,7 @@ public class HabitFrequencyViewTest extends BaseViewTest fixtures.purgeHabits(habitList); Habit habit = fixtures.createLongHabit(); - view = new HabitFrequencyView(targetContext); + view = new FrequencyChart(targetContext); view.setHabit(habit); refreshData(view); measureView(dpToPixels(300), dpToPixels(100), view); diff --git a/app/src/androidTest/java/org/isoron/uhabits/ui/habits/show/views/HabitHistoryViewTest.java b/app/src/androidTest/java/org/isoron/uhabits/ui/habits/show/views/HabitHistoryViewTest.java index 5066471e8..3e180583c 100644 --- a/app/src/androidTest/java/org/isoron/uhabits/ui/habits/show/views/HabitHistoryViewTest.java +++ b/app/src/androidTest/java/org/isoron/uhabits/ui/habits/show/views/HabitHistoryViewTest.java @@ -40,7 +40,7 @@ public class HabitHistoryViewTest extends BaseViewTest { private Habit habit; - private HabitHistoryView view; + private HistoryView view; @Before public void setUp() @@ -50,7 +50,7 @@ public class HabitHistoryViewTest extends BaseViewTest fixtures.purgeHabits(habitList); habit = fixtures.createLongHabit(); - view = new HabitHistoryView(targetContext); + view = new HistoryView(targetContext); view.setHabit(habit); measureView(dpToPixels(400), dpToPixels(200), view); refreshData(view); diff --git a/app/src/androidTest/java/org/isoron/uhabits/ui/habits/show/views/HabitScoreViewTest.java b/app/src/androidTest/java/org/isoron/uhabits/ui/habits/show/views/ScoreChartTest.java similarity index 85% rename from app/src/androidTest/java/org/isoron/uhabits/ui/habits/show/views/HabitScoreViewTest.java rename to app/src/androidTest/java/org/isoron/uhabits/ui/habits/show/views/ScoreChartTest.java index 114087f28..03f586fa5 100644 --- a/app/src/androidTest/java/org/isoron/uhabits/ui/habits/show/views/HabitScoreViewTest.java +++ b/app/src/androidTest/java/org/isoron/uhabits/ui/habits/show/views/ScoreChartTest.java @@ -25,18 +25,20 @@ import android.util.Log; import org.isoron.uhabits.*; import org.isoron.uhabits.models.Habit; +import org.isoron.uhabits.utils.*; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @RunWith(AndroidJUnit4.class) @SmallTest -public class HabitScoreViewTest extends BaseViewTest +public class ScoreChartTest extends BaseViewTest { private Habit habit; - private HabitScoreView view; + private ScoreChart view; + @Override @Before public void setUp() { @@ -45,10 +47,10 @@ public class HabitScoreViewTest extends BaseViewTest fixtures.purgeHabits(habitList); habit = fixtures.createLongHabit(); - view = new HabitScoreView(targetContext); - view.setHabit(habit); + view = new ScoreChart(targetContext); + view.setScores(habit.getScores().getAll()); + view.setPrimaryColor(ColorUtils.getColor(targetContext, habit.getColor())); view.setBucketSize(7); - refreshData(view); measureView(dpToPixels(300), dpToPixels(200), view); } @@ -79,8 +81,8 @@ public class HabitScoreViewTest extends BaseViewTest @Test public void testRender_withMonthlyBucket() throws Throwable { + view.setScores(habit.getScores().groupBy(DateUtils.TruncateField.MONTH)); view.setBucketSize(30); - view.refreshData(); view.invalidate(); assertRenders(view, "HabitScoreView/renderMonthly.png"); @@ -96,8 +98,8 @@ public class HabitScoreViewTest extends BaseViewTest @Test public void testRender_withYearlyBucket() throws Throwable { + view.setScores(habit.getScores().groupBy(DateUtils.TruncateField.YEAR)); view.setBucketSize(365); - view.refreshData(); view.invalidate(); assertRenders(view, "HabitScoreView/renderYearly.png"); diff --git a/app/src/androidTest/java/org/isoron/uhabits/ui/habits/show/views/HabitStreakViewTest.java b/app/src/androidTest/java/org/isoron/uhabits/ui/habits/show/views/StreakChartTest.java similarity index 93% rename from app/src/androidTest/java/org/isoron/uhabits/ui/habits/show/views/HabitStreakViewTest.java rename to app/src/androidTest/java/org/isoron/uhabits/ui/habits/show/views/StreakChartTest.java index aad240ac9..a9fef9304 100644 --- a/app/src/androidTest/java/org/isoron/uhabits/ui/habits/show/views/HabitStreakViewTest.java +++ b/app/src/androidTest/java/org/isoron/uhabits/ui/habits/show/views/StreakChartTest.java @@ -30,9 +30,9 @@ import org.junit.runner.RunWith; @RunWith(AndroidJUnit4.class) @SmallTest -public class HabitStreakViewTest extends BaseViewTest +public class StreakChartTest extends BaseViewTest { - private HabitStreakView view; + private StreakChart view; @Override @Before @@ -43,7 +43,7 @@ public class HabitStreakViewTest extends BaseViewTest fixtures.purgeHabits(habitList); Habit habit = fixtures.createLongHabit(); - view = new HabitStreakView(targetContext); + view = new StreakChart(targetContext); measureView(dpToPixels(300), dpToPixels(100), view); view.setHabit(habit); diff --git a/app/src/main/java/org/isoron/uhabits/models/memory/MemoryScoreList.java b/app/src/main/java/org/isoron/uhabits/models/memory/MemoryScoreList.java index 358415473..2705d407d 100644 --- a/app/src/main/java/org/isoron/uhabits/models/memory/MemoryScoreList.java +++ b/app/src/main/java/org/isoron/uhabits/models/memory/MemoryScoreList.java @@ -44,6 +44,7 @@ public class MemoryScoreList extends ScoreList if (s.getTimestamp() >= timestamp) discard.add(s); list.removeAll(discard); + getObservable().notifyListeners(); } @Override diff --git a/app/src/main/java/org/isoron/uhabits/models/sqlite/SQLiteScoreList.java b/app/src/main/java/org/isoron/uhabits/models/sqlite/SQLiteScoreList.java index e20986134..ecafd2cec 100644 --- a/app/src/main/java/org/isoron/uhabits/models/sqlite/SQLiteScoreList.java +++ b/app/src/main/java/org/isoron/uhabits/models/sqlite/SQLiteScoreList.java @@ -134,6 +134,8 @@ public class SQLiteScoreList extends ScoreList .where("habit = ?", habit.getId()) .and("timestamp >= ?", timestamp) .execute(); + + getObservable().notifyListeners(); } @Nullable diff --git a/app/src/main/java/org/isoron/uhabits/ui/habits/edit/HistoryEditorDialog.java b/app/src/main/java/org/isoron/uhabits/ui/habits/edit/HistoryEditorDialog.java index bdf08d88d..183d3d0ed 100644 --- a/app/src/main/java/org/isoron/uhabits/ui/habits/edit/HistoryEditorDialog.java +++ b/app/src/main/java/org/isoron/uhabits/ui/habits/edit/HistoryEditorDialog.java @@ -32,7 +32,7 @@ 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.habits.show.views.HabitHistoryView; +import org.isoron.uhabits.ui.habits.show.views.HistoryView; import javax.inject.Inject; @@ -43,7 +43,7 @@ public class HistoryEditorDialog extends AppCompatDialogFragment private Listener listener; - HabitHistoryView historyView; + HistoryView historyView; @Inject HabitList habitList; @@ -53,7 +53,7 @@ public class HistoryEditorDialog extends AppCompatDialogFragment { Context context = getActivity(); HabitsApplication.getComponent().inject(this); - historyView = new HabitHistoryView(context, null); + historyView = new HistoryView(context, null); if (savedInstanceState != null) { diff --git a/app/src/main/java/org/isoron/uhabits/ui/habits/show/ShowHabitFragment.java b/app/src/main/java/org/isoron/uhabits/ui/habits/show/ShowHabitFragment.java index 9352e58d3..11be5848f 100644 --- a/app/src/main/java/org/isoron/uhabits/ui/habits/show/ShowHabitFragment.java +++ b/app/src/main/java/org/isoron/uhabits/ui/habits/show/ShowHabitFragment.java @@ -22,13 +22,11 @@ package org.isoron.uhabits.ui.habits.show; import android.os.*; import android.support.v4.app.*; import android.view.*; -import android.widget.*; import org.isoron.uhabits.*; import org.isoron.uhabits.models.*; import org.isoron.uhabits.ui.habits.edit.*; import org.isoron.uhabits.ui.habits.show.views.*; -import org.isoron.uhabits.utils.*; import java.util.*; @@ -39,44 +37,33 @@ public class ShowHabitFragment extends Fragment { Habit habit; - float todayScore; - - float lastMonthScore; - - float lastYearScore; - int activeColor; int inactiveColor; - int previousScoreInterval; - private ShowHabitHelper helper; protected ShowHabitActivity activity; private List dataViews; - @BindView(R.id.sStrengthInterval) - Spinner sStrengthInterval; - - @BindView(R.id.scoreView) - HabitScoreView habitScoreView; - @BindView(R.id.historyView) - HabitHistoryView habitHistoryView; + HistoryView historyView; @BindView(R.id.punchcardView) - HabitFrequencyView habitFrequencyView; + FrequencyChart frequencyChart; + + @BindView(R.id.streakChart) + StreakChart streakChart; - @BindView(R.id.streakView) - HabitStreakView habitStreakView; + @BindView(R.id.subtitleCard) + SubtitleCard subtitleCard; - @BindView(R.id.subtitle) - SubtitleCardView subtitleView; + @BindView(R.id.overviewCard) + OverviewCard overviewCard; - @BindView(R.id.overview) - OverviewCardView overview; + @BindView(R.id.strengthCard) + ScoreCard scoreCard; @Override public View onCreateView(LayoutInflater inflater, @@ -92,15 +79,6 @@ public class ShowHabitFragment extends Fragment habit = activity.getHabit(); helper.updateColors(); - int defaultScoreInterval = - InterfaceUtils.getDefaultScoreInterval(getContext()); - previousScoreInterval = defaultScoreInterval; - setScoreBucketSize(defaultScoreInterval); - - sStrengthInterval.setSelection(defaultScoreInterval); - sStrengthInterval.setOnItemSelectedListener( - new OnItemSelectedListener()); - createDataViews(); helper.updateCardHeaders(view); setHasOptionsMenu(true); @@ -118,14 +96,14 @@ public class ShowHabitFragment extends Fragment private void createDataViews() { - subtitleView.setHabit(habit); - overview.setHabit(habit); + subtitleCard.setHabit(habit); + overviewCard.setHabit(habit); + scoreCard.setHabit(habit); dataViews = new LinkedList<>(); - dataViews.add(habitScoreView); - dataViews.add(habitHistoryView); - dataViews.add(habitFrequencyView); - dataViews.add(habitStreakView); + dataViews.add(historyView); + dataViews.add(frequencyChart); + dataViews.add(streakChart); for (HabitDataView dataView : dataViews) dataView.setHabit(habit); @@ -156,17 +134,6 @@ public class ShowHabitFragment extends Fragment return true; } - private void setScoreBucketSize(int position) - { - if (getView() == null) return; - - habitScoreView.setBucketSize( - HabitScoreView.DEFAULT_BUCKET_SIZES[position]); - - InterfaceUtils.setDefaultScoreInterval(getContext(), position); - previousScoreInterval = position; - } - @Override public void onModelChange() { @@ -190,23 +157,4 @@ public class ShowHabitFragment extends Fragment habit.getObservable().removeListener(this); super.onPause(); } - - private class OnItemSelectedListener - implements AdapterView.OnItemSelectedListener - { - @Override - public void onItemSelected(AdapterView parent, - View view, - int position, - long id) - { - setScoreBucketSize(position); - } - - @Override - public void onNothingSelected(AdapterView parent) - { - - } - } } diff --git a/app/src/main/java/org/isoron/uhabits/ui/habits/show/ShowHabitHelper.java b/app/src/main/java/org/isoron/uhabits/ui/habits/show/ShowHabitHelper.java index 168355e21..38f2062e4 100644 --- a/app/src/main/java/org/isoron/uhabits/ui/habits/show/ShowHabitHelper.java +++ b/app/src/main/java/org/isoron/uhabits/ui/habits/show/ShowHabitHelper.java @@ -37,7 +37,6 @@ public class ShowHabitHelper void updateCardHeaders(View view) { updateColor(view, R.id.tvHistory); - updateColor(view, R.id.tvStrength); updateColor(view, R.id.tvStreaks); updateColor(view, R.id.tvWeekdayFreq); updateColor(view, R.id.scoreLabel); diff --git a/app/src/main/java/org/isoron/uhabits/ui/habits/show/views/HabitFrequencyView.java b/app/src/main/java/org/isoron/uhabits/ui/habits/show/views/FrequencyChart.java similarity index 98% rename from app/src/main/java/org/isoron/uhabits/ui/habits/show/views/HabitFrequencyView.java rename to app/src/main/java/org/isoron/uhabits/ui/habits/show/views/FrequencyChart.java index f24317524..df069c455 100644 --- a/app/src/main/java/org/isoron/uhabits/ui/habits/show/views/HabitFrequencyView.java +++ b/app/src/main/java/org/isoron/uhabits/ui/habits/show/views/FrequencyChart.java @@ -31,7 +31,7 @@ import org.isoron.uhabits.utils.*; import java.text.*; import java.util.*; -public class HabitFrequencyView extends ScrollableDataView +public class FrequencyChart extends ScrollableChart implements HabitDataView, ModelObservable.Listener { private Paint pGrid; @@ -70,13 +70,13 @@ public class HabitFrequencyView extends ScrollableDataView private HashMap frequency; - public HabitFrequencyView(Context context) + public FrequencyChart(Context context) { super(context); init(); } - public HabitFrequencyView(Context context, AttributeSet attrs) + public FrequencyChart(Context context, AttributeSet attrs) { super(context, attrs); this.primaryColor = ColorUtils.getColor(getContext(), 7); diff --git a/app/src/main/java/org/isoron/uhabits/ui/habits/show/views/HabitHistoryView.java b/app/src/main/java/org/isoron/uhabits/ui/habits/show/views/HistoryView.java similarity index 96% rename from app/src/main/java/org/isoron/uhabits/ui/habits/show/views/HabitHistoryView.java rename to app/src/main/java/org/isoron/uhabits/ui/habits/show/views/HistoryView.java index 7f7c9a504..0918bbaf6 100644 --- a/app/src/main/java/org/isoron/uhabits/ui/habits/show/views/HabitHistoryView.java +++ b/app/src/main/java/org/isoron/uhabits/ui/habits/show/views/HistoryView.java @@ -33,10 +33,9 @@ import org.isoron.uhabits.utils.*; import java.text.*; import java.util.*; -public class HabitHistoryView extends ScrollableDataView implements - HabitDataView, - ToggleRepetitionTask.Listener, - ModelObservable.Listener +public class HistoryView extends ScrollableChart implements HabitDataView, + ToggleRepetitionTask.Listener, + ModelObservable.Listener { private Habit habit; @@ -89,13 +88,13 @@ public class HabitHistoryView extends ScrollableDataView implements private float headerOverflow = 0; - public HabitHistoryView(Context context) + public HistoryView(Context context) { super(context); init(); } - public HabitHistoryView(Context context, AttributeSet attrs) + public HistoryView(Context context, AttributeSet attrs) { super(context, attrs); init(); @@ -169,6 +168,7 @@ public class HabitHistoryView extends ScrollableDataView implements postInvalidate(); } + @Override public void setHabit(Habit habit) { this.habit = habit; diff --git a/app/src/main/java/org/isoron/uhabits/ui/habits/show/views/OverviewCardView.java b/app/src/main/java/org/isoron/uhabits/ui/habits/show/views/OverviewCard.java similarity index 96% rename from app/src/main/java/org/isoron/uhabits/ui/habits/show/views/OverviewCardView.java rename to app/src/main/java/org/isoron/uhabits/ui/habits/show/views/OverviewCard.java index ae952597b..845b0adec 100644 --- a/app/src/main/java/org/isoron/uhabits/ui/habits/show/views/OverviewCardView.java +++ b/app/src/main/java/org/isoron/uhabits/ui/habits/show/views/OverviewCard.java @@ -31,7 +31,7 @@ import org.isoron.uhabits.utils.*; import butterknife.*; -public class OverviewCardView extends LinearLayout +public class OverviewCard extends LinearLayout implements ModelObservable.Listener { @Nullable @@ -57,13 +57,13 @@ public class OverviewCardView extends LinearLayout private int color; - public OverviewCardView(Context context) + public OverviewCard(Context context) { super(context); init(); } - public OverviewCardView(Context context, AttributeSet attrs) + public OverviewCard(Context context, AttributeSet attrs) { super(context, attrs); init(); diff --git a/app/src/main/java/org/isoron/uhabits/ui/habits/show/views/ScoreCard.java b/app/src/main/java/org/isoron/uhabits/ui/habits/show/views/ScoreCard.java new file mode 100644 index 000000000..3874aaa22 --- /dev/null +++ b/app/src/main/java/org/isoron/uhabits/ui/habits/show/views/ScoreCard.java @@ -0,0 +1,198 @@ +/* + * Copyright (C) 2016 Álinson Santos Xavier + * + * 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 . + */ + +package org.isoron.uhabits.ui.habits.show.views; + +import android.content.*; +import android.support.annotation.*; +import android.util.*; +import android.widget.*; + +import org.isoron.uhabits.*; +import org.isoron.uhabits.models.*; +import org.isoron.uhabits.tasks.*; +import org.isoron.uhabits.utils.*; + +import java.util.*; + +import butterknife.*; + +public class ScoreCard extends RelativeLayout + implements ModelObservable.Listener +{ + public static final int[] BUCKET_SIZES = { 1, 7, 31, 92, 365 }; + + @BindView(R.id.spinner) + Spinner spinner; + + @BindView(R.id.scoreView) + ScoreChart chart; + + @BindView(R.id.title) + TextView title; + + @Nullable + private Habit habit; + + private int color; + + private int bucketSize; + + public ScoreCard(Context context) + { + super(context); + init(); + } + + public ScoreCard(Context context, AttributeSet attrs) + { + super(context, attrs); + init(); + } + + @OnItemSelected(R.id.spinner) + public void onItemSelected(int position) + { + setBucketSizeFromPosition(position); + } + + @Override + public void onModelChange() + { + refreshData(); + } + + public void setHabit(@NonNull Habit habit) + { + this.habit = habit; + color = ColorUtils.getColor(getContext(), habit.getColor()); + refreshData(); + } + + @Override + protected void onAttachedToWindow() + { + super.onAttachedToWindow(); + if (habit != null) + { + habit.getObservable().addListener(this); + habit.getScores().getObservable().addListener(this); + } + } + + @Override + protected void onDetachedFromWindow() + { + if (habit != null) + { + habit.getObservable().removeListener(this); + habit.getScores().getObservable().removeListener(this); + } + + super.onDetachedFromWindow(); + } + + @NonNull + private DateUtils.TruncateField getTruncateField() + { + DateUtils.TruncateField field; + + switch (bucketSize) + { + case 7: + field = DateUtils.TruncateField.WEEK_NUMBER; + break; + + case 365: + field = DateUtils.TruncateField.YEAR; + break; + + case 92: + field = DateUtils.TruncateField.QUARTER; + break; + + default: + Log.e("ScoreCard", + String.format("Unknown bucket size: %d", bucketSize)); + // continue to case 31 + + case 31: + field = DateUtils.TruncateField.MONTH; + break; + } + + return field; + } + + private void init() + { + inflate(getContext(), R.layout.show_habit_strength, this); + ButterKnife.bind(this); + + int defaultPosition = getDefaultSpinnerPosition(); + setBucketSizeFromPosition(defaultPosition); + spinner.setSelection(defaultPosition); + + if(isInEditMode()) + { + spinner.setVisibility(GONE); + title.setTextColor(ColorUtils.getAndroidTestColor(1)); + chart.setPrimaryColor(ColorUtils.getAndroidTestColor(1)); + chart.populateWithRandomData(); + } + } + + private int getDefaultSpinnerPosition() + { + if(isInEditMode()) return 0; + return InterfaceUtils.getDefaultScoreSpinnerPosition(getContext()); + } + + private void refreshData() + { + if (habit == null) return; + + title.setTextColor(color); + chart.setPrimaryColor(color); + + new BaseTask() + { + @Override + protected void doInBackground() + { + List scores; + + if (bucketSize == 1) scores = habit.getScores().getAll(); + else scores = habit.getScores().groupBy(getTruncateField()); + + chart.setScores(scores); + chart.setBucketSize(bucketSize); + } + }.execute(); + } + + private void setBucketSizeFromPosition(int position) + { + if(isInEditMode()) return; + + InterfaceUtils.setDefaultScoreSpinnerPosition(getContext(), position); + bucketSize = BUCKET_SIZES[position]; + refreshData(); + } +} diff --git a/app/src/main/java/org/isoron/uhabits/ui/habits/show/views/HabitScoreView.java b/app/src/main/java/org/isoron/uhabits/ui/habits/show/views/ScoreChart.java similarity index 78% rename from app/src/main/java/org/isoron/uhabits/ui/habits/show/views/HabitScoreView.java rename to app/src/main/java/org/isoron/uhabits/ui/habits/show/views/ScoreChart.java index b162b9786..b641dd225 100644 --- a/app/src/main/java/org/isoron/uhabits/ui/habits/show/views/HabitScoreView.java +++ b/app/src/main/java/org/isoron/uhabits/ui/habits/show/views/ScoreChart.java @@ -26,14 +26,12 @@ import android.util.*; import org.isoron.uhabits.*; import org.isoron.uhabits.models.*; -import org.isoron.uhabits.tasks.*; import org.isoron.uhabits.utils.*; import java.text.*; import java.util.*; -public class HabitScoreView extends ScrollableDataView - implements HabitDataView, ModelObservable.Listener +public class ScoreChart extends ScrollableChart { private static final PorterDuffXfermode XFERMODE_CLEAR = new PorterDuffXfermode(PorterDuff.Mode.CLEAR); @@ -41,14 +39,10 @@ public class HabitScoreView extends ScrollableDataView private static final PorterDuffXfermode XFERMODE_SRC = new PorterDuffXfermode(PorterDuff.Mode.SRC); - public static int DEFAULT_BUCKET_SIZES[] = {1, 7, 31, 92, 365}; - private Paint pGrid; private float em; - private Habit habit; - private SimpleDateFormat dfMonth; private SimpleDateFormat dfDay; @@ -80,8 +74,6 @@ public class HabitScoreView extends ScrollableDataView private int bucketSize = 7; - private int footerHeight; - private int backgroundColor; private Bitmap drawingCache; @@ -96,58 +88,42 @@ public class HabitScoreView extends ScrollableDataView private String previousMonthText; - public HabitScoreView(Context context) + public ScoreChart(Context context) { super(context); init(); } - public HabitScoreView(Context context, AttributeSet attrs) + public ScoreChart(Context context, AttributeSet attrs) { super(context, attrs); - this.primaryColor = ColorUtils.getColor(getContext(), 7); init(); } - @Override - public void onModelChange() - { - refreshData(); - } - - @Override - public void refreshData() + @Deprecated + public void setBucketSize(int bucketSize) { - if (isInEditMode()) generateRandomData(); - else - { - if (habit == null) return; - if (bucketSize == 1) scores = habit.getScores().getAll(); - else scores = habit.getScores().groupBy(getTruncateField()); - - createColors(); - } - + this.bucketSize = bucketSize; postInvalidate(); } - public void setBucketSize(int bucketSize) + public void setIsTransparencyEnabled(boolean enabled) { - this.bucketSize = bucketSize; + this.isTransparencyEnabled = enabled; + createColors(); + requestLayout(); } - @Override - public void setHabit(Habit habit) + public void setPrimaryColor(int primaryColor) { - this.habit = habit; - createColors(); + this.primaryColor = primaryColor; + postInvalidate(); } - public void setIsTransparencyEnabled(boolean enabled) + public void setScores(@NonNull List scores) { - this.isTransparencyEnabled = enabled; - createColors(); - requestLayout(); + this.scores = scores; + postInvalidate(); } protected void createPaints() @@ -163,30 +139,6 @@ public class HabitScoreView extends ScrollableDataView pGrid.setAntiAlias(true); } - @Override - protected void onAttachedToWindow() - { - super.onAttachedToWindow(); - new BaseTask() - { - @Override - protected void doInBackground() - { - refreshData(); - } - }.execute(); - habit.getObservable().addListener(this); - habit.getScores().getObservable().addListener(this); - } - - @Override - protected void onDetachedFromWindow() - { - habit.getScores().getObservable().removeListener(this); - habit.getObservable().removeListener(this); - super.onDetachedFromWindow(); - } - @Override protected void onDraw(Canvas canvas) { @@ -205,7 +157,7 @@ public class HabitScoreView extends ScrollableDataView activeCanvas = canvas; } - if (habit == null || scores == null) return; + if (scores == null) return; rect.set(0, 0, nColumns * columnWidth, columnHeight); rect.offset(0, paddingTop); @@ -220,16 +172,13 @@ public class HabitScoreView extends ScrollableDataView previousYearText = ""; skipYear = 0; - long currentDate = DateUtils.getStartOfToday(); - - for (int k = 0; k < nColumns + getDataOffset() - 1; k++) - currentDate -= bucketSize * DateUtils.millisecondsInOneDay; - for (int k = 0; k < nColumns; k++) { - int score = 0; int offset = nColumns - k - 1 + getDataOffset(); - if (offset < scores.size()) score = scores.get(offset).getValue(); + if (offset >= scores.size()) continue; + + int score = scores.get(offset).getValue(); + long timestamp = scores.get(offset).getTimestamp(); double relativeScore = ((double) score) / Score.MAX_VALUE; int height = (int) (columnHeight * relativeScore); @@ -250,9 +199,7 @@ public class HabitScoreView extends ScrollableDataView rect.set(0, 0, columnWidth, columnHeight); rect.offset(k * columnWidth, paddingTop); - drawFooter(activeCanvas, rect, currentDate); - - currentDate += bucketSize * DateUtils.millisecondsInOneDay; + drawFooter(activeCanvas, rect, timestamp); } if (activeCanvas != canvas) canvas.drawBitmap(drawingCache, 0, 0, null); @@ -279,18 +226,17 @@ public class HabitScoreView extends ScrollableDataView pText.setTextSize(Math.min(textSize, maxTextSize)); em = pText.getFontSpacing(); - footerHeight = (int) (3 * em); + int footerHeight = (int) (3 * em); paddingTop = (int) (em); baseSize = (height - footerHeight - paddingTop) / 8; - setScrollerBucketSize(baseSize); - columnWidth = baseSize; columnWidth = Math.max(columnWidth, getMaxDayWidth() * 1.5f); columnWidth = Math.max(columnWidth, getMaxMonthWidth() * 1.2f); nColumns = (int) (width / columnWidth); columnWidth = (float) width / nColumns; + setScrollerBucketSize((int) columnWidth); columnHeight = 8 * baseSize; @@ -304,9 +250,7 @@ public class HabitScoreView extends ScrollableDataView private void createColors() { - if (habit != null) this.primaryColor = - ColorUtils.getColor(getContext(), habit.getColor()); - + primaryColor = Color.BLACK; textColor = InterfaceUtils.getStyledColor(getContext(), R.attr.mediumContrastTextColor); gridColor = InterfaceUtils.getStyledColor(getContext(), @@ -411,7 +355,7 @@ public class HabitScoreView extends ScrollableDataView if (isTransparencyEnabled) pGraph.setXfermode(XFERMODE_SRC); } - private void generateRandomData() + public void populateWithRandomData() { Random random = new Random(); scores = new LinkedList<>(); @@ -461,38 +405,6 @@ public class HabitScoreView extends ScrollableDataView return maxMonthWidth; } - @NonNull - private DateUtils.TruncateField getTruncateField() - { - DateUtils.TruncateField field; - - switch (bucketSize) - { - case 7: - field = DateUtils.TruncateField.WEEK_NUMBER; - break; - - case 365: - field = DateUtils.TruncateField.YEAR; - break; - - case 92: - field = DateUtils.TruncateField.QUARTER; - break; - - default: - Log.e("HabitScoreView", - String.format("Unknown bucket size: %d", bucketSize)); - // continue to case 31 - - case 31: - field = DateUtils.TruncateField.MONTH; - break; - } - - return field; - } - private void init() { createPaints(); diff --git a/app/src/main/java/org/isoron/uhabits/ui/habits/show/views/ScrollableDataView.java b/app/src/main/java/org/isoron/uhabits/ui/habits/show/views/ScrollableChart.java similarity index 95% rename from app/src/main/java/org/isoron/uhabits/ui/habits/show/views/ScrollableDataView.java rename to app/src/main/java/org/isoron/uhabits/ui/habits/show/views/ScrollableChart.java index 09fa9dd97..9e4cdea43 100644 --- a/app/src/main/java/org/isoron/uhabits/ui/habits/show/views/ScrollableDataView.java +++ b/app/src/main/java/org/isoron/uhabits/ui/habits/show/views/ScrollableChart.java @@ -25,7 +25,7 @@ import android.util.*; import android.view.*; import android.widget.*; -public abstract class ScrollableDataView extends View +public abstract class ScrollableChart extends View implements GestureDetector.OnGestureListener, ValueAnimator.AnimatorUpdateListener { @@ -40,13 +40,13 @@ public abstract class ScrollableDataView extends View private ValueAnimator scrollAnimator; - public ScrollableDataView(Context context) + public ScrollableChart(Context context) { super(context); init(context); } - public ScrollableDataView(Context context, AttributeSet attrs) + public ScrollableChart(Context context, AttributeSet attrs) { super(context, attrs); init(context); diff --git a/app/src/main/java/org/isoron/uhabits/ui/habits/show/views/HabitStreakView.java b/app/src/main/java/org/isoron/uhabits/ui/habits/show/views/StreakChart.java similarity index 98% rename from app/src/main/java/org/isoron/uhabits/ui/habits/show/views/HabitStreakView.java rename to app/src/main/java/org/isoron/uhabits/ui/habits/show/views/StreakChart.java index 68ebdf934..bca5499a7 100644 --- a/app/src/main/java/org/isoron/uhabits/ui/habits/show/views/HabitStreakView.java +++ b/app/src/main/java/org/isoron/uhabits/ui/habits/show/views/StreakChart.java @@ -32,7 +32,7 @@ import org.isoron.uhabits.utils.*; import java.text.*; import java.util.*; -public class HabitStreakView extends View +public class StreakChart extends View implements HabitDataView, ModelObservable.Listener { private Habit habit; @@ -73,13 +73,13 @@ public class HabitStreakView extends View private int reverseTextColor; - public HabitStreakView(Context context) + public StreakChart(Context context) { super(context); init(); } - public HabitStreakView(Context context, AttributeSet attrs) + public StreakChart(Context context, AttributeSet attrs) { super(context, attrs); this.primaryColor = ColorUtils.getColor(getContext(), 7); diff --git a/app/src/main/java/org/isoron/uhabits/ui/habits/show/views/SubtitleCardView.java b/app/src/main/java/org/isoron/uhabits/ui/habits/show/views/SubtitleCard.java similarity index 96% rename from app/src/main/java/org/isoron/uhabits/ui/habits/show/views/SubtitleCardView.java rename to app/src/main/java/org/isoron/uhabits/ui/habits/show/views/SubtitleCard.java index dad8fac72..dbc18f530 100644 --- a/app/src/main/java/org/isoron/uhabits/ui/habits/show/views/SubtitleCardView.java +++ b/app/src/main/java/org/isoron/uhabits/ui/habits/show/views/SubtitleCard.java @@ -33,7 +33,7 @@ import org.isoron.uhabits.utils.*; import butterknife.*; -public class SubtitleCardView extends LinearLayout +public class SubtitleCard extends LinearLayout implements ModelObservable.Listener { @BindView(R.id.questionLabel) @@ -48,13 +48,13 @@ public class SubtitleCardView extends LinearLayout @Nullable private Habit habit; - public SubtitleCardView(Context context) + public SubtitleCard(Context context) { super(context); init(); } - public SubtitleCardView(Context context, AttributeSet attrs) + public SubtitleCard(Context context, AttributeSet attrs) { super(context, attrs); init(); diff --git a/app/src/main/java/org/isoron/uhabits/utils/InterfaceUtils.java b/app/src/main/java/org/isoron/uhabits/utils/InterfaceUtils.java index cde5c77d7..9d5916d2d 100644 --- a/app/src/main/java/org/isoron/uhabits/utils/InterfaceUtils.java +++ b/app/src/main/java/org/isoron/uhabits/utils/InterfaceUtils.java @@ -269,13 +269,13 @@ public abstract class InterfaceUtils } - public static void setDefaultScoreInterval(Context context, int position) + public static void setDefaultScoreSpinnerPosition(Context context, int position) { SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); prefs.edit().putInt("pref_score_view_interval", position).apply(); } - public static int getDefaultScoreInterval(Context context) + public static int getDefaultScoreSpinnerPosition(Context context) { SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); int defaultScoreInterval = prefs.getInt("pref_score_view_interval", 1); diff --git a/app/src/main/java/org/isoron/uhabits/widgets/FrequencyWidgetProvider.java b/app/src/main/java/org/isoron/uhabits/widgets/FrequencyWidgetProvider.java index e186d3224..0b7b12610 100644 --- a/app/src/main/java/org/isoron/uhabits/widgets/FrequencyWidgetProvider.java +++ b/app/src/main/java/org/isoron/uhabits/widgets/FrequencyWidgetProvider.java @@ -28,14 +28,14 @@ import org.isoron.uhabits.R; import org.isoron.uhabits.models.Habit; import org.isoron.uhabits.widgets.views.GraphWidgetView; import org.isoron.uhabits.ui.habits.show.views.HabitDataView; -import org.isoron.uhabits.ui.habits.show.views.HabitFrequencyView; +import org.isoron.uhabits.ui.habits.show.views.FrequencyChart; public class FrequencyWidgetProvider extends BaseWidgetProvider { @Override protected View buildCustomView(Context context, Habit habit) { - HabitFrequencyView dataView = new HabitFrequencyView(context); + FrequencyChart dataView = new FrequencyChart(context); GraphWidgetView view = new GraphWidgetView(context, dataView); view.setHabit(habit); return view; diff --git a/app/src/main/java/org/isoron/uhabits/widgets/HistoryWidgetProvider.java b/app/src/main/java/org/isoron/uhabits/widgets/HistoryWidgetProvider.java index b9d98f2e0..5ad306198 100644 --- a/app/src/main/java/org/isoron/uhabits/widgets/HistoryWidgetProvider.java +++ b/app/src/main/java/org/isoron/uhabits/widgets/HistoryWidgetProvider.java @@ -27,14 +27,14 @@ import org.isoron.uhabits.R; import org.isoron.uhabits.models.Habit; import org.isoron.uhabits.widgets.views.GraphWidgetView; import org.isoron.uhabits.ui.habits.show.views.HabitDataView; -import org.isoron.uhabits.ui.habits.show.views.HabitHistoryView; +import org.isoron.uhabits.ui.habits.show.views.HistoryView; public class HistoryWidgetProvider extends BaseWidgetProvider { @Override protected View buildCustomView(Context context, Habit habit) { - HabitHistoryView dataView = new HabitHistoryView(context); + HistoryView dataView = new HistoryView(context); GraphWidgetView view = new GraphWidgetView(context, dataView); view.setHabit(habit); return view; diff --git a/app/src/main/java/org/isoron/uhabits/widgets/ScoreWidgetProvider.java b/app/src/main/java/org/isoron/uhabits/widgets/ScoreWidgetProvider.java index ee998de8d..63adea38e 100644 --- a/app/src/main/java/org/isoron/uhabits/widgets/ScoreWidgetProvider.java +++ b/app/src/main/java/org/isoron/uhabits/widgets/ScoreWidgetProvider.java @@ -18,33 +18,33 @@ */ package org.isoron.uhabits.widgets; -import android.app.PendingIntent; -import android.content.Context; -import android.view.View; +import android.app.*; +import android.content.*; +import android.view.*; -import org.isoron.uhabits.HabitBroadcastReceiver; -import org.isoron.uhabits.R; -import org.isoron.uhabits.models.Habit; -import org.isoron.uhabits.utils.InterfaceUtils; -import org.isoron.uhabits.widgets.views.GraphWidgetView; -import org.isoron.uhabits.ui.habits.show.views.HabitDataView; -import org.isoron.uhabits.ui.habits.show.views.HabitScoreView; +import org.apache.commons.lang3.*; +import org.isoron.uhabits.*; +import org.isoron.uhabits.models.*; +import org.isoron.uhabits.ui.habits.show.views.*; +import org.isoron.uhabits.utils.*; public class ScoreWidgetProvider extends BaseWidgetProvider { @Override protected View buildCustomView(Context context, Habit habit) { - int defaultScoreInterval = InterfaceUtils.getDefaultScoreInterval(context); - int size = HabitScoreView.DEFAULT_BUCKET_SIZES[defaultScoreInterval]; + int defaultScoreInterval = InterfaceUtils.getDefaultScoreSpinnerPosition(context); + int size = ScoreCard.BUCKET_SIZES[defaultScoreInterval]; - HabitScoreView dataView = new HabitScoreView(context); + ScoreChart dataView = new ScoreChart(context); dataView.setIsTransparencyEnabled(true); dataView.setBucketSize(size); - GraphWidgetView view = new GraphWidgetView(context, dataView); - view.setHabit(habit); - return view; +// GraphWidgetView view = new GraphWidgetView(context, dataView); +// view.setHabit(habit); +// return view; + + throw new NotImplementedException(""); } @Override diff --git a/app/src/main/java/org/isoron/uhabits/widgets/StreakWidgetProvider.java b/app/src/main/java/org/isoron/uhabits/widgets/StreakWidgetProvider.java index 59af7a256..858ff7fed 100644 --- a/app/src/main/java/org/isoron/uhabits/widgets/StreakWidgetProvider.java +++ b/app/src/main/java/org/isoron/uhabits/widgets/StreakWidgetProvider.java @@ -27,14 +27,14 @@ import org.isoron.uhabits.R; import org.isoron.uhabits.models.Habit; import org.isoron.uhabits.widgets.views.GraphWidgetView; import org.isoron.uhabits.ui.habits.show.views.HabitDataView; -import org.isoron.uhabits.ui.habits.show.views.HabitStreakView; +import org.isoron.uhabits.ui.habits.show.views.StreakChart; public class StreakWidgetProvider extends BaseWidgetProvider { @Override protected View buildCustomView(Context context, Habit habit) { - HabitStreakView dataView = new HabitStreakView(context); + StreakChart dataView = new StreakChart(context); GraphWidgetView view = new GraphWidgetView(context, dataView); view.setHabit(habit); return view; diff --git a/app/src/main/res/layout/show_habit.xml b/app/src/main/res/layout/show_habit.xml index 9bfd2c569..4173c9094 100644 --- a/app/src/main/res/layout/show_habit.xml +++ b/app/src/main/res/layout/show_habit.xml @@ -31,49 +31,23 @@ style="@style/CardList" android:clipToPadding="false"> - + android:id="@+id/subtitleCard"/> - - - - - - - - - - + android:gravity="center" /> - @@ -113,8 +87,8 @@ style="@style/CardHeader" android:text="@string/best_streaks"/> - @@ -128,7 +102,7 @@ style="@style/CardHeader" android:text="@string/frequency"/> - diff --git a/app/src/main/res/layout/show_habit_preview.xml b/app/src/main/res/layout/show_habit_preview.xml index 4ff01a1a9..252723208 100644 --- a/app/src/main/res/layout/show_habit_preview.xml +++ b/app/src/main/res/layout/show_habit_preview.xml @@ -20,7 +20,6 @@ + app:title="Meditation"/> - - + + + \ No newline at end of file diff --git a/app/src/main/res/layout/show_habit_strength.xml b/app/src/main/res/layout/show_habit_strength.xml new file mode 100644 index 000000000..d72debdf2 --- /dev/null +++ b/app/src/main/res/layout/show_habit_strength.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + + \ No newline at end of file