From a19c36ec07740d7eb8e139458322335d7e1cb24b Mon Sep 17 00:00:00 2001 From: m1ga Date: Sun, 26 Apr 2020 17:53:52 +0200 Subject: [PATCH] feat(android): add Ti.UI.Tab.badge and badgeColor Fixes TIMOB-27859 --- .../java/ti/modules/titanium/ui/TabProxy.java | 10 ++- .../widget/tabgroup/TiUIAbstractTabGroup.java | 14 ++++ .../TiUIBottomNavigationTabGroup.java | 74 +++++++++++++++---- .../tabgroup/TiUITabLayoutTabGroup.java | 65 +++++++++++++--- .../java/org/appcelerator/titanium/TiC.java | 10 +++ 5 files changed, 150 insertions(+), 23 deletions(-) diff --git a/android/modules/ui/src/java/ti/modules/titanium/ui/TabProxy.java b/android/modules/ui/src/java/ti/modules/titanium/ui/TabProxy.java index 148dcc9f5e7..53f4ef500e3 100644 --- a/android/modules/ui/src/java/ti/modules/titanium/ui/TabProxy.java +++ b/android/modules/ui/src/java/ti/modules/titanium/ui/TabProxy.java @@ -25,7 +25,9 @@ TiC.PROPERTY_ICON, TiC.PROPERTY_TITLE, TiC.PROPERTY_TITLE_COLOR, - TiC.PROPERTY_TITLEID + TiC.PROPERTY_TITLEID, + TiC.PROPERTY_BADGE, + TiC.PROPERTY_BADGE_COLOR }) public class TabProxy extends TiViewProxy { @@ -253,6 +255,12 @@ public void onPropertyChanged(String name, Object value) if (name.equals(TiC.PROPERTY_ICON)) { ((TiUIAbstractTabGroup) tabGroupProxy.getOrCreateView()).updateTabIcon(tabGroupProxy.getTabIndex(this)); } + if (name.equals(TiC.PROPERTY_BADGE)) { + ((TiUIAbstractTabGroup) tabGroupProxy.getOrCreateView()).updateBadge(tabGroupProxy.getTabIndex(this)); + } + if (name.equals(TiC.PROPERTY_BADGE_COLOR)) { + ((TiUIAbstractTabGroup) tabGroupProxy.getOrCreateView()).updateBadgeColor(tabGroupProxy.getTabIndex(this)); + } } @Override diff --git a/android/modules/ui/src/java/ti/modules/titanium/ui/widget/tabgroup/TiUIAbstractTabGroup.java b/android/modules/ui/src/java/ti/modules/titanium/ui/widget/tabgroup/TiUIAbstractTabGroup.java index 7e921beba9b..76940e1825a 100644 --- a/android/modules/ui/src/java/ti/modules/titanium/ui/widget/tabgroup/TiUIAbstractTabGroup.java +++ b/android/modules/ui/src/java/ti/modules/titanium/ui/widget/tabgroup/TiUIAbstractTabGroup.java @@ -91,6 +91,20 @@ public abstract class TiUIAbstractTabGroup extends TiUIView */ public abstract void setBackgroundColor(int colorInt); + /** + * Update the tab badge + * + * @param index of the Tab to update. + */ + public abstract void updateBadge(int index); + + /** + * Update the tab badge color + * + * @param index of the Tab to update. + */ + public abstract void updateBadgeColor(int index); + /** * Updates the tab's background drawables to the proper color states. * diff --git a/android/modules/ui/src/java/ti/modules/titanium/ui/widget/tabgroup/TiUIBottomNavigationTabGroup.java b/android/modules/ui/src/java/ti/modules/titanium/ui/widget/tabgroup/TiUIBottomNavigationTabGroup.java index 5a48b17f809..92f8aefbb36 100644 --- a/android/modules/ui/src/java/ti/modules/titanium/ui/widget/tabgroup/TiUIBottomNavigationTabGroup.java +++ b/android/modules/ui/src/java/ti/modules/titanium/ui/widget/tabgroup/TiUIBottomNavigationTabGroup.java @@ -6,17 +6,7 @@ */ package ti.modules.titanium.ui.widget.tabgroup; -import android.annotation.SuppressLint; -import android.graphics.Rect; -import android.graphics.drawable.Drawable; -import com.google.android.material.bottomnavigation.BottomNavigationItemView; -import com.google.android.material.bottomnavigation.BottomNavigationMenuView; -import com.google.android.material.bottomnavigation.BottomNavigationView; -import com.google.android.material.bottomnavigation.LabelVisibilityMode; - -import android.view.MenuItem; -import android.view.View; -import android.view.ViewParent; +import java.util.ArrayList; import org.appcelerator.kroll.common.Log; import org.appcelerator.titanium.TiBaseActivity; @@ -27,7 +17,18 @@ import org.appcelerator.titanium.util.TiUIHelper; import org.appcelerator.titanium.view.TiCompositeLayout; -import java.util.ArrayList; +import android.annotation.SuppressLint; +import android.graphics.Rect; +import android.graphics.drawable.Drawable; +import android.view.MenuItem; +import android.view.View; +import android.view.ViewParent; + +import com.google.android.material.badge.BadgeDrawable; +import com.google.android.material.bottomnavigation.BottomNavigationItemView; +import com.google.android.material.bottomnavigation.BottomNavigationMenuView; +import com.google.android.material.bottomnavigation.BottomNavigationView; +import com.google.android.material.bottomnavigation.LabelVisibilityMode; import ti.modules.titanium.ui.TabGroupProxy; import ti.modules.titanium.ui.TabProxy; @@ -160,7 +161,7 @@ public void addTabItemInController(TiViewProxy tabProxy) return; } // Create a new item with id representing its index in mMenuItemsArray. - MenuItem menuItem = this.mBottomNavigationView.getMenu().add(null); + MenuItem menuItem = this.mBottomNavigationView.getMenu().add(0, this.mMenuItemsArray.size(), 0, ""); // Set the click listener. menuItem.setOnMenuItemClickListener(this); // Add the MenuItem to the menu of BottomNavigationView. @@ -190,6 +191,10 @@ private void updateDrawablesAfterNewItem(int index) updateTabTitle(index); // Set the icon. updateTabIcon(index); + // Set the badge + updateBadge(index); + // Set the badge color + updateBadgeColor(index); for (int i = 0; i < this.mBottomNavigationView.getMenu().size(); i++) { // Set the title text color. updateTabTitleColor(i); @@ -275,6 +280,49 @@ public void updateTabTitle(int index) } @SuppressLint("RestrictedApi") + @Override + public void updateBadge(int index) + { + if ((index < 0) || (index >= this.tabs.size())) { + return; + } + + TiViewProxy tabProxy = this.tabs.get(index).getProxy(); + if (tabProxy == null) { + return; + } + + int menuItemId = this.mBottomNavigationView.getMenu().getItem(index).getItemId(); + if (tabProxy.getProperty(TiC.PROPERTY_BADGE) != null) { + BadgeDrawable badgeDrawable = this.mBottomNavigationView.getOrCreateBadge(menuItemId); + badgeDrawable.setVisible(true); + badgeDrawable.setNumber(TiConvert.toInt(tabProxy.getProperty(TiC.PROPERTY_BADGE), 0)); + } else { + this.mBottomNavigationView.removeBadge(menuItemId); + } + } + + @Override + public void updateBadgeColor(int index) + { + if ((index < 0) || (index >= this.tabs.size())) { + return; + } + + TiViewProxy tabProxy = this.tabs.get(index).getProxy(); + if (tabProxy == null) { + return; + } + + int menuItemId = this.mBottomNavigationView.getMenu().getItem(index).getItemId(); + Log.i("COL", "" + tabProxy.getProperty(TiC.PROPERTY_BADGE_COLOR)); + if (tabProxy.getProperty(TiC.PROPERTY_BADGE_COLOR) != null) { + BadgeDrawable badgeDrawable = this.mBottomNavigationView.getOrCreateBadge(menuItemId); + badgeDrawable.setBackgroundColor( + TiConvert.toColor((String) tabProxy.getProperty(TiC.PROPERTY_BADGE_COLOR))); + } + } + @Override public void updateTabTitleColor(int index) { diff --git a/android/modules/ui/src/java/ti/modules/titanium/ui/widget/tabgroup/TiUITabLayoutTabGroup.java b/android/modules/ui/src/java/ti/modules/titanium/ui/widget/tabgroup/TiUITabLayoutTabGroup.java index 47f8fd1137a..215223b9585 100644 --- a/android/modules/ui/src/java/ti/modules/titanium/ui/widget/tabgroup/TiUITabLayoutTabGroup.java +++ b/android/modules/ui/src/java/ti/modules/titanium/ui/widget/tabgroup/TiUITabLayoutTabGroup.java @@ -6,15 +6,6 @@ */ package ti.modules.titanium.ui.widget.tabgroup; -import android.content.res.ColorStateList; -import android.content.res.Configuration; -import android.graphics.Rect; -import android.graphics.drawable.Drawable; -import com.google.android.material.tabs.TabLayout; -import android.view.View; -import android.widget.LinearLayout; -import android.widget.TextView; - import org.appcelerator.kroll.common.Log; import org.appcelerator.titanium.TiBaseActivity; import org.appcelerator.titanium.TiC; @@ -24,6 +15,17 @@ import org.appcelerator.titanium.util.TiUIHelper; import org.appcelerator.titanium.view.TiCompositeLayout; +import android.content.res.ColorStateList; +import android.content.res.Configuration; +import android.graphics.Rect; +import android.graphics.drawable.Drawable; +import android.view.View; +import android.widget.LinearLayout; +import android.widget.TextView; + +import com.google.android.material.badge.BadgeDrawable; +import com.google.android.material.tabs.TabLayout; + import ti.modules.titanium.ui.TabGroupProxy; /** @@ -161,6 +163,10 @@ public void addTabItemInController(TiViewProxy tabProxy) updateTabBackgroundDrawable(tabIndex); // Set the icon. updateTabIcon(tabIndex); + // Set the badge. + updateBadge(tabIndex); + // Set the badge.color + updateBadgeColor(tabIndex); } /** @@ -261,6 +267,47 @@ public void updateTabTitleColor(int index) } } + @Override + public void updateBadge(int index) + { + // Validate index input. + if (index < 0 || index >= tabs.size()) { + return; + } + TiViewProxy tabProxy = tabs.get(index).getProxy(); + if (tabProxy == null) { + return; + } + + BadgeDrawable badgeDrawable = this.mTabLayout.getTabAt(index).getOrCreateBadge(); + if (tabProxy.getProperty(TiC.PROPERTY_BADGE) != null) { + badgeDrawable.setVisible(true); + badgeDrawable.setNumber(TiConvert.toInt(tabProxy.getProperty(TiC.PROPERTY_BADGE), 0)); + } else { + this.mTabLayout.getTabAt(index).removeBadge(); + } + } + + @Override + public void updateBadgeColor(int index) + { + // Validate index input. + if (index < 0 || index >= tabs.size()) { + return; + } + TiViewProxy tabProxy = tabs.get(index).getProxy(); + if (tabProxy == null) { + return; + } + + BadgeDrawable badgeDrawable = this.mTabLayout.getTabAt(index).getOrCreateBadge(); + if (tabProxy.getProperty(TiC.PROPERTY_BADGE_COLOR) != null) { + badgeDrawable.setVisible(true); + badgeDrawable.setBackgroundColor( + TiConvert.toColor((String) tabProxy.getProperty(TiC.PROPERTY_BADGE_COLOR))); + } + } + @Override public void updateTabIcon(int index) { diff --git a/android/titanium/src/java/org/appcelerator/titanium/TiC.java b/android/titanium/src/java/org/appcelerator/titanium/TiC.java index afba01efad2..951d163f977 100644 --- a/android/titanium/src/java/org/appcelerator/titanium/TiC.java +++ b/android/titanium/src/java/org/appcelerator/titanium/TiC.java @@ -1067,6 +1067,16 @@ public class TiC */ public static final String PROPERTY_BACKGROUND_SELECTED_IMAGE = "backgroundSelectedImage"; + /** + * @module.api + */ + public static final String PROPERTY_BADGE = "badge"; + + /** + * @module.api + */ + public static final String PROPERTY_BADGE_COLOR = "badgeColor"; + /** * @module.api */