Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Android: improve BottomNavigation (experimental feature) #14126

Open
wants to merge 34 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
34 commits
Select commit Hold shift + click to select a range
cee32ae
xml test
m1ga Sep 27, 2024
4d7916b
badge
m1ga Sep 29, 2024
a89b6cd
use old tabgroup layout
m1ga Oct 2, 2024
4978b22
theme
m1ga Oct 2, 2024
9f3b4c2
more features
m1ga Oct 2, 2024
aa21b57
Merge branch 'master' into bottomNavigationXML
m1ga Oct 5, 2024
c1294ec
more colors
m1ga Oct 5, 2024
0851417
touchfeedback
m1ga Oct 9, 2024
dd1615d
res icons
m1ga Oct 15, 2024
62a6168
add addTab()
m1ga Oct 17, 2024
ff6d9d5
Merge branch 'master' into bottomNavigationXML
m1ga Oct 17, 2024
a657695
Merge branch 'master' into bottomNavigationXML
m1ga Oct 17, 2024
20cda85
remove redundant code, floating bar
m1ga Oct 17, 2024
48c31b0
icon font support
m1ga Oct 19, 2024
a057fb5
tintColor support for icons
m1ga Oct 19, 2024
6536b01
Merge branch 'master' into bottomNavigationXML
m1ga Oct 19, 2024
6e0ddfc
optimize selected state
m1ga Oct 20, 2024
85fc7a6
color updates
m1ga Oct 20, 2024
706cf01
add flags
m1ga Oct 20, 2024
cb1da13
status bar
m1ga Oct 21, 2024
23b1f88
Merge branch 'master' into bottomNavigationXML
m1ga Dec 14, 2024
a1930c2
chore: apidoc
m1ga Dec 14, 2024
42ff775
update property
m1ga Dec 15, 2024
fa95329
Merge branch 'master' into bottomNavigationXML
m1ga Dec 21, 2024
92c117a
Merge branch 'master' into bottomNavigationXML
m1ga Jan 2, 2025
3a52011
events
m1ga Jan 2, 2025
dbceb8e
test, bugfix for empty title
m1ga Jan 2, 2025
dec1971
add enabled property
m1ga Jan 15, 2025
a6f57f9
docs
m1ga Jan 15, 2025
ac5a629
Merge branch 'master' into bottomNavigationXML
m1ga Jan 15, 2025
60c5047
fix WindowProxy
m1ga Jan 15, 2025
4df0d81
fix WindowProxy
m1ga Jan 15, 2025
ba637af
fix linting
m1ga Jan 15, 2025
ad2748e
add back windowFlags for light status bar
m1ga Jan 15, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -363,6 +363,9 @@ public class AndroidModule extends KrollModule
@Kroll.constant
public static final int FLAG_UPDATE_CURRENT = PendingIntent.FLAG_UPDATE_CURRENT;

@Kroll.constant
public static final int STATUS_BAR_LIGHT = 8192;

@Kroll.constant
public static final int RESULT_OK = Activity.RESULT_OK;
@Kroll.constant
Expand Down
18 changes: 18 additions & 0 deletions android/modules/ui/res/layout/titanium_ui_bottom_navigation.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">

<FrameLayout
android:id="@+id/bottomNavBar_content"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_above="@+id/bottomNavBar" />

<com.google.android.material.bottomnavigation.BottomNavigationView
android:id="@+id/bottomNavBar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true" />

</RelativeLayout>
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,14 @@
*/
package ti.modules.titanium.ui;

import static ti.modules.titanium.android.AndroidModule.STATUS_BAR_LIGHT;

import android.app.Activity;
import android.content.Intent;
import android.os.Build;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;

import androidx.annotation.NonNull;
import androidx.appcompat.app.ActionBar;
Expand All @@ -29,6 +33,7 @@
import org.appcelerator.titanium.TiRootActivity;
import org.appcelerator.titanium.proxy.ActivityProxy;
import org.appcelerator.titanium.proxy.TiWindowProxy;
import org.appcelerator.titanium.util.TiColorHelper;
import org.appcelerator.titanium.util.TiConvert;
import org.appcelerator.titanium.util.TiRHelper;
import org.appcelerator.titanium.util.TiUIHelper;
Expand All @@ -39,6 +44,7 @@

import ti.modules.titanium.ui.android.AndroidModule;
import ti.modules.titanium.ui.widget.tabgroup.TiUIAbstractTabGroup;
import ti.modules.titanium.ui.widget.tabgroup.TiUIBottomNavigation;
import ti.modules.titanium.ui.widget.tabgroup.TiUIBottomNavigationTabGroup;
import ti.modules.titanium.ui.widget.tabgroup.TiUITabLayoutTabGroup;

