diff --git a/bottom-bar/src/androidTest/java/com/roughike/bottombar/BottomBarTest.java b/bottom-bar/src/androidTest/java/com/roughike/bottombar/BottomBarTest.java index 935b61fd..0b503614 100644 --- a/bottom-bar/src/androidTest/java/com/roughike/bottombar/BottomBarTest.java +++ b/bottom-bar/src/androidTest/java/com/roughike/bottombar/BottomBarTest.java @@ -45,6 +45,7 @@ public class BottomBarTest { private static final int ACTIVE_TAB_COLOR = Color.parseColor("#222222"); private static final int BACKGROUND_COLOR = Color.parseColor("#333333"); private static final int BADGE_BACKGROUND_COLOR = Color.parseColor("#444444"); + private static final int BADGE_TEXT_COLOR = Color.parseColor("#555555"); private static final boolean DEFAULT_BADGE_HIDES_WHEN_SELECTED_VALUE = true; private static final int TITLE_TEXT_APPEARANCE = com.roughike.bottombar.test.R.style.dummy_text_appearance; private static final Typeface TYPEFACE = Typeface.DEFAULT_BOLD; @@ -56,6 +57,7 @@ public class BottomBarTest { .activeTabColor(ACTIVE_TAB_COLOR) .barColorWhenSelected(BACKGROUND_COLOR) .badgeBackgroundColor(BADGE_BACKGROUND_COLOR) + .badgeTextColor(BADGE_TEXT_COLOR) .hideBadgeWhenSelected(DEFAULT_BADGE_HIDES_WHEN_SELECTED_VALUE) .titleTextAppearance(TITLE_TEXT_APPEARANCE) .titleTypeFace(TYPEFACE) @@ -115,6 +117,7 @@ public void setItemsWithCustomConfig_OverridesPreviousValues() { assertEquals(ACTIVE_TAB_COLOR, first.getActiveColor()); assertEquals(BACKGROUND_COLOR, first.getBarColorWhenSelected()); assertEquals(BADGE_BACKGROUND_COLOR, first.getBadgeBackgroundColor()); + assertEquals(BADGE_TEXT_COLOR, first.getBadgeTextColor()); assertEquals(DEFAULT_BADGE_HIDES_WHEN_SELECTED_VALUE, first.getBadgeHidesWhenActive()); assertEquals(TITLE_TEXT_APPEARANCE, first.getTitleTextAppearance()); assertEquals(TYPEFACE, first.getTitleTypeFace()); @@ -384,6 +387,7 @@ public void setInactiveTabAlpha_LeavesOtherValuesIntact() { assertEquals(ACTIVE_TAB_COLOR, inActiveTab.getActiveColor()); assertEquals(BACKGROUND_COLOR, inActiveTab.getBarColorWhenSelected()); assertEquals(BADGE_BACKGROUND_COLOR, inActiveTab.getBadgeBackgroundColor()); + assertEquals(BADGE_TEXT_COLOR, inActiveTab.getBadgeTextColor()); assertEquals(TITLE_TEXT_APPEARANCE, inActiveTab.getTitleTextAppearance()); assertEquals(TYPEFACE, inActiveTab.getTitleTypeFace()); } @@ -417,6 +421,7 @@ public void setActiveTabAlpha_LeavesOtherValuesIntact() { assertEquals(ACTIVE_TAB_COLOR, activeTab.getActiveColor()); assertEquals(BACKGROUND_COLOR, activeTab.getBarColorWhenSelected()); assertEquals(BADGE_BACKGROUND_COLOR, activeTab.getBadgeBackgroundColor()); + assertEquals(BADGE_TEXT_COLOR, activeTab.getBadgeTextColor()); assertEquals(TITLE_TEXT_APPEARANCE, activeTab.getTitleTextAppearance()); assertEquals(TYPEFACE, activeTab.getTitleTypeFace()); } @@ -455,6 +460,7 @@ public void setInactiveColor_LeavesOtherValuesIntact() { assertEquals(ACTIVE_TAB_COLOR, inActiveTab.getActiveColor()); assertEquals(BACKGROUND_COLOR, inActiveTab.getBarColorWhenSelected()); assertEquals(BADGE_BACKGROUND_COLOR, inActiveTab.getBadgeBackgroundColor()); + assertEquals(BADGE_TEXT_COLOR, inActiveTab.getBadgeTextColor()); assertEquals(TITLE_TEXT_APPEARANCE, inActiveTab.getTitleTextAppearance()); assertEquals(TYPEFACE, inActiveTab.getTitleTypeFace()); } @@ -491,6 +497,7 @@ public void setActiveColor_LeavesOtherValuesIntact() { assertEquals(Color.BLUE, inActiveTab.getActiveColor()); assertEquals(BACKGROUND_COLOR, inActiveTab.getBarColorWhenSelected()); assertEquals(BADGE_BACKGROUND_COLOR, inActiveTab.getBadgeBackgroundColor()); + assertEquals(BADGE_TEXT_COLOR, inActiveTab.getBadgeTextColor()); assertEquals(TITLE_TEXT_APPEARANCE, inActiveTab.getTitleTextAppearance()); assertEquals(TYPEFACE, inActiveTab.getTitleTypeFace()); } @@ -526,6 +533,37 @@ public void setBadgeBackgroundColor_LeavesOtherValuesIntact() { assertEquals(TYPEFACE, inActiveTab.getTitleTypeFace()); } + @Test + @UiThreadTest + public void setBadgeTextColor_UpdatesColor() { + BottomBarTab inActiveTab = bottomBar.getTabAtPosition(1); + inActiveTab.setBadgeCount(3); + + int previousBadgeTextColor = inActiveTab.getBadgeTextColor(); + int testColor = Color.GREEN; + assertNotEquals(testColor, previousBadgeTextColor); + + bottomBar.setBadgeTextColor(testColor); + assertEquals(testColor, inActiveTab.getBadgeTextColor()); + } + + @Test + public void setBadgeTextColor_LeavesOtherValuesIntact() { + bottomBar.setBadgeTextColor(Color.BLUE); + + BottomBarTab inActiveTab = bottomBar.getTabAtPosition(1); + assertNotEquals(inActiveTab, bottomBar.getCurrentTab()); + + assertEquals(INACTIVE_TAB_ALPHA, inActiveTab.getInActiveAlpha(), 0); + assertEquals(ACTIVE_TAB_ALPHA, inActiveTab.getActiveAlpha(), 0); + assertEquals(INACTIVE_TAB_COLOR, inActiveTab.getInActiveColor()); + assertEquals(ACTIVE_TAB_COLOR, inActiveTab.getActiveColor()); + assertEquals(BACKGROUND_COLOR, inActiveTab.getBarColorWhenSelected()); + assertEquals(Color.BLUE, inActiveTab.getBadgeTextColor()); + assertEquals(TITLE_TEXT_APPEARANCE, inActiveTab.getTitleTextAppearance()); + assertEquals(TYPEFACE, inActiveTab.getTitleTypeFace()); + } + @Test @UiThreadTest public void setBadgeHidesWhenSelected_UpdatesBadgeHidesWhenSelected() { @@ -550,6 +588,7 @@ public void setBadgeHidesWhenSelected_LeavesOtherValuesIntact() { assertEquals(ACTIVE_TAB_COLOR, tab.getActiveColor()); assertEquals(BACKGROUND_COLOR, tab.getBarColorWhenSelected()); assertEquals(BADGE_BACKGROUND_COLOR, tab.getBadgeBackgroundColor()); + assertEquals(BADGE_TEXT_COLOR, tab.getBadgeTextColor()); assertTrue(tab.getBadgeHidesWhenActive()); assertEquals(TITLE_TEXT_APPEARANCE, tab.getTitleTextAppearance()); assertEquals(TYPEFACE, tab.getTitleTypeFace()); @@ -582,6 +621,7 @@ public void setTitleTextAppearance_LeavesOtherValuesIntact() { assertEquals(ACTIVE_TAB_COLOR, inActiveTab.getActiveColor()); assertEquals(BACKGROUND_COLOR, inActiveTab.getBarColorWhenSelected()); assertEquals(BADGE_BACKGROUND_COLOR, inActiveTab.getBadgeBackgroundColor()); + assertEquals(BADGE_TEXT_COLOR, inActiveTab.getBadgeTextColor()); assertEquals(-666, inActiveTab.getTitleTextAppearance()); assertEquals(TYPEFACE, inActiveTab.getTitleTypeFace()); } @@ -614,6 +654,7 @@ public void setTitleTypeface_LeavesOtherValuesIntact() { assertEquals(ACTIVE_TAB_COLOR, inActiveTab.getActiveColor()); assertEquals(BACKGROUND_COLOR, inActiveTab.getBarColorWhenSelected()); assertEquals(BADGE_BACKGROUND_COLOR, inActiveTab.getBadgeBackgroundColor()); + assertEquals(BADGE_TEXT_COLOR, inActiveTab.getBadgeTextColor()); assertEquals(TITLE_TEXT_APPEARANCE, inActiveTab.getTitleTextAppearance()); assertEquals(Typeface.DEFAULT, inActiveTab.getTitleTypeFace()); } diff --git a/bottom-bar/src/androidTest/java/com/roughike/bottombar/TabParserTest.java b/bottom-bar/src/androidTest/java/com/roughike/bottombar/TabParserTest.java index e6709111..039375cc 100644 --- a/bottom-bar/src/androidTest/java/com/roughike/bottombar/TabParserTest.java +++ b/bottom-bar/src/androidTest/java/com/roughike/bottombar/TabParserTest.java @@ -120,6 +120,15 @@ public void badgeBackgroundColorAsExpected() { assertEquals(Color.parseColor("#00F0F0"), tabs.get(4).getBadgeBackgroundColor()); } + @Test + public void badgeTextColorAsExpected() { + assertEquals(Color.parseColor("#FF0000"), tabs.get(0).getBadgeTextColor()); + assertEquals(Color.parseColor("#00FF00"), tabs.get(1).getBadgeTextColor()); + assertEquals(Color.parseColor("#F00000"), tabs.get(2).getBadgeTextColor()); + assertEquals(Color.parseColor("#00F000"), tabs.get(3).getBadgeTextColor()); + assertEquals(Color.parseColor("#00F0F0"), tabs.get(4).getBadgeTextColor()); + } + @Test public void correctBadgeHidingPolicies() { assertFalse(tabs.get(0).getBadgeHidesWhenActive()); diff --git a/bottom-bar/src/androidTest/res/xml/dummy_tabs_five.xml b/bottom-bar/src/androidTest/res/xml/dummy_tabs_five.xml index 97fa200f..2670bbe8 100644 --- a/bottom-bar/src/androidTest/res/xml/dummy_tabs_five.xml +++ b/bottom-bar/src/androidTest/res/xml/dummy_tabs_five.xml @@ -1,8 +1,8 @@ - - - - - + + + + + \ No newline at end of file diff --git a/bottom-bar/src/main/java/com/roughike/bottombar/BottomBar.java b/bottom-bar/src/main/java/com/roughike/bottombar/BottomBar.java index 350cc316..5dae7b61 100644 --- a/bottom-bar/src/main/java/com/roughike/bottombar/BottomBar.java +++ b/bottom-bar/src/main/java/com/roughike/bottombar/BottomBar.java @@ -77,6 +77,7 @@ public class BottomBar extends LinearLayout implements View.OnClickListener, Vie private int inActiveTabColor; private int activeTabColor; private int badgeBackgroundColor; + private int badgeTextColor; private boolean hideBadgeWhenActive; private boolean longPressHintsEnabled; private int titleTextAppearance; @@ -208,6 +209,7 @@ private void populateAttributes(Context context, AttributeSet attrs, int defStyl inActiveTabColor = ta.getColor(R.styleable.BottomBar_bb_inActiveTabColor, defaultInActiveColor); activeTabColor = ta.getColor(R.styleable.BottomBar_bb_activeTabColor, defaultActiveColor); badgeBackgroundColor = ta.getColor(R.styleable.BottomBar_bb_badgeBackgroundColor, Color.RED); + badgeTextColor = ta.getColor(R.styleable.BottomBar_bb_badgeTextColor, Color.WHITE); hideBadgeWhenActive = ta.getBoolean(R.styleable.BottomBar_bb_badgesHideWhenActive, true); titleTextAppearance = ta.getResourceId(R.styleable.BottomBar_bb_titleTextAppearance, 0); titleTypeFace = getTypeFaceFromAsset(ta.getString(R.styleable.BottomBar_bb_titleTypeFace)); @@ -318,6 +320,7 @@ private BottomBarTab.Config getTabConfig() { .activeTabColor(activeTabColor) .barColorWhenSelected(defaultBackgroundColor) .badgeBackgroundColor(badgeBackgroundColor) + .badgeTextColor(badgeTextColor) .hideBadgeWhenSelected(hideBadgeWhenActive) .titleTextAppearance(titleTextAppearance) .titleTypeFace(titleTypeFace) @@ -697,6 +700,17 @@ public void update(BottomBarTab tab) { }); } + public void setBadgeTextColor(@ColorInt int color) { + badgeTextColor = color; + + batchPropertyApplier.applyToAllTabs(new BatchTabPropertyApplier.TabPropertyUpdater() { + @Override + public void update(BottomBarTab tab) { + tab.setBadgeTextColor(badgeTextColor); + } + }); + } + /** * Controls whether the badge (if any) for active tabs * should be hidden or not. diff --git a/bottom-bar/src/main/java/com/roughike/bottombar/BottomBarBadge.java b/bottom-bar/src/main/java/com/roughike/bottombar/BottomBarBadge.java index af5b8546..103a9ce6 100644 --- a/bottom-bar/src/main/java/com/roughike/bottombar/BottomBarBadge.java +++ b/bottom-bar/src/main/java/com/roughike/bottombar/BottomBarBadge.java @@ -110,6 +110,10 @@ void setColoredCircleBackground(int circleColor) { setBackgroundCompat(backgroundCircle); } + void setBadgeTextColor(int badgeTextColor) { + setTextColor(badgeTextColor); + } + private void wrapTabAndBadgeInSameContainer(final BottomBarTab tab) { ViewGroup tabContainer = (ViewGroup) tab.getParent(); tabContainer.removeView(tab); diff --git a/bottom-bar/src/main/java/com/roughike/bottombar/BottomBarTab.java b/bottom-bar/src/main/java/com/roughike/bottombar/BottomBarTab.java index d33e1e30..1bbacee3 100644 --- a/bottom-bar/src/main/java/com/roughike/bottombar/BottomBarTab.java +++ b/bottom-bar/src/main/java/com/roughike/bottombar/BottomBarTab.java @@ -61,6 +61,7 @@ public class BottomBarTab extends LinearLayout { private int activeColor; private int barColorWhenSelected; private int badgeBackgroundColor; + private int badgeTextColor; private boolean badgeHidesWhenActive; private AppCompatImageView iconView; private TextView titleView; @@ -84,6 +85,7 @@ void setConfig(@NonNull Config config) { setActiveColor(config.activeTabColor); setBarColorWhenSelected(config.barColorWhenSelected); setBadgeBackgroundColor(config.badgeBackgroundColor); + setBadgeTextColor(config.badgeTextColor); setBadgeHidesWhenActive(config.badgeHidesWhenSelected); setTitleTextAppearance(config.titleTextAppearance); setTitleTypeface(config.titleTypeFace); @@ -280,6 +282,18 @@ public void setBadgeBackgroundColor(int badgeBackgroundColor) { } } + public int getBadgeTextColor() { + return badgeTextColor; + } + + public void setBadgeTextColor(int badgeTextColor) { + this.badgeTextColor = badgeTextColor; + + if (badge != null) { + badge.setBadgeTextColor(badgeBackgroundColor); + } + } + public boolean getBadgeHidesWhenActive() { return badgeHidesWhenActive; } @@ -329,6 +343,7 @@ public void setBadgeCount(int count) { if (badge == null) { badge = new BottomBarBadge(getContext()); badge.attachToTab(this, badgeBackgroundColor); + badge.setTextColor(badgeTextColor); } badge.setCount(count); @@ -647,6 +662,7 @@ public static class Config { private final int activeTabColor; private final int barColorWhenSelected; private final int badgeBackgroundColor; + private final int badgeTextColor; private final int titleTextAppearance; private final Typeface titleTypeFace; private boolean badgeHidesWhenSelected = true; @@ -658,6 +674,7 @@ private Config(Builder builder) { this.activeTabColor = builder.activeTabColor; this.barColorWhenSelected = builder.barColorWhenSelected; this.badgeBackgroundColor = builder.badgeBackgroundColor; + this.badgeTextColor = builder.badgeTextColor; this.badgeHidesWhenSelected = builder.hidesBadgeWhenSelected; this.titleTextAppearance = builder.titleTextAppearance; this.titleTypeFace = builder.titleTypeFace; @@ -670,6 +687,7 @@ public static class Builder { private int activeTabColor; private int barColorWhenSelected; private int badgeBackgroundColor; + private int badgeTextColor; private boolean hidesBadgeWhenSelected = true; private int titleTextAppearance; private Typeface titleTypeFace; @@ -704,6 +722,11 @@ public Builder badgeBackgroundColor(@ColorInt int color) { return this; } + public Builder badgeTextColor(@ColorInt int color) { + this.badgeTextColor = color; + return this; + } + public Builder hideBadgeWhenSelected(boolean hide) { this.hidesBadgeWhenSelected = hide; return this; diff --git a/bottom-bar/src/main/java/com/roughike/bottombar/TabParser.java b/bottom-bar/src/main/java/com/roughike/bottombar/TabParser.java index 65ec8fe2..3dc1dc5b 100644 --- a/bottom-bar/src/main/java/com/roughike/bottombar/TabParser.java +++ b/bottom-bar/src/main/java/com/roughike/bottombar/TabParser.java @@ -22,6 +22,7 @@ import static com.roughike.bottombar.TabParser.TabAttribute.ACTIVE_COLOR; import static com.roughike.bottombar.TabParser.TabAttribute.BADGE_BACKGROUND_COLOR; +import static com.roughike.bottombar.TabParser.TabAttribute.BADGE_TEXT_COLOR; import static com.roughike.bottombar.TabParser.TabAttribute.BADGE_HIDES_WHEN_ACTIVE; import static com.roughike.bottombar.TabParser.TabAttribute.BAR_COLOR_WHEN_SELECTED; import static com.roughike.bottombar.TabParser.TabAttribute.ICON; @@ -134,6 +135,11 @@ private BottomBarTab parseNewTab(@NonNull XmlResourceParser parser, @IntRange(fr if (badgeBackgroundColor == COLOR_NOT_SET) continue; workingTab.setBadgeBackgroundColor(badgeBackgroundColor); break; + case BADGE_TEXT_COLOR: + int badgeTextColor = getColorValue(parser, i); + if (badgeTextColor == COLOR_NOT_SET) continue; + workingTab.setBadgeTextColor(badgeTextColor); + break; case BADGE_HIDES_WHEN_ACTIVE: boolean badgeHidesWhenActive = parser.getAttributeBooleanValue(i, true); workingTab.setBadgeHidesWhenActive(badgeHidesWhenActive); @@ -188,6 +194,7 @@ private int getColorValue(@NonNull XmlResourceParser parser, @IntRange(from = 0) ACTIVE_COLOR, BAR_COLOR_WHEN_SELECTED, BADGE_BACKGROUND_COLOR, + BADGE_TEXT_COLOR, BADGE_HIDES_WHEN_ACTIVE, IS_TITLELESS }) @@ -199,6 +206,7 @@ private int getColorValue(@NonNull XmlResourceParser parser, @IntRange(from = 0) String ACTIVE_COLOR = "activeColor"; String BAR_COLOR_WHEN_SELECTED = "barColorWhenSelected"; String BADGE_BACKGROUND_COLOR = "badgeBackgroundColor"; + String BADGE_TEXT_COLOR = "badgeTextColor"; String BADGE_HIDES_WHEN_ACTIVE = "badgeHidesWhenActive"; String IS_TITLELESS = "iconOnly"; } diff --git a/bottom-bar/src/main/res/values/attrs.xml b/bottom-bar/src/main/res/values/attrs.xml index 8b382f4d..f0bc7a83 100644 --- a/bottom-bar/src/main/res/values/attrs.xml +++ b/bottom-bar/src/main/res/values/attrs.xml @@ -15,6 +15,7 @@ +