{ "id": "176116", "key": "TIMOB-28386", "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": [], "resolution": { "id": "10000", "description": "", "name": "Done" }, "resolutiondate": "2021-04-08T00:50:21.000+0000", "created": "2021-03-12T12:22:48.000+0000", "priority": { "name": "None", "id": "6" }, "labels": [], "versions": [ { "id": "21050", "name": "Release 10.0.0", "archived": false, "released": true, "releaseDate": "2021-05-17" } ], "issuelinks": [], "assignee": { "name": "jquick", "key": "jquick", "displayName": "Joshua Quick", "active": true, "timeZone": "America/Los_Angeles" }, "updated": "2021-04-08T00:50:21.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": "On Android with SDK 10, the app crashes when toggling light- and dark-mode:\r\n{code}\r\n[ERROR] TiExceptionHandler: (main) [68,139775] Attempt to invoke virtual method 'boolean org.appcelerator.kroll.KrollDict.containsKey(java.lang.Object)' on a null object reference\r\n[ERROR] TiExceptionHandler:\r\n[ERROR] TiExceptionHandler: org.appcelerator.titanium.view.TiUIView.processProperties(TiUIView.java:954)\r\n[ERROR] TiExceptionHandler: ti.pageindicator.PageIndicatorView.processProperties(PageIndicatorView.kt:31)\r\n[ERROR] TiExceptionHandler: org.appcelerator.kroll.KrollProxy.setModelListener(KrollProxy.java:1312)\r\n[ERROR] TiExceptionHandler: org.appcelerator.titanium.proxy.TiViewProxy.realizeViews(TiViewProxy.java:486)\r\n[ERROR] TiExceptionHandler: org.appcelerator.titanium.proxy.TiViewProxy.handleGetView(TiViewProxy.java:476)\r\n[ERROR] TiExceptionHandler: org.appcelerator.titanium.proxy.TiViewProxy.getOrCreateView(TiViewProxy.java:437)\r\n[ERROR] TiExceptionHandler: org.appcelerator.titanium.proxy.TiViewProxy.realizeViews(TiViewProxy.java:493)\r\n[ERROR] TiExceptionHandler: org.appcelerator.titanium.proxy.TiViewProxy.handleGetView(TiViewProxy.java:476)\r\n[ERROR] TiExceptionHandler: org.appcelerator.titanium.proxy.TiViewProxy.getOrCreateView(TiViewProxy.java:437)\r\n[ERROR] TiExceptionHandler: org.appcelerator.titanium.proxy.TiViewProxy.realizeViews(TiViewProxy.java:493)\r\n[ERROR] TiExceptionHandler: org.appcelerator.titanium.proxy.TiViewProxy.handleGetView(TiViewProxy.java:476)\r\n[ERROR] TiExceptionHandler: org.appcelerator.titanium.proxy.TiViewProxy.getOrCreateView(TiViewProxy.java:437)\r\n[ERROR] TiExceptionHandler: ti.modules.titanium.ui.widget.tabgroup.TiUITab.getContentView(TiUITab.java:52)\r\n[ERROR] TiExceptionHandler: ti.modules.titanium.ui.widget.tabgroup.TiUIAbstractTabGroup$TabFragment.onCreateView(TiUIAbstractTabGroup.java:613)\r\n[ERROR] TiExceptionHandler: androidx.fragment.app.Fragment.performCreateView(Fragment.java:2950)\r\n[ERROR] TiExceptionHandler: androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:515)\r\n[ERROR] TiExceptionHandler: androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:282)\r\n[ERROR] TiExceptionHandler: androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:2177)\r\n[ERROR] TiExceptionHandler: androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:2088)\r\n[ERROR] TiExceptionHandler: androidx.fragment.app.FragmentManager.execSingleAction(FragmentManager.java:1959)\r\n[ERROR] TiExceptionHandler: androidx.fragment.app.BackStackRecord.commitNowAllowingStateLoss(BackStackRecord.java:311)\r\n[ERROR] TiExceptionHandler: androidx.fragment.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:249)\r\n[ERROR] TiExceptionHandler: androidx.viewpager.widget.ViewPager.populate(ViewPager.java:1244)\r\n[ERROR] TiExceptionHandler: androidx.viewpager.widget.ViewPager.populate(ViewPager.java:1092)\r\n[ERROR] TiExceptionHandler: androidx.viewpager.widget.ViewPager.onMeasure(ViewPager.java:1622)\r\n[ERROR] TiExceptionHandler: android.view.View.measure(View.java:25466)\r\n[ERROR] TiExceptionHandler: org.appcelerator.titanium.view.TiCompositeLayout.constrainChild(TiCompositeLayout.java:742)\r\n[ERROR] TiExceptionHandler: org.appcelerator.titanium.view.TiCompositeLayout.onMeasure(TiCompositeLayout.java:575)\r\n[ERROR] TiExceptionHandler: android.view.View.measure(View.java:25466)\r\n[ERROR] TiExceptionHandler: android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6957)\r\n[ERROR] TiExceptionHandler: android.widget.FrameLayout.onMeasure(FrameLayout.java:194)\r\n[ERROR] TiExceptionHandler: androidx.appcompat.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:146)\r\n[ERROR] TiExceptionHandler: android.view.View.measure(View.java:25466)\r\n[ERROR] TiExceptionHandler: android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6957)\r\n[ERROR] TiExceptionHandler: androidx.appcompat.widget.ActionBarOverlayLayout.onMeasure(ActionBarOverlayLayout.java:490)\r\n[ERROR] TiExceptionHandler: android.view.View.measure(View.java:25466)\r\n[ERROR] TiExceptionHandler: android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6957)\r\n[ERROR] TiExceptionHandler: android.widget.FrameLayout.onMeasure(FrameLayout.java:194)\r\n[ERROR] TiExceptionHandler: android.view.View.measure(View.java:25466)\r\n[ERROR] TiExceptionHandler: android.widget.LinearLayout.measureVertical(LinearLayout.java:995)\r\n[ERROR] TiExceptionHandler: android.widget.LinearLayout.onMeasure(LinearLayout.java:721)\r\n[ERROR] TiExceptionHandler: android.view.View.measure(View.java:25466)\r\n[ERROR] TiExceptionHandler: android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6957)\r\n[ERROR] TiExceptionHandler: android.widget.FrameLayout.onMeasure(FrameLayout.java:194)\r\n[ERROR] TiExceptionHandler: com.android.internal.policy.DecorView.onMeasure(DecorView.java:747)\r\n[ERROR] TiExceptionHandler: android.view.View.measure(View.java:25466)\r\n[ERROR] TiExceptionHandler: android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:3402)\r\n[ERROR] TiExceptionHandler: android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:2246)\r\n[ERROR] TiExceptionHandler: android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2504)\r\n[ERROR] TiExceptionHandler: android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1948)\r\n[ERROR] TiExceptionHandler: android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:8177)\r\n[ERROR] TiExceptionHandler: android.view.Choreographer$CallbackRecord.run(Choreographer.java:972)\r\n[ERROR] TiExceptionHandler: android.view.Choreographer.doCallbacks(Choreographer.java:796)\r\n[ERROR] TiExceptionHandler: android.view.Choreographer.doFrame(Choreographer.java:731)\r\n[ERROR] TiExceptionHandler: android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:957)\r\n[ERROR] TiExceptionHandler: android.os.Handler.handleCallback(Handler.java:938)\r\n[ERROR] TiExceptionHandler: android.os.Handler.dispatchMessage(Handler.java:99)\r\n[ERROR] TiExceptionHandler: android.os.Looper.loop(Looper.java:223)\r\n[ERROR] TiExceptionHandler: android.app.ActivityThread.main(ActivityThread.java:7660)\r\n[ERROR] TiExceptionHandler: java.lang.reflect.Method.invoke(Native Method)\r\n[ERROR] TiExceptionHandler: com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)\r\n[ERROR] TiExceptionHandler: com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)\r\n{code}\r\n\r\nFirst, we thought it's our custom module (ti.pageindicator), but the crash occurs in the proxy handler. All we do is:\r\n{code}\r\n override fun processProperties(d: KrollDict?) {\r\n super.processProperties(d) // <-- This is called and then crahses in the super-function\r\n\r\n if (d == null) {\r\n return\r\n }\r\n\r\n for (key in d.keys) {\r\n handleProperty(key, d[key])\r\n }\r\n }\r\n{code}", "attachment": [], "flagged": false, "summary": "Android: App crashes when changing to dark mode", "creator": { "name": "hknoechel", "key": "hansknoechel", "displayName": "Hans Knöchel", "active": true, "timeZone": "Europe/Berlin" }, "subtasks": [], "reporter": { "name": "hknoechel", "key": "hansknoechel", "displayName": "Hans Knöchel", "active": true, "timeZone": "Europe/Berlin" }, "environment": null, "comment": { "comments": [ { "id": "458406", "author": { "name": "jquick", "key": "jquick", "displayName": "Joshua Quick", "active": true, "timeZone": "America/Los_Angeles" }, "body": "[~hknoechel], I added a bunch of null reference guards to our proxy code in the below PR.\r\nhttps://github.com/appcelerator/titanium_mobile/pull/12537\r\n\r\nHowever, the real issue is that the \"ti.pageindicator\" module's proxy object is being \"released\" when it shouldn't. So, even with my above null guards, odds are this proxy object will stop functioning after changing themes. The root issue is that the module's proxy objects are wrongly being released when the activity is being recreated, but I'm not seeing this issue anywhere else (such as MapView in \"ti.map\"). I can't get to the root of the issue without seeing the module's code.", "updateAuthor": { "name": "jquick", "key": "jquick", "displayName": "Joshua Quick", "active": true, "timeZone": "America/Los_Angeles" }, "created": "2021-03-13T04:01:40.000+0000", "updated": "2021-03-13T04:01:40.000+0000" }, { "id": "458549", "author": { "name": "jquick", "key": "jquick", "displayName": "Joshua Quick", "active": true, "timeZone": "America/Los_Angeles" }, "body": "Closing since we've added null-guards to Titanium 10.0.0 and 3rd party module affected was changed to avoid issue.", "updateAuthor": { "name": "jquick", "key": "jquick", "displayName": "Joshua Quick", "active": true, "timeZone": "America/Los_Angeles" }, "created": "2021-04-08T00:50:11.000+0000", "updated": "2021-04-08T00:50:11.000+0000" } ], "maxResults": 2, "total": 2, "startAt": 0 } } }