From e2f1e272b461e6c76ba545c613112724fd67a67c Mon Sep 17 00:00:00 2001 From: Rossen Hristov Date: Mon, 30 May 2016 09:48:50 +0300 Subject: [PATCH] Fixed: Android layerType should not be changed if there is no need Resolves #1899 --- .../App_Resources/Android/AndroidManifest.xml | 1 + tests/app/ui/view/view-tests.android.ts | 47 ++++++++++++++++++- .../ui/styling/background.android.ts | 19 +++++--- tns-core-modules/ui/styling/style.ts | 8 ++-- 4 files changed, 64 insertions(+), 11 deletions(-) diff --git a/tests/app/App_Resources/Android/AndroidManifest.xml b/tests/app/App_Resources/Android/AndroidManifest.xml index 6aaf5de78..a0a6ce0e0 100644 --- a/tests/app/App_Resources/Android/AndroidManifest.xml +++ b/tests/app/App_Resources/Android/AndroidManifest.xml @@ -24,6 +24,7 @@ android:allowBackup="true" android:icon="@drawable/icon" android:label="@string/app_name" + android:largeHeap="true" android:theme="@style/AppTheme" > (v.android).getBackground(); return bkg && bkg.background && !types.isNullOrUndefined(bkg.background.image); -} \ No newline at end of file +} + +let SDK: number; +function getSDK() { + if (!SDK) { + SDK = android.os.Build.VERSION.SDK_INT; + } + + return SDK; +} + +export function test_AndroidLayerType_BorderWidth() { + helper.buildUIAndRunTest(new labelModule.Label(), (views: Array) => { + let lbl = (views[0]); + let androidView = lbl.android; + let originalLayerType = androidView.getLayerType(); + lbl.borderWidth = 5; + TKUnit.assertEqual(androidView.getLayerType(), getSDK() < 18 ? android.view.View.LAYER_TYPE_SOFTWARE : originalLayerType); + lbl.borderWidth = 0; + TKUnit.assertEqual(androidView.getLayerType(), originalLayerType); + }); +}; + +export function test_AndroidLayerType_BorderRadius() { + helper.buildUIAndRunTest(new labelModule.Label(), (views: Array) => { + let lbl = (views[0]); + let androidView = lbl.android; + let originalLayerType = androidView.getLayerType(); + lbl.borderRadius = 5; + TKUnit.assertEqual(androidView.getLayerType(), getSDK() < 18 ? android.view.View.LAYER_TYPE_SOFTWARE : originalLayerType); + lbl.borderRadius = 0; + TKUnit.assertEqual(androidView.getLayerType(), originalLayerType); + }); +}; + +export function test_AndroidLayerType_ClipPath() { + helper.buildUIAndRunTest(new labelModule.Label(), (views: Array) => { + let lbl = (views[0]); + let androidView = lbl.android; + let originalLayerType = androidView.getLayerType(); + lbl.style.clipPath = "rect(0, 0, 100%, 100%)"; + TKUnit.assertEqual(androidView.getLayerType(), getSDK() < 18 ? android.view.View.LAYER_TYPE_SOFTWARE : originalLayerType); + lbl.style.clipPath = undefined; + TKUnit.assertEqual(androidView.getLayerType(), originalLayerType); + }); +}; \ No newline at end of file diff --git a/tns-core-modules/ui/styling/background.android.ts b/tns-core-modules/ui/styling/background.android.ts index 1390732da..f280fd8f4 100644 --- a/tns-core-modules/ui/styling/background.android.ts +++ b/tns-core-modules/ui/styling/background.android.ts @@ -225,8 +225,14 @@ export module ad { var _defaultBackgrounds = new Map(); + interface CacheLayerType { + layerType: number; + } + export function onBackgroundOrBorderPropertyChanged(v: view.View) { var nativeView = v._nativeView; + var cache = v._nativeView; + if (!nativeView) { return; } @@ -265,14 +271,12 @@ export module ad { bkg.background = backgroundValue; bkg.clipPath = clipPathValue; - if (getSDK() < 18) { + if ((v.borderWidth !== 0 || v.borderRadius !== 0 || clipPathValue) && getSDK() < 18) { // Switch to software because of unsupported canvas methods if hardware acceleration is on: // http://developer.android.com/guide/topics/graphics/hardware-accel.html + cache.layerType = nativeView.getLayerType(); nativeView.setLayerType(android.view.View.LAYER_TYPE_SOFTWARE, null); } - else { - nativeView.setLayerType(android.view.View.LAYER_TYPE_HARDWARE, null); - } } else { // reset the value with the default native value @@ -287,9 +291,10 @@ export module ad { } } - if (getSDK() < 18) { - // Reset layer type to hardware - nativeView.setLayerType(android.view.View.LAYER_TYPE_HARDWARE, null); + if (cache.layerType !== undefined) { + // Reset layer type + nativeView.setLayerType(cache.layerType, null); + cache.layerType = undefined; } } diff --git a/tns-core-modules/ui/styling/style.ts b/tns-core-modules/ui/styling/style.ts index 257fede80..e5c3bd5b5 100644 --- a/tns-core-modules/ui/styling/style.ts +++ b/tns-core-modules/ui/styling/style.ts @@ -405,9 +405,11 @@ function isPaddingValid(value: number): boolean { var supportedPaths = ["rect", "circle", "ellipse", "polygon"]; function isClipPathValid(value: string): boolean { + if (!value){ + return true; + } var functionName = value.substring(0, value.indexOf("(")).trim(); - - return supportedPaths.indexOf(functionName) !== -1 || value === ""; + return supportedPaths.indexOf(functionName) !== -1; } function isMarginValid(value: number): boolean { @@ -921,7 +923,7 @@ export class Style extends DependencyObservable implements styling.Style { } private _applyStyleProperty(property: Property, newValue: any) { - + if (!this._view._shouldApplyStyleHandlers()) { return; }