diff --git a/app/src/main/java/com/philliphsu/clock2/aospdatetimepicker/Utils.java b/app/src/main/java/com/philliphsu/clock2/aospdatetimepicker/Utils.java index c261015..f566f14 100644 --- a/app/src/main/java/com/philliphsu/clock2/aospdatetimepicker/Utils.java +++ b/app/src/main/java/com/philliphsu/clock2/aospdatetimepicker/Utils.java @@ -21,12 +21,21 @@ import android.animation.ObjectAnimator; import android.animation.PropertyValuesHolder; import android.annotation.SuppressLint; import android.content.Context; +import android.content.res.ColorStateList; import android.content.res.TypedArray; +import android.graphics.drawable.Drawable; import android.os.Build; import android.support.annotation.AttrRes; +import android.support.annotation.ColorInt; +import android.support.annotation.DrawableRes; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.support.v4.content.ContextCompat; +import android.support.v4.graphics.drawable.DrawableCompat; import android.text.format.Time; import android.util.TypedValue; import android.view.View; +import android.widget.ImageView; import com.philliphsu.clock2.R; @@ -191,6 +200,51 @@ public class Utils { return value.data; } + /** + * Mutates the given drawable, applies the specified tint list, and sets this tinted + * drawable on the target ImageView. + * + * @param target the ImageView that should have the tinted drawable set on + * @param drawable the drawable to tint + * @param tintList Color state list to use for tinting this drawable, or null to clear the tint + */ + public static void setTintList(ImageView target, Drawable drawable, ColorStateList tintList) { + // TODO: What is the VectorDrawable counterpart for this process? + // Use a mutable instance of the drawable, so we only affect this instance. + // This is especially useful when you need to modify properties of drawables loaded from + // resources. By default, all drawables instances loaded from the same resource share a + // common state; if you modify the state of one instance, all the other instances will + // receive the same modification. + // Wrap drawable so that it may be used for tinting across the different + // API levels, via the tinting methods in this class. + drawable = DrawableCompat.wrap(drawable.mutate()); + DrawableCompat.setTintList(drawable, tintList); + target.setImageDrawable(drawable); + } + + /** + * Returns a tinted drawable from the given drawable resource, if {@code tintList != null}. + * Otherwise, no tint will be applied. + */ + public static Drawable getTintedDrawable(@NonNull Context context, + @DrawableRes int drawableRes, + @Nullable ColorStateList tintList) { + Drawable d = DrawableCompat.wrap(ContextCompat.getDrawable(context, drawableRes).mutate()); + DrawableCompat.setTintList(d, tintList); + return d; + } + + /** + * Returns a tinted drawable from the given drawable resource and color resource. + */ + public static Drawable getTintedDrawable(@NonNull Context context, + @DrawableRes int drawableRes, + @ColorInt int colorInt) { + Drawable d = DrawableCompat.wrap(ContextCompat.getDrawable(context, drawableRes).mutate()); + DrawableCompat.setTint(d, colorInt); + return d; + } + /** * Gets dialog type (Light/Dark) from current theme * @param context The context to use as reference for the boolean diff --git a/app/src/main/java/com/philliphsu/clock2/editalarm/MinutesGrid.java b/app/src/main/java/com/philliphsu/clock2/editalarm/MinutesGrid.java index 17dc954..57de40a 100644 --- a/app/src/main/java/com/philliphsu/clock2/editalarm/MinutesGrid.java +++ b/app/src/main/java/com/philliphsu/clock2/editalarm/MinutesGrid.java @@ -1,10 +1,12 @@ package com.philliphsu.clock2.editalarm; import android.content.Context; +import android.support.v4.content.ContextCompat; import android.view.View; import android.widget.ImageButton; import com.philliphsu.clock2.R; +import com.philliphsu.clock2.aospdatetimepicker.Utils; /** * Created by Phillip Hsu on 8/17/2016. @@ -52,8 +54,21 @@ public class MinutesGrid extends NumbersGrid { @Override void setTheme(Context context, boolean themeDark) { super.setTheme(context, themeDark); - mMinusButton.setImageResource(themeDark? R.drawable.ic_minus_circle_dark_24dp : R.drawable.ic_minus_circle_24dp); - mPlusButton.setImageResource(themeDark? R.drawable.ic_add_circle_dark_24dp : R.drawable.ic_add_circle_24dp); + if (themeDark) { + // Resources default to dark-themed color (#FFFFFF) + // If vector fill color is transparent, programmatically tinting will not work. + // Since dark-themed active icon color is fully opaque, use that color as the + // base color and tint at runtime as needed. + mMinusButton.setImageResource(R.drawable.ic_minus_circle_24dp); + mPlusButton.setImageResource(R.drawable.ic_add_circle_24dp); + } else { + // Tint drawables + final int colorActiveLight = ContextCompat.getColor(context, R.color.icon_color_active_light); + mMinusButton.setImageDrawable(Utils.getTintedDrawable( + context, R.drawable.ic_minus_circle_24dp, colorActiveLight)); + mPlusButton.setImageDrawable(Utils.getTintedDrawable( + context, R.drawable.ic_add_circle_24dp, colorActiveLight)); + } } /** diff --git a/app/src/main/java/com/philliphsu/clock2/editalarm/NumberGridTimePickerDialog.java b/app/src/main/java/com/philliphsu/clock2/editalarm/NumberGridTimePickerDialog.java index 19b744b..12cfc97 100644 --- a/app/src/main/java/com/philliphsu/clock2/editalarm/NumberGridTimePickerDialog.java +++ b/app/src/main/java/com/philliphsu/clock2/editalarm/NumberGridTimePickerDialog.java @@ -45,8 +45,6 @@ import java.util.Locale; import butterknife.Bind; import butterknife.OnClick; -import static com.philliphsu.clock2.util.ConversionUtils.dpToPx; - //import com.android.datetimepicker.HapticFeedbackController; //import com.android.datetimepicker.R; //import com.android.datetimepicker.Utils; @@ -132,8 +130,6 @@ public class NumberGridTimePickerDialog extends BaseTimePickerDialog implements private int mHalfDayToggleUnselectedColor; // ====================================== MY STUFF ============================================= - // The padding in dp for the half day icon compound drawable - public static final int HALF_DAY_ICON_PADDING = 8; // Describes both AM/PM in the 12-hour clock and the half-days of the 24-hour clock. // TODO: Use the *values* of AM and PM instead. @@ -245,7 +241,7 @@ public class NumberGridTimePickerDialog extends BaseTimePickerDialog implements mInitialMinute = minute; mIs24HourMode = is24HourMode; mInKbMode = false; - mThemeDark = false; + mThemeDark = true; } /** @@ -321,17 +317,20 @@ public class NumberGridTimePickerDialog extends BaseTimePickerDialog implements TextView tv1 = (TextView) mLeftHalfDayToggle.getChildAt(0); TextView tv2 = (TextView) mRightHalfDayToggle.getChildAt(0); if (mIs24HourMode) { + final int iconPadding = getResources().getDimensionPixelSize(R.dimen.half_day_icon_padding); tv1.setText("00 - 11"); // Intrinsic bounds meaning the drawable's own bounds? So 24dp box. + // We need different drawable resources for each case, not a single one that we + // just tint differently, because the orientation of each one is different. tv1.setCompoundDrawablesWithIntrinsicBounds( mThemeDark? R.drawable.ic_half_day_1_dark_24dp : R.drawable.ic_half_day_1_24dp, 0, 0, 0); - tv1.setCompoundDrawablePadding((int) dpToPx(getActivity(), HALF_DAY_ICON_PADDING)); + tv1.setCompoundDrawablePadding(iconPadding); tv2.setText("12 - 23"); tv2.setCompoundDrawablesWithIntrinsicBounds( mThemeDark? R.drawable.ic_half_day_2_dark_24dp : R.drawable.ic_half_day_2_24dp, 0, 0, 0); - tv2.setCompoundDrawablePadding((int) dpToPx(getActivity(), HALF_DAY_ICON_PADDING)); + tv2.setCompoundDrawablePadding(iconPadding); } else { tv1.setText(mAmText); tv2.setText(mPmText); diff --git a/app/src/main/java/com/philliphsu/clock2/editalarm/NumpadTimePicker.java b/app/src/main/java/com/philliphsu/clock2/editalarm/NumpadTimePicker.java index 2d40252..7915405 100644 --- a/app/src/main/java/com/philliphsu/clock2/editalarm/NumpadTimePicker.java +++ b/app/src/main/java/com/philliphsu/clock2/editalarm/NumpadTimePicker.java @@ -3,13 +3,11 @@ package com.philliphsu.clock2.editalarm; import android.animation.ObjectAnimator; import android.content.Context; import android.content.res.ColorStateList; -import android.graphics.drawable.Drawable; import android.os.Build; import android.support.annotation.IntDef; import android.support.annotation.Nullable; import android.support.design.widget.FloatingActionButton; import android.support.v4.content.ContextCompat; -import android.support.v4.graphics.drawable.DrawableCompat; import android.text.format.DateFormat; import android.util.AttributeSet; import android.view.animation.DecelerateInterpolator; @@ -114,29 +112,13 @@ public class NumpadTimePicker extends GridLayoutNumpad { b.setTextColor(mColors); } - // Get a mutable instance of the drawable, so we only affect this instance. - // This is especially useful when you need to modify properties of drawables loaded from - // resources. By default, all drawables instances loaded from the same resource share a - // common state; if you modify the state of one instance, all the other instances will - // receive the same modification. - // TODO: What is the VectorDrawable counterpart for this process? - Drawable backspaceDrawable = mBackspace.getDrawable().mutate(); - // Wrap drawable so that it may be used for tinting across the different - // API levels, via the tinting methods in this class. - backspaceDrawable = DrawableCompat.wrap(backspaceDrawable); - // Prepare the tints ColorStateList colorBackspace = ContextCompat.getColorStateList(context, themeDark? R.color.icon_color_dark : R.color.icon_color); - DrawableCompat.setTintList(backspaceDrawable, colorBackspace); - mBackspace.setImageDrawable(backspaceDrawable); + Utils.setTintList(mBackspace, mBackspace.getDrawable(), colorBackspace); - // TODO: What is the VectorDrawable counterpart for this process? - Drawable iconDrawable = mFab.getDrawable().mutate(); - iconDrawable = DrawableCompat.wrap(iconDrawable); ColorStateList colorIcon = ContextCompat.getColorStateList(context, themeDark? R.color.icon_color_dark : R.color.fab_icon_color); - DrawableCompat.setTintList(iconDrawable, colorIcon); - mFab.setImageDrawable(iconDrawable); + Utils.setTintList(mFab, mFab.getDrawable(), colorIcon); // this.getContext() ==> default teal accent color // application context ==> white diff --git a/app/src/main/res/drawable/ic_add_circle_24dp.xml b/app/src/main/res/drawable/ic_add_circle_24dp.xml index 520b71c..7588c59 100644 --- a/app/src/main/res/drawable/ic_add_circle_24dp.xml +++ b/app/src/main/res/drawable/ic_add_circle_24dp.xml @@ -4,6 +4,6 @@ android:viewportWidth="24.0" android:viewportHeight="24.0"> diff --git a/app/src/main/res/drawable/ic_add_circle_dark_24dp.xml b/app/src/main/res/drawable/ic_add_circle_dark_24dp.xml deleted file mode 100644 index 7588c59..0000000 --- a/app/src/main/res/drawable/ic_add_circle_dark_24dp.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_half_day_1_24dp.xml b/app/src/main/res/drawable/ic_half_day_1_24dp.xml index 2f9cd1e..cd45c7a 100644 --- a/app/src/main/res/drawable/ic_half_day_1_24dp.xml +++ b/app/src/main/res/drawable/ic_half_day_1_24dp.xml @@ -4,6 +4,6 @@ android:viewportWidth="24.0" android:viewportHeight="24.0"> diff --git a/app/src/main/res/drawable/ic_minus_circle_24dp.xml b/app/src/main/res/drawable/ic_minus_circle_24dp.xml index 30a5f06..073883f 100644 --- a/app/src/main/res/drawable/ic_minus_circle_24dp.xml +++ b/app/src/main/res/drawable/ic_minus_circle_24dp.xml @@ -4,6 +4,6 @@ android:viewportWidth="24.0" android:viewportHeight="24.0"> diff --git a/app/src/main/res/drawable/ic_minus_circle_dark_24dp.xml b/app/src/main/res/drawable/ic_minus_circle_dark_24dp.xml deleted file mode 100644 index 073883f..0000000 --- a/app/src/main/res/drawable/ic_minus_circle_dark_24dp.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/app/src/main/res/values/aosp_datetimepicker_dimens.xml b/app/src/main/res/values/aosp_datetimepicker_dimens.xml index 068290d..7a868f3 100644 --- a/app/src/main/res/values/aosp_datetimepicker_dimens.xml +++ b/app/src/main/res/values/aosp_datetimepicker_dimens.xml @@ -64,4 +64,5 @@ 6dp + 8dp \ No newline at end of file