{ "id": "173971", "key": "TIMOB-27302", "fields": { "issuetype": { "id": "1", "description": "A problem which impairs or prevents the functions of the product.", "name": "Bug", "subtask": false }, "project": { "id": "10153", "key": "TIMOB", "name": "Titanium SDK/CLI", "projectCategory": { "id": "10100", "description": "Titanium and related SDKs used in application development", "name": "Client" } }, "fixVersions": [ { "id": "20832", "name": "Release 8.3.0", "archived": false, "released": true, "releaseDate": "2019-11-25" } ], "resolution": { "id": "1", "description": "A fix for this issue is checked into the tree and tested.", "name": "Fixed" }, "resolutiondate": "2019-09-10T04:35:50.000+0000", "created": "2019-08-02T00:36:56.000+0000", "priority": { "name": "Low", "id": "4" }, "labels": [ "TabGroup", "android", "engSchedule" ], "versions": [ { "id": "19882", "name": "Release 8.0.0", "archived": false, "released": true, "releaseDate": "2019-03-14" } ], "issuelinks": [], "assignee": { "name": "ybanev", "key": "ybanev", "displayName": "Yordan Banev", "active": true, "timeZone": "Europe/Athens" }, "updated": "2019-09-10T04:35:50.000+0000", "status": { "description": "The issue is considered finished, the resolution is correct. Issues which are closed can be reopened.", "name": "Closed", "id": "6", "statusCategory": { "id": 3, "key": "done", "colorName": "green", "name": "Done" } }, "components": [ { "id": "10202", "name": "Android", "description": "Android Platform" } ], "description": "*Summary:*\r\nOn 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}}.\r\n\r\n*Note 1:*\r\nAndroid'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.\r\n\r\n*Note 2:*\r\nTitanium 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.\r\n{code}\r\n[ERROR] : TiUITabLayoutTabGroup: (main) [190,190] Trying to add more than five tabs in a TabGroup with TABS_STYLE_BOTTOM_NAVIGATION style.\r\n{code}\r\n\r\n*Steps to reproduce:*\r\n# Build and run the below code on Android.\r\n# Tap on the 5th tab.\r\n# Put your finger on the center of the screen and drag left.\r\n# Notice that the app crashes/hangs.\r\n\r\n{code:javascript}\r\nfunction createTab(title) {\r\n\tvar window = Ti.UI.createWindow({ title: title });\r\n\twindow.add(Ti.UI.createLabel({ text: title + \" View\" }));\r\n\tvar tab = Ti.UI.createTab({\r\n\t\ttitle: title,\r\n\t\twindow: window,\r\n\t});\r\n\treturn tab;\r\n}\r\n\r\nvar tabGroupSettings = {\r\n\ttabs: [\r\n\t\tcreateTab(\"Tab 1\"),\r\n\t\tcreateTab(\"Tab 2\"),\r\n\t\tcreateTab(\"Tab 3\"),\r\n\t\tcreateTab(\"Tab 4\"),\r\n\t\tcreateTab(\"Tab 5\"),\r\n\t\tcreateTab(\"Tab 6\")\r\n\t],\r\n};\r\nif (Ti.Platform.name === \"android\") {\r\n\ttabGroupSettings.shiftMode = false;\r\n\ttabGroupSettings.style = Ti.UI.Android.TABS_STYLE_BOTTOM_NAVIGATION;\r\n}\r\nvar tabGroup = Ti.UI.createTabGroup(tabGroupSettings);\r\ntabGroup.open();\r\n{code}\r\n\r\n*Result:*\r\nThe app throws the following exception when dragging left on the 5th tab.\r\n{code}\r\n[ERROR] : E/MessageQueue-JNI: java.lang.IndexOutOfBoundsException: Index: 5, Size: 5\r\n[ERROR] : E/MessageQueue-JNI: \tat java.util.ArrayList.get(ArrayList.java:437)\r\n[ERROR] : E/MessageQueue-JNI: \tat android.support.v7.view.menu.MenuBuilder.getItem(MenuBuilder.java:741)\r\n[ERROR] : E/MessageQueue-JNI: \tat ti.modules.titanium.ui.widget.tabgroup.TiUIBottomNavigationTabGroup.selectTabItemInController(TiUIBottomNavigationTabGroup.java:234)\r\n[ERROR] : E/MessageQueue-JNI: \tat ti.modules.titanium.ui.widget.tabgroup.TiUIAbstractTabGroup$2.onPageSelected(TiUIAbstractTabGroup.java:364)\r\n[ERROR] : E/MessageQueue-JNI: \tat android.support.v4.view.ViewPager.dispatchOnPageSelected(ViewPager.java:1941)\r\n[ERROR] : E/MessageQueue-JNI: \tat android.support.v4.view.ViewPager.scrollToItem(ViewPager.java:680)\r\n[ERROR] : E/MessageQueue-JNI: \tat android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:664)\r\n[ERROR] : E/MessageQueue-JNI: \tat android.support.v4.view.ViewPager.onTouchEvent(ViewPager.java:2257)\r\n[ERROR] : E/MessageQueue-JNI: \tat ti.modules.titanium.ui.widget.tabgroup.TiUIAbstractTabGroup$1.onTouchEvent(TiUIAbstractTabGroup.java:176)\r\n[ERROR] : E/MessageQueue-JNI: \tat android.view.View.dispatchTouchEvent(View.java:12513)\r\n[ERROR] : E/MessageQueue-JNI: \tat android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3024)\r\n[ERROR] : E/MessageQueue-JNI: \tat android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2705)\r\n[ERROR] : E/MessageQueue-JNI: \tat android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3030)\r\n[ERROR] : E/MessageQueue-JNI: \tat android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2719)\r\n[ERROR] : E/MessageQueue-JNI: \tat android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3030)\r\n[ERROR] : E/MessageQueue-JNI: \tat android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2719)\r\n[ERROR] : E/MessageQueue-JNI: \tat android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3030)\r\n[ERROR] : E/MessageQueue-JNI: \tat android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2719)\r\n[ERROR] : E/MessageQueue-JNI: \tat android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3030)\r\n[ERROR] : E/MessageQueue-JNI: \tat android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2719)\r\n[ERROR] : E/MessageQueue-JNI: \tat android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3030)\r\n[ERROR] : E/MessageQueue-JNI: \tat android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2719)\r\n[ERROR] : E/MessageQueue-JNI: \tat android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3030)\r\n[ERROR] : E/MessageQueue-JNI: \tat android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2719)\r\n[ERROR] : E/MessageQueue-JNI: \tat com.android.internal.policy.DecorView.superDispatchTouchEvent(DecorView.java:440)\r\n[ERROR] : E/MessageQueue-JNI: \tat com.android.internal.policy.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1830)\r\n[ERROR] : E/MessageQueue-JNI: \tat android.app.Activity.dispatchTouchEvent(Activity.java:3400)\r\n[ERROR] : E/MessageQueue-JNI: \tat android.support.v7.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:68)\r\n[ERROR] : E/MessageQueue-JNI: \tat com.android.internal.policy.DecorView.dispatchTouchEvent(DecorView.java:398)\r\n[ERROR] : E/MessageQueue-JNI: \tat android.view.View.dispatchPointerEvent(View.java:12752)\r\n[ERROR] : E/MessageQueue-JNI: \tat android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:5106)\r\n[ERROR] : E/MessageQueue-JNI: \tat android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:4909)\r\n[ERROR] : E/MessageQueue-JNI: \tat android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4426)\r\n[ERROR] : E/MessageQueue-JNI: \tat android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4479)\r\n[ERROR] : E/MessageQueue-JNI: \tat android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4445)\r\n[ERROR] : E/MessageQueue-JNI: \tat android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:4585)\r\n[ERROR] : E/MessageQueue-JNI: \tat android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4453)\r\n[ERROR] : E/MessageQueue-JNI: \tat android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:4642)\r\n[ERROR] : E/MessageQueue-JNI: \tat android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4426)\r\n[ERROR] : E/MessageQueue-JNI: \tat android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4479)\r\n[ERROR] : E/MessageQueue-JNI: \tat android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4445)\r\n[ERROR] : E/MessageQueue-JNI: \tat android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4453)\r\n[ERROR] : E/MessageQueue-JNI: \tat android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4426)\r\n[ERROR] : E/MessageQueue-JNI: \tat android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:7092)\r\n[ERROR] : E/MessageQueue-JNI: \tat android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:7061)\r\n[ERROR] : E/MessageQueue-JNI: \tat android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:7022)\r\n[ERROR] : E/MessageQueue-JNI: \tat android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:7195)\r\n[ERROR] : E/MessageQueue-JNI: \tat android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:186)\r\n[ERROR] : E/MessageQueue-JNI: \tat android.os.MessageQueue.nativePollOnce(Native Method)\r\n[ERROR] : E/MessageQueue-JNI: \tat android.os.MessageQueue.next(MessageQueue.java:326)\r\n[ERROR] : E/MessageQueue-JNI: \tat android.os.Looper.loop(Looper.java:160)\r\n[ERROR] : E/MessageQueue-JNI: \tat android.app.ActivityThread.main(ActivityThread.java:6680)\r\n[ERROR] : E/MessageQueue-JNI: \tat java.lang.reflect.Method.in\r\n[ERROR] : TiExceptionHandler: (main) [22369,22559] Index: 5, Size: 5\r\n[ERROR] : TiExceptionHandler:\r\n[ERROR] : TiExceptionHandler: java.util.ArrayList.get(ArrayList.java:437)\r\n[ERROR] : TiExceptionHandler: android.support.v7.view.menu.MenuBuilder.getItem(MenuBuilder.java:741)\r\n[ERROR] : TiExceptionHandler: ti.modules.titanium.ui.widget.tabgroup.TiUIBottomNavigationTabGroup.selectTabItemInController(TiUIBottomNavigationTabGroup.java:234)\r\n[ERROR] : TiExceptionHandler: ti.modules.titanium.ui.widget.tabgroup.TiUIAbstractTabGroup$2.onPageSelected(TiUIAbstractTabGroup.java:364)\r\n[ERROR] : TiExceptionHandler: android.support.v4.view.ViewPager.dispatchOnPageSelected(ViewPager.java:1941)\r\n[ERROR] : TiExceptionHandler: android.support.v4.view.ViewPager.scrollToItem(ViewPager.java:680)\r\n[ERROR] : TiExceptionHandler: android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:664)\r\n[ERROR] : TiExceptionHandler: android.support.v4.view.ViewPager.onTouchEvent(ViewPager.java:2257)\r\n[ERROR] : TiExceptionHandler: ti.modules.titanium.ui.widget.tabgroup.TiUIAbstractTabGroup$1.onTouchEvent(TiUIAbstractTabGroup.java:176)\r\n[ERROR] : TiExceptionHandler: android.view.View.dispatchTouchEvent(View.java:12513)\r\n[ERROR] : TiExceptionHandler: android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3024)\r\n[ERROR] : TiExceptionHandler: android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2705)\r\n[ERROR] : TiExceptionHandler: android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3030)\r\n[ERROR] : TiExceptionHandler: android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2719)\r\n[ERROR] : TiExceptionHandler: android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3030)\r\n[ERROR] : TiExceptionHandler: android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2719)\r\n[ERROR] : TiExceptionHandler: android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3030)\r\n[ERROR] : TiExceptionHandler: android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2719)\r\n[ERROR] : TiExceptionHandler: android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3030)\r\n[ERROR] : TiExceptionHandler: android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2719)\r\n[ERROR] : TiExceptionHandler: android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3030)\r\n[ERROR] : TiExceptionHandler: android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2719)\r\n[ERROR] : TiExceptionHandler: android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3030)\r\n[ERROR] : TiExceptionHandler: android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2719)\r\n[ERROR] : TiExceptionHandler: com.android.internal.policy.DecorView.superDispatchTouchEvent(DecorView.java:440)\r\n[ERROR] : TiExceptionHandler: com.android.internal.policy.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1830)\r\n[ERROR] : TiExceptionHandler: android.app.Activity.dispatchTouchEvent(Activity.java:3400)\r\n[ERROR] : TiExceptionHandler: android.support.v7.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:68)\r\n[ERROR] : TiExceptionHandler: com.android.internal.policy.DecorView.dispatchTouchEvent(DecorView.java:398)\r\n[ERROR] : TiExceptionHandler: android.view.View.dispatchPointerEvent(View.java:12752)\r\n[ERROR] : TiExceptionHandler: android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:5106)\r\n[ERROR] : TiExceptionHandler: android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:4909)\r\n[ERROR] : TiExceptionHandler: android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4426)\r\n[ERROR] : TiExceptionHandler: android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4479)\r\n[ERROR] : TiExceptionHandler: android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4445)\r\n[ERROR] : TiExceptionHandler: android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:4585)\r\n[ERROR] : TiExceptionHandler: android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4453)\r\n[ERROR] : TiExceptionHandler: android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:4642)\r\n[ERROR] : TiExceptionHandler: android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4426)\r\n[ERROR] : TiExceptionHandler: android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4479)\r\n[ERROR] : TiExceptionHandler: android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4445)\r\n[ERROR] : TiExceptionHandler: android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4453)\r\n[ERROR] : TiExceptionHandler: android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4426)\r\n[ERROR] : TiExceptionHandler: android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:7092)\r\n[ERROR] : TiExceptionHandler: android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:7061)\r\n[ERROR] : TiExceptionHandler: android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:7022)\r\n[ERROR] : TiExceptionHandler: android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:7195)\r\n[ERROR] : TiExceptionHandler: android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:186)\r\n[ERROR] : TiExceptionHandler: android.os.MessageQueue.nativePollOnce(Native Method)\r\n[ERROR] : TiExceptionHandler: android.os.MessageQueue.next(MessageQueue.java:326)\r\n[ERROR] : TiExceptionHandler: android.os.Looper.loop(Looper.java:160)\r\n[ERROR] : TiExceptionHandler: android.app.ActivityThread.main(ActivityThread.java:6680)\r\n{code}\r\n\r\n", "attachment": [], "flagged": false, "summary": "Android: Bottom style TabGroup with more than 5 tabs crashes when swiping left on 5th tab", "creator": { "name": "jquick", "key": "jquick", "displayName": "Joshua Quick", "active": true, "timeZone": "America/Los_Angeles" }, "subtasks": [], "reporter": { "name": "jquick", "key": "jquick", "displayName": "Joshua Quick", "active": true, "timeZone": "America/Los_Angeles" }, "environment": null, "comment": { "comments": [ { "id": "450498", "author": { "name": "ybanev", "key": "ybanev", "displayName": "Yordan Banev", "active": true, "timeZone": "Europe/Athens" }, "body": "PR: https://github.com/appcelerator/titanium_mobile/pull/11149", "updateAuthor": { "name": "ybanev", "key": "ybanev", "displayName": "Yordan Banev", "active": true, "timeZone": "Europe/Athens" }, "created": "2019-08-15T15:41:56.000+0000", "updated": "2019-08-15T15:41:56.000+0000" }, { "id": "450665", "author": { "name": "ybanev", "key": "ybanev", "displayName": "Yordan Banev", "active": true, "timeZone": "Europe/Athens" }, "body": "PR (8_3_X): https://github.com/appcelerator/titanium_mobile/pull/11161", "updateAuthor": { "name": "ybanev", "key": "ybanev", "displayName": "Yordan Banev", "active": true, "timeZone": "Europe/Athens" }, "created": "2019-08-21T12:27:10.000+0000", "updated": "2019-08-21T12:27:10.000+0000" }, { "id": "450677", "author": { "name": "kmahalingam", "key": "kmahalingam", "displayName": "Keerthi Mahalingam", "active": false, "timeZone": "America/Los_Angeles" }, "body": "FR passed. Waiting on Jenkins", "updateAuthor": { "name": "kmahalingam", "key": "kmahalingam", "displayName": "Keerthi Mahalingam", "active": false, "timeZone": "America/Los_Angeles" }, "created": "2019-08-21T16:48:29.000+0000", "updated": "2019-08-21T16:48:29.000+0000" }, { "id": "451229", "author": { "name": "cwilliams", "key": "cwilliams", "displayName": "Christopher Williams", "active": true, "timeZone": "America/New_York" }, "body": "merged to master, closed 8_3_X backport as master is now 8.3.0 target.", "updateAuthor": { "name": "cwilliams", "key": "cwilliams", "displayName": "Christopher Williams", "active": true, "timeZone": "America/New_York" }, "created": "2019-09-09T19:19:14.000+0000", "updated": "2019-09-09T19:19:14.000+0000" }, { "id": "451245", "author": { "name": "kmahalingam", "key": "kmahalingam", "displayName": "Keerthi Mahalingam", "active": false, "timeZone": "America/Los_Angeles" }, "body": "Verified the fix on sdk 8.3.0.v20190909144256. tab group works as expected.\r\n\r\nTest Environment:\r\nOperating System\r\n Name = Mac OS X\r\n Version = 10.14.5\r\n Architecture = 64bit\r\nNode.js\r\n Node.js Version = 10.16.2\r\n npm Version = 6.9.0\r\nTitanium CLI\r\n CLI Version = 5.2.1\r\nTitanium SDK\r\n SDK Version = 8.3.0.v20190909144256\r\nDevice -samsung s5 android 6\r\nEMulator- pixel android 9", "updateAuthor": { "name": "kmahalingam", "key": "kmahalingam", "displayName": "Keerthi Mahalingam", "active": false, "timeZone": "America/Los_Angeles" }, "created": "2019-09-10T04:35:40.000+0000", "updated": "2019-09-10T04:35:40.000+0000" } ], "maxResults": 7, "total": 7, "startAt": 0 } } }