Expand All @@ -49,7 +55,8 @@
TiC.PROPERTY_SWIPEABLE,
TiC.PROPERTY_AUTO_TAB_TITLE,
TiC.PROPERTY_EXIT_ON_CLOSE,
TiC.PROPERTY_SMOOTH_SCROLL_ON_TAB_CLICK
TiC.PROPERTY_SMOOTH_SCROLL_ON_TAB_CLICK,
TiC.PROPERTY_INDICATOR_COLOR
})
public class TabGroupProxy extends TiWindowProxy implements TiActivityWindow
{
Expand All @@ -69,6 +76,7 @@ public class TabGroupProxy extends TiWindowProxy implements TiActivityWindow
private Object selectedTab; // NOTE: Can be TabProxy or Number
private String tabGroupTitle = null;
private boolean autoTabTitle = false;
private boolean tabEnabled = true;

public TabGroupProxy()
{
Expand Down Expand Up @@ -189,6 +197,22 @@ public void setActiveTab(Object tabOrIndex)
}
}

@Kroll.setProperty
public void setEnabled(Boolean enabled)
{
tabEnabled = enabled;
TiUIAbstractTabGroup tabGroup = (TiUIAbstractTabGroup) view;
if (tabGroup != null) {
tabGroup.setEnabled(enabled);
}
}

@Kroll.getProperty
public Boolean getEnabled()
{
return tabEnabled;
}

private TabProxy getActiveTabProxy()
{
Object activeTab = getActiveTab();
Expand Down Expand Up @@ -279,6 +303,9 @@ public void handleCreationDict(KrollDict options)
if (options.containsKeyAndNotNull(TiC.PROPERTY_ACTIVE_TAB)) {
setActiveTab(options.get(TiC.PROPERTY_ACTIVE_TAB));
}
if (options.containsKeyAndNotNull(TiC.PROPERTY_ENABLED)) {
setEnabled(options.getBoolean(TiC.PROPERTY_ENABLED));
}
}

@Kroll.getProperty
Expand Down Expand Up @@ -323,6 +350,21 @@ protected void handleOpen(KrollDict options)
if (topActivity == null || topActivity.isFinishing()) {
return;
}

// set theme for XML layout
if (hasProperty(TiC.PROPERTY_STYLE)
&& ((Integer) getProperty(TiC.PROPERTY_STYLE)) == AndroidModule.TABS_STYLE_BOTTOM_NAVIGATION
&& getProperty(TiC.PROPERTY_THEME) != null) {
try {
String themeName = getProperty(TiC.PROPERTY_THEME).toString();
int theme = TiRHelper.getResource("style."
+ themeName.replaceAll("[^A-Za-z0-9_]", "_"));
topActivity.setTheme(theme);
topActivity.getApplicationContext().setTheme(theme);
} catch (Exception e) {
}
}

Intent intent = new Intent(topActivity, TiActivity.class);
fillIntent(topActivity, intent);

Expand Down Expand Up @@ -367,7 +409,11 @@ public void windowCreated(TiBaseActivity activity, Bundle savedInstanceState)
((TiUITabLayoutTabGroup) view).setTabMode((Integer) getProperty(TiC.PROPERTY_TAB_MODE));
}
} else {
view = new TiUIBottomNavigationTabGroup(this, activity);
if (TiConvert.toBoolean(getProperty("experimental"), false)) {
view = new TiUIBottomNavigation(this, activity);
} else {
view = new TiUIBottomNavigationTabGroup(this, activity);
}
}
// If we have set a title before the creation of the native view, set it now.
if (this.tabGroupTitle != null) {
Expand Down Expand Up @@ -405,6 +451,22 @@ public void windowCreated(TiBaseActivity activity, Bundle savedInstanceState)

// Need to handle the cached activity proxy properties in the JS side.
callPropertySync(PROPERTY_POST_TAB_GROUP_CREATED, null);

if (getActivity() != null) {
if (hasPropertyAndNotNull(TiC.PROPERTY_FLAGS)) {
if (TiConvert.toInt(getProperty(TiC.PROPERTY_FLAGS)) == STATUS_BAR_LIGHT
&& Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
getActivity().getWindow().getDecorView()
.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
}
}
if (hasPropertyAndNotNull(TiC.PROPERTY_STATUS_BAR_COLOR)) {
int colorInt = TiColorHelper.parseColor(
TiConvert.toString(getProperty(TiC.PROPERTY_STATUS_BAR_COLOR)),
TiApplication.getAppRootOrCurrentActivity());
getActivity().getWindow().setStatusBarColor(colorInt);
}
}
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,16 @@

package ti.modules.titanium.ui;

import static ti.modules.titanium.android.AndroidModule.STATUS_BAR_LIGHT;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Intent;
import android.graphics.Color;
import android.graphics.PixelFormat;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.os.Bundle;
import android.os.Message;
import android.text.Spannable;
Expand Down Expand Up @@ -333,6 +336,13 @@ public void windowCreated(TiBaseActivity activity, Bundle savedInstanceState)
win.getDecorView().setSystemUiVisibility(TiConvert.toInt(getProperty(TiC.PROPERTY_UI_FLAGS)));
}

