package org.getlantern.firetweet.preference; import android.annotation.SuppressLint; import android.content.ComponentName; import android.content.Context; import android.content.pm.PackageManager; import android.content.res.TypedArray; import android.preference.CheckBoxPreference; import android.preference.PreferenceManager; import android.support.annotation.NonNull; import android.util.AttributeSet; public class ComponentStatePreference extends CheckBoxPreference { private final PackageManager mPackageManager; private final ComponentName mComponentName; public ComponentStatePreference(final Context context) { this(context, null); } public ComponentStatePreference(final Context context, final AttributeSet attrs) { this(context, attrs, android.R.attr.checkBoxPreferenceStyle); } public ComponentStatePreference(final Context context, final AttributeSet attrs, final int defStyle) { super(context, attrs, defStyle); mPackageManager = context.getPackageManager(); mComponentName = getComponentName(context, attrs); setDefaultValue(isComponentEnabled()); } @Override public boolean shouldDisableDependents() { final boolean disableDependentsState = getDisableDependentsState(); final boolean value = isComponentEnabled(); return disableDependentsState ? value : !value; } @Override protected Object onGetDefaultValue(final TypedArray a, final int index) { return isComponentEnabled(); } @Override protected void onSetInitialValue(final boolean restoreValue, final Object defaultValue) { setChecked(getPersistedBoolean(true)); } protected ComponentName getComponentName(Context context, AttributeSet attrs) { final TypedArray a = context.obtainStyledAttributes(attrs, new int[]{android.R.attr.name}); final String name = a.getString(0); a.recycle(); if (name == null) throw new NullPointerException(); return new ComponentName(context.getPackageName(), name); } protected boolean isComponentAvailable() { return true; } @Override protected boolean shouldPersist() { return true; } @Override protected void notifyHierarchyChanged() { super.notifyHierarchyChanged(); updateEnableState(); } @Override protected void onAttachedToHierarchy(@NonNull final PreferenceManager preferenceManager) { super.onAttachedToHierarchy(preferenceManager); updateEnableState(); } @Override protected boolean persistBoolean(final boolean value) { final int newState = value ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED : PackageManager.COMPONENT_ENABLED_STATE_DISABLED; mPackageManager.setComponentEnabledSetting(mComponentName, newState, PackageManager.DONT_KILL_APP); return true; } @Override protected boolean getPersistedBoolean(final boolean defaultReturnValue) { return isComponentEnabled(); } @SuppressLint("InlinedApi") private boolean isComponentEnabled() { try { final int state = mPackageManager.getComponentEnabledSetting(mComponentName); return state != PackageManager.COMPONENT_ENABLED_STATE_DISABLED && state != PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER && state != PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED; } catch (NullPointerException e) { // Seems this will thrown on older devices return false; } } private void updateEnableState() { setEnabled(isComponentAvailable()); } }