From 9100019c0a33272df8cb39b44fd66e542b9505f6 Mon Sep 17 00:00:00 2001 From: Amir Shalem Date: Wed, 18 Sep 2019 00:36:26 -0700 Subject: [PATCH] Split YogaConfig into interface and actual implementation Summary: Split YogaConfig into the same way YogaNode is split today. Into an abstract class defining the interface, and actual JNI implementation Reviewed By: SidharthGuglani Differential Revision: D17266404 fbshipit-source-id: 3d5d6aa65c55cfa61d47c662d140cdce6dcb0ea1 --- java/com/facebook/yoga/YogaConfig.java | 65 +++------------- java/com/facebook/yoga/YogaConfigFactory.java | 2 +- java/com/facebook/yoga/YogaConfigJNIBase.java | 76 +++++++++++++++++++ .../facebook/yoga/YogaConfigJNIFinalizer.java | 30 ++++++++ 4 files changed, 118 insertions(+), 55 deletions(-) create mode 100644 java/com/facebook/yoga/YogaConfigJNIBase.java create mode 100644 java/com/facebook/yoga/YogaConfigJNIFinalizer.java diff --git a/java/com/facebook/yoga/YogaConfig.java b/java/com/facebook/yoga/YogaConfig.java index 49a4c44b..6a670407 100644 --- a/java/com/facebook/yoga/YogaConfig.java +++ b/java/com/facebook/yoga/YogaConfig.java @@ -6,78 +6,35 @@ */ package com.facebook.yoga; -import com.facebook.soloader.SoLoader; - -public class YogaConfig { +public abstract class YogaConfig { public static int SPACING_TYPE = 1; - private long mNativePointer; - private YogaLogger mLogger; - private YogaNodeCloneFunction mYogaNodeCloneFunction; + public abstract void setExperimentalFeatureEnabled(YogaExperimentalFeature feature, boolean enabled); - public YogaConfig() { - mNativePointer = YogaNative.jni_YGConfigNew(); - if (mNativePointer == 0) { - throw new IllegalStateException("Failed to allocate native memory"); - } - } + public abstract void setUseWebDefaults(boolean useWebDefaults); - @Override - protected void finalize() throws Throwable { - try { - YogaNative.jni_YGConfigFree(mNativePointer); - } finally { - super.finalize(); - } - } - - public void setExperimentalFeatureEnabled(YogaExperimentalFeature feature, boolean enabled) { - YogaNative.jni_YGConfigSetExperimentalFeatureEnabled(mNativePointer, feature.intValue(), enabled); - } - - public void setUseWebDefaults(boolean useWebDefaults) { - YogaNative.jni_YGConfigSetUseWebDefaults(mNativePointer, useWebDefaults); - } - - public void setPrintTreeFlag(boolean enable) { - YogaNative.jni_YGConfigSetPrintTreeFlag(mNativePointer, enable); - } - - public void setPointScaleFactor(float pixelsInPoint) { - YogaNative.jni_YGConfigSetPointScaleFactor(mNativePointer, pixelsInPoint); - } + public abstract void setPrintTreeFlag(boolean enable); + public abstract void setPointScaleFactor(float pixelsInPoint); /** * Yoga previously had an error where containers would take the maximum space possible instead of the minimum * like they are supposed to. In practice this resulted in implicit behaviour similar to align-self: stretch; * Because this was such a long-standing bug we must allow legacy users to switch back to this behaviour. */ - public void setUseLegacyStretchBehaviour(boolean useLegacyStretchBehaviour) { - YogaNative.jni_YGConfigSetUseLegacyStretchBehaviour(mNativePointer, useLegacyStretchBehaviour); - } + public abstract void setUseLegacyStretchBehaviour(boolean useLegacyStretchBehaviour); /** * If this flag is set then yoga would diff the layout without legacy flag and would set a bool in * YogaNode(mDoesLegacyStretchFlagAffectsLayout) with true if the layouts were different and false * if not */ - public void setShouldDiffLayoutWithoutLegacyStretchBehaviour( - boolean shouldDiffLayoutWithoutLegacyStretchBehaviour) { - YogaNative.jni_YGConfigSetShouldDiffLayoutWithoutLegacyStretchBehaviour( - mNativePointer, shouldDiffLayoutWithoutLegacyStretchBehaviour); - } + public abstract void setShouldDiffLayoutWithoutLegacyStretchBehaviour( + boolean shouldDiffLayoutWithoutLegacyStretchBehaviour); - public void setLogger(YogaLogger logger) { - mLogger = logger; - YogaNative.jni_YGConfigSetLogger(mNativePointer, logger); - } + public abstract void setLogger(YogaLogger logger); - public YogaLogger getLogger() { - return mLogger; - } + public abstract YogaLogger getLogger(); - long getNativePointer() { - return mNativePointer; - } + abstract long getNativePointer(); } diff --git a/java/com/facebook/yoga/YogaConfigFactory.java b/java/com/facebook/yoga/YogaConfigFactory.java index d5784d68..fca4dc90 100644 --- a/java/com/facebook/yoga/YogaConfigFactory.java +++ b/java/com/facebook/yoga/YogaConfigFactory.java @@ -2,6 +2,6 @@ package com.facebook.yoga; public abstract class YogaConfigFactory { public static YogaConfig create() { - return new YogaConfig(); + return new YogaConfigJNIFinalizer(); } } diff --git a/java/com/facebook/yoga/YogaConfigJNIBase.java b/java/com/facebook/yoga/YogaConfigJNIBase.java new file mode 100644 index 00000000..643a3a0d --- /dev/null +++ b/java/com/facebook/yoga/YogaConfigJNIBase.java @@ -0,0 +1,76 @@ +/** + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the LICENSE + * file in the root directory of this source tree. + */ +package com.facebook.yoga; + +import com.facebook.soloader.SoLoader; + +public abstract class YogaConfigJNIBase extends YogaConfig { + + protected long mNativePointer; + private YogaLogger mLogger; + private YogaNodeCloneFunction mYogaNodeCloneFunction; + + private YogaConfigJNIBase(long nativePointer) { + if (nativePointer == 0) { + throw new IllegalStateException("Failed to allocate native memory"); + } + mNativePointer = nativePointer; + } + + YogaConfigJNIBase() { + this(YogaNative.jni_YGConfigNew()); + } + + public void setExperimentalFeatureEnabled(YogaExperimentalFeature feature, boolean enabled) { + YogaNative.jni_YGConfigSetExperimentalFeatureEnabled(mNativePointer, feature.intValue(), enabled); + } + + public void setUseWebDefaults(boolean useWebDefaults) { + YogaNative.jni_YGConfigSetUseWebDefaults(mNativePointer, useWebDefaults); + } + + public void setPrintTreeFlag(boolean enable) { + YogaNative.jni_YGConfigSetPrintTreeFlag(mNativePointer, enable); + } + + public void setPointScaleFactor(float pixelsInPoint) { + YogaNative.jni_YGConfigSetPointScaleFactor(mNativePointer, pixelsInPoint); + } + + /** + * Yoga previously had an error where containers would take the maximum space possible instead of the minimum + * like they are supposed to. In practice this resulted in implicit behaviour similar to align-self: stretch; + * Because this was such a long-standing bug we must allow legacy users to switch back to this behaviour. + */ + public void setUseLegacyStretchBehaviour(boolean useLegacyStretchBehaviour) { + YogaNative.jni_YGConfigSetUseLegacyStretchBehaviour(mNativePointer, useLegacyStretchBehaviour); + } + + /** + * If this flag is set then yoga would diff the layout without legacy flag and would set a bool in + * YogaNode(mDoesLegacyStretchFlagAffectsLayout) with true if the layouts were different and false + * if not + */ + public void setShouldDiffLayoutWithoutLegacyStretchBehaviour( + boolean shouldDiffLayoutWithoutLegacyStretchBehaviour) { + YogaNative.jni_YGConfigSetShouldDiffLayoutWithoutLegacyStretchBehaviour( + mNativePointer, shouldDiffLayoutWithoutLegacyStretchBehaviour); + } + + public void setLogger(YogaLogger logger) { + mLogger = logger; + YogaNative.jni_YGConfigSetLogger(mNativePointer, logger); + } + + public YogaLogger getLogger() { + return mLogger; + } + + long getNativePointer() { + return mNativePointer; + } +} diff --git a/java/com/facebook/yoga/YogaConfigJNIFinalizer.java b/java/com/facebook/yoga/YogaConfigJNIFinalizer.java new file mode 100644 index 00000000..aa7fb364 --- /dev/null +++ b/java/com/facebook/yoga/YogaConfigJNIFinalizer.java @@ -0,0 +1,30 @@ +/** + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the LICENSE + * file in the root directory of this source tree. + */ +package com.facebook.yoga; + +public class YogaConfigJNIFinalizer extends YogaConfigJNIBase { + public YogaConfigJNIFinalizer() { + super(); + } + + @Override + protected void finalize() throws Throwable { + try { + freeNatives(); + } finally { + super.finalize(); + } + } + + public void freeNatives() { + if (mNativePointer != 0) { + long nativePointer = mNativePointer; + mNativePointer = 0; + YogaNative.jni_YGConfigFree(nativePointer); + } + } +}