if (hasProperty(TiC.PROPERTY_WINDOW_FLAGS)) {
if ((TiConvert.toInt(getProperty(TiC.PROPERTY_WINDOW_FLAGS)) & STATUS_BAR_LIGHT) != 0
&& Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
win.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
}
}

// Handle titleAttributes property.
if (hasProperty(TiC.PROPERTY_TITLE_ATTRIBUTES)) {
KrollDict innerAttributes = getProperties().getKrollDict(TiC.PROPERTY_TITLE_ATTRIBUTES);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@
import org.appcelerator.titanium.proxy.TiWindowProxy;
import org.appcelerator.titanium.util.TiColorHelper;
import org.appcelerator.titanium.util.TiConvert;
import org.appcelerator.titanium.util.TiIconDrawable;
import org.appcelerator.titanium.util.TiUIHelper;
import org.appcelerator.titanium.view.TiInsetsProvider;
import org.appcelerator.titanium.view.TiUIView;
Expand Down Expand Up @@ -115,6 +116,13 @@ public abstract class TiUIAbstractTabGroup extends TiUIView
*/
public abstract void updateTabBackgroundDrawable(int index);

/**
* Material 3 active indicator color
hansemannn marked this conversation as resolved.
Show resolved Hide resolved
*
* @param color color
*/
public abstract void updateActiveIndicatorColor(int color);

/**
* Update the tab's title to the proper text.
*
Expand Down Expand Up @@ -144,6 +152,13 @@ public abstract class TiUIAbstractTabGroup extends TiUIView
*/
public abstract String getTabTitle(int index);

/**
* Enables/disables tab menu
*
* @param enabled value
*/
public abstract void setEnabled(Boolean enabled);

// region protected fields
protected final static String TAG = "TiUIAbstractTabGroup";
protected static final String WARNING_LAYOUT_MESSAGE =
Expand Down Expand Up @@ -454,7 +469,7 @@ public void onPageScrollStateChanged(int i)
// Set action bar color.
if (proxy != null) {
final ActionBar actionBar = ((AppCompatActivity) proxy.getActivity()).getSupportActionBar();
if (actionBar != null) {
if (actionBar != null && !this.tabs.isEmpty()) {
final TiWindowProxy windowProxy = ((TabProxy) this.tabs.get(tabIndex).getProxy()).getWindow();
final KrollDict windowProperties = windowProxy.getProperties();
final KrollDict properties = getProxy().getProperties();
Expand Down Expand Up @@ -495,6 +510,9 @@ public void processProperties(KrollDict d)
} else {
setBackgroundColor(getDefaultBackgroundColor());
}
if (d.containsKeyAndNotNull(TiC.PROPERTY_INDICATOR_COLOR)) {
updateActiveIndicatorColor(TiConvert.toColor(d, TiC.PROPERTY_INDICATOR_COLOR, proxy.getActivity()));
}
super.processProperties(d);
}

Expand All @@ -516,6 +534,8 @@ public void propertyChanged(String key, Object oldValue, Object newValue, KrollP
for (TiUITab tabView : tabs) {
updateTabBackgroundDrawable(tabs.indexOf(tabView));
}
} else if (key.equals(TiC.PROPERTY_INDICATOR_COLOR)) {
updateActiveIndicatorColor(TiColorHelper.parseColor(newValue.toString(), proxy.getActivity()));
} else {
super.propertyChanged(key, oldValue, newValue, proxy);
}
Expand Down Expand Up @@ -552,7 +572,12 @@ public Drawable updateIconTint(TiViewProxy tabProxy, Drawable drawable, boolean
}

// Clone existing drawable so color filter applies correctly.
drawable = drawable.getConstantState().newDrawable();
if (drawable.getConstantState() == null && drawable.getClass() == TiIconDrawable.class) {
// TiIconDrawable
drawable = drawable.mutate();
} else {
drawable = drawable.getConstantState().newDrawable();
}

final KrollDict tabProperties = tabProxy.getProperties();
final KrollDict properties = getProxy().getProperties();
Expand Down
Loading
Loading