Skip to content

Commit

Permalink
Fixed: Android layerType should not be changed if there is no need
Browse files Browse the repository at this point in the history
Resolves #1899
  • Loading branch information
hamorphis committed May 30, 2016
1 parent 153650f commit e2f1e27
Show file tree
Hide file tree
Showing 4 changed files with 64 additions and 11 deletions.
1 change: 1 addition & 0 deletions tests/app/App_Resources/Android/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
android:allowBackup="true"
android:icon="@drawable/icon"
android:label="@string/app_name"
android:largeHeap="true"
android:theme="@style/AppTheme" >
<activity
android:name="com.tns.NativeScriptActivity"
Expand Down
47 changes: 46 additions & 1 deletion tests/app/ui/view/view-tests.android.ts
Original file line number Diff line number Diff line change
Expand Up @@ -296,4 +296,49 @@ export function checkNativeBackgroundImage(v: view.View): boolean {
var bkg = <background.ad.BorderDrawable>(<android.view.View>v.android).getBackground();

return bkg && bkg.background && !types.isNullOrUndefined(bkg.background.image);
}
}

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<view.View>) => {
let lbl = <labelModule.Label>(views[0]);
let androidView = <android.view.View>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<view.View>) => {
let lbl = <labelModule.Label>(views[0]);
let androidView = <android.view.View>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<view.View>) => {
let lbl = <labelModule.Label>(views[0]);
let androidView = <android.view.View>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);
});
};
19 changes: 12 additions & 7 deletions tns-core-modules/ui/styling/background.android.ts
Original file line number Diff line number Diff line change
Expand Up @@ -225,8 +225,14 @@ export module ad {

var _defaultBackgrounds = new Map<string, android.graphics.drawable.Drawable>();

interface CacheLayerType {
layerType: number;
}

export function onBackgroundOrBorderPropertyChanged(v: view.View) {
var nativeView = <android.view.View>v._nativeView;
var cache = <CacheLayerType>v._nativeView;

if (!nativeView) {
return;
}
Expand Down Expand Up @@ -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
Expand All @@ -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;
}
}

Expand Down
8 changes: 5 additions & 3 deletions tns-core-modules/ui/styling/style.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down Expand Up @@ -921,7 +923,7 @@ export class Style extends DependencyObservable implements styling.Style {
}

private _applyStyleProperty(property: Property, newValue: any) {

if (!this._view._shouldApplyStyleHandlers()) {
return;
}
Expand Down

0 comments on commit e2f1e27

Please sign in to comment.