diff --git a/sdk/src/java/cyanogenmod/hardware/CMHardwareManager.java b/sdk/src/java/cyanogenmod/hardware/CMHardwareManager.java index 5f60443a..0db99484 100644 --- a/sdk/src/java/cyanogenmod/hardware/CMHardwareManager.java +++ b/sdk/src/java/cyanogenmod/hardware/CMHardwareManager.java @@ -27,6 +27,7 @@ import cyanogenmod.hardware.HSIC; import java.io.UnsupportedEncodingException; import java.lang.IllegalArgumentException; +import java.lang.reflect.Field; import java.nio.ByteBuffer; import java.util.Arrays; import java.util.List; @@ -225,6 +226,26 @@ public final class CMHardwareManager { return feature == (getSupportedFeatures() & feature); } + /** + * String version for preference constraints + * + * @hide + */ + public boolean isSupported(String feature) { + if (!feature.startsWith("FEATURE_")) { + return false; + } + try { + Field f = getClass().getField(feature); + if (f != null) { + return isSupported((int) f.get(null)); + } + } catch (NoSuchFieldException | IllegalAccessException e) { + // ignore + } + + return false; + } /** * Determine if the given feature is enabled or disabled. * diff --git a/sdk/src/java/cyanogenmod/preference/ConstraintsHelper.java b/sdk/src/java/cyanogenmod/preference/ConstraintsHelper.java index e6149958..c4e8195f 100644 --- a/sdk/src/java/cyanogenmod/preference/ConstraintsHelper.java +++ b/sdk/src/java/cyanogenmod/preference/ConstraintsHelper.java @@ -29,6 +29,7 @@ import android.text.TextUtils; import android.util.AttributeSet; import android.util.TypedValue; +import cyanogenmod.hardware.CMHardwareManager; import cyanogenmod.platform.R; @@ -115,8 +116,15 @@ public class ConstraintsHelper { // Check if a system feature is available String rFeature = a.getString(R.styleable.cm_SelfRemovingPreference_requiresFeature); - if (rFeature != null && !hasSystemFeature(mContext, rFeature)) { - return false; + if (rFeature != null) { + if (rFeature.startsWith("cmhardware:")) { + if (!CMHardwareManager.getInstance(mContext).isSupported( + rFeature.substring("cmhardware:".length()))) { + return false; + } + } else if (!hasSystemFeature(mContext, rFeature)) { + return false; + } } // Check a boolean system property