Titanium JIRA Archive
Titanium SDK/CLI (TIMOB)

[TIMOB-27302] Android: Bottom style TabGroup with more than 5 tabs crashes when swiping left on 5th tab

GitHub Issuen/a
TypeBug
PriorityLow
StatusClosed
ResolutionFixed
Resolution Date2019-09-10T04:35:50.000+0000
Affected Version/sRelease 8.0.0
Fix Version/sRelease 8.3.0
ComponentsAndroid
LabelsTabGroup, android, engSchedule
ReporterJoshua Quick
AssigneeYordan Banev
Created2019-08-02T00:36:56.000+0000
Updated2019-09-10T04:35:50.000+0000

Description

*Summary:* On Android, if you set up a TabGroup with style TABS_STYLE_BOTTOM_NAVIGATION and more than 5 tabs, then swiping left on the 5th tab will cause a crash with an IndexOutOfBoundsException. *Note 1:* Android's bottom style tabs only natively supports up to 5 tabs, making this a minor issue. If you want to use more than 5 tabs, then you have to use the top tab style instead. *Note 2:* Titanium correctly renders up to 5 tabs without issue if given more than 5 tabs. We will log the following error message when attempting to do so. We just need a boundary check when switching tabs via gestures.
[ERROR] :  TiUITabLayoutTabGroup: (main) [190,190] Trying to add more than five tabs in a TabGroup with TABS_STYLE_BOTTOM_NAVIGATION style.
*Steps to reproduce:*

Build and run the below code on Android.

Tap on the 5th tab.

Put your finger on the center of the screen and drag left.

