From 2d61e0ceba0ca7e1069392876a6f1a84fbd9c029 Mon Sep 17 00:00:00 2001 From: Steve Kondik Date: Thu, 15 Sep 2016 05:16:42 -0700 Subject: [PATCH] cmsdk: Add constraints and behaviors for our preferences * Add a new set of attributes which can be declared in the preference XML which will cause the preference to be removed from the hierarchy if the constraint is not met. Currently we can check for installed packages, system properties, config references, and system features. * CMPartsPreference is also updated to use similar logic based on the external XML. Change-Id: If8fb39cd3312623e38bb3498bfb3f29ed8b444d6 --- api/cm_current.txt | 54 ++++- cm/res/Android.mk | 1 + sdk/res/res/values/attrs.xml | 11 +- sdk/res/res/values/public.xml | 12 ++ sdk/res/res/values/symbols.xml | 8 + .../CMGlobalSettingSwitchPreference.java | 6 +- .../CMSecureSettingListPreference.java | 4 +- .../CMSecureSettingSwitchPreference.java | 6 +- .../CMSystemSettingListPreference.java | 3 +- .../CMSystemSettingSwitchPreference.java | 6 +- .../preference/ConstraintsHelper.java | 196 ++++++++++++++++++ .../SelfRemovingListPreference.java | 51 +++++ .../preference/SelfRemovingPreference.java | 55 +++++ .../SelfRemovingSwitchPreference.java | 55 +++++ .../SystemSettingSwitchPreference.java | 4 +- .../internal/cmparts/CMPartsPreference.java | 9 +- 16 files changed, 456 insertions(+), 25 deletions(-) create mode 100644 sdk/res/res/values/public.xml create mode 100644 sdk/res/res/values/symbols.xml create mode 100644 sdk/src/java/cyanogenmod/preference/ConstraintsHelper.java create mode 100644 sdk/src/java/cyanogenmod/preference/SelfRemovingListPreference.java create mode 100644 sdk/src/java/cyanogenmod/preference/SelfRemovingPreference.java create mode 100644 sdk/src/java/cyanogenmod/preference/SelfRemovingSwitchPreference.java diff --git a/api/cm_current.txt b/api/cm_current.txt index d8910560..9dc36e3c 100644 --- a/api/cm_current.txt +++ b/api/cm_current.txt @@ -737,6 +737,10 @@ package cyanogenmod.platform { public static final class R.attr { ctor public R.attr(); + field public static final int requiresConfig = 1057030148; // 0x3f010004 + field public static final int requiresFeature = 1057030147; // 0x3f010003 + field public static final int requiresPackage = 1057030146; // 0x3f010002 + field public static final int requiresProperty = 1057030149; // 0x3f010005 } public static final class R.bool { @@ -747,6 +751,10 @@ package cyanogenmod.platform { ctor public R.drawable(); } + public static final class R.id { + ctor public R.id(); + } + public static final class R.integer { ctor public R.integer(); } @@ -782,7 +790,7 @@ package cyanogenmod.power { package cyanogenmod.preference { - public class CMGlobalSettingSwitchPreference extends SwitchPreference { + public class CMGlobalSettingSwitchPreference extends cyanogenmod.preference.SelfRemovingSwitchPreference { ctor public CMGlobalSettingSwitchPreference(android.content.Context, android.util.AttributeSet, int); ctor public CMGlobalSettingSwitchPreference(android.content.Context, android.util.AttributeSet); ctor public CMGlobalSettingSwitchPreference(android.content.Context); @@ -791,7 +799,7 @@ package cyanogenmod.preference { method protected boolean persistBoolean(boolean); } - public class CMSecureSettingListPreference extends ListPreference { + public class CMSecureSettingListPreference extends cyanogenmod.preference.SelfRemovingListPreference { ctor public CMSecureSettingListPreference(android.content.Context, android.util.AttributeSet, int); ctor public CMSecureSettingListPreference(android.content.Context, android.util.AttributeSet); method public int getIntValue(int); @@ -800,7 +808,7 @@ package cyanogenmod.preference { method protected boolean persistString(java.lang.String); } - public class CMSecureSettingSwitchPreference extends SwitchPreference { + public class CMSecureSettingSwitchPreference extends cyanogenmod.preference.SelfRemovingSwitchPreference { ctor public CMSecureSettingSwitchPreference(android.content.Context, android.util.AttributeSet, int); ctor public CMSecureSettingSwitchPreference(android.content.Context, android.util.AttributeSet); ctor public CMSecureSettingSwitchPreference(android.content.Context); @@ -809,7 +817,7 @@ package cyanogenmod.preference { method protected boolean persistBoolean(boolean); } - public class CMSystemSettingListPreference extends ListPreference { + public class CMSystemSettingListPreference extends cyanogenmod.preference.SelfRemovingListPreference { ctor public CMSystemSettingListPreference(android.content.Context, android.util.AttributeSet, int); ctor public CMSystemSettingListPreference(android.content.Context, android.util.AttributeSet); method public int getIntValue(int); @@ -818,7 +826,7 @@ package cyanogenmod.preference { method protected boolean persistString(java.lang.String); } - public class CMSystemSettingSwitchPreference extends SwitchPreference { + public class CMSystemSettingSwitchPreference extends cyanogenmod.preference.SelfRemovingSwitchPreference { ctor public CMSystemSettingSwitchPreference(android.content.Context, android.util.AttributeSet, int); ctor public CMSystemSettingSwitchPreference(android.content.Context, android.util.AttributeSet); ctor public CMSystemSettingSwitchPreference(android.content.Context); @@ -827,7 +835,41 @@ package cyanogenmod.preference { method protected boolean persistBoolean(boolean); } - public class SystemSettingSwitchPreference extends SwitchPreference { + public class ConstraintsHelper { + ctor public ConstraintsHelper(android.content.Context, android.util.AttributeSet, Preference); + method public void applyConstraints(); + method public static boolean hasSystemFeature(android.content.Context, java.lang.String); + method public static boolean isDozeAvailable(android.content.Context); + method public static boolean isPackageInstalled(android.content.Context, java.lang.String, boolean); + method public static boolean isVoiceCapable(android.content.Context); + method public void setAvailable(boolean); + } + + public class SelfRemovingListPreference extends ListPreference { + ctor public SelfRemovingListPreference(android.content.Context, android.util.AttributeSet, int); + ctor public SelfRemovingListPreference(android.content.Context, android.util.AttributeSet); + ctor public SelfRemovingListPreference(android.content.Context); + method public void onBindViewHolder(PreferenceViewHolder); + method protected void setAvailable(boolean); + } + + public class SelfRemovingPreference extends Preference { + ctor public SelfRemovingPreference(android.content.Context, android.util.AttributeSet, int); + ctor public SelfRemovingPreference(android.content.Context, android.util.AttributeSet); + ctor public SelfRemovingPreference(android.content.Context); + method public void onBindViewHolder(PreferenceViewHolder); + method protected void setAvailable(boolean); + } + + public class SelfRemovingSwitchPreference extends SwitchPreference { + ctor public SelfRemovingSwitchPreference(android.content.Context, android.util.AttributeSet, int); + ctor public SelfRemovingSwitchPreference(android.content.Context, android.util.AttributeSet); + ctor public SelfRemovingSwitchPreference(android.content.Context); + method public void onBindViewHolder(PreferenceViewHolder); + method protected void setAvailable(boolean); + } + + public class SystemSettingSwitchPreference extends cyanogenmod.preference.SelfRemovingSwitchPreference { ctor public SystemSettingSwitchPreference(android.content.Context, android.util.AttributeSet, int); ctor public SystemSettingSwitchPreference(android.content.Context, android.util.AttributeSet); ctor public SystemSettingSwitchPreference(android.content.Context); diff --git a/cm/res/Android.mk b/cm/res/Android.mk index 4f3bec97..4b186962 100644 --- a/cm/res/Android.mk +++ b/cm/res/Android.mk @@ -22,6 +22,7 @@ LOCAL_CERTIFICATE := platform LOCAL_AAPT_FLAGS := --auto-add-overlay LOCAL_AAPT_FLAGS += --private-symbols org.cyanogenmod.platform.internal LOCAL_RESOURCE_DIR := $(addprefix $(LOCAL_PATH)/, res) +LOCAL_RESOURCE_DIR += $(LOCAL_PATH)/../../sdk/res/res # Tell aapt to create "extending (non-application)" resource IDs, # since these resources will be used by many apps. diff --git a/sdk/res/res/values/attrs.xml b/sdk/res/res/values/attrs.xml index b9ee43b1..3b026f3f 100644 --- a/sdk/res/res/values/attrs.xml +++ b/sdk/res/res/values/attrs.xml @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. --> - + @@ -22,4 +22,11 @@ - \ No newline at end of file + + + + + + + + diff --git a/sdk/res/res/values/public.xml b/sdk/res/res/values/public.xml new file mode 100644 index 00000000..1772bd75 --- /dev/null +++ b/sdk/res/res/values/public.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/sdk/res/res/values/symbols.xml b/sdk/res/res/values/symbols.xml new file mode 100644 index 00000000..de93ac1c --- /dev/null +++ b/sdk/res/res/values/symbols.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/sdk/src/java/cyanogenmod/preference/CMGlobalSettingSwitchPreference.java b/sdk/src/java/cyanogenmod/preference/CMGlobalSettingSwitchPreference.java index 4a7952c7..63e5e9d7 100644 --- a/sdk/src/java/cyanogenmod/preference/CMGlobalSettingSwitchPreference.java +++ b/sdk/src/java/cyanogenmod/preference/CMGlobalSettingSwitchPreference.java @@ -17,12 +17,12 @@ package cyanogenmod.preference; import android.content.Context; -import android.support.v14.preference.SwitchPreference; import android.util.AttributeSet; import cyanogenmod.providers.CMSettings; -public class CMGlobalSettingSwitchPreference extends SwitchPreference { +public class CMGlobalSettingSwitchPreference extends SelfRemovingSwitchPreference { + public CMGlobalSettingSwitchPreference(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @@ -32,7 +32,7 @@ public class CMGlobalSettingSwitchPreference extends SwitchPreference { } public CMGlobalSettingSwitchPreference(Context context) { - super(context, null); + super(context); } @Override diff --git a/sdk/src/java/cyanogenmod/preference/CMSecureSettingListPreference.java b/sdk/src/java/cyanogenmod/preference/CMSecureSettingListPreference.java index 307a821d..aed7211a 100644 --- a/sdk/src/java/cyanogenmod/preference/CMSecureSettingListPreference.java +++ b/sdk/src/java/cyanogenmod/preference/CMSecureSettingListPreference.java @@ -16,13 +16,13 @@ package cyanogenmod.preference; import android.content.Context; -import android.support.v7.preference.ListPreference; import android.util.AttributeSet; import cyanogenmod.providers.CMSettings; -public class CMSecureSettingListPreference extends ListPreference { +public class CMSecureSettingListPreference extends SelfRemovingListPreference { + public CMSecureSettingListPreference(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } diff --git a/sdk/src/java/cyanogenmod/preference/CMSecureSettingSwitchPreference.java b/sdk/src/java/cyanogenmod/preference/CMSecureSettingSwitchPreference.java index d3174249..e54766ad 100644 --- a/sdk/src/java/cyanogenmod/preference/CMSecureSettingSwitchPreference.java +++ b/sdk/src/java/cyanogenmod/preference/CMSecureSettingSwitchPreference.java @@ -17,12 +17,12 @@ package cyanogenmod.preference; import android.content.Context; -import android.support.v14.preference.SwitchPreference; import android.util.AttributeSet; import cyanogenmod.providers.CMSettings; -public class CMSecureSettingSwitchPreference extends SwitchPreference { +public class CMSecureSettingSwitchPreference extends SelfRemovingSwitchPreference { + public CMSecureSettingSwitchPreference(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @@ -32,7 +32,7 @@ public class CMSecureSettingSwitchPreference extends SwitchPreference { } public CMSecureSettingSwitchPreference(Context context) { - super(context, null); + super(context); } @Override diff --git a/sdk/src/java/cyanogenmod/preference/CMSystemSettingListPreference.java b/sdk/src/java/cyanogenmod/preference/CMSystemSettingListPreference.java index ff19b04d..c8ab9190 100644 --- a/sdk/src/java/cyanogenmod/preference/CMSystemSettingListPreference.java +++ b/sdk/src/java/cyanogenmod/preference/CMSystemSettingListPreference.java @@ -16,13 +16,12 @@ package cyanogenmod.preference; import android.content.Context; -import android.support.v7.preference.ListPreference; import android.util.AttributeSet; import cyanogenmod.providers.CMSettings; -public class CMSystemSettingListPreference extends ListPreference { +public class CMSystemSettingListPreference extends SelfRemovingListPreference { public CMSystemSettingListPreference(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } diff --git a/sdk/src/java/cyanogenmod/preference/CMSystemSettingSwitchPreference.java b/sdk/src/java/cyanogenmod/preference/CMSystemSettingSwitchPreference.java index c4f91d66..9bd1cb94 100644 --- a/sdk/src/java/cyanogenmod/preference/CMSystemSettingSwitchPreference.java +++ b/sdk/src/java/cyanogenmod/preference/CMSystemSettingSwitchPreference.java @@ -17,12 +17,12 @@ package cyanogenmod.preference; import android.content.Context; -import android.support.v14.preference.SwitchPreference; import android.util.AttributeSet; import cyanogenmod.providers.CMSettings; -public class CMSystemSettingSwitchPreference extends SwitchPreference { +public class CMSystemSettingSwitchPreference extends SelfRemovingSwitchPreference { + public CMSystemSettingSwitchPreference(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @@ -32,7 +32,7 @@ public class CMSystemSettingSwitchPreference extends SwitchPreference { } public CMSystemSettingSwitchPreference(Context context) { - super(context, null); + super(context); } @Override diff --git a/sdk/src/java/cyanogenmod/preference/ConstraintsHelper.java b/sdk/src/java/cyanogenmod/preference/ConstraintsHelper.java new file mode 100644 index 00000000..3ec1b0c1 --- /dev/null +++ b/sdk/src/java/cyanogenmod/preference/ConstraintsHelper.java @@ -0,0 +1,196 @@ +/* + * Copyright (C) 2016 The CyanogenMod Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package cyanogenmod.preference; + +import android.content.Context; +import android.content.pm.PackageInfo; +import android.content.pm.PackageManager; +import android.content.res.TypedArray; +import android.os.Build; +import android.os.SystemProperties; +import android.support.v7.preference.Preference; +import android.support.v7.preference.PreferenceGroup; +import android.telephony.TelephonyManager; +import android.text.TextUtils; +import android.util.AttributeSet; +import android.util.TypedValue; + +import cyanogenmod.platform.R; + + +/** + * Helpers for checking if a device supports various features. + */ +public class ConstraintsHelper { + + private static final String TAG = "Constraints"; + + private final Context mContext; + + private final AttributeSet mAttrs; + + private final Preference mPref; + + private boolean mAvailable = true; + + public ConstraintsHelper(Context context, AttributeSet attrs, Preference pref) { + mContext = context; + mAttrs = attrs; + mPref = pref; + + mAvailable = checkConstraints(); + } + + public void setAvailable(boolean available) { + mAvailable = available; + } + + public void applyConstraints() { + if (!mAvailable) { + final PreferenceGroup group = getParent(mPref); + group.removePreference(mPref); + if (group.getPreferenceCount() == 0) { + getParent(group).removePreference(group); + } + } + } + + private PreferenceGroup getParent(Preference preference) + { + return getParent(mPref.getPreferenceManager().getPreferenceScreen(), preference); + } + + private PreferenceGroup getParent(PreferenceGroup root, Preference preference) + { + for (int i = 0; i < root.getPreferenceCount(); i++) + { + Preference p = root.getPreference(i); + if (p == preference) + return root; + if (PreferenceGroup.class.isInstance(p)) + { + PreferenceGroup parent = getParent((PreferenceGroup)p, preference); + if (parent != null) + return parent; + } + } + return null; + } + + private boolean checkConstraints() { + if (mAttrs == null) { + return true; + } + + TypedArray a = mContext.getResources().obtainAttributes(mAttrs, + R.styleable.cm_SelfRemovingPreference); + + try { + + // Check if a specific package is installed + String rPackage = a.getString(R.styleable.cm_SelfRemovingPreference_requiresPackage); + if (rPackage != null && !isPackageInstalled(mContext, rPackage, false)) { + return false; + } + + // Check if a system feature is available + String rFeature = a.getString(R.styleable.cm_SelfRemovingPreference_requiresFeature); + if (rFeature != null && !hasSystemFeature(mContext, rFeature)) { + return false; + } + + // Check a boolean system property + String rProperty = a.getString(R.styleable.cm_SelfRemovingPreference_requiresProperty); + if (rProperty != null) { + String value = SystemProperties.get(rProperty); + if (value == null || !Boolean.parseBoolean(value)) { + return false; + } + } + + // Check a config resource. This can be a bool or a string. A null string + // fails the constraint. + TypedValue tv = a.peekValue(R.styleable.cm_SelfRemovingPreference_requiresConfig); + if (tv != null) { + if (tv.type == TypedValue.TYPE_STRING) { + if (tv.resourceId != 0) { + if (mContext.getResources().getString(tv.resourceId) == null) { + return false; + } + } + } else if (tv.type == TypedValue.TYPE_INT_BOOLEAN) { + if (tv.resourceId != 0) { + if (tv.data == 0) { + return false; + } + } + } + } + } finally { + a.recycle(); + } + + return true; + } + + /** + * Returns whether the device supports a particular feature + */ + public static boolean hasSystemFeature(Context context, String feature) { + return context.getPackageManager().hasSystemFeature(feature); + } + /** + * Returns whether the device is voice-capable (meaning, it is also a phone). + */ + public static boolean isVoiceCapable(Context context) { + TelephonyManager telephony = + (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); + return telephony != null && telephony.isVoiceCapable(); + } + + /** + * Checks if a package is installed. Set the ignoreState argument to true if you don't + * care if the package is enabled/disabled. + */ + public static boolean isPackageInstalled(Context context, String pkg, boolean ignoreState) { + if (pkg != null) { + try { + PackageInfo pi = context.getPackageManager().getPackageInfo(pkg, 0); + if (!pi.applicationInfo.enabled && !ignoreState) { + return false; + } + } catch (PackageManager.NameNotFoundException e) { + return false; + } + } + + return true; + } + + /** + * Does the device support Doze? + * @param context + * @return + */ + public static boolean isDozeAvailable(Context context) { + String name = Build.IS_DEBUGGABLE ? SystemProperties.get("debug.doze.component") : null; + if (TextUtils.isEmpty(name)) { + name = context.getResources().getString( + com.android.internal.R.string.config_dozeComponent); + } + return !TextUtils.isEmpty(name); + } +} diff --git a/sdk/src/java/cyanogenmod/preference/SelfRemovingListPreference.java b/sdk/src/java/cyanogenmod/preference/SelfRemovingListPreference.java new file mode 100644 index 00000000..a4a59304 --- /dev/null +++ b/sdk/src/java/cyanogenmod/preference/SelfRemovingListPreference.java @@ -0,0 +1,51 @@ +/* + * Copyright (C) 2016 The CyanogenMod Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package cyanogenmod.preference; + +import android.content.Context; +import android.support.v7.preference.ListPreference; +import android.support.v7.preference.PreferenceViewHolder; +import android.util.AttributeSet; + +public class SelfRemovingListPreference extends ListPreference { + + private final ConstraintsHelper mConstraints; + + public SelfRemovingListPreference(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + mConstraints = new ConstraintsHelper(context, attrs, this); + } + + public SelfRemovingListPreference(Context context, AttributeSet attrs) { + super(context, attrs); + mConstraints = new ConstraintsHelper(context, attrs, this); + } + + public SelfRemovingListPreference(Context context) { + super(context); + mConstraints = new ConstraintsHelper(context, null, this); + } + + @Override + public void onBindViewHolder(PreferenceViewHolder holder) { + super.onBindViewHolder(holder); + mConstraints.applyConstraints(); + } + + protected void setAvailable(boolean available) { + mConstraints.setAvailable(available); + } +} diff --git a/sdk/src/java/cyanogenmod/preference/SelfRemovingPreference.java b/sdk/src/java/cyanogenmod/preference/SelfRemovingPreference.java new file mode 100644 index 00000000..ff3de3b6 --- /dev/null +++ b/sdk/src/java/cyanogenmod/preference/SelfRemovingPreference.java @@ -0,0 +1,55 @@ +/* + * Copyright (C) 2016 The CyanogenMod project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package cyanogenmod.preference; + +import android.content.Context; +import android.support.v7.preference.Preference; +import android.support.v7.preference.PreferenceViewHolder; +import android.util.AttributeSet; + +/** + * A Preference which can automatically remove itself from the hierarchy + * based on constraints set in XML. + */ +public class SelfRemovingPreference extends Preference { + + private final ConstraintsHelper mConstraints; + + public SelfRemovingPreference(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + mConstraints = new ConstraintsHelper(context, attrs, this); + } + + public SelfRemovingPreference(Context context, AttributeSet attrs) { + super(context, attrs); + mConstraints = new ConstraintsHelper(context, attrs, this); + } + + public SelfRemovingPreference(Context context) { + super(context); + mConstraints = new ConstraintsHelper(context, null, this); + } + + @Override + public void onBindViewHolder(PreferenceViewHolder holder) { + super.onBindViewHolder(holder); + mConstraints.applyConstraints(); + } + + protected void setAvailable(boolean available) { + mConstraints.setAvailable(available); + } +} diff --git a/sdk/src/java/cyanogenmod/preference/SelfRemovingSwitchPreference.java b/sdk/src/java/cyanogenmod/preference/SelfRemovingSwitchPreference.java new file mode 100644 index 00000000..771dc047 --- /dev/null +++ b/sdk/src/java/cyanogenmod/preference/SelfRemovingSwitchPreference.java @@ -0,0 +1,55 @@ +/* + * Copyright (C) 2016 The CyanogenMod project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package cyanogenmod.preference; + +import android.content.Context; +import android.support.v14.preference.SwitchPreference; +import android.support.v7.preference.PreferenceViewHolder; +import android.util.AttributeSet; + +/** + * A SwitchPreference which can automatically remove itself from the hierarchy + * based on constraints set in XML. + */ +public class SelfRemovingSwitchPreference extends SwitchPreference { + + private final ConstraintsHelper mConstraints; + + public SelfRemovingSwitchPreference(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + mConstraints = new ConstraintsHelper(context, attrs, this); + } + + public SelfRemovingSwitchPreference(Context context, AttributeSet attrs) { + super(context, attrs); + mConstraints = new ConstraintsHelper(context, attrs, this); + } + + public SelfRemovingSwitchPreference(Context context) { + super(context); + mConstraints = new ConstraintsHelper(context, null, this); + } + + @Override + public void onBindViewHolder(PreferenceViewHolder holder) { + super.onBindViewHolder(holder); + mConstraints.applyConstraints(); + } + + protected void setAvailable(boolean available) { + mConstraints.setAvailable(available); + } +} diff --git a/sdk/src/java/cyanogenmod/preference/SystemSettingSwitchPreference.java b/sdk/src/java/cyanogenmod/preference/SystemSettingSwitchPreference.java index a774834e..02492821 100644 --- a/sdk/src/java/cyanogenmod/preference/SystemSettingSwitchPreference.java +++ b/sdk/src/java/cyanogenmod/preference/SystemSettingSwitchPreference.java @@ -18,10 +18,10 @@ package cyanogenmod.preference; import android.content.Context; import android.provider.Settings; -import android.support.v14.preference.SwitchPreference; import android.util.AttributeSet; -public class SystemSettingSwitchPreference extends SwitchPreference { +public class SystemSettingSwitchPreference extends SelfRemovingSwitchPreference { + public SystemSettingSwitchPreference(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } diff --git a/sdk/src/java/org/cyanogenmod/internal/cmparts/CMPartsPreference.java b/sdk/src/java/org/cyanogenmod/internal/cmparts/CMPartsPreference.java index 4e90d5f0..24cda812 100644 --- a/sdk/src/java/org/cyanogenmod/internal/cmparts/CMPartsPreference.java +++ b/sdk/src/java/org/cyanogenmod/internal/cmparts/CMPartsPreference.java @@ -19,15 +19,16 @@ import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; -import android.support.v7.preference.Preference; import android.util.AttributeSet; +import cyanogenmod.preference.SelfRemovingPreference; + import static org.cyanogenmod.internal.cmparts.PartsList.ACTION_PART; import static org.cyanogenmod.internal.cmparts.PartsList.ACTION_PART_CHANGED; import static org.cyanogenmod.internal.cmparts.PartsList.EXTRA_PART; import static org.cyanogenmod.internal.cmparts.PartsList.EXTRA_PART_KEY; -public class CMPartsPreference extends Preference { +public class CMPartsPreference extends SelfRemovingPreference { private static final String TAG = "CMPartsPreference"; @@ -41,6 +42,10 @@ public class CMPartsPreference extends Preference { throw new RuntimeException("Part not found: " + getKey()); } + if (!mPart.isAvailable()) { + setAvailable(false); + } + Intent i = new Intent(ACTION_PART); i.putExtra(EXTRA_PART_KEY, mPart.getName()); setIntent(i);