Titanium JIRA Archive
Titanium SDK/CLI (TIMOB)

[TIMOB-20089] Android: setting a view layout to null crashes the app

GitHub Issuen/a
TypeBug
PriorityCritical
StatusClosed
ResolutionFixed
Resolution Date2015-12-03T02:58:59.000+0000
Affected Version/sn/a
Fix Version/sRelease 5.2.0
ComponentsAndroid
LabelsView, android, crash, layout
ReporterXavier Lacot
AssigneeAshraf Abu
Created2015-12-02T11:36:19.000+0000
Updated2016-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)

Comments

  1. Xavier Lacot 2015-12-02

    A pull request to fix this problem has been submitted in https://github.com/appcelerator/titanium_mobile/pull/7529
  2. Tim Poulsen 2015-12-02

    I'm curious (but obviously too lazy to test) whether setting layout to undefined rather than null also causes the crash. This is how I generally handle resetting properties to their default / unset states. I hope Appc will merge your PR.
  3. Ashraf Abu 2015-12-03

    Classic App.js test code:-
       var win = Ti.UI.createWindow();
        
       var view = Ti.UI.createView({
       	layout: null
       });
         
       win.add(view);
       win.open();
       
  4. Ashraf Abu 2015-12-03

    PR https://github.com/appcelerator/titanium_mobile/pull/7529 reviewed and merged.
  5. Lokesh Choudhary 2016-01-21

    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

JSON Source