Tint selectableItemBackground with accent color
This commit is contained in:
parent
29086b4b02
commit
f2e25cb261
@ -20,10 +20,12 @@ import android.animation.Keyframe;
|
|||||||
import android.animation.ObjectAnimator;
|
import android.animation.ObjectAnimator;
|
||||||
import android.animation.PropertyValuesHolder;
|
import android.animation.PropertyValuesHolder;
|
||||||
import android.annotation.SuppressLint;
|
import android.annotation.SuppressLint;
|
||||||
|
import android.annotation.TargetApi;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.res.ColorStateList;
|
import android.content.res.ColorStateList;
|
||||||
import android.content.res.TypedArray;
|
import android.content.res.TypedArray;
|
||||||
import android.graphics.drawable.Drawable;
|
import android.graphics.drawable.Drawable;
|
||||||
|
import android.graphics.drawable.RippleDrawable;
|
||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
import android.support.annotation.AttrRes;
|
import android.support.annotation.AttrRes;
|
||||||
import android.support.annotation.ColorInt;
|
import android.support.annotation.ColorInt;
|
||||||
@ -55,7 +57,6 @@ public class Utils {
|
|||||||
// Alpha level for fully opaque.
|
// Alpha level for fully opaque.
|
||||||
public static final int FULL_ALPHA = 255;
|
public static final int FULL_ALPHA = 255;
|
||||||
|
|
||||||
|
|
||||||
static final String SHARED_PREFS_NAME = "com.android.calendar_preferences";
|
static final String SHARED_PREFS_NAME = "com.android.calendar_preferences";
|
||||||
|
|
||||||
public static boolean isJellybeanOrLater() {
|
public static boolean isJellybeanOrLater() {
|
||||||
@ -245,6 +246,20 @@ public class Utils {
|
|||||||
return d;
|
return d;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the color on the {@code view}'s RippleDrawable background,
|
||||||
|
* if its background was set to {@code android.R.attr.selectableItemBackground} or
|
||||||
|
* {@code android.R.attr.selectableItemBackgroundBorderless}.
|
||||||
|
* @param view the view that should have its highlight color changed
|
||||||
|
*/
|
||||||
|
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
|
||||||
|
public static void setColorControlHighlight(@NonNull View view, @ColorInt int color) {
|
||||||
|
Drawable selectableItemBackground = view.getBackground();
|
||||||
|
if (selectableItemBackground instanceof RippleDrawable) {
|
||||||
|
((RippleDrawable) selectableItemBackground).setColor(ColorStateList.valueOf(color));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets dialog type (Light/Dark) from current theme
|
* Gets dialog type (Light/Dark) from current theme
|
||||||
* @param context The context to use as reference for the boolean
|
* @param context The context to use as reference for the boolean
|
||||||
|
|||||||
@ -11,6 +11,7 @@ import android.view.View;
|
|||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
|
|
||||||
import com.philliphsu.clock2.R;
|
import com.philliphsu.clock2.R;
|
||||||
|
import com.philliphsu.clock2.aospdatetimepicker.Utils;
|
||||||
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
|
|
||||||
@ -39,7 +40,8 @@ public abstract class GridLayoutNumpad extends GridLayout {
|
|||||||
private int mCount = 0;
|
private int mCount = 0;
|
||||||
private OnInputChangeListener mOnInputChangeListener;
|
private OnInputChangeListener mOnInputChangeListener;
|
||||||
|
|
||||||
ColorStateList mColors;
|
private ColorStateList mTextColors;
|
||||||
|
int mAccentColor;
|
||||||
|
|
||||||
@Bind({ R.id.zero, R.id.one, R.id.two, R.id.three, R.id.four,
|
@Bind({ R.id.zero, R.id.one, R.id.two, R.id.three, R.id.four,
|
||||||
R.id.five, R.id.six, R.id.seven, R.id.eight, R.id.nine })
|
R.id.five, R.id.six, R.id.seven, R.id.eight, R.id.nine })
|
||||||
@ -63,8 +65,7 @@ public abstract class GridLayoutNumpad extends GridLayout {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public GridLayoutNumpad(Context context) {
|
public GridLayoutNumpad(Context context) {
|
||||||
super(context);
|
this(context, null);
|
||||||
init();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public GridLayoutNumpad(Context context, AttributeSet attrs) {
|
public GridLayoutNumpad(Context context, AttributeSet attrs) {
|
||||||
@ -83,13 +84,29 @@ public abstract class GridLayoutNumpad extends GridLayout {
|
|||||||
// The buttons are actually of type Button, but we kept references
|
// The buttons are actually of type Button, but we kept references
|
||||||
// to them as TextViews... which is fine since TextView is the superclass
|
// to them as TextViews... which is fine since TextView is the superclass
|
||||||
// of Button.
|
// of Button.
|
||||||
mColors = ContextCompat.getColorStateList(context,
|
mTextColors = ContextCompat.getColorStateList(context, themeDark?
|
||||||
themeDark? R.color.numeric_keypad_button_text_dark : R.color.numeric_keypad_button_text);
|
R.color.numeric_keypad_button_text_dark : R.color.numeric_keypad_button_text);
|
||||||
|
|
||||||
|
// AFAIK, the only way to get the user's accent color is programmatically,
|
||||||
|
// because it is uniquely defined in their app's theme. It is not possible
|
||||||
|
// for us to reference that via XML (i.e. with ?colorAccent or similar),
|
||||||
|
// which happens at compile time.
|
||||||
|
// TOneverDO: Use any other Context to retrieve the accent color. We must use
|
||||||
|
// the Context param passed to us, because we know this context to be
|
||||||
|
// NumpadTimePickerDialog.getContext(), which is equivalent to
|
||||||
|
// NumpadTimePickerDialog.getActivity(). It is from that Activity where we
|
||||||
|
// get its theme's colorAccent.
|
||||||
|
mAccentColor = Utils.getThemeAccentColor(context);
|
||||||
for (TextView b : mButtons) {
|
for (TextView b : mButtons) {
|
||||||
b.setTextColor(mColors);
|
setTextColor(b);
|
||||||
|
Utils.setColorControlHighlight(b, mAccentColor);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void setTextColor(TextView view) {
|
||||||
|
view.setTextColor(mTextColors);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return the number of digits we can input
|
* @return the number of digits we can input
|
||||||
*/
|
*/
|
||||||
|
|||||||
@ -503,6 +503,9 @@ public class NumberGridTimePickerDialog extends BaseTimePickerDialog implements
|
|||||||
mHalfDayToggleUnselectedColor = ContextCompat.getColor(getContext(),
|
mHalfDayToggleUnselectedColor = ContextCompat.getColor(getContext(),
|
||||||
mThemeDark? R.color.text_color_primary_dark : R.color.text_color_primary_light);
|
mThemeDark? R.color.text_color_primary_dark : R.color.text_color_primary_light);
|
||||||
|
|
||||||
|
Utils.setColorControlHighlight(mLeftHalfDayToggle, accentColor);
|
||||||
|
Utils.setColorControlHighlight(mRightHalfDayToggle, accentColor);
|
||||||
|
|
||||||
// Update the half day at the end when the state colors have been initialized
|
// Update the half day at the end when the state colors have been initialized
|
||||||
updateHalfDay(mInitialHourOfDay < 12? AM : PM);
|
updateHalfDay(mInitialHourOfDay < 12? AM : PM);
|
||||||
return view;
|
return view;
|
||||||
|
|||||||
@ -22,7 +22,7 @@ public abstract class NumbersGrid extends GridLayout implements View.OnClickList
|
|||||||
OnNumberSelectedListener mSelectionListener;
|
OnNumberSelectedListener mSelectionListener;
|
||||||
View mLastSelectedView;
|
View mLastSelectedView;
|
||||||
|
|
||||||
private final int mSelectedTextColor;
|
final int mSelectedTextColor;
|
||||||
// TODO: The half-day buttons in the dialog's layout also need to use this color.
|
// TODO: The half-day buttons in the dialog's layout also need to use this color.
|
||||||
// Consider moving this to either the Dialog class, or move the buttons and the FAB
|
// Consider moving this to either the Dialog class, or move the buttons and the FAB
|
||||||
// to the GridSelectorLayout class and then move these to GridSelectorLayout.
|
// to the GridSelectorLayout class and then move these to GridSelectorLayout.
|
||||||
@ -48,6 +48,10 @@ public abstract class NumbersGrid extends GridLayout implements View.OnClickList
|
|||||||
mIsInitialized = false;
|
mIsInitialized = false;
|
||||||
// mDefaultTextColor = Utils.getTextColorFromThemeAttr(context, android.R.attr.textColorPrimary);
|
// mDefaultTextColor = Utils.getTextColorFromThemeAttr(context, android.R.attr.textColorPrimary);
|
||||||
mDefaultTextColor = ContextCompat.getColor(context, R.color.text_color_primary_light);
|
mDefaultTextColor = ContextCompat.getColor(context, R.color.text_color_primary_light);
|
||||||
|
// The reason we can use the Context passed here and get the correct accent color
|
||||||
|
// is that this NumbersGrid is programmatically created by the GridSelectorLayout in
|
||||||
|
// its initialize(), and the Context passed in there is from
|
||||||
|
// NumberGridTimePickerDialog.getActivity().
|
||||||
mSelectedTextColor = Utils.getThemeAccentColor(context);
|
mSelectedTextColor = Utils.getThemeAccentColor(context);
|
||||||
// Show the first button as default selected
|
// Show the first button as default selected
|
||||||
setIndicator(getChildAt(indexOfDefaultValue()));
|
setIndicator(getChildAt(indexOfDefaultValue()));
|
||||||
@ -142,6 +146,7 @@ public abstract class NumbersGrid extends GridLayout implements View.OnClickList
|
|||||||
R.color.text_color_primary_dark : R.color.text_color_primary_light);
|
R.color.text_color_primary_dark : R.color.text_color_primary_light);
|
||||||
for (int i = 0; i < getChildCount(); i++) {
|
for (int i = 0; i < getChildCount(); i++) {
|
||||||
View v = getChildAt(i);
|
View v = getChildAt(i);
|
||||||
|
Utils.setColorControlHighlight(v, mSelectedTextColor/*colorAccent*/);
|
||||||
// Filter out views that aren't number buttons
|
// Filter out views that aren't number buttons
|
||||||
if (canRegisterClickListener(v)) {
|
if (canRegisterClickListener(v)) {
|
||||||
((TextView) v).setTextColor(mDefaultTextColor);
|
((TextView) v).setTextColor(mDefaultTextColor);
|
||||||
|
|||||||
@ -63,7 +63,6 @@ public class NumpadTimePicker extends GridLayoutNumpad {
|
|||||||
@Bind(R.id.backspace) ImageButton mBackspace;
|
@Bind(R.id.backspace) ImageButton mBackspace;
|
||||||
|
|
||||||
private boolean mThemeDark;
|
private boolean mThemeDark;
|
||||||
private int mAccentColor;
|
|
||||||
private int mFabDisabledColorDark;
|
private int mFabDisabledColorDark;
|
||||||
private int mFabDisabledColorLight;
|
private int mFabDisabledColorLight;
|
||||||
|
|
||||||
@ -105,12 +104,20 @@ public class NumpadTimePicker extends GridLayoutNumpad {
|
|||||||
void setTheme(Context context, boolean themeDark) {
|
void setTheme(Context context, boolean themeDark) {
|
||||||
super.setTheme(context, themeDark);
|
super.setTheme(context, themeDark);
|
||||||
mThemeDark = themeDark;
|
mThemeDark = themeDark;
|
||||||
|
// this.getContext() ==> default teal accent color
|
||||||
|
// application context ==> white
|
||||||
|
// The Context that was passed in is NumpadTimePickerDialog.getContext() which
|
||||||
|
// is probably the host Activity. I have no idea what this.getContext() returns,
|
||||||
|
// but its probably some internal type that isn't tied to any of our application
|
||||||
|
// components.
|
||||||
|
|
||||||
// So, we kept the 0-9 buttons as TextViews, but here we kept
|
// So, we kept the 0-9 buttons as TextViews, but here we kept
|
||||||
// the alt buttons as actual Buttons...
|
// the alt buttons as actual Buttons...
|
||||||
for (Button b : mAltButtons) {
|
for (Button b : mAltButtons) {
|
||||||
b.setTextColor(mColors);
|
setTextColor(b);
|
||||||
|
Utils.setColorControlHighlight(b, mAccentColor);
|
||||||
}
|
}
|
||||||
|
Utils.setColorControlHighlight(mBackspace, mAccentColor);
|
||||||
|
|
||||||
ColorStateList colorBackspace = ContextCompat.getColorStateList(context,
|
ColorStateList colorBackspace = ContextCompat.getColorStateList(context,
|
||||||
themeDark? R.color.icon_color_dark : R.color.icon_color);
|
themeDark? R.color.icon_color_dark : R.color.icon_color);
|
||||||
@ -120,13 +127,6 @@ public class NumpadTimePicker extends GridLayoutNumpad {
|
|||||||
themeDark? R.color.icon_color_dark : R.color.fab_icon_color);
|
themeDark? R.color.icon_color_dark : R.color.fab_icon_color);
|
||||||
Utils.setTintList(mFab, mFab.getDrawable(), colorIcon);
|
Utils.setTintList(mFab, mFab.getDrawable(), colorIcon);
|
||||||
|
|
||||||
// this.getContext() ==> default teal accent color
|
|
||||||
// application context ==> white
|
|
||||||
// The Context that was passed in is NumpadTimePickerDialog.getContext() which
|
|
||||||
// is probably the host Activity. I have no idea what this.getContext() returns,
|
|
||||||
// but its probably some internal type that isn't tied to any of our application
|
|
||||||
// components.
|
|
||||||
mAccentColor = Utils.getThemeAccentColor(context);
|
|
||||||
// Make sure the dark theme disabled color shows up initially
|
// Make sure the dark theme disabled color shows up initially
|
||||||
updateFabState();
|
updateFabState();
|
||||||
}
|
}
|
||||||
|
|||||||
@ -59,7 +59,7 @@ public class NumpadTimePickerDialog extends BaseTimePickerDialog
|
|||||||
NumpadTimePickerDialog ret = new NumpadTimePickerDialog();
|
NumpadTimePickerDialog ret = new NumpadTimePickerDialog();
|
||||||
// TODO: Do these in initialize()
|
// TODO: Do these in initialize()
|
||||||
ret.setOnTimeSetListener(callback);
|
ret.setOnTimeSetListener(callback);
|
||||||
ret.mThemeDark = true;
|
ret.mThemeDark = false;
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -5,6 +5,7 @@ import android.support.v4.content.ContextCompat;
|
|||||||
import android.view.View;
|
import android.view.View;
|
||||||
|
|
||||||
import com.philliphsu.clock2.R;
|
import com.philliphsu.clock2.R;
|
||||||
|
import com.philliphsu.clock2.aospdatetimepicker.Utils;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Created by Phillip Hsu on 8/17/2016.
|
* Created by Phillip Hsu on 8/17/2016.
|
||||||
@ -84,6 +85,7 @@ public class TwentyFourHoursGrid extends NumbersGrid implements View.OnLongClick
|
|||||||
R.color.text_color_secondary_dark : R.color.text_color_secondary_light);
|
R.color.text_color_secondary_dark : R.color.text_color_secondary_light);
|
||||||
for (int i = 0; i < getChildCount(); i++) {
|
for (int i = 0; i < getChildCount(); i++) {
|
||||||
TwentyFourHourGridItem item = (TwentyFourHourGridItem) getChildAt(i);
|
TwentyFourHourGridItem item = (TwentyFourHourGridItem) getChildAt(i);
|
||||||
|
Utils.setColorControlHighlight(item, mSelectedTextColor/*colorAccent*/);
|
||||||
item.getPrimaryTextView().setTextColor(mDefaultTextColor);
|
item.getPrimaryTextView().setTextColor(mDefaultTextColor);
|
||||||
item.getSecondaryTextView().setTextColor(mSecondaryTextColor);
|
item.getSecondaryTextView().setTextColor(mSecondaryTextColor);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -37,7 +37,7 @@
|
|||||||
<item name="layout_columnWeight">1</item>
|
<item name="layout_columnWeight">1</item>
|
||||||
<!--<item name="layout_rowWeight">1</item>-->
|
<!--<item name="layout_rowWeight">1</item>-->
|
||||||
<item name="android:layout_height">@dimen/numeric_keypad_cell_height</item>
|
<item name="android:layout_height">@dimen/numeric_keypad_cell_height</item>
|
||||||
<item name="android:background">?android:attr/selectableItemBackground</item>
|
<item name="android:background">?android:attr/selectableItemBackgroundBorderless</item>
|
||||||
<item name="android:gravity">center</item>
|
<item name="android:gravity">center</item>
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
@ -122,6 +122,9 @@
|
|||||||
</style>
|
</style>
|
||||||
|
|
||||||
<style name="ModalStyle" parent="Widget.Design.BottomSheet.Modal">
|
<style name="ModalStyle" parent="Widget.Design.BottomSheet.Modal">
|
||||||
|
<!-- TODO: See if this can be set programmatically, or else we'd have to force users
|
||||||
|
~ to declare a bottomSheetDialogTheme in their theme.
|
||||||
|
-->
|
||||||
<item name="behavior_peekHeight">@dimen/peek_height_upper_limit</item>
|
<item name="behavior_peekHeight">@dimen/peek_height_upper_limit</item>
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user