Notice that the app crashes/hangs.

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"),
		createTab("Tab 4"),
		createTab("Tab 5"),
		createTab("Tab 6")
	],
};
if (Ti.Platform.name === "android") {
	tabGroupSettings.shiftMode = false;
	tabGroupSettings.style = Ti.UI.Android.TABS_STYLE_BOTTOM_NAVIGATION;
}
var tabGroup = Ti.UI.createTabGroup(tabGroupSettings);
tabGroup.open();
*Result:* The app throws the following exception when dragging left on the 5th tab.
[ERROR] :  E/MessageQueue-JNI: java.lang.IndexOutOfBoundsException: Index: 5, Size: 5
[ERROR] :  E/MessageQueue-JNI: 	at java.util.ArrayList.get(ArrayList.java:437)
[ERROR] :  E/MessageQueue-JNI: 	at android.support.v7.view.menu.MenuBuilder.getItem(MenuBuilder.java:741)
[ERROR] :  E/MessageQueue-JNI: 	at ti.modules.titanium.ui.widget.tabgroup.TiUIBottomNavigationTabGroup.selectTabItemInController(TiUIBottomNavigationTabGroup.java:234)
[ERROR] :  E/MessageQueue-JNI: 	at ti.modules.titanium.ui.widget.tabgroup.TiUIAbstractTabGroup$2.onPageSelected(TiUIAbstractTabGroup.java:364)
[ERROR] :  E/MessageQueue-JNI: 	at android.support.v4.view.ViewPager.dispatchOnPageSelected(ViewPager.java:1941)
[ERROR] :  E/MessageQueue-JNI: 	at android.support.v4.view.ViewPager.scrollToItem(ViewPager.java:680)
[ERROR] :  E/MessageQueue-JNI: 	at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:664)
[ERROR] :  E/MessageQueue-JNI: 	at android.support.v4.view.ViewPager.onTouchEvent(ViewPager.java:2257)
[ERROR] :  E/MessageQueue-JNI: 	at ti.modules.titanium.ui.widget.tabgroup.TiUIAbstractTabGroup$1.onTouchEvent(TiUIAbstractTabGroup.java:176)
[ERROR] :  E/MessageQueue-JNI: 	at android.view.View.dispatchTouchEvent(View.java:12513)
[ERROR] :  E/MessageQueue-JNI: 	at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3024)
[ERROR] :  E/MessageQueue-JNI: 	at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2705)
[ERROR] :  E/MessageQueue-JNI: 	at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3030)
[ERROR] :  E/MessageQueue-JNI: 	at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2719)
[ERROR] :  E/MessageQueue-JNI: 	at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3030)
[ERROR] :  E/MessageQueue-JNI: 	at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2719)
[ERROR] :  E/MessageQueue-JNI: 	at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3030)
[ERROR] :  E/MessageQueue-JNI: 	at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2719)
[ERROR] :  E/MessageQueue-JNI: 	at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3030)
[ERROR] :  E/MessageQueue-JNI: 	at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2719)
[ERROR] :  E/MessageQueue-JNI: 	at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3030)
[ERROR] :  E/MessageQueue-JNI: 	at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2719)
[ERROR] :  E/MessageQueue-JNI: 	at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3030)
[ERROR] :  E/MessageQueue-JNI: 	at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2719)
[ERROR] :  E/MessageQueue-JNI: 	at com.android.internal.policy.DecorView.superDispatchTouchEvent(DecorView.java:440)
[ERROR] :  E/MessageQueue-JNI: 	at com.android.internal.policy.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1830)
[ERROR] :  E/MessageQueue-JNI: 	at android.app.Activity.dispatchTouchEvent(Activity.java:3400)
[ERROR] :  E/MessageQueue-JNI: 	at android.support.v7.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:68)
[ERROR] :  E/MessageQueue-JNI: 	at com.android.internal.policy.DecorView.dispatchTouchEvent(DecorView.java:398)
[ERROR] :  E/MessageQueue-JNI: 	at android.view.View.dispatchPointerEvent(View.java:12752)
[ERROR] :  E/MessageQueue-JNI: 	at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:5106)
[ERROR] :  E/MessageQueue-JNI: 	at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:4909)
[ERROR] :  E/MessageQueue-JNI: 	at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4426)
[ERROR] :  E/MessageQueue-JNI: 	at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4479)
[ERROR] :  E/MessageQueue-JNI: 	at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4445)
[ERROR] :  E/MessageQueue-JNI: 	at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:4585)
[ERROR] :  E/MessageQueue-JNI: 	at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4453)
[ERROR] :  E/MessageQueue-JNI: 	at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:4642)
[ERROR] :  E/MessageQueue-JNI: 	at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4426)
[ERROR] :  E/MessageQueue-JNI: 	at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4479)
[ERROR] :  E/MessageQueue-JNI: 	at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4445)
[ERROR] :  E/MessageQueue-JNI: 	at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4453)
[ERROR] :  E/MessageQueue-JNI: 	at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4426)
[ERROR] :  E/MessageQueue-JNI: 	at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:7092)
[ERROR] :  E/MessageQueue-JNI: 	at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:7061)
[ERROR] :  E/MessageQueue-JNI: 	at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:7022)
[ERROR] :  E/MessageQueue-JNI: 	at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:7195)
[ERROR] :  E/MessageQueue-JNI: 	at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:186)
[ERROR] :  E/MessageQueue-JNI: 	at android.os.MessageQueue.nativePollOnce(Native Method)
[ERROR] :  E/MessageQueue-JNI: 	at android.os.MessageQueue.next(MessageQueue.java:326)
[ERROR] :  E/MessageQueue-JNI: 	at android.os.Looper.loop(Looper.java:160)
[ERROR] :  E/MessageQueue-JNI: 	at android.app.ActivityThread.main(ActivityThread.java:6680)
[ERROR] :  E/MessageQueue-JNI: 	at java.lang.reflect.Method.in
[ERROR] :  TiExceptionHandler: (main) [22369,22559] Index: 5, Size: 5
[ERROR] :  TiExceptionHandler:
[ERROR] :  TiExceptionHandler:     java.util.ArrayList.get(ArrayList.java:437)
[ERROR] :  TiExceptionHandler:     android.support.v7.view.menu.MenuBuilder.getItem(MenuBuilder.java:741)
[ERROR] :  TiExceptionHandler:     ti.modules.titanium.ui.widget.tabgroup.TiUIBottomNavigationTabGroup.selectTabItemInController(TiUIBottomNavigationTabGroup.java:234)
[ERROR] :  TiExceptionHandler:     ti.modules.titanium.ui.widget.tabgroup.TiUIAbstractTabGroup$2.onPageSelected(TiUIAbstractTabGroup.java:364)
[ERROR] :  TiExceptionHandler:     android.support.v4.view.ViewPager.dispatchOnPageSelected(ViewPager.java:1941)
[ERROR] :  TiExceptionHandler:     android.support.v4.view.ViewPager.scrollToItem(ViewPager.java:680)
[ERROR] :  TiExceptionHandler:     android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:664)
[ERROR] :  TiExceptionHandler:     android.support.v4.view.ViewPager.onTouchEvent(ViewPager.java:2257)
[ERROR] :  TiExceptionHandler:     ti.modules.titanium.ui.widget.tabgroup.TiUIAbstractTabGroup$1.onTouchEvent(TiUIAbstractTabGroup.java:176)
[ERROR] :  TiExceptionHandler:     android.view.View.dispatchTouchEvent(View.java:12513)
[ERROR] :  TiExceptionHandler:     android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3024)
[ERROR] :  TiExceptionHandler:     android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2705)
[ERROR] :  TiExceptionHandler:     android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3030)
[ERROR] :  TiExceptionHandler:     android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2719)
[ERROR] :  TiExceptionHandler:     android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3030)
[ERROR] :  TiExceptionHandler:     android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2719)
[ERROR] :  TiExceptionHandler:     android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3030)
[ERROR] :  TiExceptionHandler:     android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2719)
[ERROR] :  TiExceptionHandler:     android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3030)
[ERROR] :  TiExceptionHandler:     android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2719)
[ERROR] :  TiExceptionHandler:     android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3030)
[ERROR] :  TiExceptionHandler:     android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2719)
[ERROR] :  TiExceptionHandler:     android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3030)
[ERROR] :  TiExceptionHandler:     android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2719)
[ERROR] :  TiExceptionHandler:     com.android.internal.policy.DecorView.superDispatchTouchEvent(DecorView.java:440)
[ERROR] :  TiExceptionHandler:     com.android.internal.policy.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1830)
[ERROR] :  TiExceptionHandler:     android.app.Activity.dispatchTouchEvent(Activity.java:3400)
[ERROR] :  TiExceptionHandler:     android.support.v7.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:68)
[ERROR] :  TiExceptionHandler:     com.android.internal.policy.DecorView.dispatchTouchEvent(DecorView.java:398)
[ERROR] :  TiExceptionHandler:     android.view.View.dispatchPointerEvent(View.java:12752)
[ERROR] :  TiExceptionHandler:     android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:5106)
[ERROR] :  TiExceptionHandler:     android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:4909)
[ERROR] :  TiExceptionHandler:     android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4426)
[ERROR] :  TiExceptionHandler:     android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4479)
[ERROR] :  TiExceptionHandler:     android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4445)
[ERROR] :  TiExceptionHandler:     android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:4585)
[ERROR] :  TiExceptionHandler:     android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4453)
[ERROR] :  TiExceptionHandler:     android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:4642)
[ERROR] :  TiExceptionHandler:     android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4426)
[ERROR] :  TiExceptionHandler:     android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4479)
[ERROR] :  TiExceptionHandler:     android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4445)
[ERROR] :  TiExceptionHandler:     android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4453)
[ERROR] :  TiExceptionHandler:     android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4426)
[ERROR] :  TiExceptionHandler:     android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:7092)
[ERROR] :  TiExceptionHandler:     android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:7061)
[ERROR] :  TiExceptionHandler:     android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:7022)
[ERROR] :  TiExceptionHandler:     android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:7195)
[ERROR] :  TiExceptionHandler:     android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:186)
[ERROR] :  TiExceptionHandler:     android.os.MessageQueue.nativePollOnce(Native Method)
[ERROR] :  TiExceptionHandler:     android.os.MessageQueue.next(MessageQueue.java:326)
[ERROR] :  TiExceptionHandler:     android.os.Looper.loop(Looper.java:160)
[ERROR] :  TiExceptionHandler:     android.app.ActivityThread.main(ActivityThread.java:6680)

Comments

  1. Yordan Banev 2019-08-15

    PR: https://github.com/appcelerator/titanium_mobile/pull/11149
  2. Yordan Banev 2019-08-21

    PR (8_3_X): https://github.com/appcelerator/titanium_mobile/pull/11161
  3. Keerthi Mahalingam 2019-08-21

    FR passed. Waiting on Jenkins
  4. Christopher Williams 2019-09-09

    merged to master, closed 8_3_X backport as master is now 8.3.0 target.
  5. Keerthi Mahalingam 2019-09-10

    Verified the fix on sdk 8.3.0.v20190909144256. tab group works as expected. Test Environment: Operating System Name = Mac OS X Version = 10.14.5 Architecture = 64bit Node.js Node.js Version = 10.16.2 npm Version = 6.9.0 Titanium CLI CLI Version = 5.2.1 Titanium SDK SDK Version = 8.3.0.v20190909144256 Device -samsung s5 android 6 EMulator- pixel android 9

JSON Source