summaryrefslogtreecommitdiff
path: root/constraintlayout/src/main/java/android/support/constraint/ConstraintSet.java
diff options
context:
space:
mode:
Diffstat (limited to 'constraintlayout/src/main/java/android/support/constraint/ConstraintSet.java')
-rw-r--r--constraintlayout/src/main/java/android/support/constraint/ConstraintSet.java115
1 files changed, 107 insertions, 8 deletions
diff --git a/constraintlayout/src/main/java/android/support/constraint/ConstraintSet.java b/constraintlayout/src/main/java/android/support/constraint/ConstraintSet.java
index 2e942d3..b54cd80 100644
--- a/constraintlayout/src/main/java/android/support/constraint/ConstraintSet.java
+++ b/constraintlayout/src/main/java/android/support/constraint/ConstraintSet.java
@@ -33,6 +33,7 @@ import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import java.io.IOException;
+import java.lang.reflect.Array;
import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.HashSet;
@@ -260,7 +261,14 @@ public class ConstraintSet {
private static final int CIRCLE = 61;
private static final int CIRCLE_RADIUS = 62;
private static final int CIRCLE_ANGLE = 63;
- private static final int UNUSED = 64;
+
+ private static final int WIDTH_PERCENT = 69;
+ private static final int HEIGHT_PERCENT = 70;
+ private static final int CHAIN_USE_RTL = 71;
+ private static final int BARRIER_DIRECTION = 72;
+ private static final int CONSTRAINT_REFERENCED_IDS = 73;
+ private static final int BARRIER_ALLOWS_GONE_WIDGETS = 74;
+ private static final int UNUSED = 75;
static {
mapToConstant.append(R.styleable.ConstraintSet_layout_constraintLeft_toLeftOf, LEFT_TO_LEFT);
@@ -333,6 +341,18 @@ public class ConstraintSet {
mapToConstant.append(R.styleable.ConstraintSet_layout_constraintCircleRadius, CIRCLE_RADIUS);
mapToConstant.append(R.styleable.ConstraintSet_layout_constraintCircleAngle, CIRCLE_ANGLE);
mapToConstant.append(R.styleable.ConstraintSet_android_id, VIEW_ID);
+
+ mapToConstant.append(R.styleable.ConstraintSet_layout_constraintWidth_percent, WIDTH_PERCENT);
+ mapToConstant.append(R.styleable.ConstraintSet_layout_constraintHeight_percent, HEIGHT_PERCENT);
+
+ mapToConstant.append(R.styleable.ConstraintSet_chainUseRtl, CHAIN_USE_RTL);
+ mapToConstant.append(R.styleable.ConstraintSet_barrierDirection, BARRIER_DIRECTION);
+ mapToConstant.append(R.styleable.ConstraintSet_constraint_referenced_ids, CONSTRAINT_REFERENCED_IDS);
+ mapToConstant.append(R.styleable.ConstraintSet_barrierAllowsGoneWidgets, BARRIER_ALLOWS_GONE_WIDGETS);
+ }
+
+ public Constraint getParameters(int mId) {
+ return get(mId);
}
private static class Constraint {
@@ -412,9 +432,11 @@ public class ConstraintSet {
public int heightMin = UNSET;
public float widthPercent = 1;
public float heightPercent = 1;
+ public boolean mBarrierAllowsGoneWidgets = false;
public int mBarrierDirection = UNSET;
public int mHelperType = UNSET;
public int [] mReferenceIds;
+ public String mReferenceIdString;
public Constraint clone() {
Constraint clone = new Constraint();
@@ -496,6 +518,7 @@ public class ConstraintSet {
clone.circleConstraint = circleConstraint;
clone.circleRadius = circleRadius;
clone.circleAngle = circleAngle;
+ clone.mBarrierAllowsGoneWidgets = mBarrierAllowsGoneWidgets;
return clone;
}
@@ -640,6 +663,8 @@ public class ConstraintSet {
param.guideEnd = guideEnd;
param.width = mWidth;
param.height = mHeight;
+
+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
param.setMarginStart(startMargin);
param.setMarginEnd(endMargin);
@@ -718,6 +743,12 @@ public class ConstraintSet {
}
}
}
+ if (view instanceof Barrier) {
+ Barrier barrier = ((Barrier) view);
+ constraint.mBarrierAllowsGoneWidgets = barrier.allowsGoneWidget();
+ constraint.mReferenceIds = barrier.getReferencedIds();
+ constraint.mBarrierDirection = barrier.getType();
+ }
}
}
@@ -775,18 +806,24 @@ public class ConstraintSet {
if (mConstraints.containsKey(id)) {
used.remove(id);
Constraint constraint = mConstraints.get(id);
+ if (view instanceof Barrier) {
+ constraint.mHelperType = BARRIER_TYPE;
+ }
if (constraint.mHelperType != UNSET) {
switch (constraint.mHelperType) {
case BARRIER_TYPE:
Barrier barrier = (Barrier) view;
barrier.setId(id);
- barrier.setReferencedIds(constraint.mReferenceIds);
barrier.setType(constraint.mBarrierDirection);
- ConstraintLayout.LayoutParams param = constraintLayout
- .generateDefaultLayoutParams();
- constraint.applyTo(param);
+ barrier.setAllowsGoneWidget(constraint.mBarrierAllowsGoneWidgets);
+ if (constraint.mReferenceIds != null) {
+ barrier.setReferencedIds(constraint.mReferenceIds);
+ } else if (constraint.mReferenceIdString != null) {
+ constraint.mReferenceIds = convertReferenceString(barrier,
+ constraint.mReferenceIdString);
+ barrier.setReferencedIds(constraint.mReferenceIds);
+ }
break;
-
}
}
ConstraintLayout.LayoutParams param = (ConstraintLayout.LayoutParams) view
@@ -825,14 +862,20 @@ public class ConstraintSet {
case BARRIER_TYPE:
Barrier barrier = new Barrier(constraintLayout.getContext());
barrier.setId(id);
- barrier.setReferencedIds(constraint.mReferenceIds);
+ if (constraint.mReferenceIds != null) {
+ barrier.setReferencedIds(constraint.mReferenceIds);
+ } else if (constraint.mReferenceIdString != null) {
+ constraint.mReferenceIds = convertReferenceString(barrier,
+ constraint.mReferenceIdString);
+ barrier.setReferencedIds(constraint.mReferenceIds);
+ }
barrier.setType(constraint.mBarrierDirection);
ConstraintLayout.LayoutParams param = constraintLayout
.generateDefaultLayoutParams();
+ barrier.validateParams();
constraint.applyTo(param);
constraintLayout.addView(barrier, param);
break;
-
}
}
if (constraint.mIsGuideline) {
@@ -2366,6 +2409,25 @@ public class ConstraintSet {
case DIMENSION_RATIO:
c.dimensionRatio = a.getString(attr);
break;
+ case WIDTH_PERCENT:
+ c.widthPercent = a.getFloat(attr, 1);
+ break;
+ case HEIGHT_PERCENT:
+ c.heightPercent = a.getFloat(attr, 1);
+ break;
+ case CHAIN_USE_RTL:
+ Log.e(TAG, "CURRENTLY UNSUPPORTED"); // TODO add support or remove
+ // TODO add support or remove c.mChainUseRtl = a.getBoolean(attr,c.mChainUseRtl);
+ break;
+ case BARRIER_DIRECTION:
+ c.mBarrierDirection = a.getInt(attr,c.mBarrierDirection);
+ break;
+ case CONSTRAINT_REFERENCED_IDS:
+ c.mReferenceIdString = a.getString(attr);
+ break;
+ case BARRIER_ALLOWS_GONE_WIDGETS:
+ c.mBarrierAllowsGoneWidgets = a.getBoolean(attr,c.mBarrierAllowsGoneWidgets);
+ break;
case UNUSED:
Log.w(TAG,
"unused attribute 0x" + Integer.toHexString(attr) + " " + mapToConstant.get(attr));
@@ -2377,4 +2439,41 @@ public class ConstraintSet {
}
}
+ private int[] convertReferenceString(View view, String referenceIdString) {
+ String[] split = referenceIdString.split(",");
+ Context context = view.getContext();
+ int[]tags = new int[split.length];
+ int count = 0;
+ for (int i = 0; i < split.length; i++) {
+ String idString = split[i];
+ idString = idString.trim();
+ int tag = 0;
+ try {
+ Class res = R.id.class;
+ Field field = res.getField(idString);
+ tag = field.getInt(null);
+ }
+ catch (Exception e) {
+ // Do nothing
+ }
+ if (tag == 0) {
+ tag = context.getResources().getIdentifier(idString, "id",
+ context.getPackageName());
+ }
+
+ if (tag == 0 && view.isInEditMode() && view.getParent() instanceof ConstraintLayout) {
+ ConstraintLayout constraintLayout = (ConstraintLayout) view.getParent();
+ Object value = constraintLayout.getDesignInformation(0, idString);
+ if (value != null && value instanceof Integer) {
+ tag = (Integer) value;
+ }
+ }
+ tags[count++] = tag;
+ }
+ if (count!=split.length) {
+ tags = Arrays.copyOf(tags,count);
+ }
+ return tags;
+ }
+
}