From 91bb8ce4a5ecd1a473f66319fb2d5a5d576c0ef1 Mon Sep 17 00:00:00 2001 From: hshristov Date: Fri, 9 Oct 2015 10:35:02 +0300 Subject: [PATCH] Android layout logging is now separate METADATA key. Percent layout is NOT respected when measured with UNSPECIFIED size. --- .../widgets/CommonLayoutParams.java | 78 ++++++++++++------- src/org/nativescript/widgets/ImageView.java | 2 +- 2 files changed, 49 insertions(+), 31 deletions(-) diff --git a/src/org/nativescript/widgets/CommonLayoutParams.java b/src/org/nativescript/widgets/CommonLayoutParams.java index 79028628c..6e99a6e2c 100644 --- a/src/org/nativescript/widgets/CommonLayoutParams.java +++ b/src/org/nativescript/widgets/CommonLayoutParams.java @@ -20,7 +20,7 @@ import android.widget.FrameLayout; */ public class CommonLayoutParams extends FrameLayout.LayoutParams { - static final String tag = "NSLayout"; + static final String TAG = "NSLayout"; static int debuggable = -1; private static final StringBuilder sb = new StringBuilder(); @@ -154,7 +154,7 @@ public class CommonLayoutParams extends FrameLayout.LayoutParams { sb.append(MeasureSpec.toString(widthMeasureSpec)); sb.append(", "); sb.append(MeasureSpec.toString(heightMeasureSpec)); - log(tag, sb.toString()); + log(TAG, sb.toString()); } child.measure(widthMeasureSpec, heightMeasureSpec); @@ -174,7 +174,7 @@ public class CommonLayoutParams extends FrameLayout.LayoutParams { sb.append(childRight); sb.append(", "); sb.append(childBottom); - log(tag, sb.toString()); + log(TAG, sb.toString()); } child.layout(childLeft, childTop, childRight, childBottom); @@ -188,13 +188,18 @@ public class CommonLayoutParams extends FrameLayout.LayoutParams { // Negative means not initialized. if(debuggable < 0) { try { - Context context = child.getContext(); - int flags = context.getPackageManager().getPackageInfo(context.getPackageName(), 0).applicationInfo.flags; - debuggable = (flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0 ? 1 : 0; - } - catch (NameNotFoundException e) { - debuggable = 0; - } + Context context = child.getContext(); + ApplicationInfo ai = context.getPackageManager().getApplicationInfo(context.getPackageName(), android.content.pm.PackageManager.GET_META_DATA); + android.os.Bundle bundle = ai.metaData; + Boolean debugLayouts = bundle != null ? bundle.getBoolean("debugLayouts", false) : false; + debuggable = debugLayouts ? 1 : 0; + } catch (NameNotFoundException e) { + debuggable = 0; + Log.e(TAG, "Failed to load meta-data, NameNotFound: " + e.getMessage()); + } catch (NullPointerException e) { + debuggable = 0; + Log.e(TAG, "Failed to load meta-data, NullPointer: " + e.getMessage()); + } } int childWidthMeasureSpec = getMeasureSpec(child, widthMeasureSpec, true); @@ -209,7 +214,7 @@ public class CommonLayoutParams extends FrameLayout.LayoutParams { sb.append(MeasureSpec.toString(childWidthMeasureSpec)); sb.append(", "); sb.append(MeasureSpec.toString(childHeightMeasureSpec)); - log(tag, sb.toString()); + log(TAG, sb.toString()); } child.measure(childWidthMeasureSpec, childHeightMeasureSpec); @@ -218,25 +223,38 @@ public class CommonLayoutParams extends FrameLayout.LayoutParams { public static void updateChildLayoutParams(View child, int widthMeasureSpec, int heightMeasureSpec) { int availableWidth = MeasureSpec.getSize(widthMeasureSpec); - int availableHeight = MeasureSpec.getSize(heightMeasureSpec); - CommonLayoutParams lp = (CommonLayoutParams)child.getLayoutParams(); - if (lp.widthPercent > 0) { - lp.width = (int)(availableWidth * lp.widthPercent); - } - if (lp.heightPercent > 0) { - lp.height = (int)(availableHeight * lp.heightPercent); - } - if (lp.leftMarginPercent > 0) { - lp.leftMargin = (int)(availableWidth * lp.leftMarginPercent); - } - if (lp.rightMarginPercent > 0) { - lp.rightMargin = (int)(availableWidth * lp.rightMarginPercent); - } - if (lp.topMarginPercent > 0) { - lp.topMargin = (int)(availableHeight * lp.topMarginPercent); - } - if (lp.bottomMarginPercent > 0) { - lp.bottomMargin = (int)(availableHeight * lp.bottomMarginPercent); + int widthSpec = MeasureSpec.getMode(widthMeasureSpec); + + int availableHeight = MeasureSpec.getSize(heightMeasureSpec); + int heightSpec = MeasureSpec.getMode(heightMeasureSpec); + + CommonLayoutParams lp = (CommonLayoutParams)child.getLayoutParams(); + if (widthSpec != MeasureSpec.UNSPECIFIED) { + if (lp.widthPercent > 0) { + lp.width = (int)(availableWidth * lp.widthPercent); + } + + if (lp.leftMarginPercent > 0) { + lp.leftMargin = (int)(availableWidth * lp.leftMarginPercent); + } + + if (lp.rightMarginPercent > 0) { + lp.rightMargin = (int)(availableWidth * lp.rightMarginPercent); + } + } + + if (heightSpec != MeasureSpec.UNSPECIFIED) { + if (lp.heightPercent > 0) { + lp.height = (int)(availableHeight * lp.heightPercent); + } + + if (lp.topMarginPercent > 0) { + lp.topMargin = (int)(availableHeight * lp.topMarginPercent); + } + + if (lp.bottomMarginPercent > 0) { + lp.bottomMargin = (int)(availableHeight * lp.bottomMarginPercent); + } } } diff --git a/src/org/nativescript/widgets/ImageView.java b/src/org/nativescript/widgets/ImageView.java index 4c6118b1d..d25a4954d 100644 --- a/src/org/nativescript/widgets/ImageView.java +++ b/src/org/nativescript/widgets/ImageView.java @@ -99,7 +99,7 @@ public class ImageView extends android.widget.ImageView { sb.append(", measureHeight: "); sb.append(measureHeight); - CommonLayoutParams.log(CommonLayoutParams.tag, sb.toString()); + CommonLayoutParams.log(CommonLayoutParams.TAG, sb.toString()); } int widthSizeAndState = resolveSizeAndState(measureWidth, widthMeasureSpec, 0);