From 6484b96e5af2f6636490700b0c984caa60e58705 Mon Sep 17 00:00:00 2001 From: Alinson Xavier Date: Wed, 15 Jun 2016 05:04:12 -0400 Subject: [PATCH] Reformat and reorganize some code --- .../org/isoron/uhabits/ui/BaseSystem.java | 2 +- .../controllers/HabitCardListController.java | 2 +- .../list/views/CheckmarkButtonView.java | 4 +- .../habits/list/views/HabitCardListView.java | 7 - .../ui/habits/show/ShowHabitActivity.java | 31 +- .../ui/habits/show/ShowHabitFragment.java | 15 +- .../ui/habits/show/ShowHabitHelper.java | 128 +++-- .../habits/show/views/HabitFrequencyView.java | 325 +++++------ .../habits/show/views/HabitHistoryView.java | 518 +++++++++--------- .../ui/habits/show/views/HabitScoreView.java | 350 ++++++------ .../ui/habits/show/views/HabitStreakView.java | 185 +++---- .../ui/habits/show/views/RingView.java | 213 +++---- .../habits/show/views/ScrollableDataView.java | 13 +- .../uhabits/ui/settings/SettingsActivity.java | 3 + .../widgets/views/CheckmarkWidgetView.java | 1 - .../widgets/views/GraphWidgetView.java | 1 - .../views/HabitWidgetView.java | 89 +-- 17 files changed, 951 insertions(+), 936 deletions(-) rename app/src/main/java/org/isoron/uhabits/{ui/habits/show => widgets}/views/HabitWidgetView.java (66%) diff --git a/app/src/main/java/org/isoron/uhabits/ui/BaseSystem.java b/app/src/main/java/org/isoron/uhabits/ui/BaseSystem.java index a95f90f01..e1c7e106c 100644 --- a/app/src/main/java/org/isoron/uhabits/ui/BaseSystem.java +++ b/app/src/main/java/org/isoron/uhabits/ui/BaseSystem.java @@ -161,7 +161,7 @@ public class BaseSystem Environment.getExternalStorageState()); } - private String getLogcat() throws IOException + public String getLogcat() throws IOException { int maxLineCount = 250; StringBuilder builder = new StringBuilder(); diff --git a/app/src/main/java/org/isoron/uhabits/ui/habits/list/controllers/HabitCardListController.java b/app/src/main/java/org/isoron/uhabits/ui/habits/list/controllers/HabitCardListController.java index 2cfb03c98..ebb69d60c 100644 --- a/app/src/main/java/org/isoron/uhabits/ui/habits/list/controllers/HabitCardListController.java +++ b/app/src/main/java/org/isoron/uhabits/ui/habits/list/controllers/HabitCardListController.java @@ -306,7 +306,7 @@ public class HabitCardListController implements DragSortListView.DropListener, protected void notifyListener() { - if (habitListener == null) return; + if(selectionListener == null) return; if (activeMode == SELECTION_MODE) selectionListener.onSelectionChange(); diff --git a/app/src/main/java/org/isoron/uhabits/ui/habits/list/views/CheckmarkButtonView.java b/app/src/main/java/org/isoron/uhabits/ui/habits/list/views/CheckmarkButtonView.java index 2fcd34406..ef6f7f2ca 100644 --- a/app/src/main/java/org/isoron/uhabits/ui/habits/list/views/CheckmarkButtonView.java +++ b/app/src/main/java/org/isoron/uhabits/ui/habits/list/views/CheckmarkButtonView.java @@ -68,8 +68,8 @@ public class CheckmarkButtonView extends FrameLayout public void toggle() { - value = (value == Checkmark.CHECKED_EXPLICITLY ? Checkmark.UNCHECKED : - Checkmark.CHECKED_EXPLICITLY); +// value = (value == Checkmark.CHECKED_EXPLICITLY ? Checkmark.UNCHECKED : +// Checkmark.CHECKED_EXPLICITLY); performHapticFeedback(HapticFeedbackConstants.LONG_PRESS); postInvalidate(); diff --git a/app/src/main/java/org/isoron/uhabits/ui/habits/list/views/HabitCardListView.java b/app/src/main/java/org/isoron/uhabits/ui/habits/list/views/HabitCardListView.java index e1d0832a3..52366774e 100644 --- a/app/src/main/java/org/isoron/uhabits/ui/habits/list/views/HabitCardListView.java +++ b/app/src/main/java/org/isoron/uhabits/ui/habits/list/views/HabitCardListView.java @@ -111,13 +111,6 @@ public class HabitCardListView extends DragSortListView }); } - public void toggleShowArchived() - { -// showArchived = !showArchived; -// cache.setIncludeArchived(showArchived); -// cache.refreshAllHabits(true); - } - @Override protected void onAttachedToWindow() { diff --git a/app/src/main/java/org/isoron/uhabits/ui/habits/show/ShowHabitActivity.java b/app/src/main/java/org/isoron/uhabits/ui/habits/show/ShowHabitActivity.java index 4825f1fa4..bbd7fa628 100644 --- a/app/src/main/java/org/isoron/uhabits/ui/habits/show/ShowHabitActivity.java +++ b/app/src/main/java/org/isoron/uhabits/ui/habits/show/ShowHabitActivity.java @@ -33,7 +33,7 @@ import javax.inject.*; /** * Activity that allows the user to see more information about a single habit. - * + *

* Shows all the metadata for the habit, in addition to several charts. */ public class ShowHabitActivity extends BaseActivity @@ -43,19 +43,9 @@ public class ShowHabitActivity extends BaseActivity @Inject HabitList habitList; - @Override - protected void onCreate(Bundle savedInstanceState) + public Habit getHabit() { - super.onCreate(savedInstanceState); - HabitsApplication.getComponent().inject(this); - - Uri data = getIntent().getData(); - habit = habitList.getById(ContentUris.parseId(data)); - - setContentView(R.layout.show_habit_activity); - BaseScreen.setupActionBarColor(this, ColorUtils.getColor(this, habit.getColor())); - - setupHabitActionBar(); + return habit; } public void setupHabitActionBar() @@ -68,8 +58,19 @@ public class ShowHabitActivity extends BaseActivity actionBar.setTitle(habit.getName()); } - public Habit getHabit() + @Override + protected void onCreate(Bundle savedInstanceState) { - return habit; + super.onCreate(savedInstanceState); + HabitsApplication.getComponent().inject(this); + + Uri data = getIntent().getData(); + habit = habitList.getById(ContentUris.parseId(data)); + + setContentView(R.layout.show_habit_activity); + BaseScreen.setupActionBarColor(this, + ColorUtils.getColor(this, habit.getColor())); + + setupHabitActionBar(); } } 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 ac2c611fa..56279b767 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 @@ -195,16 +195,11 @@ public class ShowHabitFragment extends Fragment public void onModelChange() { refreshData(); - activity.runOnUiThread(new Runnable() - { - @Override - public void run() - { - helper.updateColors(); - helper.updateMainHeader(getView()); - helper.updateCardHeaders(getView()); - if (activity != null) activity.setupHabitActionBar(); - } + activity.runOnUiThread(() -> { + helper.updateColors(); + helper.updateMainHeader(getView()); + helper.updateCardHeaders(getView()); + if (activity != null) activity.setupHabitActionBar(); }); } 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 dabc9a3c9..d0a340007 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 @@ -19,16 +19,14 @@ package org.isoron.uhabits.ui.habits.show; -import android.content.res.Resources; -import android.view.View; -import android.widget.TextView; +import android.content.res.*; +import android.view.*; +import android.widget.*; -import org.isoron.uhabits.R; -import org.isoron.uhabits.models.Score; -import org.isoron.uhabits.ui.habits.show.views.RingView; -import org.isoron.uhabits.utils.ColorUtils; -import org.isoron.uhabits.utils.DateUtils; -import org.isoron.uhabits.utils.InterfaceUtils; +import org.isoron.uhabits.*; +import org.isoron.uhabits.models.*; +import org.isoron.uhabits.ui.habits.show.views.*; +import org.isoron.uhabits.utils.*; public class ShowHabitHelper { @@ -63,44 +61,33 @@ public class ShowHabitHelper resources.getString(R.string.days)); } - void updateScore(View view) + void updateCardHeaders(View view) { - if (fragment.habit == null) return; - if (view == null) return; + updateColor(view, R.id.tvHistory); + updateColor(view, R.id.tvOverview); + updateColor(view, R.id.tvStrength); + updateColor(view, R.id.tvStreaks); + updateColor(view, R.id.tvWeekdayFreq); + updateColor(view, R.id.scoreLabel); + } - float todayPercentage = fragment.todayScore / Score.MAX_VALUE; - float monthDiff = - todayPercentage - (fragment.lastMonthScore / Score.MAX_VALUE); - float yearDiff = - todayPercentage - (fragment.lastYearScore / Score.MAX_VALUE); + void updateColor(View view, int viewId) + { + if (fragment.habit == null || fragment.activity == null) return; - RingView scoreRing = (RingView) view.findViewById(R.id.scoreRing); + TextView textView = (TextView) view.findViewById(viewId); int androidColor = - ColorUtils.getColor(fragment.getActivity(), - fragment.habit.getColor()); - scoreRing.setColor(androidColor); - scoreRing.setPercentage(todayPercentage); - - TextView scoreLabel = (TextView) view.findViewById(R.id.scoreLabel); - TextView monthDiffLabel = - (TextView) view.findViewById(R.id.monthDiffLabel); - TextView yearDiffLabel = - (TextView) view.findViewById(R.id.yearDiffLabel); - - scoreLabel.setText(String.format("%.0f%%", todayPercentage * 100)); - - String minus = "\u2212"; - monthDiffLabel.setText( - String.format("%s%.0f%%", (monthDiff >= 0 ? "+" : minus), - Math.abs(monthDiff) * 100)); - yearDiffLabel.setText( - String.format("%s%.0f%%", (yearDiff >= 0 ? "+" : minus), - Math.abs(yearDiff) * 100)); + ColorUtils.getColor(fragment.activity, fragment.habit.getColor()); + textView.setTextColor(androidColor); + } - monthDiffLabel.setTextColor( - monthDiff >= 0 ? fragment.activeColor : fragment.inactiveColor); - yearDiffLabel.setTextColor( - yearDiff >= 0 ? fragment.activeColor : fragment.inactiveColor); + void updateColors() + { + fragment.activeColor = ColorUtils.getColor(fragment.getContext(), + fragment.habit.getColor()); + fragment.inactiveColor = + InterfaceUtils.getStyledColor(fragment.getContext(), + R.attr.mediumContrastTextColor); } void updateMainHeader(View view) @@ -129,33 +116,42 @@ public class ShowHabitHelper questionLabel.setVisibility(View.GONE); } - void updateCardHeaders(View view) + void updateScore(View view) { - updateColor(view, R.id.tvHistory); - updateColor(view, R.id.tvOverview); - updateColor(view, R.id.tvStrength); - updateColor(view, R.id.tvStreaks); - updateColor(view, R.id.tvWeekdayFreq); - updateColor(view, R.id.scoreLabel); - } + if (fragment.habit == null) return; + if (view == null) return; - void updateColor(View view, int viewId) - { - if (fragment.habit == null || fragment.activity == null) return; + float todayPercentage = fragment.todayScore / Score.MAX_VALUE; + float monthDiff = + todayPercentage - (fragment.lastMonthScore / Score.MAX_VALUE); + float yearDiff = + todayPercentage - (fragment.lastYearScore / Score.MAX_VALUE); - TextView textView = (TextView) view.findViewById(viewId); - int androidColor = - ColorUtils.getColor(fragment.activity, fragment.habit.getColor()); - textView.setTextColor(androidColor); - } + RingView scoreRing = (RingView) view.findViewById(R.id.scoreRing); + int androidColor = ColorUtils.getColor(fragment.getActivity(), + fragment.habit.getColor()); + scoreRing.setColor(androidColor); + scoreRing.setPercentage(todayPercentage); - void updateColors() - { - fragment.activeColor = - ColorUtils.getColor(fragment.getContext(), - fragment.habit.getColor()); - fragment.inactiveColor = - InterfaceUtils.getStyledColor(fragment.getContext(), - R.attr.mediumContrastTextColor); + TextView scoreLabel = (TextView) view.findViewById(R.id.scoreLabel); + TextView monthDiffLabel = + (TextView) view.findViewById(R.id.monthDiffLabel); + TextView yearDiffLabel = + (TextView) view.findViewById(R.id.yearDiffLabel); + + scoreLabel.setText(String.format("%.0f%%", todayPercentage * 100)); + + String minus = "\u2212"; + monthDiffLabel.setText( + String.format("%s%.0f%%", (monthDiff >= 0 ? "+" : minus), + Math.abs(monthDiff) * 100)); + yearDiffLabel.setText( + String.format("%s%.0f%%", (yearDiff >= 0 ? "+" : minus), + Math.abs(yearDiff) * 100)); + + monthDiffLabel.setTextColor( + monthDiff >= 0 ? fragment.activeColor : fragment.inactiveColor); + yearDiffLabel.setTextColor( + yearDiff >= 0 ? fragment.activeColor : fragment.inactiveColor); } } 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/HabitFrequencyView.java index dd8fbdb22..f24317524 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/HabitFrequencyView.java @@ -19,48 +19,53 @@ package org.isoron.uhabits.ui.habits.show.views; -import android.content.Context; -import android.graphics.Canvas; -import android.graphics.Paint; -import android.graphics.RectF; -import android.util.AttributeSet; - -import org.isoron.uhabits.R; -import org.isoron.uhabits.models.Habit; -import org.isoron.uhabits.models.ModelObservable; -import org.isoron.uhabits.tasks.BaseTask; -import org.isoron.uhabits.utils.ColorUtils; -import org.isoron.uhabits.utils.DateUtils; -import org.isoron.uhabits.utils.InterfaceUtils; - -import java.text.SimpleDateFormat; -import java.util.Calendar; -import java.util.Date; -import java.util.GregorianCalendar; -import java.util.HashMap; -import java.util.Random; - -public class HabitFrequencyView extends ScrollableDataView implements HabitDataView, ModelObservable.Listener +import android.content.*; +import android.graphics.*; +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 HabitFrequencyView extends ScrollableDataView + implements HabitDataView, ModelObservable.Listener { private Paint pGrid; + private float em; + private Habit habit; + private SimpleDateFormat dfMonth; + private SimpleDateFormat dfYear; private Paint pText, pGraph; + private RectF rect, prevRect; + private int baseSize; + private int paddingTop; private float columnWidth; + private int columnHeight; + private int nColumns; private int textColor; + private int gridColor; + private int[] colors; + private int primaryColor; + private boolean isBackgroundTransparent; private HashMap frequency; @@ -79,40 +84,34 @@ public class HabitFrequencyView extends ScrollableDataView implements HabitDataV init(); } - public void setHabit(Habit habit) + @Override + public void onModelChange() { - this.habit = habit; - createColors(); + refreshData(); } - private void init() + public void refreshData() { - createPaints(); - createColors(); - - dfMonth = DateUtils.getDateFormat("MMM"); - dfYear = DateUtils.getDateFormat("yyyy"); + if (isInEditMode()) generateRandomData(); + else if (habit != null) + { + frequency = habit.getRepetitions().getWeekdayFrequency(); + createColors(); + } - rect = new RectF(); - prevRect = new RectF(); + postInvalidate(); } - private void createColors() + public void setHabit(Habit habit) { - if(habit != null) - { - this.primaryColor = ColorUtils.getColor(getContext(), - habit.getColor()); - } - - textColor = InterfaceUtils.getStyledColor(getContext(), R.attr.mediumContrastTextColor); - gridColor = InterfaceUtils.getStyledColor(getContext(), R.attr.lowContrastTextColor); + this.habit = habit; + createColors(); + } - colors = new int[4]; - colors[0] = gridColor; - colors[3] = primaryColor; - colors[1] = ColorUtils.mixColors(colors[0], colors[3], 0.66f); - colors[2] = ColorUtils.mixColors(colors[0], colors[3], 0.33f); + public void setIsBackgroundTransparent(boolean isBackgroundTransparent) + { + this.isBackgroundTransparent = isBackgroundTransparent; + createColors(); } protected void createPaints() @@ -129,78 +128,27 @@ public class HabitFrequencyView extends ScrollableDataView implements HabitDataV } @Override - protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) - { - int width = MeasureSpec.getSize(widthMeasureSpec); - int height = MeasureSpec.getSize(heightMeasureSpec); - setMeasuredDimension(width, height); - } - - @Override - protected void onSizeChanged(int width, int height, int oldWidth, int oldHeight) - { - if(height < 9) height = 200; - - baseSize = height / 8; - setScrollerBucketSize(baseSize); - - pText.setTextSize(baseSize * 0.4f); - pGraph.setTextSize(baseSize * 0.4f); - pGraph.setStrokeWidth(baseSize * 0.1f); - pGrid.setStrokeWidth(baseSize * 0.05f); - em = pText.getFontSpacing(); - - columnWidth = baseSize; - columnWidth = Math.max(columnWidth, getMaxMonthWidth() * 1.2f); - - columnHeight = 8 * baseSize; - nColumns = (int) (width / columnWidth); - paddingTop = 0; - } - - private float getMaxMonthWidth() - { - float maxMonthWidth = 0; - GregorianCalendar day = DateUtils.getStartOfTodayCalendar(); - - for(int i = 0; i < 12; i++) - { - day.set(Calendar.MONTH, i); - float monthWidth = pText.measureText(dfMonth.format(day.getTime())); - maxMonthWidth = Math.max(maxMonthWidth, monthWidth); - } - - return maxMonthWidth; - } - - public void refreshData() + protected void onAttachedToWindow() { - if(isInEditMode()) generateRandomData(); - else if(habit != null) + super.onAttachedToWindow(); + new BaseTask() { - frequency = habit.getRepetitions().getWeekdayFrequency(); - createColors(); - } - - postInvalidate(); + @Override + protected void doInBackground() + { + refreshData(); + } + }.execute(); + habit.getObservable().addListener(this); + habit.getCheckmarks().observable.addListener(this); } - private void generateRandomData() + @Override + protected void onDetachedFromWindow() { - GregorianCalendar date = DateUtils.getStartOfTodayCalendar(); - date.set(Calendar.DAY_OF_MONTH, 1); - Random rand = new Random(); - frequency.clear(); - - for(int i = 0; i < 40; i++) - { - Integer values[] = new Integer[7]; - for(int j = 0; j < 7; j++) - values[j] = rand.nextInt(5); - - frequency.put(date.getTimeInMillis(), values); - date.add(Calendar.MONTH, -1); - } + habit.getCheckmarks().observable.removeListener(this); + habit.getObservable().removeListener(this); + super.onDetachedFromWindow(); } @Override @@ -223,7 +171,7 @@ public class HabitFrequencyView extends ScrollableDataView implements HabitDataV currentDate.set(Calendar.DAY_OF_MONTH, 1); currentDate.add(Calendar.MONTH, -nColumns + 2 - getDataOffset()); - for(int i = 0; i < nColumns - 1; i++) + for (int i = 0; i < nColumns - 1; i++) { rect.set(0, 0, columnWidth, columnHeight); rect.offset(i * columnWidth, 0); @@ -233,6 +181,59 @@ public class HabitFrequencyView extends ScrollableDataView implements HabitDataV } } + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) + { + int width = MeasureSpec.getSize(widthMeasureSpec); + int height = MeasureSpec.getSize(heightMeasureSpec); + setMeasuredDimension(width, height); + } + + @Override + protected void onSizeChanged(int width, + int height, + int oldWidth, + int oldHeight) + { + if (height < 9) height = 200; + + baseSize = height / 8; + setScrollerBucketSize(baseSize); + + pText.setTextSize(baseSize * 0.4f); + pGraph.setTextSize(baseSize * 0.4f); + pGraph.setStrokeWidth(baseSize * 0.1f); + pGrid.setStrokeWidth(baseSize * 0.05f); + em = pText.getFontSpacing(); + + columnWidth = baseSize; + columnWidth = Math.max(columnWidth, getMaxMonthWidth() * 1.2f); + + columnHeight = 8 * baseSize; + nColumns = (int) (width / columnWidth); + paddingTop = 0; + } + + private void createColors() + { + if (habit != null) + { + this.primaryColor = + ColorUtils.getColor(getContext(), habit.getColor()); + } + + textColor = InterfaceUtils.getStyledColor(getContext(), + R.attr.mediumContrastTextColor); + gridColor = InterfaceUtils.getStyledColor(getContext(), + R.attr.lowContrastTextColor); + + colors = new int[4]; + colors[0] = gridColor; + colors[3] = primaryColor; + colors[1] = ColorUtils.mixColors(colors[0], colors[3], 0.66f); + colors[2] = ColorUtils.mixColors(colors[0], colors[3], 0.33f); + } + private void drawColumn(Canvas canvas, RectF rect, GregorianCalendar date) { Integer values[] = frequency.get(date.getTimeInMillis()); @@ -246,8 +247,7 @@ public class HabitFrequencyView extends ScrollableDataView implements HabitDataV rect.offset(prevRect.left, prevRect.top + baseSize * j); int i = DateUtils.javaWeekdayToLoopWeekday(localeWeekdayList[j]); - if(values != null) - drawMarker(canvas, rect, values[i]); + if (values != null) drawMarker(canvas, rect, values[i]); rect.offset(0, rowHeight); } @@ -259,19 +259,12 @@ public class HabitFrequencyView extends ScrollableDataView implements HabitDataV { Date time = date.getTime(); - canvas.drawText(dfMonth.format(time), rect.centerX(), rect.centerY() - 0.1f * em, pText); + canvas.drawText(dfMonth.format(time), rect.centerX(), + rect.centerY() - 0.1f * em, pText); - if(date.get(Calendar.MONTH) == 1) - canvas.drawText(dfYear.format(time), rect.centerX(), rect.centerY() + 0.9f * em, pText); - } - - private void drawMarker(Canvas canvas, RectF rect, Integer value) - { - float padding = rect.height() * 0.2f; - float radius = (rect.height() - 2 * padding) / 2.0f / 4.0f * Math.min(value, 4); - - pGraph.setColor(colors[Math.min(3, Math.max(0, value - 1))]); - canvas.drawCircle(rect.centerX(), rect.centerY(), radius, pGraph); + if (date.get(Calendar.MONTH) == 1) + canvas.drawText(dfYear.format(time), rect.centerX(), + rect.centerY() + 0.9f * em, pText); } private void drawGrid(Canvas canvas, RectF rGrid) @@ -283,12 +276,14 @@ public class HabitFrequencyView extends ScrollableDataView implements HabitDataV pText.setColor(textColor); pGrid.setColor(gridColor); - for (String day : DateUtils.getLocaleDayNames(Calendar.SHORT)) { + for (String day : DateUtils.getLocaleDayNames(Calendar.SHORT)) + { canvas.drawText(day, rGrid.right - columnWidth, - rGrid.top + rowHeight / 2 + 0.25f * em, pText); + rGrid.top + rowHeight / 2 + 0.25f * em, pText); pGrid.setStrokeWidth(1f); - canvas.drawLine(rGrid.left, rGrid.top, rGrid.right, rGrid.top, pGrid); + canvas.drawLine(rGrid.left, rGrid.top, rGrid.right, rGrid.top, + pGrid); rGrid.offset(0, rowHeight); } @@ -296,40 +291,58 @@ public class HabitFrequencyView extends ScrollableDataView implements HabitDataV canvas.drawLine(rGrid.left, rGrid.top, rGrid.right, rGrid.top, pGrid); } - public void setIsBackgroundTransparent(boolean isBackgroundTransparent) + private void drawMarker(Canvas canvas, RectF rect, Integer value) { - this.isBackgroundTransparent = isBackgroundTransparent; - createColors(); - } + float padding = rect.height() * 0.2f; + float radius = + (rect.height() - 2 * padding) / 2.0f / 4.0f * Math.min(value, 4); + pGraph.setColor(colors[Math.min(3, Math.max(0, value - 1))]); + canvas.drawCircle(rect.centerX(), rect.centerY(), radius, pGraph); + } - @Override - protected void onAttachedToWindow() + private void generateRandomData() { - super.onAttachedToWindow(); - new BaseTask() + GregorianCalendar date = DateUtils.getStartOfTodayCalendar(); + date.set(Calendar.DAY_OF_MONTH, 1); + Random rand = new Random(); + frequency.clear(); + + for (int i = 0; i < 40; i++) { - @Override - protected void doInBackground() - { - refreshData(); - } - }.execute(); - habit.getObservable().addListener(this); - habit.getCheckmarks().observable.addListener(this); + Integer values[] = new Integer[7]; + for (int j = 0; j < 7; j++) + values[j] = rand.nextInt(5); + + frequency.put(date.getTimeInMillis(), values); + date.add(Calendar.MONTH, -1); + } } - @Override - protected void onDetachedFromWindow() + private float getMaxMonthWidth() { - habit.getCheckmarks().observable.removeListener(this); - habit.getObservable().removeListener(this); - super.onDetachedFromWindow(); + float maxMonthWidth = 0; + GregorianCalendar day = DateUtils.getStartOfTodayCalendar(); + + for (int i = 0; i < 12; i++) + { + day.set(Calendar.MONTH, i); + float monthWidth = pText.measureText(dfMonth.format(day.getTime())); + maxMonthWidth = Math.max(maxMonthWidth, monthWidth); + } + + return maxMonthWidth; } - @Override - public void onModelChange() + private void init() { - refreshData(); + createPaints(); + createColors(); + + dfMonth = DateUtils.getDateFormat("MMM"); + dfYear = DateUtils.getDateFormat("yyyy"); + + rect = new RectF(); + prevRect = new RectF(); } } 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/HabitHistoryView.java index b855b8e79..7f7c9a504 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/HabitHistoryView.java @@ -19,61 +19,76 @@ package org.isoron.uhabits.ui.habits.show.views; -import android.content.Context; -import android.graphics.Canvas; -import android.graphics.Color; -import android.graphics.Paint; -import android.graphics.Paint.Align; -import android.graphics.RectF; -import android.util.AttributeSet; -import android.view.HapticFeedbackConstants; -import android.view.MotionEvent; - -import org.isoron.uhabits.R; -import org.isoron.uhabits.models.Habit; -import org.isoron.uhabits.models.ModelObservable; -import org.isoron.uhabits.tasks.BaseTask; -import org.isoron.uhabits.tasks.ToggleRepetitionTask; -import org.isoron.uhabits.utils.ColorUtils; -import org.isoron.uhabits.utils.DateUtils; -import org.isoron.uhabits.utils.InterfaceUtils; - -import java.text.SimpleDateFormat; -import java.util.Calendar; -import java.util.GregorianCalendar; -import java.util.Random; - -public class HabitHistoryView extends ScrollableDataView implements HabitDataView, - ToggleRepetitionTask.Listener, ModelObservable.Listener +import android.content.*; +import android.graphics.*; +import android.graphics.Paint.*; +import android.util.*; +import android.view.*; + +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 HabitHistoryView extends ScrollableDataView implements + HabitDataView, + ToggleRepetitionTask.Listener, + ModelObservable.Listener { private Habit habit; + private int[] checkmarks; + private Paint pSquareBg, pSquareFg, pTextHeader; + private float squareSpacing; private float squareTextOffset; + private float headerTextOffset; private float columnWidth; + private float columnHeight; + private int nColumns; private SimpleDateFormat dfMonth; + private SimpleDateFormat dfYear; private Calendar baseDate; + private int nDays; - /** 0-based-position of today in the column */ + + /** + * 0-based-position of today in the column + */ private int todayPositionInColumn; + private int colors[]; + private RectF baseLocation; + private int primaryColor; private boolean isBackgroundTransparent; + private int textColor; + private int reverseTextColor; + private boolean isEditable; + private String previousMonth; + + private String previousYear; + + private float headerOverflow = 0; + public HabitHistoryView(Context context) { super(context); @@ -86,37 +101,152 @@ public class HabitHistoryView extends ScrollableDataView implements HabitDataVie init(); } + @Override + public void onLongPress(MotionEvent e) + { + onSingleTapUp(e); + } + + @Override + public void onModelChange() + { + refreshData(); + } + + @Override + public boolean onSingleTapUp(MotionEvent e) + { + if (!isEditable) return false; + + performHapticFeedback(HapticFeedbackConstants.KEYBOARD_TAP); + + int pointerId = e.getPointerId(0); + float x = e.getX(pointerId); + float y = e.getY(pointerId); + + final Long timestamp = positionToTimestamp(x, y); + if (timestamp == null) return false; + + ToggleRepetitionTask task = new ToggleRepetitionTask(habit, timestamp); + task.setListener(this); + task.execute(); + + return true; + } + + @Override + public void onToggleRepetitionFinished() + { + new BaseTask() + { + @Override + protected void doInBackground() + { + refreshData(); + } + + @Override + protected void onPostExecute(Void aVoid) + { + invalidate(); + super.onPostExecute(null); + } + }.execute(); + } + + @Override + public void refreshData() + { + if (isInEditMode()) generateRandomData(); + else + { + if (habit == null) return; + checkmarks = habit.getCheckmarks().getAllValues(); + createColors(); + } + + updateDate(); + postInvalidate(); + } + public void setHabit(Habit habit) { this.habit = habit; createColors(); } - private void init() + public void setIsBackgroundTransparent(boolean isBackgroundTransparent) { + this.isBackgroundTransparent = isBackgroundTransparent; createColors(); - createPaints(); + } - isEditable = false; - checkmarks = new int[0]; - primaryColor = ColorUtils.getColor(getContext(), 7); - dfMonth = DateUtils.getDateFormat("MMM"); - dfYear = DateUtils.getDateFormat("yyyy"); + public void setIsEditable(boolean isEditable) + { + this.isEditable = isEditable; + } - baseLocation = new RectF(); + protected void createPaints() + { + pTextHeader = new Paint(); + pTextHeader.setTextAlign(Align.LEFT); + pTextHeader.setAntiAlias(true); + + pSquareBg = new Paint(); + + pSquareFg = new Paint(); + pSquareFg.setAntiAlias(true); + pSquareFg.setTextAlign(Align.CENTER); } - private void updateDate() + @Override + protected void onAttachedToWindow() { - baseDate = DateUtils.getStartOfTodayCalendar(); - baseDate.add(Calendar.DAY_OF_YEAR, -(getDataOffset() - 1) * 7); + super.onAttachedToWindow(); + new BaseTask() + { + @Override + protected void doInBackground() + { + refreshData(); + } + }.execute(); + habit.getObservable().addListener(this); + habit.getCheckmarks().observable.addListener(this); + } - nDays = (nColumns - 1) * 7; - int realWeekday = DateUtils.getStartOfTodayCalendar().get(Calendar.DAY_OF_WEEK); - todayPositionInColumn = (7 + realWeekday - baseDate.getFirstDayOfWeek()) % 7; + @Override + protected void onDetachedFromWindow() + { + habit.getCheckmarks().observable.removeListener(this); + habit.getObservable().removeListener(this); + super.onDetachedFromWindow(); + } - baseDate.add(Calendar.DAY_OF_YEAR, -nDays); - baseDate.add(Calendar.DAY_OF_YEAR, -todayPositionInColumn); + @Override + protected void onDraw(Canvas canvas) + { + super.onDraw(canvas); + + baseLocation.set(0, 0, columnWidth - squareSpacing, + columnWidth - squareSpacing); + baseLocation.offset(getPaddingLeft(), getPaddingTop()); + + headerOverflow = 0; + previousMonth = ""; + previousYear = ""; + pTextHeader.setColor(textColor); + + updateDate(); + GregorianCalendar currentDate = (GregorianCalendar) baseDate.clone(); + + for (int column = 0; column < nColumns - 1; column++) + { + drawColumn(canvas, baseLocation, currentDate, column); + baseLocation.offset(columnWidth, -columnHeight); + } + + drawAxis(canvas, baseLocation); } @Override @@ -128,14 +258,18 @@ public class HabitHistoryView extends ScrollableDataView implements HabitDataVie } @Override - protected void onSizeChanged(int width, int height, int oldWidth, int oldHeight) + protected void onSizeChanged(int width, + int height, + int oldWidth, + int oldHeight) { - if(height < 8) height = 200; + if (height < 8) height = 200; float baseSize = height / 8.0f; setScrollerBucketSize((int) baseSize); squareSpacing = InterfaceUtils.dpToPixels(getContext(), 1.0f); - float maxTextSize = getResources().getDimension(R.dimen.regularTextSize); + float maxTextSize = + getResources().getDimension(R.dimen.regularTextSize); float textSize = height * 0.06f; textSize = Math.min(textSize, maxTextSize); @@ -149,35 +283,26 @@ public class HabitHistoryView extends ScrollableDataView implements HabitDataVie columnWidth = baseSize; columnHeight = 8 * baseSize; - nColumns = (int)((width - rightLabelWidth - horizontalPadding) / baseSize) + 1; + nColumns = + (int) ((width - rightLabelWidth - horizontalPadding) / baseSize) + + 1; updateDate(); } - private float getWeekdayLabelWidth() - { - float width = 0; - - for(String w : DateUtils.getLocaleDayNames(Calendar.SHORT)) - width = Math.max(width, pSquareFg.measureText(w)); - - return width; - } - private void createColors() { - if(habit != null) - this.primaryColor = ColorUtils.getColor(getContext(), - habit.getColor()); + if (habit != null) this.primaryColor = + ColorUtils.getColor(getContext(), habit.getColor()); - if(isBackgroundTransparent) + if (isBackgroundTransparent) primaryColor = ColorUtils.setMinValue(primaryColor, 0.75f); int red = Color.red(primaryColor); int green = Color.green(primaryColor); int blue = Color.blue(primaryColor); - if(isBackgroundTransparent) + if (isBackgroundTransparent) { colors = new int[3]; colors[0] = Color.argb(16, 255, 255, 255); @@ -189,100 +314,45 @@ public class HabitHistoryView extends ScrollableDataView implements HabitDataVie else { colors = new int[3]; - colors[0] = InterfaceUtils.getStyledColor(getContext(), R.attr.lowContrastTextColor); + colors[0] = InterfaceUtils.getStyledColor(getContext(), + R.attr.lowContrastTextColor); colors[1] = Color.argb(127, red, green, blue); colors[2] = primaryColor; - textColor = InterfaceUtils.getStyledColor(getContext(), R.attr.mediumContrastTextColor); - reverseTextColor = InterfaceUtils.getStyledColor(getContext(), R.attr.highContrastReverseTextColor); + textColor = InterfaceUtils.getStyledColor(getContext(), + R.attr.mediumContrastTextColor); + reverseTextColor = InterfaceUtils.getStyledColor(getContext(), + R.attr.highContrastReverseTextColor); } } - protected void createPaints() - { - pTextHeader = new Paint(); - pTextHeader.setTextAlign(Align.LEFT); - pTextHeader.setAntiAlias(true); - - pSquareBg = new Paint(); - - pSquareFg = new Paint(); - pSquareFg.setAntiAlias(true); - pSquareFg.setTextAlign(Align.CENTER); - } - - public void refreshData() - { - if(isInEditMode()) - generateRandomData(); - else - { - if(habit == null) return; - checkmarks = habit.getCheckmarks().getAllValues(); - createColors(); - } - - updateDate(); - postInvalidate(); - } - - private void generateRandomData() - { - Random random = new Random(); - checkmarks = new int[100]; - - for(int i = 0; i < 100; i++) - if(random.nextFloat() < 0.3) checkmarks[i] = 2; - - for(int i = 0; i < 100 - 7; i++) - { - int count = 0; - for (int j = 0; j < 7; j++) - if(checkmarks[i + j] != 0) - count++; - - if(count >= 3) checkmarks[i] = Math.max(checkmarks[i], 1); - } - } - - private String previousMonth; - private String previousYear; - - @Override - protected void onDraw(Canvas canvas) + private void drawAxis(Canvas canvas, RectF location) { - super.onDraw(canvas); - - baseLocation.set(0, 0, columnWidth - squareSpacing, columnWidth - squareSpacing); - baseLocation.offset(getPaddingLeft(), getPaddingTop()); - - headerOverflow = 0; - previousMonth = ""; - previousYear = ""; - pTextHeader.setColor(textColor); - - updateDate(); - GregorianCalendar currentDate = (GregorianCalendar) baseDate.clone(); + float verticalOffset = pTextHeader.getFontSpacing() * 0.4f; - for (int column = 0; column < nColumns - 1; column++) + for (String day : DateUtils.getLocaleDayNames(Calendar.SHORT)) { - drawColumn(canvas, baseLocation, currentDate, column); - baseLocation.offset(columnWidth, - columnHeight); + location.offset(0, columnWidth); + canvas.drawText(day, location.left + headerTextOffset, + location.centerY() + verticalOffset, pTextHeader); } - - drawAxis(canvas, baseLocation); } - private void drawColumn(Canvas canvas, RectF location, GregorianCalendar date, int column) + private void drawColumn(Canvas canvas, + RectF location, + GregorianCalendar date, + int column) { drawColumnHeader(canvas, location, date); location.offset(0, columnWidth); for (int j = 0; j < 7; j++) { - if (!(column == nColumns - 2 && getDataOffset() == 0 && j > todayPositionInColumn)) + if (!(column == nColumns - 2 && getDataOffset() == 0 && + j > todayPositionInColumn)) { - int checkmarkOffset = getDataOffset() * 7 + nDays - 7 * (column + 1) + - todayPositionInColumn - j; + int checkmarkOffset = + getDataOffset() * 7 + nDays - 7 * (column + 1) + + todayPositionInColumn - j; drawSquare(canvas, location, date, checkmarkOffset); } @@ -291,7 +361,31 @@ public class HabitHistoryView extends ScrollableDataView implements HabitDataVie } } - private void drawSquare(Canvas canvas, RectF location, GregorianCalendar date, + private void drawColumnHeader(Canvas canvas, + RectF location, + GregorianCalendar date) + { + String month = dfMonth.format(date.getTime()); + String year = dfYear.format(date.getTime()); + + String text = null; + if (!month.equals(previousMonth)) text = previousMonth = month; + else if (!year.equals(previousYear)) text = previousYear = year; + + if (text != null) + { + canvas.drawText(text, location.left + headerOverflow, + location.bottom - headerTextOffset, pTextHeader); + headerOverflow += + pTextHeader.measureText(text) + columnWidth * 0.2f; + } + + headerOverflow = Math.max(0, headerOverflow - columnWidth); + } + + private void drawSquare(Canvas canvas, + RectF location, + GregorianCalendar date, int checkmarkOffset) { if (checkmarkOffset >= checkmarks.length) pSquareBg.setColor(colors[0]); @@ -300,74 +394,50 @@ public class HabitHistoryView extends ScrollableDataView implements HabitDataVie pSquareFg.setColor(reverseTextColor); canvas.drawRect(location, pSquareBg); String text = Integer.toString(date.get(Calendar.DAY_OF_MONTH)); - canvas.drawText(text, location.centerX(), location.centerY() + squareTextOffset, pSquareFg); + canvas.drawText(text, location.centerX(), + location.centerY() + squareTextOffset, pSquareFg); } - private void drawAxis(Canvas canvas, RectF location) + private void generateRandomData() { - float verticalOffset = pTextHeader.getFontSpacing() * 0.4f; + Random random = new Random(); + checkmarks = new int[100]; - for (String day : DateUtils.getLocaleDayNames(Calendar.SHORT)) + for (int i = 0; i < 100; i++) + if (random.nextFloat() < 0.3) checkmarks[i] = 2; + + for (int i = 0; i < 100 - 7; i++) { - location.offset(0, columnWidth); - canvas.drawText(day, location.left + headerTextOffset, - location.centerY() + verticalOffset, pTextHeader); + int count = 0; + for (int j = 0; j < 7; j++) + if (checkmarks[i + j] != 0) count++; + + if (count >= 3) checkmarks[i] = Math.max(checkmarks[i], 1); } } - private float headerOverflow = 0; - - private void drawColumnHeader(Canvas canvas, RectF location, GregorianCalendar date) + private float getWeekdayLabelWidth() { - String month = dfMonth.format(date.getTime()); - String year = dfYear.format(date.getTime()); - - String text = null; - if (!month.equals(previousMonth)) - text = previousMonth = month; - else if(!year.equals(previousYear)) - text = previousYear = year; + float width = 0; - if(text != null) - { - canvas.drawText(text, location.left + headerOverflow, location.bottom - headerTextOffset, pTextHeader); - headerOverflow += pTextHeader.measureText(text) + columnWidth * 0.2f; - } + for (String w : DateUtils.getLocaleDayNames(Calendar.SHORT)) + width = Math.max(width, pSquareFg.measureText(w)); - headerOverflow = Math.max(0, headerOverflow - columnWidth); + return width; } - public void setIsBackgroundTransparent(boolean isBackgroundTransparent) + private void init() { - this.isBackgroundTransparent = isBackgroundTransparent; createColors(); - } - - @Override - public void onLongPress(MotionEvent e) - { - onSingleTapUp(e); - } - - @Override - public boolean onSingleTapUp(MotionEvent e) - { - if(!isEditable) return false; - - performHapticFeedback(HapticFeedbackConstants.KEYBOARD_TAP); - - int pointerId = e.getPointerId(0); - float x = e.getX(pointerId); - float y = e.getY(pointerId); - - final Long timestamp = positionToTimestamp(x, y); - if(timestamp == null) return false; + createPaints(); - ToggleRepetitionTask task = new ToggleRepetitionTask(habit, timestamp); - task.setListener(this); - task.execute(); + isEditable = false; + checkmarks = new int[0]; + primaryColor = ColorUtils.getColor(getContext(), 7); + dfMonth = DateUtils.getDateFormat("MMM"); + dfYear = DateUtils.getDateFormat("yyyy"); - return true; + baseLocation = new RectF(); } private Long positionToTimestamp(float x, float y) @@ -375,71 +445,31 @@ public class HabitHistoryView extends ScrollableDataView implements HabitDataVie int col = (int) (x / columnWidth); int row = (int) (y / columnWidth); - if(row == 0) return null; - if(col == nColumns - 1) return null; + if (row == 0) return null; + if (col == nColumns - 1) return null; int offset = col * 7 + (row - 1); Calendar date = (Calendar) baseDate.clone(); date.add(Calendar.DAY_OF_YEAR, offset); - if(DateUtils.getStartOfDay(date.getTimeInMillis()) > DateUtils.getStartOfToday()) - return null; + if (DateUtils.getStartOfDay(date.getTimeInMillis()) > + DateUtils.getStartOfToday()) return null; return date.getTimeInMillis(); } - public void setIsEditable(boolean isEditable) - { - this.isEditable = isEditable; - } - - @Override - public void onToggleRepetitionFinished() - { - new BaseTask() - { - @Override - protected void doInBackground() - { - refreshData(); - } - - @Override - protected void onPostExecute(Void aVoid) - { - invalidate(); - super.onPostExecute(null); - } - }.execute(); - } - - @Override - protected void onAttachedToWindow() + private void updateDate() { - super.onAttachedToWindow(); - new BaseTask() - { - @Override - protected void doInBackground() - { - refreshData(); - } - }.execute(); - habit.getObservable().addListener(this); - habit.getCheckmarks().observable.addListener(this); - } + baseDate = DateUtils.getStartOfTodayCalendar(); + baseDate.add(Calendar.DAY_OF_YEAR, -(getDataOffset() - 1) * 7); - @Override - protected void onDetachedFromWindow() - { - habit.getCheckmarks().observable.removeListener(this); - habit.getObservable().removeListener(this); - super.onDetachedFromWindow(); - } + nDays = (nColumns - 1) * 7; + int realWeekday = + DateUtils.getStartOfTodayCalendar().get(Calendar.DAY_OF_WEEK); + todayPositionInColumn = + (7 + realWeekday - baseDate.getFirstDayOfWeek()) % 7; - @Override - public void onModelChange() - { - refreshData(); + baseDate.add(Calendar.DAY_OF_YEAR, -nDays); + baseDate.add(Calendar.DAY_OF_YEAR, -todayPositionInColumn); } } 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/HabitScoreView.java index 7215430ee..2d125283a 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/HabitScoreView.java @@ -19,34 +19,18 @@ package org.isoron.uhabits.ui.habits.show.views; -import android.content.Context; -import android.graphics.Bitmap; -import android.graphics.Canvas; -import android.graphics.Color; -import android.graphics.Paint; -import android.graphics.PorterDuff; -import android.graphics.PorterDuffXfermode; -import android.graphics.RectF; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; -import android.util.AttributeSet; -import android.util.Log; - -import org.isoron.uhabits.R; -import org.isoron.uhabits.models.Habit; -import org.isoron.uhabits.models.ModelObservable; -import org.isoron.uhabits.models.Score; -import org.isoron.uhabits.tasks.BaseTask; -import org.isoron.uhabits.utils.ColorUtils; -import org.isoron.uhabits.utils.DateUtils; -import org.isoron.uhabits.utils.InterfaceUtils; - -import java.text.SimpleDateFormat; -import java.util.Calendar; -import java.util.GregorianCalendar; -import java.util.LinkedList; -import java.util.List; -import java.util.Random; +import android.content.*; +import android.graphics.*; +import android.support.annotation.*; +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 @@ -138,10 +122,8 @@ public class HabitScoreView extends ScrollableDataView else { if (habit == null) return; - if (bucketSize == 1) - scores = habit.getScores().getAll(); - else - scores = habit.getScores().groupBy(getTruncateField()); + if (bucketSize == 1) scores = habit.getScores().getAll(); + else scores = habit.getScores().groupBy(getTruncateField()); createColors(); } @@ -168,19 +150,6 @@ public class HabitScoreView extends ScrollableDataView requestLayout(); } - private void createColors() - { - if (habit != null) this.primaryColor = - ColorUtils.getColor(getContext(), habit.getColor()); - - textColor = InterfaceUtils.getStyledColor(getContext(), - R.attr.mediumContrastTextColor); - gridColor = InterfaceUtils.getStyledColor(getContext(), - R.attr.lowContrastTextColor); - backgroundColor = InterfaceUtils.getStyledColor(getContext(), - R.attr.cardBackgroundColor); - } - protected void createPaints() { pText = new Paint(); @@ -194,6 +163,158 @@ 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) + { + super.onDraw(canvas); + Canvas activeCanvas; + + if (isTransparencyEnabled) + { + if (drawingCache == null) initCache(getWidth(), getHeight()); + + activeCanvas = cacheCanvas; + drawingCache.eraseColor(Color.TRANSPARENT); + } + else + { + activeCanvas = canvas; + } + + if (habit == null || scores == null) return; + + rect.set(0, 0, nColumns * columnWidth, columnHeight); + rect.offset(0, paddingTop); + + drawGrid(activeCanvas, rect); + + pText.setColor(textColor); + pGraph.setColor(primaryColor); + prevRect.setEmpty(); + + previousMonthText = ""; + 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(); + + double relativeScore = ((double) score) / Score.MAX_VALUE; + int height = (int) (columnHeight * relativeScore); + + rect.set(0, 0, baseSize, baseSize); + rect.offset(k * columnWidth + (columnWidth - baseSize) / 2, + paddingTop + columnHeight - height - baseSize / 2); + + if (!prevRect.isEmpty()) + { + drawLine(activeCanvas, prevRect, rect); + drawMarker(activeCanvas, prevRect); + } + + if (k == nColumns - 1) drawMarker(activeCanvas, rect); + + prevRect.set(rect); + rect.set(0, 0, columnWidth, columnHeight); + rect.offset(k * columnWidth, paddingTop); + + drawFooter(activeCanvas, rect, currentDate); + + currentDate += bucketSize * DateUtils.millisecondsInOneDay; + } + + if (activeCanvas != canvas) canvas.drawBitmap(drawingCache, 0, 0, null); + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) + { + int width = MeasureSpec.getSize(widthMeasureSpec); + int height = MeasureSpec.getSize(heightMeasureSpec); + setMeasuredDimension(width, height); + } + + @Override + protected void onSizeChanged(int width, + int height, + int oldWidth, + int oldHeight) + { + if (height < 9) height = 200; + + float maxTextSize = getResources().getDimension(R.dimen.tinyTextSize); + float textSize = height * 0.06f; + pText.setTextSize(Math.min(textSize, maxTextSize)); + em = pText.getFontSpacing(); + + 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; + + columnHeight = 8 * baseSize; + + float minStrokeWidth = InterfaceUtils.dpToPixels(getContext(), 1); + pGraph.setTextSize(baseSize * 0.5f); + pGraph.setStrokeWidth(baseSize * 0.1f); + pGrid.setStrokeWidth(Math.min(minStrokeWidth, baseSize * 0.05f)); + + if (isTransparencyEnabled) initCache(width, height); + } + + private void createColors() + { + if (habit != null) this.primaryColor = + ColorUtils.getColor(getContext(), habit.getColor()); + + textColor = InterfaceUtils.getStyledColor(getContext(), + R.attr.mediumContrastTextColor); + gridColor = InterfaceUtils.getStyledColor(getContext(), + R.attr.lowContrastTextColor); + backgroundColor = InterfaceUtils.getStyledColor(getContext(), + R.attr.cardBackgroundColor); + } + private void drawFooter(Canvas canvas, RectF rect, long currentDate) { String yearText = dfYear.format(currentDate); @@ -393,145 +514,6 @@ public class HabitScoreView extends ScrollableDataView cacheCanvas = new Canvas(drawingCache); } - @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) - { - super.onDraw(canvas); - Canvas activeCanvas; - - if (isTransparencyEnabled) - { - if (drawingCache == null) initCache(getWidth(), getHeight()); - - activeCanvas = cacheCanvas; - drawingCache.eraseColor(Color.TRANSPARENT); - } - else - { - activeCanvas = canvas; - } - - if (habit == null || scores == null) return; - - rect.set(0, 0, nColumns * columnWidth, columnHeight); - rect.offset(0, paddingTop); - - drawGrid(activeCanvas, rect); - - pText.setColor(textColor); - pGraph.setColor(primaryColor); - prevRect.setEmpty(); - - previousMonthText = ""; - 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(); - - double relativeScore = ((double) score) / Score.MAX_VALUE; - int height = (int) (columnHeight * relativeScore); - - rect.set(0, 0, baseSize, baseSize); - rect.offset(k * columnWidth + (columnWidth - baseSize) / 2, - paddingTop + columnHeight - height - baseSize / 2); - - if (!prevRect.isEmpty()) - { - drawLine(activeCanvas, prevRect, rect); - drawMarker(activeCanvas, prevRect); - } - - if (k == nColumns - 1) drawMarker(activeCanvas, rect); - - prevRect.set(rect); - rect.set(0, 0, columnWidth, columnHeight); - rect.offset(k * columnWidth, paddingTop); - - drawFooter(activeCanvas, rect, currentDate); - - currentDate += bucketSize * DateUtils.millisecondsInOneDay; - } - - if (activeCanvas != canvas) canvas.drawBitmap(drawingCache, 0, 0, null); - } - - @Override - protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) - { - int width = MeasureSpec.getSize(widthMeasureSpec); - int height = MeasureSpec.getSize(heightMeasureSpec); - setMeasuredDimension(width, height); - } - - @Override - protected void onSizeChanged(int width, - int height, - int oldWidth, - int oldHeight) - { - if (height < 9) height = 200; - - float maxTextSize = getResources().getDimension(R.dimen.tinyTextSize); - float textSize = height * 0.06f; - pText.setTextSize(Math.min(textSize, maxTextSize)); - em = pText.getFontSpacing(); - - 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; - - columnHeight = 8 * baseSize; - - float minStrokeWidth = InterfaceUtils.dpToPixels(getContext(), 1); - pGraph.setTextSize(baseSize * 0.5f); - pGraph.setStrokeWidth(baseSize * 0.1f); - pGrid.setStrokeWidth(Math.min(minStrokeWidth, baseSize * 0.05f)); - - if (isTransparencyEnabled) initCache(width, height); - } - private void setModeOrColor(Paint p, PorterDuffXfermode mode, int color) { if (isTransparencyEnabled) p.setXfermode(mode); 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/HabitStreakView.java index 59d2bc78a..68ebdf934 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/HabitStreakView.java @@ -19,27 +19,18 @@ package org.isoron.uhabits.ui.habits.show.views; -import android.content.Context; -import android.graphics.Canvas; -import android.graphics.Color; -import android.graphics.Paint; -import android.graphics.RectF; -import android.util.AttributeSet; -import android.view.View; - -import org.isoron.uhabits.R; -import org.isoron.uhabits.models.Habit; -import org.isoron.uhabits.models.ModelObservable; -import org.isoron.uhabits.models.Streak; -import org.isoron.uhabits.tasks.BaseTask; -import org.isoron.uhabits.utils.ColorUtils; -import org.isoron.uhabits.utils.InterfaceUtils; - -import java.text.DateFormat; -import java.util.Collections; -import java.util.Date; -import java.util.List; -import java.util.TimeZone; +import android.content.*; +import android.graphics.*; +import android.util.*; +import android.view.*; + +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 HabitStreakView extends View implements HabitDataView, ModelObservable.Listener @@ -124,6 +115,82 @@ public class HabitStreakView extends View createColors(); } + protected void createPaints() + { + paint = new Paint(); + paint.setTextAlign(Paint.Align.CENTER); + paint.setAntiAlias(true); + } + + @Override + protected void onAttachedToWindow() + { + super.onAttachedToWindow(); + new BaseTask() + { + @Override + protected void doInBackground() + { + refreshData(); + } + }.execute(); + habit.getObservable().addListener(this); + habit.getStreaks().getObservable().addListener(this); + } + + @Override + protected void onDetachedFromWindow() + { + habit.getStreaks().getObservable().removeListener(this); + habit.getObservable().removeListener(this); + super.onDetachedFromWindow(); + } + + @Override + protected void onDraw(Canvas canvas) + { + super.onDraw(canvas); + if (streaks.size() == 0) return; + + rect.set(0, 0, width, baseSize); + + for (Streak s : streaks) + { + drawRow(canvas, s, rect); + rect.offset(0, baseSize); + } + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) + { + int width = MeasureSpec.getSize(widthMeasureSpec); + int height = MeasureSpec.getSize(heightMeasureSpec); + setMeasuredDimension(width, height); + } + + @Override + protected void onSizeChanged(int width, + int height, + int oldWidth, + int oldHeight) + { + maxStreakCount = height / baseSize; + this.width = width; + + float minTextSize = getResources().getDimension(R.dimen.tinyTextSize); + float maxTextSize = + getResources().getDimension(R.dimen.regularTextSize); + float textSize = baseSize * 0.5f; + + paint.setTextSize( + Math.max(Math.min(textSize, maxTextSize), minTextSize)); + em = paint.getFontSpacing(); + textMargin = 0.5f * em; + + updateMaxMin(); + } + private void createColors() { if (habit != null) this.primaryColor = @@ -145,13 +212,6 @@ public class HabitStreakView extends View R.attr.highContrastReverseTextColor); } - protected void createPaints() - { - paint = new Paint(); - paint.setTextAlign(Paint.Align.CENTER); - paint.setAntiAlias(true); - } - private void drawRow(Canvas canvas, Streak streak, RectF rect) { if (maxLength == 0) return; @@ -208,75 +268,6 @@ public class HabitStreakView extends View baseSize = getResources().getDimensionPixelSize(R.dimen.baseSize); } - @Override - protected void onAttachedToWindow() - { - super.onAttachedToWindow(); - new BaseTask() - { - @Override - protected void doInBackground() - { - refreshData(); - } - }.execute(); - habit.getObservable().addListener(this); - habit.getStreaks().getObservable().addListener(this); - } - - @Override - protected void onDetachedFromWindow() - { - habit.getStreaks().getObservable().removeListener(this); - habit.getObservable().removeListener(this); - super.onDetachedFromWindow(); - } - - @Override - protected void onDraw(Canvas canvas) - { - super.onDraw(canvas); - if (streaks.size() == 0) return; - - rect.set(0, 0, width, baseSize); - - for (Streak s : streaks) - { - drawRow(canvas, s, rect); - rect.offset(0, baseSize); - } - } - - @Override - protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) - { - int width = MeasureSpec.getSize(widthMeasureSpec); - int height = MeasureSpec.getSize(heightMeasureSpec); - setMeasuredDimension(width, height); - } - - @Override - protected void onSizeChanged(int width, - int height, - int oldWidth, - int oldHeight) - { - maxStreakCount = height / baseSize; - this.width = width; - - float minTextSize = getResources().getDimension(R.dimen.tinyTextSize); - float maxTextSize = - getResources().getDimension(R.dimen.regularTextSize); - float textSize = baseSize * 0.5f; - - paint.setTextSize( - Math.max(Math.min(textSize, maxTextSize), minTextSize)); - em = paint.getFontSpacing(); - textMargin = 0.5f * em; - - updateMaxMin(); - } - private int percentageToColor(float percentage) { if (percentage >= 1.0f) return colors[3]; diff --git a/app/src/main/java/org/isoron/uhabits/ui/habits/show/views/RingView.java b/app/src/main/java/org/isoron/uhabits/ui/habits/show/views/RingView.java index f471dfce9..2d124fe64 100644 --- a/app/src/main/java/org/isoron/uhabits/ui/habits/show/views/RingView.java +++ b/app/src/main/java/org/isoron/uhabits/ui/habits/show/views/RingView.java @@ -19,47 +19,52 @@ package org.isoron.uhabits.ui.habits.show.views; -import android.content.Context; -import android.graphics.Bitmap; -import android.graphics.Canvas; -import android.graphics.Color; -import android.graphics.Paint; -import android.graphics.PorterDuff; -import android.graphics.PorterDuffXfermode; -import android.graphics.RectF; -import android.support.annotation.Nullable; -import android.text.TextPaint; -import android.util.AttributeSet; -import android.view.View; - -import org.isoron.uhabits.R; -import org.isoron.uhabits.utils.ColorUtils; -import org.isoron.uhabits.utils.InterfaceUtils; +import android.content.*; +import android.graphics.*; +import android.support.annotation.*; +import android.text.*; +import android.util.*; +import android.view.*; + +import org.isoron.uhabits.*; +import org.isoron.uhabits.utils.*; + +import static org.isoron.uhabits.utils.InterfaceUtils.*; public class RingView extends View { public static final PorterDuffXfermode XFERMODE_CLEAR = - new PorterDuffXfermode(PorterDuff.Mode.CLEAR); + new PorterDuffXfermode(PorterDuff.Mode.CLEAR); private int color; + private float precision; + private float percentage; + private int diameter; + private float thickness; private RectF rect; + private TextPaint pRing; private Integer backgroundColor; + private Integer inactiveColor; private float em; + private String text; + private float textSize; + private boolean enableFontAwesome; @Nullable private Bitmap drawingCache; + private Canvas cacheCanvas; private boolean isTransparencyEnabled; @@ -71,54 +76,56 @@ public class RingView extends View percentage = 0.0f; precision = 0.01f; color = ColorUtils.getAndroidTestColor(0); - thickness = InterfaceUtils.dpToPixels(getContext(), 2); + thickness = dpToPixels(getContext(), 2); text = ""; textSize = context.getResources().getDimension(R.dimen.smallTextSize); init(); } - public RingView(Context context, AttributeSet attrs) + public RingView(Context ctx, AttributeSet attrs) { - super(context, attrs); + super(ctx, attrs); - percentage = InterfaceUtils.getFloatAttribute(context, attrs, "percentage", 0); - precision = InterfaceUtils.getFloatAttribute(context, attrs, "precision", 0.01f); + percentage = getFloatAttribute(ctx, attrs, "percentage", 0); + precision = getFloatAttribute(ctx, attrs, "precision", 0.01f); - color = InterfaceUtils.getColorAttribute(context, attrs, "color", 0); - backgroundColor = InterfaceUtils.getColorAttribute(context, attrs, "backgroundColor", null); - inactiveColor = InterfaceUtils.getColorAttribute(context, attrs, "inactiveColor", null); + color = getColorAttribute(ctx, attrs, "color", 0); + backgroundColor = + getColorAttribute(ctx, attrs, "backgroundColor", null); + inactiveColor = getColorAttribute(ctx, attrs, "inactiveColor", null); - thickness = InterfaceUtils.getFloatAttribute(context, attrs, "thickness", 0); - thickness = InterfaceUtils.dpToPixels(context, thickness); + thickness = getFloatAttribute(ctx, attrs, "thickness", 0); + thickness = dpToPixels(ctx, thickness); - float defaultTextSize = context.getResources().getDimension(R.dimen.smallTextSize); - textSize = InterfaceUtils.getFloatAttribute(context, attrs, "textSize", defaultTextSize); - textSize = InterfaceUtils.spToPixels(context, textSize); + float defaultTextSize = + ctx.getResources().getDimension(R.dimen.smallTextSize); + textSize = getFloatAttribute(ctx, attrs, "textSize", defaultTextSize); + textSize = spToPixels(ctx, textSize); + text = getAttribute(ctx, attrs, "text", ""); - text = InterfaceUtils.getAttribute(context, attrs, "text", ""); - - enableFontAwesome = InterfaceUtils.getBooleanAttribute(context, attrs, "enableFontAwesome", false); + enableFontAwesome = + getBooleanAttribute(ctx, attrs, "enableFontAwesome", false); init(); } - public void setColor(int color) + @Override + public void setBackgroundColor(int backgroundColor) { - this.color = color; + this.backgroundColor = backgroundColor; postInvalidate(); } - public void setTextSize(float textSize) + public void setColor(int color) { - this.textSize = textSize; + this.color = color; + postInvalidate(); } - @Override - public void setBackgroundColor(int backgroundColor) + public void setIsTransparencyEnabled(boolean isTransparencyEnabled) { - this.backgroundColor = backgroundColor; - postInvalidate(); + this.isTransparencyEnabled = isTransparencyEnabled; } public void setPercentage(float percentage) @@ -133,64 +140,21 @@ public class RingView extends View postInvalidate(); } - public void setThickness(float thickness) - { - this.thickness = thickness; - postInvalidate(); - } - public void setText(String text) { this.text = text; postInvalidate(); } - private void init() - { - pRing = new TextPaint(); - pRing.setAntiAlias(true); - pRing.setColor(color); - pRing.setTextAlign(Paint.Align.CENTER); - - if(backgroundColor == null) - backgroundColor = InterfaceUtils.getStyledColor(getContext(), R.attr.cardBackgroundColor); - - if(inactiveColor == null) - inactiveColor = InterfaceUtils.getStyledColor(getContext(), R.attr.highContrastTextColor); - - inactiveColor = ColorUtils.setAlpha(inactiveColor, 0.1f); - - rect = new RectF(); - } - - @Override - protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) - { - super.onMeasure(widthMeasureSpec, heightMeasureSpec); - - int width = MeasureSpec.getSize(widthMeasureSpec); - int height = MeasureSpec.getSize(heightMeasureSpec); - diameter = Math.min(height, width); - - pRing.setTextSize(textSize); - em = pRing.measureText("M"); - - setMeasuredDimension(diameter, diameter); - } - - @Override - protected void onSizeChanged(int w, int h, int oldw, int oldh) + public void setTextSize(float textSize) { - super.onSizeChanged(w, h, oldw, oldh); - - if(isTransparencyEnabled) reallocateCache(); + this.textSize = textSize; } - private void reallocateCache() + public void setThickness(float thickness) { - if (drawingCache != null) drawingCache.recycle(); - drawingCache = Bitmap.createBitmap(diameter, diameter, Bitmap.Config.ARGB_8888); - cacheCanvas = new Canvas(drawingCache); + this.thickness = thickness; + postInvalidate(); } @Override @@ -199,9 +163,9 @@ public class RingView extends View super.onDraw(canvas); Canvas activeCanvas; - if(isTransparencyEnabled) + if (isTransparencyEnabled) { - if(drawingCache == null) reallocateCache(); + if (drawingCache == null) reallocateCache(); activeCanvas = cacheCanvas; drawingCache.eraseColor(Color.TRANSPARENT); } @@ -220,12 +184,10 @@ public class RingView extends View pRing.setColor(inactiveColor); activeCanvas.drawArc(rect, angle - 90, 360 - angle, true, pRing); - if(thickness > 0) + if (thickness > 0) { - if(isTransparencyEnabled) - pRing.setXfermode(XFERMODE_CLEAR); - else - pRing.setColor(backgroundColor); + if (isTransparencyEnabled) pRing.setXfermode(XFERMODE_CLEAR); + else pRing.setColor(backgroundColor); rect.inset(thickness, thickness); activeCanvas.drawArc(rect, 0, 360, true, pRing); @@ -233,16 +195,63 @@ public class RingView extends View pRing.setColor(color); pRing.setTextSize(textSize); - if(enableFontAwesome) pRing.setTypeface(InterfaceUtils.getFontAwesome(getContext())); - activeCanvas.drawText(text, rect.centerX(), rect.centerY() + 0.4f * em, pRing); + if (enableFontAwesome) + pRing.setTypeface(getFontAwesome(getContext())); + activeCanvas.drawText(text, rect.centerX(), + rect.centerY() + 0.4f * em, pRing); } - if(activeCanvas != canvas) - canvas.drawBitmap(drawingCache, 0, 0, null); + if (activeCanvas != canvas) canvas.drawBitmap(drawingCache, 0, 0, null); } - public void setIsTransparencyEnabled(boolean isTransparencyEnabled) + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { - this.isTransparencyEnabled = isTransparencyEnabled; + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + + int width = MeasureSpec.getSize(widthMeasureSpec); + int height = MeasureSpec.getSize(heightMeasureSpec); + diameter = Math.min(height, width); + + pRing.setTextSize(textSize); + em = pRing.measureText("M"); + + setMeasuredDimension(diameter, diameter); + } + + @Override + protected void onSizeChanged(int w, int h, int oldw, int oldh) + { + super.onSizeChanged(w, h, oldw, oldh); + + if (isTransparencyEnabled) reallocateCache(); + } + + private void init() + { + pRing = new TextPaint(); + pRing.setAntiAlias(true); + pRing.setColor(color); + pRing.setTextAlign(Paint.Align.CENTER); + + if (backgroundColor == null) backgroundColor = + InterfaceUtils.getStyledColor(getContext(), + R.attr.cardBackgroundColor); + + if (inactiveColor == null) inactiveColor = + InterfaceUtils.getStyledColor(getContext(), + R.attr.highContrastTextColor); + + inactiveColor = ColorUtils.setAlpha(inactiveColor, 0.1f); + + rect = new RectF(); + } + + private void reallocateCache() + { + if (drawingCache != null) drawingCache.recycle(); + drawingCache = + Bitmap.createBitmap(diameter, diameter, Bitmap.Config.ARGB_8888); + cacheCanvas = new Canvas(drawingCache); } } 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/ScrollableDataView.java index 746d06cd0..09fa9dd97 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/ScrollableDataView.java @@ -19,14 +19,11 @@ package org.isoron.uhabits.ui.habits.show.views; -import android.animation.ValueAnimator; -import android.content.Context; -import android.util.AttributeSet; -import android.view.GestureDetector; -import android.view.MotionEvent; -import android.view.View; -import android.view.ViewParent; -import android.widget.Scroller; +import android.animation.*; +import android.content.*; +import android.util.*; +import android.view.*; +import android.widget.*; public abstract class ScrollableDataView extends View implements GestureDetector.OnGestureListener, diff --git a/app/src/main/java/org/isoron/uhabits/ui/settings/SettingsActivity.java b/app/src/main/java/org/isoron/uhabits/ui/settings/SettingsActivity.java index c281f23d8..24198dc7b 100644 --- a/app/src/main/java/org/isoron/uhabits/ui/settings/SettingsActivity.java +++ b/app/src/main/java/org/isoron/uhabits/ui/settings/SettingsActivity.java @@ -20,6 +20,9 @@ package org.isoron.uhabits.ui.settings; import android.os.*; +import android.support.annotation.*; +import android.support.v4.app.*; +import android.view.*; import org.isoron.uhabits.*; import org.isoron.uhabits.ui.*; diff --git a/app/src/main/java/org/isoron/uhabits/widgets/views/CheckmarkWidgetView.java b/app/src/main/java/org/isoron/uhabits/widgets/views/CheckmarkWidgetView.java index 47a8b2587..d1893d536 100644 --- a/app/src/main/java/org/isoron/uhabits/widgets/views/CheckmarkWidgetView.java +++ b/app/src/main/java/org/isoron/uhabits/widgets/views/CheckmarkWidgetView.java @@ -31,7 +31,6 @@ import org.isoron.uhabits.models.Checkmark; import org.isoron.uhabits.models.Habit; import org.isoron.uhabits.models.Score; import org.isoron.uhabits.ui.habits.show.views.HabitDataView; -import org.isoron.uhabits.ui.habits.show.views.HabitWidgetView; import org.isoron.uhabits.ui.habits.show.views.RingView; import org.isoron.uhabits.utils.ColorUtils; import org.isoron.uhabits.utils.InterfaceUtils; diff --git a/app/src/main/java/org/isoron/uhabits/widgets/views/GraphWidgetView.java b/app/src/main/java/org/isoron/uhabits/widgets/views/GraphWidgetView.java index 4198d84b1..621e00b18 100644 --- a/app/src/main/java/org/isoron/uhabits/widgets/views/GraphWidgetView.java +++ b/app/src/main/java/org/isoron/uhabits/widgets/views/GraphWidgetView.java @@ -28,7 +28,6 @@ import android.widget.TextView; import org.isoron.uhabits.R; import org.isoron.uhabits.models.Habit; import org.isoron.uhabits.ui.habits.show.views.HabitDataView; -import org.isoron.uhabits.ui.habits.show.views.HabitWidgetView; public class GraphWidgetView extends HabitWidgetView implements HabitDataView { diff --git a/app/src/main/java/org/isoron/uhabits/ui/habits/show/views/HabitWidgetView.java b/app/src/main/java/org/isoron/uhabits/widgets/views/HabitWidgetView.java similarity index 66% rename from app/src/main/java/org/isoron/uhabits/ui/habits/show/views/HabitWidgetView.java rename to app/src/main/java/org/isoron/uhabits/widgets/views/HabitWidgetView.java index 6b161f016..f7ca8131a 100644 --- a/app/src/main/java/org/isoron/uhabits/ui/habits/show/views/HabitWidgetView.java +++ b/app/src/main/java/org/isoron/uhabits/widgets/views/HabitWidgetView.java @@ -17,27 +17,26 @@ * with this program. If not, see . */ -package org.isoron.uhabits.ui.habits.show.views; - -import android.content.Context; -import android.graphics.Color; -import android.graphics.Paint; -import android.graphics.drawable.InsetDrawable; -import android.graphics.drawable.ShapeDrawable; -import android.graphics.drawable.shapes.RoundRectShape; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; -import android.util.AttributeSet; -import android.view.ViewGroup; -import android.widget.FrameLayout; - -import org.isoron.uhabits.R; -import org.isoron.uhabits.models.Habit; -import org.isoron.uhabits.utils.InterfaceUtils; - -import java.util.Arrays; - -public abstract class HabitWidgetView extends FrameLayout implements HabitDataView +package org.isoron.uhabits.widgets.views; + +import android.content.*; +import android.graphics.*; +import android.graphics.drawable.*; +import android.graphics.drawable.shapes.*; +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.ui.habits.show.views.*; +import org.isoron.uhabits.utils.*; + +import java.util.*; + +public abstract class HabitWidgetView extends FrameLayout + implements HabitDataView { @Nullable protected InsetDrawable background; @@ -47,12 +46,8 @@ public abstract class HabitWidgetView extends FrameLayout implements HabitDataV @Nullable protected Habit habit; - protected ViewGroup frame; - public void setShadowAlpha(int shadowAlpha) - { - this.shadowAlpha = shadowAlpha; - } + protected ViewGroup frame; private int shadowAlpha; @@ -68,21 +63,28 @@ public abstract class HabitWidgetView extends FrameLayout implements HabitDataV init(); } - private void init() + @Override + public void setHabit(@NonNull Habit habit) { - inflate(getContext(), getInnerLayoutId(), this); - shadowAlpha = (int) (255 * InterfaceUtils.getStyledFloat(getContext(), R.attr.widgetShadowAlpha)); - rebuildBackground(); + this.habit = habit; } - protected abstract @NonNull Integer getInnerLayoutId(); + public void setShadowAlpha(int shadowAlpha) + { + this.shadowAlpha = shadowAlpha; + } + + protected abstract + @NonNull + Integer getInnerLayoutId(); protected void rebuildBackground() { Context context = getContext(); - int backgroundAlpha = - (int) (255 * InterfaceUtils.getStyledFloat(context, R.attr.widgetBackgroundAlpha)); + int backgroundAlpha = (int) (255 * + InterfaceUtils.getStyledFloat(context, + R.attr.widgetBackgroundAlpha)); int shadowRadius = (int) InterfaceUtils.dpToPixels(context, 2); int shadowOffset = (int) InterfaceUtils.dpToPixels(context, 1); @@ -98,20 +100,25 @@ public abstract class HabitWidgetView extends FrameLayout implements HabitDataV int insetLeftTop = Math.max(shadowRadius - shadowOffset, 0); int insetRightBottom = shadowRadius + shadowOffset; - background = new InsetDrawable(innerDrawable, insetLeftTop, insetLeftTop, insetRightBottom, - insetRightBottom); + background = + new InsetDrawable(innerDrawable, insetLeftTop, insetLeftTop, + insetRightBottom, insetRightBottom); backgroundPaint = innerDrawable.getPaint(); - backgroundPaint.setShadowLayer(shadowRadius, shadowOffset, shadowOffset, shadowColor); - backgroundPaint.setColor(InterfaceUtils.getStyledColor(context, R.attr.cardBackgroundColor)); + backgroundPaint.setShadowLayer(shadowRadius, shadowOffset, shadowOffset, + shadowColor); + backgroundPaint.setColor( + InterfaceUtils.getStyledColor(context, R.attr.cardBackgroundColor)); backgroundPaint.setAlpha(backgroundAlpha); frame = (ViewGroup) findViewById(R.id.frame); - if(frame != null) frame.setBackgroundDrawable(background); + if (frame != null) frame.setBackgroundDrawable(background); } - @Override - public void setHabit(@NonNull Habit habit) + private void init() { - this.habit = habit; + inflate(getContext(), getInnerLayoutId(), this); + shadowAlpha = (int) (255 * InterfaceUtils.getStyledFloat(getContext(), + R.attr.widgetShadowAlpha)); + rebuildBackground(); } }