[TIMOB-20089] Android: setting a view layout to null crashes the app
GitHub Issue | n/a |
---|---|
Type | Bug |
Priority | Critical |
Status | Closed |
Resolution | Fixed |
Resolution Date | 2015-12-03T02:58:59.000+0000 |
Affected Version/s | n/a |
Fix Version/s | Release 5.2.0 |
Components | Android |
Labels | View, android, crash, layout |
Reporter | Xavier Lacot |
Assignee | Ashraf Abu |
Created | 2015-12-02T11:36:19.000+0000 |
Updated | 2016-01-21T01:55:53.000+0000 |
Description
When setting a view's layout to "null", the app completely crashes:
[ERROR] TiApplication: (main) [396,396] Sending event: exception on thread: main msg:java.lang.RuntimeException: Unable to start activity ComponentInfo{com.jolicode.testview/org.appcelerator.titanium.TiActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.String.equals(java.lang.Object)' on a null object reference; Titanium 5.0.2,2015/09/30 12:07,92c2265
[ERROR] TiApplication: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.jolicode.testview/org.appcelerator.titanium.TiActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.String.equals(java.lang.Object)' on a null object reference
[ERROR] TiApplication: at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2325)
[ERROR] TiApplication: at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387)
[ERROR] TiApplication: at android.app.ActivityThread.access$800(ActivityThread.java:151)
[ERROR] TiApplication: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)
[ERROR] TiApplication: at android.os.Handler.dispatchMessage(Handler.java:102)
[ERROR] TiApplication: at android.os.Looper.loop(Looper.java:135)
[ERROR] TiApplication: at android.app.ActivityThread.main(ActivityThread.java:5254)
[ERROR] TiApplication: at java.lang.reflect.Method.invoke(Native Method)
[ERROR] TiApplication: at java.lang.reflect.Method.invoke(Method.java:372)
[ERROR] TiApplication: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
[ERROR] TiApplication: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
[ERROR] TiApplication: Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.String.equals(java.lang.Object)' on a null object reference
[ERROR] TiApplication: at ti.modules.titanium.ui.widget.TiView.<init>(TiView.java:25)
[ERROR] TiApplication: at ti.modules.titanium.ui.ViewProxy.createView(ViewProxy.java:33)
[ERROR] TiApplication: at org.appcelerator.titanium.proxy.TiViewProxy.handleGetView(TiViewProxy.java:485)
[ERROR] TiApplication: at org.appcelerator.titanium.proxy.TiViewProxy.getOrCreateView(TiViewProxy.java:471)
[ERROR] TiApplication: at org.appcelerator.titanium.proxy.TiViewProxy.realizeViews(TiViewProxy.java:509)
[ERROR] TiApplication: at org.appcelerator.titanium.proxy.TiViewProxy.handleGetView(TiViewProxy.java:493)
[ERROR] TiApplication: at org.appcelerator.titanium.proxy.TiViewProxy.getOrCreateView(TiViewProxy.java:471)
[ERROR] TiApplication: at org.appcelerator.titanium.proxy.TiViewProxy.handleAdd(TiViewProxy.java:672)
[ERROR] TiApplication: at org.appcelerator.titanium.proxy.TiViewProxy.add(TiViewProxy.java:566)
[ERROR] TiApplication: at ti.modules.titanium.ui.WindowProxy.windowCreated(WindowProxy.java:237)
[ERROR] TiApplication: at org.appcelerator.titanium.TiActivityWindows.windowCreated(TiActivityWindows.java:33)
[ERROR] TiApplication: at org.appcelerator.titanium.TiBaseActivity.windowCreated(TiBaseActivity.java:458)
[ERROR] TiApplication: at org.appcelerator.titanium.TiBaseActivity.onCreate(TiBaseActivity.java:551)
[ERROR] TiApplication: at org.appcelerator.titanium.TiActivity.onCreate(TiActivity.java:18)
[ERROR] TiApplication: at android.app.Activity.performCreate(Activity.java:5990)
[ERROR] TiApplication: at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106)
[ERROR] TiApplication: at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2278)
[ERROR] TiApplication: ... 10 more
Steps to reproduce:
* create a new Alloy application
* app/controllers/index.js :
$.index.open();
* app/views/index.xml :
<Alloy>
<Window>
<View id="main" class="horizontal oh-shit">
<View id="firstChild"></View>
</View>
</Window>
</Alloy>
* app/styles/index.tss :
'.horizontal': {
layout: 'horizontal'
}
'.oh-shit': {
layout: null
}
* compile and run the app, it crashes at startup on android
Reason: The [TiView class constructor](https://github.com/appcelerator/titanium_mobile/blob/bc85170157d3bebc5de1d61a9fe6e34bce84a8c9/android/modules/ui/src/java/ti/modules/titanium/ui/widget/TiView.java#L23) does not correctly check that the layout property is not null, and it crashes on line 25 when calling equals()
.
Expected behavior: The app should not crash and the view should have the default layout (LayoutArrangement.DEFAULT
)
A pull request to fix this problem has been submitted in https://github.com/appcelerator/titanium_mobile/pull/7529
I'm curious (but obviously too lazy to test) whether setting layout to
undefined
rather thannull
also causes the crash. This is how I generally handle resetting properties to their default / unset states. I hope Appc will merge your PR.Classic App.js test code:-
PR https://github.com/appcelerator/titanium_mobile/pull/7529 reviewed and merged.
Verified the fix. Setting the layout property of the view to null does not crash the app/ Closing. Environment: Appc Studio : 4.5.0.201601131150 Ti SDK : 5.2.0.v20160114021251 Ti CLI : 5.0.5 Alloy : 1.7.26 MAC Yosemite : 10.10.5 Appc NPM : 4.2.3-1 Appc CLI : 5.2.0-231 Node: v0.12.27 Nexus 6P - Android 6.0