[TIMOB-28189] Android: Opening TabGroup crashes when using AppCompat theme as of 9.3.0
| GitHub Issue | n/a |
|---|---|
| Type | Bug |
| Priority | Critical |
| Status | Closed |
| Resolution | Fixed |
| Resolution Date | 2020-11-24T18:41:04.000+0000 |
| Affected Version/s | Release 9.3.0 |
| Fix Version/s | Release 9.3.0 |
| Components | Android |
| Labels | TabGroup, android, open, regression, theme |
| Reporter | Joshua Quick |
| Assignee | Joshua Quick |
| Created | 2020-10-13T00:05:51.000+0000 |
| Updated | 2020-11-24T18:41:04.000+0000 |
Description
*Summary:*
When the app is using a Copy the below
Theme.AppCompat derived theme, opening a TabGroup will throw an exception as of Titanium 9.3.0 stating the app needs to use Theme.MaterialComponents. It should only throw this exception when using the "badge" or "badgeColor" property.
This regression was caught before release.
*Steps to reproduce:*
Create a Classic Titanium app project.
Copy the below <application/> theme to project's "tiapp.xml" file.
Copy the below "app.js" to the project.
Build and run on Android.
tiapp.xml
<ti:app>
<android xmlns:android="http://schemas.android.com/apk/res/android">
<manifest>
<application android:theme="@style/Theme.AppCompat"/>
</manifest>
</android>
</ti:app>
app.js
function createTab(title) {
var window = Ti.UI.createWindow({ title: title });
window.add(Ti.UI.createLabel({ text: title + " View" }));
var tab = Ti.UI.createTab({
title: title,
window: window,
});
return tab;
}
var tabGroupSettings = {
tabs: [createTab("Tab 1"), createTab("Tab 2"), createTab("Tab 3")],
};
if (OS_ANDROID) {
tabGroupSettings.shiftMode = false;
tabGroupSettings.style = Ti.UI.Android.TABS_STYLE_BOTTOM_NAVIGATION;
}
var tabGroup = Ti.UI.createTabGroup(tabGroupSettings);
tabGroup.open();
*Result:*
App crashes with the following exception...
[ERROR] TiExceptionHandler: (main) [206,322] Unable to start activity ComponentInfo{com.appcelerator.testing/org.appcelerator.titanium.TiActivity}: java.lang.IllegalArgumentException: The style on this component requires your app theme to be Theme.MaterialComponents (or a descendant).
[ERROR] TiExceptionHandler:
[ERROR] TiExceptionHandler: com.google.android.material.internal.ThemeEnforcement.checkTheme(ThemeEnforcement.java:248)
[ERROR] TiExceptionHandler: com.google.android.material.internal.ThemeEnforcement.checkMaterialTheme(ThemeEnforcement.java:222)
[ERROR] TiExceptionHandler: com.google.android.material.badge.BadgeDrawable.<init>(BadgeDrawable.java:361)
[ERROR] TiExceptionHandler: com.google.android.material.badge.BadgeDrawable.createFromAttributes(BadgeDrawable.java:294)
[ERROR] TiExceptionHandler: com.google.android.material.badge.BadgeDrawable.create(BadgeDrawable.java:262)
[ERROR] TiExceptionHandler: com.google.android.material.bottomnavigation.BottomNavigationMenuView.getOrCreateBadge(BottomNavigationMenuView.java:647)
[ERROR] TiExceptionHandler: com.google.android.material.bottomnavigation.BottomNavigationView.getOrCreateBadge(BottomNavigationView.java:674)
[ERROR] TiExceptionHandler: ti.modules.titanium.ui.widget.tabgroup.TiUIBottomNavigationTabGroup.updateBadge(TiUIBottomNavigationTabGroup.java:296)
[ERROR] TiExceptionHandler: ti.modules.titanium.ui.widget.tabgroup.TiUIBottomNavigationTabGroup.updateDrawablesAfterNewItem(TiUIBottomNavigationTabGroup.java:195)
[ERROR] TiExceptionHandler: ti.modules.titanium.ui.widget.tabgroup.TiUIBottomNavigationTabGroup.addTabItemInController(TiUIBottomNavigationTabGroup.java:171)
[ERROR] TiExceptionHandler: ti.modules.titanium.ui.widget.tabgroup.TiUIAbstractTabGroup.addTab(TiUIAbstractTabGroup.java:263)
[ERROR] TiExceptionHandler: ti.modules.titanium.ui.widget.tabgroup.TiUIBottomNavigationTabGroup.addTab(TiUIBottomNavigationTabGroup.java:65)
[ERROR] TiExceptionHandler: ti.modules.titanium.ui.TabGroupProxy.handlePostOpen(TabGroupProxy.java:480)
[ERROR] TiExceptionHandler: ti.modules.titanium.ui.TabGroupProxy.onWindowActivityCreated(TabGroupProxy.java:462)
[ERROR] TiExceptionHandler: org.appcelerator.titanium.TiBaseActivity.onCreate(TiBaseActivity.java:756)
[ERROR] TiExceptionHandler: org.appcelerator.titanium.TiActivity.onCreate(TiActivity.java:47)
[ERROR] TiExceptionHandler: android.app.Activity.performCreate(Activity.java:8000)
[ERROR] TiExceptionHandler: android.app.Activity.performCreate(Activity.java:7984)
[ERROR] TiExceptionHandler: android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1309)
[ERROR] TiExceptionHandler: android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3422)
[ERROR] TiExceptionHandler: android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3601)
[ERROR] TiExceptionHandler: android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85)
[ERROR] TiExceptionHandler: android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
[ERROR] TiExceptionHandler: android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
[ERROR] TiExceptionHandler: android.app.ActivityThread$H.handleMessage(ActivityThread.java:2066)
[ERROR] TiExceptionHandler: android.os.Handler.dispatchMessage(Handler.java:106)
[ERROR] TiExceptionHandler: android.os.Looper.loop(Looper.java:223)
[ERROR] TiExceptionHandler: android.app.ActivityThread.main(ActivityThread.java:7656)
[ERROR] TiExceptionHandler: java.lang.reflect.Method.invoke(Native Method)
[ERROR] TiExceptionHandler: com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
[ERROR] TiExceptionHandler: com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
*Expected Result:*
Should not crash if the [Tab.badge](https://docs.appcelerator.com/platform/latest/#!/api/Titanium.UI.Tab-property-badge) property is not set. However, if the code does set this property, then this error does make sense because it can't natively work without using a Theme.MaterialComponents derived theme. So, it should only throw or log the exception when this property is assigned.
PR (master): https://github.com/appcelerator/titanium_mobile/pull/12175
FR Passed, waiting on Jenkins build.
merged to master for 9.3.0 target
Closing.