From 765a1ec2a5a4d38a9741b3046ccde25a065a4672 Mon Sep 17 00:00:00 2001 From: Appcelerator Build Date: Mon, 24 May 2021 10:53:47 -0400 Subject: [PATCH] fix(android): guard access to some toast properties (#12826) Fixes TIMOB-28448 --- .../titanium/ui/widget/TiUINotification.java | 54 ++++++++++--------- tests/Resources/ti.ui.notification.test.js | 48 +++++++++++++++++ 2 files changed, 78 insertions(+), 24 deletions(-) create mode 100644 tests/Resources/ti.ui.notification.test.js diff --git a/android/modules/ui/src/java/ti/modules/titanium/ui/widget/TiUINotification.java b/android/modules/ui/src/java/ti/modules/titanium/ui/widget/TiUINotification.java index ae057161343..11216dfc3f3 100644 --- a/android/modules/ui/src/java/ti/modules/titanium/ui/widget/TiUINotification.java +++ b/android/modules/ui/src/java/ti/modules/titanium/ui/widget/TiUINotification.java @@ -32,13 +32,6 @@ public TiUINotification(TiViewProxy proxy) @Override public void processProperties(KrollDict d) { - - float horizontalMargin = toast.getHorizontalMargin(); - float verticalMargin = toast.getVerticalMargin(); - int offsetX = toast.getXOffset(); - int offsetY = toast.getYOffset(); - int gravity = toast.getGravity(); - if (proxy.hasProperty(TiC.PROPERTY_MESSAGE)) { toast.setText(TiConvert.toString(proxy.getProperty(TiC.PROPERTY_MESSAGE))); } @@ -49,30 +42,43 @@ public void processProperties(KrollDict d) toast.setDuration(duration); } - //float horizontalMargin, float verticalMargin - if (proxy.hasProperty("horizontalMargin")) { - horizontalMargin = TiConvert.toFloat(proxy.getProperty("horizontalMargin")); - } + // Only change layout if we have custom margins + if (proxy.hasProperty("horizontalMargin") || proxy.hasProperty("verticalMargin")) { + float horizontalMargin = toast.getHorizontalMargin(); + float verticalMargin = toast.getVerticalMargin(); - if (proxy.hasProperty("verticalMargin")) { - verticalMargin = TiConvert.toFloat(proxy.getProperty("verticalMargin")); - } + // float horizontalMargin, float verticalMargin + if (proxy.hasProperty("horizontalMargin")) { + horizontalMargin = TiConvert.toFloat(proxy.getProperty("horizontalMargin")); + } - toast.setMargin(horizontalMargin, verticalMargin); + if (proxy.hasProperty("verticalMargin")) { + verticalMargin = TiConvert.toFloat(proxy.getProperty("verticalMargin")); + } - if (proxy.hasProperty("offsetX")) { - offsetX = TiConvert.toInt(proxy.getProperty("offsetX")); + toast.setMargin(horizontalMargin, verticalMargin); } - if (proxy.hasProperty("offsetY")) { - offsetY = TiConvert.toInt(proxy.getProperty("offsetY")); - } + // Only change gravity if we have custom offsets / gravity + if (proxy.hasProperty("offsetX") || proxy.hasProperty("offsetY") || proxy.hasProperty("gravity")) { + int offsetX = toast.getXOffset(); + int offsetY = toast.getYOffset(); + int gravity = toast.getGravity(); - if (proxy.hasProperty("gravity")) { - gravity = TiConvert.toInt(proxy.getProperty("gravity")); - } + if (proxy.hasProperty("offsetX")) { + offsetX = TiConvert.toInt(proxy.getProperty("offsetX")); + } + + if (proxy.hasProperty("offsetY")) { + offsetY = TiConvert.toInt(proxy.getProperty("offsetY")); + } - toast.setGravity(gravity, offsetX, offsetY); + if (proxy.hasProperty("gravity")) { + gravity = TiConvert.toInt(proxy.getProperty("gravity")); + } + + toast.setGravity(gravity, offsetX, offsetY); + } super.processProperties(d); } diff --git a/tests/Resources/ti.ui.notification.test.js b/tests/Resources/ti.ui.notification.test.js new file mode 100644 index 00000000000..a7b919a103f --- /dev/null +++ b/tests/Resources/ti.ui.notification.test.js @@ -0,0 +1,48 @@ +/* + * Appcelerator Titanium Mobile + * Copyright (c) 2021-Present by Axway. All Rights Reserved. + * Licensed under the terms of the Apache Public License + * Please see the LICENSE included with this distribution for details. + */ +/* eslint-env mocha */ +/* eslint no-unused-expressions: "off" */ +/* eslint promise/no-callback-in-promise: "off" */ +'use strict'; +const should = require('./utilities/assertions'); + +describe('Titanium.UI.Notification', function () { + this.timeout(10000); + + let window; + afterEach(done => { + if (window && !window.closed) { + window.close().then(() => done()).catch(_e => done()); + } else { + window = null; + done(); + } + }); + + describe('methods', () => { + describe('#show()', () => { + it('is a Function', () => { + const notification = Ti.UI.createNotification({ + title: 'Hello world', + duration: Ti.UI.NOTIFICATION_DURATION_SHORT + }); + + should(notification).have.a.property('show').which.is.a.Function(); + }); + + it('does not crash', finish => { + const notification = Ti.UI.createNotification({ + title: 'Hello world', + duration: Ti.UI.NOTIFICATION_DURATION_SHORT + }); + + window = Ti.UI.createWindow(); + window.open().then(notification.show).catch(finish); + }); + }); + }); +});