diff --git a/app/src/androidTest/assets/views-v21/CheckmarkView/checked.png b/app/src/androidTest/assets/views-v21/CheckmarkView/checked.png index 6f744b1fe..b54e5707d 100644 Binary files a/app/src/androidTest/assets/views-v21/CheckmarkView/checked.png and b/app/src/androidTest/assets/views-v21/CheckmarkView/checked.png differ diff --git a/app/src/androidTest/assets/views-v21/CheckmarkView/implicitly_checked.png b/app/src/androidTest/assets/views-v21/CheckmarkView/implicitly_checked.png index c3190d58c..39d8e87f3 100644 Binary files a/app/src/androidTest/assets/views-v21/CheckmarkView/implicitly_checked.png and b/app/src/androidTest/assets/views-v21/CheckmarkView/implicitly_checked.png differ diff --git a/app/src/androidTest/assets/views-v21/CheckmarkView/large_size.png b/app/src/androidTest/assets/views-v21/CheckmarkView/large_size.png index 3aad412d5..99e439e72 100644 Binary files a/app/src/androidTest/assets/views-v21/CheckmarkView/large_size.png and b/app/src/androidTest/assets/views-v21/CheckmarkView/large_size.png differ diff --git a/app/src/androidTest/assets/views-v21/CheckmarkView/unchecked.png b/app/src/androidTest/assets/views-v21/CheckmarkView/unchecked.png index 92dfa2efe..2dc0f531a 100644 Binary files a/app/src/androidTest/assets/views-v21/CheckmarkView/unchecked.png and b/app/src/androidTest/assets/views-v21/CheckmarkView/unchecked.png differ diff --git a/app/src/androidTest/assets/views/HabitHistoryView/render.png b/app/src/androidTest/assets/views/HabitHistoryView/render.png index 92bfa3727..fce176813 100644 Binary files a/app/src/androidTest/assets/views/HabitHistoryView/render.png and b/app/src/androidTest/assets/views/HabitHistoryView/render.png differ diff --git a/app/src/androidTest/assets/views/HabitHistoryView/renderDataOffset.png b/app/src/androidTest/assets/views/HabitHistoryView/renderDataOffset.png index cb20ba286..679ad00d4 100644 Binary files a/app/src/androidTest/assets/views/HabitHistoryView/renderDataOffset.png and b/app/src/androidTest/assets/views/HabitHistoryView/renderDataOffset.png differ diff --git a/app/src/androidTest/assets/views/HabitHistoryView/renderDifferentSize.png b/app/src/androidTest/assets/views/HabitHistoryView/renderDifferentSize.png index bf0d14daa..be64fb851 100644 Binary files a/app/src/androidTest/assets/views/HabitHistoryView/renderDifferentSize.png and b/app/src/androidTest/assets/views/HabitHistoryView/renderDifferentSize.png differ diff --git a/app/src/androidTest/java/org/isoron/uhabits/unit/views/HabitHistoryViewTest.java b/app/src/androidTest/java/org/isoron/uhabits/unit/views/HabitHistoryViewTest.java index 933e62509..da146d1e3 100644 --- a/app/src/androidTest/java/org/isoron/uhabits/unit/views/HabitHistoryViewTest.java +++ b/app/src/androidTest/java/org/isoron/uhabits/unit/views/HabitHistoryViewTest.java @@ -21,6 +21,7 @@ package org.isoron.uhabits.unit.views; import android.support.test.runner.AndroidJUnit4; import android.test.suitebuilder.annotation.SmallTest; +import android.util.Log; import org.isoron.uhabits.helpers.DateHelper; import org.isoron.uhabits.models.Habit; @@ -56,6 +57,7 @@ public class HabitHistoryViewTest extends ViewTest @Test public void render() throws Throwable { + Log.d("HabitHistoryViewTest", String.format("height=%d", dpToPixels(100))); assertRenders(view, "HabitHistoryView/render.png"); } @@ -69,7 +71,7 @@ public class HabitHistoryViewTest extends ViewTest @Test public void render_withDataOffset() throws Throwable { - view.onScroll(null, null, -300, 0); + view.onScroll(null, null, -dpToPixels(150), 0); view.invalidate(); assertRenders(view, "HabitHistoryView/renderDataOffset.png"); @@ -79,7 +81,7 @@ public class HabitHistoryViewTest extends ViewTest public void tapDate_withEditableView() throws Throwable { view.setIsEditable(true); - tap(view, 280, 30); + tap(view, 270, 30); waitForAsyncTasks(); long today = DateHelper.getStartOfToday(); @@ -90,7 +92,7 @@ public class HabitHistoryViewTest extends ViewTest public void tapDate_withReadOnlyView() throws Throwable { view.setIsEditable(false); - tap(view, 280, 30); + tap(view, 270, 30); waitForAsyncTasks(); long today = DateHelper.getStartOfToday(); diff --git a/app/src/main/java/org/isoron/uhabits/views/HabitHistoryView.java b/app/src/main/java/org/isoron/uhabits/views/HabitHistoryView.java index 462277ce9..a15059295 100644 --- a/app/src/main/java/org/isoron/uhabits/views/HabitHistoryView.java +++ b/app/src/main/java/org/isoron/uhabits/views/HabitHistoryView.java @@ -24,13 +24,16 @@ import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Paint.Align; -import android.graphics.Rect; +import android.graphics.RectF; import android.util.AttributeSet; +import android.util.Log; +import android.view.HapticFeedbackConstants; import android.view.MotionEvent; import org.isoron.uhabits.R; import org.isoron.uhabits.helpers.ColorHelper; import org.isoron.uhabits.helpers.DateHelper; +import org.isoron.uhabits.helpers.DialogHelper; import org.isoron.uhabits.models.Habit; import org.isoron.uhabits.tasks.ToggleRepetitionTask; @@ -46,13 +49,13 @@ public class HabitHistoryView extends ScrollableDataView implements HabitDataVie private Habit habit; private int[] checkmarks; private Paint pSquareBg, pSquareFg, pTextHeader; - private int squareSpacing; + private float squareSpacing; private float squareTextOffset; private float headerTextOffset; - private int columnWidth; - private int columnHeight; + private float columnWidth; + private float columnHeight; private int nColumns; private String wdays[]; @@ -63,7 +66,7 @@ public class HabitHistoryView extends ScrollableDataView implements HabitDataVie private int nDays; private int todayWeekday; private int colors[]; - private Rect baseLocation; + private RectF baseLocation; private int primaryColor; private boolean isBackgroundTransparent; @@ -103,7 +106,7 @@ public class HabitHistoryView extends ScrollableDataView implements HabitDataVie dfMonth = new SimpleDateFormat("MMM", Locale.getDefault()); dfYear = new SimpleDateFormat("yyyy", Locale.getDefault()); - baseLocation = new Rect(); + baseLocation = new RectF(); } private void updateDate() @@ -130,11 +133,11 @@ public class HabitHistoryView extends ScrollableDataView implements HabitDataVie protected void onSizeChanged(int width, int height, int oldWidth, int oldHeight) { if(height < 8) height = 200; - int baseSize = height / 8; - setScrollerBucketSize(baseSize); + float baseSize = height / 8.0f; + setScrollerBucketSize((int) baseSize); - squareSpacing = (int) Math.floor(baseSize / 15.0); - int maxTextSize = getResources().getDimensionPixelSize(R.dimen.history_max_font_size); + squareSpacing = DialogHelper.dpToPixels(getContext(), 1.0f); + float maxTextSize = getResources().getDimensionPixelSize(R.dimen.regularTextSize); float textSize = Math.min(baseSize * 0.5f, maxTextSize); pSquareFg.setTextSize(textSize); @@ -142,26 +145,22 @@ public class HabitHistoryView extends ScrollableDataView implements HabitDataVie squareTextOffset = pSquareFg.getFontSpacing() * 0.4f; headerTextOffset = pTextHeader.getFontSpacing() * 0.3f; - int rightLabelWidth = getWeekdayLabelWidth(); - int horizontalPadding = getPaddingRight() + getPaddingLeft(); + float rightLabelWidth = getWeekdayLabelWidth() + headerTextOffset; + float horizontalPadding = getPaddingRight() + getPaddingLeft(); columnWidth = baseSize; columnHeight = 8 * baseSize; - nColumns = (width - rightLabelWidth - horizontalPadding) / baseSize + 1; + nColumns = (int)((width - rightLabelWidth - horizontalPadding) / baseSize) + 1; updateDate(); } - private int getWeekdayLabelWidth() + private float getWeekdayLabelWidth() { - int width = 0; - Rect bounds = new Rect(); + float width = 0; for(String w : wdays) - { - pSquareFg.getTextBounds(w, 0, w.length(), bounds); - width = Math.max(width, bounds.right); - } + width = Math.max(width, pSquareFg.measureText(w)); return width; } @@ -272,7 +271,7 @@ public class HabitHistoryView extends ScrollableDataView implements HabitDataVie drawAxis(canvas, baseLocation); } - private void drawColumn(Canvas canvas, Rect location, GregorianCalendar date, int column) + private void drawColumn(Canvas canvas, RectF location, GregorianCalendar date, int column) { drawColumnHeader(canvas, location, date); location.offset(0, columnWidth); @@ -290,7 +289,7 @@ public class HabitHistoryView extends ScrollableDataView implements HabitDataVie } } - private void drawSquare(Canvas canvas, Rect location, GregorianCalendar date, + private void drawSquare(Canvas canvas, RectF location, GregorianCalendar date, int checkmarkOffset) { if (checkmarkOffset >= checkmarks.length) pSquareBg.setColor(colors[0]); @@ -301,7 +300,7 @@ public class HabitHistoryView extends ScrollableDataView implements HabitDataVie canvas.drawText(text, location.centerX(), location.centerY() + squareTextOffset, pSquareFg); } - private void drawAxis(Canvas canvas, Rect location) + private void drawAxis(Canvas canvas, RectF location) { for (int i = 0; i < 7; i++) { @@ -313,7 +312,7 @@ public class HabitHistoryView extends ScrollableDataView implements HabitDataVie private float headerOverflow = 0; - private void drawColumnHeader(Canvas canvas, Rect location, GregorianCalendar date) + private void drawColumnHeader(Canvas canvas, RectF location, GregorianCalendar date) { String month = dfMonth.format(date.getTime()); String year = dfYear.format(date.getTime()); @@ -339,11 +338,19 @@ public class HabitHistoryView extends ScrollableDataView implements HabitDataVie 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);