Minor changes to HabitHistoryView rendering; enable haptic feedback
|
Before Width: | Height: | Size: 7.4 KiB After Width: | Height: | Size: 7.4 KiB |
|
Before Width: | Height: | Size: 7.5 KiB After Width: | Height: | Size: 7.5 KiB |
|
Before Width: | Height: | Size: 24 KiB After Width: | Height: | Size: 24 KiB |
|
Before Width: | Height: | Size: 7.8 KiB After Width: | Height: | Size: 7.8 KiB |
|
Before Width: | Height: | Size: 37 KiB After Width: | Height: | Size: 36 KiB |
|
Before Width: | Height: | Size: 30 KiB After Width: | Height: | Size: 29 KiB |
|
Before Width: | Height: | Size: 35 KiB After Width: | Height: | Size: 31 KiB |
@@ -21,6 +21,7 @@ package org.isoron.uhabits.unit.views;
|
|||||||
|
|
||||||
import android.support.test.runner.AndroidJUnit4;
|
import android.support.test.runner.AndroidJUnit4;
|
||||||
import android.test.suitebuilder.annotation.SmallTest;
|
import android.test.suitebuilder.annotation.SmallTest;
|
||||||
|
import android.util.Log;
|
||||||
|
|
||||||
import org.isoron.uhabits.helpers.DateHelper;
|
import org.isoron.uhabits.helpers.DateHelper;
|
||||||
import org.isoron.uhabits.models.Habit;
|
import org.isoron.uhabits.models.Habit;
|
||||||
@@ -56,6 +57,7 @@ public class HabitHistoryViewTest extends ViewTest
|
|||||||
@Test
|
@Test
|
||||||
public void render() throws Throwable
|
public void render() throws Throwable
|
||||||
{
|
{
|
||||||
|
Log.d("HabitHistoryViewTest", String.format("height=%d", dpToPixels(100)));
|
||||||
assertRenders(view, "HabitHistoryView/render.png");
|
assertRenders(view, "HabitHistoryView/render.png");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -69,7 +71,7 @@ public class HabitHistoryViewTest extends ViewTest
|
|||||||
@Test
|
@Test
|
||||||
public void render_withDataOffset() throws Throwable
|
public void render_withDataOffset() throws Throwable
|
||||||
{
|
{
|
||||||
view.onScroll(null, null, -300, 0);
|
view.onScroll(null, null, -dpToPixels(150), 0);
|
||||||
view.invalidate();
|
view.invalidate();
|
||||||
|
|
||||||
assertRenders(view, "HabitHistoryView/renderDataOffset.png");
|
assertRenders(view, "HabitHistoryView/renderDataOffset.png");
|
||||||
@@ -79,7 +81,7 @@ public class HabitHistoryViewTest extends ViewTest
|
|||||||
public void tapDate_withEditableView() throws Throwable
|
public void tapDate_withEditableView() throws Throwable
|
||||||
{
|
{
|
||||||
view.setIsEditable(true);
|
view.setIsEditable(true);
|
||||||
tap(view, 280, 30);
|
tap(view, 270, 30);
|
||||||
waitForAsyncTasks();
|
waitForAsyncTasks();
|
||||||
|
|
||||||
long today = DateHelper.getStartOfToday();
|
long today = DateHelper.getStartOfToday();
|
||||||
@@ -90,7 +92,7 @@ public class HabitHistoryViewTest extends ViewTest
|
|||||||
public void tapDate_withReadOnlyView() throws Throwable
|
public void tapDate_withReadOnlyView() throws Throwable
|
||||||
{
|
{
|
||||||
view.setIsEditable(false);
|
view.setIsEditable(false);
|
||||||
tap(view, 280, 30);
|
tap(view, 270, 30);
|
||||||
waitForAsyncTasks();
|
waitForAsyncTasks();
|
||||||
|
|
||||||
long today = DateHelper.getStartOfToday();
|
long today = DateHelper.getStartOfToday();
|
||||||
|
|||||||
@@ -24,13 +24,16 @@ import android.graphics.Canvas;
|
|||||||
import android.graphics.Color;
|
import android.graphics.Color;
|
||||||
import android.graphics.Paint;
|
import android.graphics.Paint;
|
||||||
import android.graphics.Paint.Align;
|
import android.graphics.Paint.Align;
|
||||||
import android.graphics.Rect;
|
import android.graphics.RectF;
|
||||||
import android.util.AttributeSet;
|
import android.util.AttributeSet;
|
||||||
|
import android.util.Log;
|
||||||
|
import android.view.HapticFeedbackConstants;
|
||||||
import android.view.MotionEvent;
|
import android.view.MotionEvent;
|
||||||
|
|
||||||
import org.isoron.uhabits.R;
|
import org.isoron.uhabits.R;
|
||||||
import org.isoron.uhabits.helpers.ColorHelper;
|
import org.isoron.uhabits.helpers.ColorHelper;
|
||||||
import org.isoron.uhabits.helpers.DateHelper;
|
import org.isoron.uhabits.helpers.DateHelper;
|
||||||
|
import org.isoron.uhabits.helpers.DialogHelper;
|
||||||
import org.isoron.uhabits.models.Habit;
|
import org.isoron.uhabits.models.Habit;
|
||||||
import org.isoron.uhabits.tasks.ToggleRepetitionTask;
|
import org.isoron.uhabits.tasks.ToggleRepetitionTask;
|
||||||
|
|
||||||
@@ -46,13 +49,13 @@ public class HabitHistoryView extends ScrollableDataView implements HabitDataVie
|
|||||||
private Habit habit;
|
private Habit habit;
|
||||||
private int[] checkmarks;
|
private int[] checkmarks;
|
||||||
private Paint pSquareBg, pSquareFg, pTextHeader;
|
private Paint pSquareBg, pSquareFg, pTextHeader;
|
||||||
private int squareSpacing;
|
private float squareSpacing;
|
||||||
|
|
||||||
private float squareTextOffset;
|
private float squareTextOffset;
|
||||||
private float headerTextOffset;
|
private float headerTextOffset;
|
||||||
|
|
||||||
private int columnWidth;
|
private float columnWidth;
|
||||||
private int columnHeight;
|
private float columnHeight;
|
||||||
private int nColumns;
|
private int nColumns;
|
||||||
|
|
||||||
private String wdays[];
|
private String wdays[];
|
||||||
@@ -63,7 +66,7 @@ public class HabitHistoryView extends ScrollableDataView implements HabitDataVie
|
|||||||
private int nDays;
|
private int nDays;
|
||||||
private int todayWeekday;
|
private int todayWeekday;
|
||||||
private int colors[];
|
private int colors[];
|
||||||
private Rect baseLocation;
|
private RectF baseLocation;
|
||||||
private int primaryColor;
|
private int primaryColor;
|
||||||
|
|
||||||
private boolean isBackgroundTransparent;
|
private boolean isBackgroundTransparent;
|
||||||
@@ -103,7 +106,7 @@ public class HabitHistoryView extends ScrollableDataView implements HabitDataVie
|
|||||||
dfMonth = new SimpleDateFormat("MMM", Locale.getDefault());
|
dfMonth = new SimpleDateFormat("MMM", Locale.getDefault());
|
||||||
dfYear = new SimpleDateFormat("yyyy", Locale.getDefault());
|
dfYear = new SimpleDateFormat("yyyy", Locale.getDefault());
|
||||||
|
|
||||||
baseLocation = new Rect();
|
baseLocation = new RectF();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void updateDate()
|
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)
|
protected void onSizeChanged(int width, int height, int oldWidth, int oldHeight)
|
||||||
{
|
{
|
||||||
if(height < 8) height = 200;
|
if(height < 8) height = 200;
|
||||||
int baseSize = height / 8;
|
float baseSize = height / 8.0f;
|
||||||
setScrollerBucketSize(baseSize);
|
setScrollerBucketSize((int) baseSize);
|
||||||
|
|
||||||
squareSpacing = (int) Math.floor(baseSize / 15.0);
|
squareSpacing = DialogHelper.dpToPixels(getContext(), 1.0f);
|
||||||
int maxTextSize = getResources().getDimensionPixelSize(R.dimen.history_max_font_size);
|
float maxTextSize = getResources().getDimensionPixelSize(R.dimen.regularTextSize);
|
||||||
float textSize = Math.min(baseSize * 0.5f, maxTextSize);
|
float textSize = Math.min(baseSize * 0.5f, maxTextSize);
|
||||||
|
|
||||||
pSquareFg.setTextSize(textSize);
|
pSquareFg.setTextSize(textSize);
|
||||||
@@ -142,26 +145,22 @@ public class HabitHistoryView extends ScrollableDataView implements HabitDataVie
|
|||||||
squareTextOffset = pSquareFg.getFontSpacing() * 0.4f;
|
squareTextOffset = pSquareFg.getFontSpacing() * 0.4f;
|
||||||
headerTextOffset = pTextHeader.getFontSpacing() * 0.3f;
|
headerTextOffset = pTextHeader.getFontSpacing() * 0.3f;
|
||||||
|
|
||||||
int rightLabelWidth = getWeekdayLabelWidth();
|
float rightLabelWidth = getWeekdayLabelWidth() + headerTextOffset;
|
||||||
int horizontalPadding = getPaddingRight() + getPaddingLeft();
|
float horizontalPadding = getPaddingRight() + getPaddingLeft();
|
||||||
|
|
||||||
columnWidth = baseSize;
|
columnWidth = baseSize;
|
||||||
columnHeight = 8 * baseSize;
|
columnHeight = 8 * baseSize;
|
||||||
nColumns = (width - rightLabelWidth - horizontalPadding) / baseSize + 1;
|
nColumns = (int)((width - rightLabelWidth - horizontalPadding) / baseSize) + 1;
|
||||||
|
|
||||||
updateDate();
|
updateDate();
|
||||||
}
|
}
|
||||||
|
|
||||||
private int getWeekdayLabelWidth()
|
private float getWeekdayLabelWidth()
|
||||||
{
|
{
|
||||||
int width = 0;
|
float width = 0;
|
||||||
Rect bounds = new Rect();
|
|
||||||
|
|
||||||
for(String w : wdays)
|
for(String w : wdays)
|
||||||
{
|
width = Math.max(width, pSquareFg.measureText(w));
|
||||||
pSquareFg.getTextBounds(w, 0, w.length(), bounds);
|
|
||||||
width = Math.max(width, bounds.right);
|
|
||||||
}
|
|
||||||
|
|
||||||
return width;
|
return width;
|
||||||
}
|
}
|
||||||
@@ -272,7 +271,7 @@ public class HabitHistoryView extends ScrollableDataView implements HabitDataVie
|
|||||||
drawAxis(canvas, baseLocation);
|
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);
|
drawColumnHeader(canvas, location, date);
|
||||||
location.offset(0, columnWidth);
|
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)
|
int checkmarkOffset)
|
||||||
{
|
{
|
||||||
if (checkmarkOffset >= checkmarks.length) pSquareBg.setColor(colors[0]);
|
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);
|
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++)
|
for (int i = 0; i < 7; i++)
|
||||||
{
|
{
|
||||||
@@ -313,7 +312,7 @@ public class HabitHistoryView extends ScrollableDataView implements HabitDataVie
|
|||||||
|
|
||||||
private float headerOverflow = 0;
|
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 month = dfMonth.format(date.getTime());
|
||||||
String year = dfYear.format(date.getTime());
|
String year = dfYear.format(date.getTime());
|
||||||
@@ -339,11 +338,19 @@ public class HabitHistoryView extends ScrollableDataView implements HabitDataVie
|
|||||||
createColors();
|
createColors();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onLongPress(MotionEvent e)
|
||||||
|
{
|
||||||
|
onSingleTapUp(e);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean onSingleTapUp(MotionEvent e)
|
public boolean onSingleTapUp(MotionEvent e)
|
||||||
{
|
{
|
||||||
if(!isEditable) return false;
|
if(!isEditable) return false;
|
||||||
|
|
||||||
|
performHapticFeedback(HapticFeedbackConstants.KEYBOARD_TAP);
|
||||||
|
|
||||||
int pointerId = e.getPointerId(0);
|
int pointerId = e.getPointerId(0);
|
||||||
float x = e.getX(pointerId);
|
float x = e.getX(pointerId);
|
||||||
float y = e.getY(pointerId);
|
float y = e.getY(pointerId);
|
||||||
|
|||||||