diff --git a/app/build.gradle b/app/build.gradle index 93d60fe16..8c816c10e 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -25,7 +25,7 @@ android { proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' } debug { - testCoverageEnabled = true + testCoverageEnabled = false } } diff --git a/app/src/androidTest/java/org/isoron/uhabits/activities/habits/list/views/CheckmarkButtonViewTest.java b/app/src/androidTest/java/org/isoron/uhabits/activities/habits/list/views/CheckmarkButtonViewTest.java index b8bbc0bac..53c5fbeeb 100644 --- a/app/src/androidTest/java/org/isoron/uhabits/activities/habits/list/views/CheckmarkButtonViewTest.java +++ b/app/src/androidTest/java/org/isoron/uhabits/activities/habits/list/views/CheckmarkButtonViewTest.java @@ -46,12 +46,12 @@ public class CheckmarkButtonViewTest extends BaseViewTest public void setUp() { super.setUp(); - setSimilarityCutoff(0.03f); + setSimilarityCutoff(0.015f); latch = new CountDownLatch(1); view = new CheckmarkButtonView(targetContext); view.setValue(Checkmark.UNCHECKED); - view.setColor(ColorUtils.getAndroidTestColor(7)); + view.setColor(ColorUtils.getAndroidTestColor(5)); measureView(view, dpToPixels(40), dpToPixels(40)); } diff --git a/app/src/main/java/org/isoron/uhabits/activities/habits/list/views/CheckmarkButtonView.java b/app/src/main/java/org/isoron/uhabits/activities/habits/list/views/CheckmarkButtonView.java index 97d0c9fca..818ccb615 100644 --- a/app/src/main/java/org/isoron/uhabits/activities/habits/list/views/CheckmarkButtonView.java +++ b/app/src/main/java/org/isoron/uhabits/activities/habits/list/views/CheckmarkButtonView.java @@ -20,21 +20,34 @@ package org.isoron.uhabits.activities.habits.list.views; import android.content.*; +import android.content.res.*; +import android.graphics.*; +import android.support.annotation.*; +import android.text.*; +import android.util.*; import android.view.*; -import android.widget.*; import org.isoron.uhabits.*; import org.isoron.uhabits.activities.habits.list.controllers.*; -import org.isoron.uhabits.models.*; import org.isoron.uhabits.utils.*; -public class CheckmarkButtonView extends TextView +import static android.view.View.MeasureSpec.*; +import static org.isoron.uhabits.models.Checkmark.*; +import static org.isoron.uhabits.utils.AttributeSetUtils.*; + +public class CheckmarkButtonView extends View { private int color; private int value; - private StyledResources res; + private StyledResources styledRes; + + private TextPaint paint; + + private int lowContrastColor; + + private RectF rect; public CheckmarkButtonView(Context context) { @@ -42,6 +55,21 @@ public class CheckmarkButtonView extends TextView init(); } + public CheckmarkButtonView(@Nullable Context ctx, @Nullable AttributeSet attrs) + { + super(ctx, attrs); + init(); + + if(ctx == null) throw new IllegalStateException(); + if(attrs == null) throw new IllegalStateException(); + + int paletteColor = getIntAttribute(ctx, attrs, "color", 0); + setColor(ColorUtils.getAndroidTestColor(paletteColor)); + + int value = getIntAttribute(ctx, attrs, "value", 0); + setValue(value); + } + public void setColor(int color) { this.color = color; @@ -57,54 +85,60 @@ public class CheckmarkButtonView extends TextView public void setValue(int value) { this.value = value; - updateText(); + postInvalidate(); } public void toggle() { - value = (value == Checkmark.CHECKED_EXPLICITLY ? Checkmark.UNCHECKED : - Checkmark.CHECKED_EXPLICITLY); - + value = (value == CHECKED_EXPLICITLY ? UNCHECKED : CHECKED_EXPLICITLY); performHapticFeedback(HapticFeedbackConstants.LONG_PRESS); - updateText(); + postInvalidate(); } - private void init() + @Override + protected void onDraw(Canvas canvas) { - res = new StyledResources(getContext()); + super.onDraw(canvas); + Resources resources = getResources(); + + paint.setColor(value == CHECKED_EXPLICITLY ? color : lowContrastColor); + int id = (value == UNCHECKED ? R.string.fa_times : R.string.fa_check); + String label = resources.getString(id); + float em = paint.measureText("m"); - setWillNotDraw(false); + rect.set(0, 0, getWidth(), getHeight()); + rect.offset(0, 0.4f * em); + canvas.drawText(label, rect.centerX(), rect.centerY(), paint); + } - setMinHeight( - getResources().getDimensionPixelSize(R.dimen.checkmarkHeight)); - setMinWidth( - getResources().getDimensionPixelSize(R.dimen.checkmarkWidth)); + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) + { + Resources res = getResources(); + int height = res.getDimensionPixelSize(R.dimen.checkmarkHeight); + int width = res.getDimensionPixelSize(R.dimen.checkmarkWidth); - setFocusable(false); - setGravity(Gravity.CENTER); - setTypeface(InterfaceUtils.getFontAwesome(getContext())); + widthMeasureSpec = makeMeasureSpec(width, EXACTLY); + heightMeasureSpec = makeMeasureSpec(height, EXACTLY); + + super.onMeasure(widthMeasureSpec, heightMeasureSpec); } - private void updateText() + private void init() { - int lowContrastColor = res.getColor(R.attr.lowContrastTextColor); - - if (value == Checkmark.CHECKED_EXPLICITLY) - { - setText(R.string.fa_check); - setTextColor(color); - } - - if (value == Checkmark.CHECKED_IMPLICITLY) - { - setText(R.string.fa_check); - setTextColor(lowContrastColor); - } - - if (value == Checkmark.UNCHECKED) - { - setText(R.string.fa_times); - setTextColor(lowContrastColor); - } + setFocusable(false); + + Resources res = getResources(); + styledRes = new StyledResources(getContext()); + + paint = new TextPaint(); + paint.setTypeface(InterfaceUtils.getFontAwesome(getContext())); + paint.setAntiAlias(true); + paint.setTextAlign(Paint.Align.CENTER); + paint.setTextSize(res.getDimension(R.dimen.regularTextSize)); + + rect = new RectF(); + color = ColorUtils.getAndroidTestColor(0); + lowContrastColor = styledRes.getColor(R.attr.lowContrastTextColor); } } diff --git a/app/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardView.java b/app/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardView.java index d57e0a71c..8aeba9685 100644 --- a/app/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardView.java +++ b/app/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardView.java @@ -214,6 +214,7 @@ public class HabitCardView extends FrameLayout scoreRing.setPercentage(rand.nextFloat()); checkmarkPanel.setColor(color); checkmarkPanel.setCheckmarkValues(values); + checkmarkPanel.setButtonCount(5); } private void refresh() diff --git a/app/src/main/java/org/isoron/uhabits/utils/AttributeSetUtils.java b/app/src/main/java/org/isoron/uhabits/utils/AttributeSetUtils.java index c633a9b72..67c9de531 100644 --- a/app/src/main/java/org/isoron/uhabits/utils/AttributeSetUtils.java +++ b/app/src/main/java/org/isoron/uhabits/utils/AttributeSetUtils.java @@ -74,4 +74,14 @@ public class AttributeSetUtils if (number != null) return Float.parseFloat(number); else return defaultValue; } + + public static int getIntAttribute(@NonNull Context context, + @NonNull AttributeSet attrs, + @NonNull String name, + int defaultValue) + { + String number = getAttribute(context, attrs, name, null); + if (number != null) return Integer.parseInt(number); + else return defaultValue; + } }